<目標>大數據
STM32雙機 SPI中斷收發通訊同步
<描述>it
# STM32雙機配置爲一主一從模式class
# 採用主機中斷髮送,從機中斷接收配置
# 收發機制採用不間斷收發(發送爲空就發送,接收非空就接收,中間無其餘操做打斷)硬件
# 就是單字節發送與接收程序
<問題>方法
從機接收端會出現,接收到的數據多是原始發送數據也會是錯誤數據,出現這種現象的條件是發送主機復位、發送主機從新上電、隨時間變化(物理碰觸等)都會產生錯誤數據,而復位接收從機、從新上電接收從機會糾正數據總結
<分析>通信
# STM32雙機未共地致使 共地後問題依舊
# STM32未使用NSS引腳致使 使用後問題依舊
# 工做模式改變嘗試(發送與接收工做模式配置爲不匹配) 問題依舊
# 主機發送太過頻繁致使,致使接收來不及接收致使 拉大發送數據週期問題依舊
# 從數據結果上分析,應該是發送主機與接收從機未同步致使,接收總線的數據先由移位寄存器接收,再copy至數據寄存器,因此分析數據錯位現象是出如今移位寄存器中,好比正在傳輸中由復位操做或斷電操做等,導致移位寄存器只接收了3bit數據,而SPI數據的接收機制是,移位寄存器收滿8bit數據後copy至數據寄存器,這一切都是硬件完成,注意數據的搬移是copy,因此移位寄存器中的數據還在即數據殘留特性,就像剛剛的這種中斷操做行爲致使移位寄存器殘留了當前字節的3bit數據,未滿8bit數據故不會copy至數據寄存器,因此等待恢復工做後,須要再接收5bit數據,這樣滿8bit數據後copy至spi->DR,可是這1byte數據中的前3bit與後5bit數據本不是一個有效byte數據,就致使讀到1byte無效數據,產生了接收錯誤數據的現象
<解決>
# 拉大發送數據週期&在進入接收中斷後先關閉SPI外設,而後再讀取數據,出中斷前開始SPI外設
> 在進入中斷服務程序後關閉spi外設,將致使在關閉外設期間發生的中斷而被忽視,尤爲是多數據連續發送,好比DMA數據發送,實測將致使丟數據,即其中的部分中斷未做出響應而丟棄。
> 拉大數據發送週期不失爲一個辦法,但在多數場合不適合,通訊中通常就要求快速傳輸,幾乎沒有單個字節的傳輸(單個字節傳輸可理解爲拉大數據發送週期的一種特例)。
# 。。。
<總結>
# 這種方法只是暫時解決了該條件下接收錯誤數據的問題,並未完美解決和分析透這一現象
# 不拉大發送數據週期,只是在進入接收中斷後先關閉SPI外設,而後再讀取數據,出中斷前開始SPI外設,接收數據錯誤問題依舊
<深思>
以上現象的產生可分析出以下的狀況致使
# 雙機正在傳輸過程當中,因爲復位、重啓等操做導致收發雙方不一樣步而出現如下狀況
> 發送端不間斷一直髮送,而接收端因爲復位、重啓等操做導致從新初始化準備開始接收,正巧雙機出現這種狀況,在接收端開始接收時發送端發送至當前1Byte的第5bit,這意味着第0-4bit已丟棄,剩餘第5-7bit恰好被接收端接收,即接收端收到3bit數據,隨着發送端下1Byte數據發送,這種環境將產生何種結果?
[分析]
> 接收端接收發送端發來的1Byte數據裏的前5bit與以前收到的3bit合成1Byte數據,將置位SPI_RXNE產生中斷將當前接收的1Byte數據讀走,這就致使了錯誤數據的產生,在環境保持不變的條件下,錯誤數據源遠流長
> 接收端是否會接收剛準備好接收時到來的3bit數據?
@ 不接收,是何緣由摒棄了這殘缺的數據?
@ 接收了,但並未copy至SPI_DR或者其餘狀況