<目標>
STM32雙機 SPI中斷收發通信
<描述>
# STM32雙機配置為一主一從模式
# 采用主機中斷發送,從機中斷接收
# 收發機制采用不間斷收發(發送為空就發送,接收非空就接收,中間無其他操作打斷)
# 就是單字節發送與接收
<問題>
從機接收端會出現,接收到的數據可能是原始發送數據也會是錯誤數據,出現這種現象的條件是發送主機復位、發送主機重新上電、隨時間變化(物理碰觸等)都會產生錯誤數據,而復位接收從機、重新上電接收從機會糾正數據
<分析>
# 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或者其他情況
