99久久久久国产-99久久久久国产精品免费-99久久久久久久-99久久久免费精品免费-99久久免费费视频在线观看

131 1300 0010
其他
當前位置: 首頁>> 元件技術>>其他>>
  • 導航欄目
  • 二極管
  • 整流橋
  • MOS管
  • 其他
  • STM32單片機SPI總線與FPGA的通信設計
    STM32單片機SPI總線與FPGA的通信設計
  • STM32單片機SPI總線與FPGA的通信設計
  •   發布日期: 2019-06-06  瀏覽次數: 2,943

    最近在研究SPI總線,至于協議和硬件描述就不多說了

    四線包括時鐘、片選、接收、發送

     

    初始化SP

    SPI_InitStructure.SPI_Direction = SPI_DirecTIon_2Lines_FullDuplex; //全雙工

    SPI_InitStructure.SPI_Mode = SPI_Mode_Master; //主模式

    SPI_InitStructure.SPI_DataSize = SPI_DataSize_16b; //16bit寬度

    SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low;

    SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;

    SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;

    STM32單片機SPI總線與FPGA的通信設計

    SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_2; //2--18MHz; 4--9MHz; 8--4.5MHz

    SPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; //高位在前

    SPI_InitStructure.SPI_CRCPolynomial = 7;

    SPI_Init(SPIx, &SPI_InitStructure);

    SPI_Cmd(SPIx, ENABLE);

    SPI不能硬件控制CS,只能軟件來控,就是通過將NSS設為外部GPIO來控制。

    像我所做的項目是使用STM32FPGA通信,而FPGA的SPI工作在這種一直狀態

    作為主設備的STM32,CS在傳輸數據的時候為低,傳輸完畢后必須拉高,這樣FPGA可以判斷出SPI的傳輸起止狀態。

    FPGA的數據傳輸格式是16bit地址+16bit數據

    對于讀16bit,實現如下

    uint16_t spi_read(SPI_TypeDef* SPIx,uint32_t addr)

    {

    uint16_t value;

    uint16_t spi_nss;

    uint16_t add;

    uint32_t level;

    if(SPI1 == SPIx)

    spi_nss = SPI1_PIN_NSS;

    else if(SPI2 == SPIx)

    spi_nss = SPI2_PIN_NSS;

    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);

    GPIO_ResetBits(GPIOA, spi_nss);

    SPI_I2S_SendData(SPIx, addr); //0xf014 》》 2

    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);

    SPI_I2S_SendData(SPIx, 0x0);

    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);

    SPI_I2S_ReceiveData(SPIx);

    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);

    GPIO_SetBits(GPIOA, spi_nss);

    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);

    value = SPI_I2S_ReceiveData(SPIx);

    return value;

    }

    寫函數

    void spi_write(SPI_TypeDef* SPIx,uint32_t addr, uint16_t value)

    {

    uint16_t spi_nss;

    uint32_t level;

    if(SPI1 == SPIx)

    spi_nss = SPI1_PIN_NSS;

    else if(SPI2 == SPIx)

    spi_nss = SPI2_PIN_NSS;

    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);

    GPIO_ResetBits(GPIOA, spi_nss);

    SPI_I2S_SendData(SPIx, addr);

    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);

    SPI_I2S_SendData(SPIx, value);

    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);

    SPI_I2S_ReceiveData(SPIx);

    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);

    GPIO_SetBits(GPIOA, spi_nss);

    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET);

    SPI_I2S_ReceiveData(SPIx);

    }

    拿write函數舉例

    只所以這么設計是因為

    如果是函數一開始就將NSS腳拉低,然后再去send,如下

    GPIO_ResetBits(GPIOA, spi_nss);

    while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET);

    SPI_I2S_SendData(SPIx, addr);

    這樣在CS拉低一段時間后(時間大概有16個時鐘周期),才有CLK,這樣延時就會降低SPI的傳輸效率

    之前那種方式會在CS拉底后很快就有clk時鐘出來

    之所以寫兩次再讀兩次而不是讀一次寫一次也是考慮到效率的問題

    如果先寫一次再讀一次,看波形每個數據之間有比較大的空隙是沒有clk的,就是說在傳輸完一個數據后再

    傳第二個會要等一段時間,這個對速度要求比較高的設備是不允許的

    還有值得注意的是:

    如果SPI是主模式,那么GPIO設置為

    NSS是GPIO_Mode_Out_PP

    CLK是GPIO_Mode_AF_PP

    MOSI是GPIO_Mode_AF_PP

    MISO是GPIO_Mode_IN_FLOATING

    如果SPI是從模式,那么GPIO設置為

    NSS是GPIO_Mode_Out_PP

    CLK是GPIO_Mode_IN_FLOATING

    MOSI是GPIO_Mode_IN_FLOATING

    MISO是GPIO_Mode_AF_PP


  • ·上一篇:
    ·下一篇:
  • 其他關聯資訊
    深圳市日月辰科技有限公司
    地址:深圳市寶安區松崗鎮潭頭第二工業城A區27棟3樓
    電話:0755-2955 6626
    傳真:0755-2978 1585
    手機:131 1300 0010
    郵箱:hu@szryc.com

    深圳市日月辰科技有限公司 版權所有:Copyright?2010-2023 m.qingjujia.cn 電話:13113000010 粵ICP備2021111333號
    主站蜘蛛池模板: 欧美日韩网| 黄色免费观看 | 欧美一级做a影片爱橙影院 欧美一级做一a做片性视频 | 看全色黄大色黄大片色责看的 | 美女福利视频一区 | 国产日韩精品视频一区二区三区 | 愉拍自拍 | 日韩毛片欧美一级a | 亚洲在线高清 | 天天摸天天碰中文字幕 | 亚洲国产精品第一页 | 国产亚洲视频在线观看 | 久久青草免费97线频观 | 操比大片| 亚洲精品久久久久午夜 | 精品成人在线视频 | 欧美一级高清片欧美国产欧美 | 最新在线鲁丝片eeuss第1页 | 春色视频一区二区三区 | 高清中文字幕视频在线播 | 日本高清αv毛片免费 | 国产色网址| ssss国产在线观看 | 亚洲一区二区三区精品影院 | 国产大片视频免费观看 | 在线播放国产一区 | 老妇毛片久久久久久久久 | 日韩成人在线观看视频 | 免费一级黄色录像 | 国产精品视频一区二区噜噜 | 可以免费看黄的网址 | 一区免费视频 | 免费精品精品国产欧美在线 | 亚洲一区免费 | 成人自拍小视频 | 91久久国产青草亚洲 | 911精品国产亚洲日本美国韩国 | 亚洲欲色 | 日韩伦理一区 | 东京加勒比中文字幕波多野结衣 | 日韩欧美一区二区精品久久 |