天天看點

STM32的SPI2操作Flash

關于STM32F107的SPI标志 SPI_I2S_FLAG_BSY和SPI_I2S_FLAG_TXE的疑問   ​​ ​​

用STM32 SPI1驅動DAC7611,在發送資料的時候用了while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET);等待發送緩沖區為空後再拉高CS。結果發現在資料(16位)沒有發送完時,就執行了CS拉高。然後我換了這個語句while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_BSY) == SET);就正确了。我想知道,STM32如何判斷發送緩沖區為空的?這兩個辨別位的判斷有什麼差別?

while(SPI_I2S_GetFlagStatus(SPI2, SPI_I2S_FLAG_TXE) != RESET); //等待發送完成

while(SPI_I2S_GetFlagStatus(SPI2,SPI_I2S_FLAG_BSY)==SET);

隻發送過程(BIDIMODE=0并且RXONLY=0)

在此模式下,傳輸過程可以簡要說明如下,使用BSY位等待傳輸的結束(見圖215

466/754

和圖216):

1. 設定SPE位為’1’,使能SPI子產品;

2. 在SPI_DR寄存器中寫入第一個要發送的資料,這個操作會清除TXE标志;

3. 等待TXE=1,然後寫入第二個要發送的資料。重複這個操作,發送後續的資料;

4. 寫入最後一個資料到SPI_DR寄存器之後,等待TXE=1;然後等待BSY=0,這表示最後一個資料的傳輸已經完成。

也可以在響應TXE标志的上升沿産生的中斷的處理程式中實作這個過程。

注: 1. 對于不連續的傳輸,在寫入SPI_DR寄存器的操作與設定BSY位之間有2個APB時鐘周期的延遲,是以在隻發送模式下,寫入最後一個資料後,最好先等待TXE=1,然後再等待BSY=0。

2. 隻發送模式下,在傳輸2個資料之後,由于不會讀出接收到的資料,SPI_SR寄存器中的OVR位會變為’1’。(譯注:軟體不必理會這個OVR标志位)

是配置的時候有點問題,

    SPI_InitTypeDef  SPI_InitStructure;

      SPI_Init(SPI2, &SPI_InitStructure);

     SPI_InitTypeDef  *SPI_InitStructure;

      SPI_Init(SPI2, SPI_InitStructure);