關於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
http://bbs.21ic.com/icview-157057-1-1.html stm32的奇怪SPI2問題?