STM32的SPI2操作Flash


關於STM32F107的SPI標志 SPI_I2S_FLAG_BSY和SPI_I2S_FLAG_TXE的疑問  http://www.openedv.com/posts/list/23579.htm

用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);
兩種方式的不同,大家有興趣的可以試一下,其中一種方式是不行的(至少針對某些固態庫是不行

 

STM32分別基於庫和寄存器的硬件SPI2例程,適合入門者!http://www.amobbs.com/thread-5467320-1-1.html

STM32 SPI2問題  http://zhidao.baidu.com/link?url=H82AEsq4bX3gVjfMSuUZeTMANDlCRWMxgMEZCD79YJt_ngpH-iHZEuuK7gkjRlZ2weRdqK1TiSRSCftORDvOCCcjjiMXmvRXDQaYc3POX43

http://bbs.21ic.com/icview-157057-1-1.html     stm32的奇怪SPI2問題?

http://group.ednchina.com/GROUP_MES_14262_619_13966.HTM

http://bbs.csdn.net/topics/390652078?page=1


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM