<strong id="0toem"><dl id="0toem"></dl></strong><b id="0toem"><menuitem id="0toem"></menuitem></b>

      <b id="0toem"><menuitem id="0toem"></menuitem></b>
    1. <code id="0toem"><abbr id="0toem"></abbr></code>
      <strong id="0toem"><dl id="0toem"></dl></strong>
      <kbd id="0toem"></kbd>
              1. <code id="0toem"></code>
                <th id="0toem"><progress id="0toem"></progress></th><strong id="0toem"><form id="0toem"></form></strong>

                <th id="0toem"></th>
              2. 131 1300 0010
                其他
                當前位置: 首頁>> 元件技術>>其他>>
              3. 導航欄目
              4. 二極管
              5. 整流橋
              6. MOS管
              7. 其他
              8. STM32單片機SPI總線與FPGA的通信設計
                STM32單片機SPI總線與FPGA的通信設計
              9. STM32單片機SPI總線與FPGA的通信設計
              10.   發(fā)布日期: 2019-06-06  瀏覽次數(shù): 3,187

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

                四線包括時鐘、片選、接收、發(fā)送

                 

                初始化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工作在這種一直狀態(tài)

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

                FPGA的數(shù)據傳輸格式是16bit地址+16bit數(shù)據

                對于讀16bit,實現(xiàn)如下

                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;

                }

                寫函數(shù)

                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函數(shù)舉例

                只所以這么設計是因為

                如果是函數(shù)一開始就將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時鐘出來

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

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

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

                還有值得注意的是:

                如果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


              11. ·上一篇:
                ·下一篇:
              12. 其他關聯(lián)資訊
                深圳市日月辰科技有限公司
                地址:深圳市寶安區(qū)松崗鎮(zhèn)潭頭第二工業(yè)城A區(qū)27棟3樓
                電話:0755-2955 6626
                傳真:0755-2978 1585
                手機:131 1300 0010
                郵箱:[email protected]

                深圳市日月辰科技有限公司 版權所有:Copyright?2010-2023 www.xydibang.com 電話:13113000010 粵ICP備2021111333號
                <strong id="0toem"><dl id="0toem"></dl></strong><b id="0toem"><menuitem id="0toem"></menuitem></b>

                    <b id="0toem"><menuitem id="0toem"></menuitem></b>
                  1. <code id="0toem"><abbr id="0toem"></abbr></code>
                    <strong id="0toem"><dl id="0toem"></dl></strong>
                    <kbd id="0toem"></kbd>
                            1. <code id="0toem"></code>
                              <th id="0toem"><progress id="0toem"></progress></th><strong id="0toem"><form id="0toem"></form></strong>

                              <th id="0toem"></th>
                            2. 一级A片女处破7女视频 | 中文字幕在线视频免费 | 婷婷五月天欧美 | 青春草免费视频日韩 | 奇米影视狠狠撸 |