STM32使用的baseCAN,使用過程中發現一些注意的事項,特此記錄。
現象:
CAN發送程序,在1ms以上間隔調用時,一切正常。
當連續調用CAN發送程序4次或更多時,表現為丟數據,僅能發送一條或2條CAN數據。
分析原因:
1、STM32提供3個用於發送的mailbox。
2、當間隔1ms或連續發送3條以內時,我的應用程序會按調用標准庫函數,自動裝載mailbox,表現為發送正常。
3、當連續發送超過4條時,因為3個mailbox還沒有發送完成,處於滿的狀態,因此應用程序會收到無空閑的應答同時清除未發送的mailbox,造成數據丟失。
修改程序:
1、以3個mailbox滿為標准,進行超時等待,結果發送數據不丟但順序亂了。
2、每裝載一個mailbox都等待發送完成后,再裝載下一個;等待最大時間限制為2ms(for循環5000次)。
小結:
裝載到mailbox的三個數據,不是按裝載順序發送的,而是按固定123的寄存器順序發送的,只要mailbox1有數據,2、3就會等待發送,因此判斷mailbox滿的邏輯不可行。
經測試正常情況下500kbps時,等待發送完成用時約300us(for循環800次),限時2ms足夠。