有人使用STM32F4芯片驗(yàn)證SPI功能。當(dāng)使用片內(nèi)兩個(gè)SPI模塊基于中斷方式進(jìn)行收發(fā)時(shí),發(fā)現(xiàn)總是出現(xiàn)接收數(shù)據(jù)丟失的情況,貌似總丟失末尾2個(gè)數(shù)據(jù)。代碼使用HAL庫提供的API函數(shù)。這是怎么回事呢?
我拿STM32F407開發(fā)板進(jìn)行驗(yàn)證測(cè)試。使用SPI1做發(fā)送,SPI3做接收,都使用中斷方式。
很快重現(xiàn)了問題現(xiàn)象,即發(fā)生接收數(shù)據(jù)丟失的情形。見下圖驗(yàn)證結(jié)果,發(fā)了8個(gè)數(shù)據(jù),只收到6個(gè)數(shù)據(jù)。
現(xiàn)在是同一顆芯片,即同一CPU基于中斷方式完成收發(fā)。懷疑會(huì)不會(huì)是不同SPI收發(fā)模塊中斷優(yōu)先級(jí)的安排不合理導(dǎo)致的問題。如果二者優(yōu)先級(jí)一樣的話,這里的發(fā)送中斷往往先于接收中斷的產(chǎn)生,勢(shì)必會(huì)出現(xiàn)接收不及時(shí)的情形。通過對(duì)代碼跟蹤調(diào)試,也的確發(fā)現(xiàn)了SPI接收溢出的現(xiàn)象,即接收數(shù)據(jù)提取不及時(shí)。
這樣分析下來,感覺數(shù)據(jù)丟失應(yīng)該跟通信速率有關(guān),丟失數(shù)據(jù)的多少不應(yīng)該固定。于是,我大幅度提升SPI通信速率再行測(cè)試,果真丟失的數(shù)據(jù)更多了。見下圖測(cè)試結(jié)果,發(fā)8個(gè)數(shù)據(jù)只收到1個(gè)數(shù)據(jù)。【前面測(cè)試時(shí)SPI波特率是5.25Mb/s,現(xiàn)在改為21Mb/s了】
我將SPI3接收中斷的優(yōu)先級(jí)調(diào)得比SPI1發(fā)送中斷的還高,如下圖所示。
基于重新調(diào)整中斷優(yōu)先級(jí)后的代碼再做測(cè)試,結(jié)果就完全正常了。
當(dāng)然,我們還可以有其它靈活處理的辦法。比方發(fā)送用中斷,接收用DMA,或者發(fā)送用輪訓(xùn),接收用中斷或DMA,或者都用DMA方式也行。
這里的核心問題是中斷優(yōu)先級(jí)沒有合理安排好。STM32ARM核中斷的內(nèi)容不多,不過內(nèi)容不多的東西往往意味著使用上更為靈活。好,今天的話題就分享到這里。
審核編輯:湯梓紅
-
SPI
+關(guān)注
關(guān)注
17文章
1669瀏覽量
90733 -
中斷
+關(guān)注
關(guān)注
5文章
889瀏覽量
41220 -
開發(fā)板
+關(guān)注
關(guān)注
25文章
4771瀏覽量
96174 -
STM32F4
+關(guān)注
關(guān)注
3文章
194瀏覽量
27888 -
HAL庫
+關(guān)注
關(guān)注
1文章
114瀏覽量
6032
原文標(biāo)題:SPI傳輸時(shí)為何丟失2個(gè)數(shù)據(jù)?
文章出處:【微信號(hào):stmcu832,微信公眾號(hào):茶話MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論