導言
《STM32F103_LL庫+寄存器學習筆記14 - CAN發送完成中斷》上一章節完成CAN發送完成中斷,在梳理二級發送緩存之前,先梳理怎樣監控CAN發送失敗。
如上所示:
- 當我關掉CAN分析儀的CAN通道1,CAN錯誤狀態寄存器CAN_ESR的TEC(發送錯誤計數器)持續遞增,且最終遞增至最大值0x80(十進制128)。此時,EPVF(錯誤被動標志)與EWGF(錯誤警告標志)都被置1。
- 當我關掉CAN分析儀的CAN通道1,CAN錯誤狀態寄存器CAN_ESR的TEC(發送錯誤計數器)開始遞增時,LEC(上次錯誤代碼)等于0x03(ACK錯誤)。
- 當我重新開啟CAN分析儀的CAN通道1,CAN錯誤狀態寄存器CAN_ESR的TEC(發送錯誤計數器)持續遞減,且最終遞減至0。此時,EPVF(錯誤被動標志)與EWGF(錯誤警告標志)與LEC(上次錯誤代碼)都被置0。
項目地址:
- 寄存器方式:https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_ll_library14_Can_Send_Interrupt
- HAL庫方式:https://github.com/q164129345/MCU_Develop/tree/main/stm32f103_hal_library14_Can_Send_Interrupt
一、梳理寄存器
1.1、CAN錯誤狀態寄存器CAN_ESR
如上所示:
- 跟CAN發送相關的是TEC(9位發送錯誤計數器)。正如上面的gif動圖所示,發送失敗一次,TEC會快速+8。發送成功一次,TEC會減1。
- LEC(上次錯誤代碼)、EPVF(錯誤被動標志)、EWGF(錯誤警告標志)跟CAN接收與CAN發送都有關系。
1.2、TEC遞增至128,不再遞增
如上所示,讓CAN分析儀關閉,總線只有STM32F103一個CAN節點。此時,STM32F103往CAN總線上發送CAN消息時,會觸發確認ACK錯誤(TEC=0x03)。因為沒有另外的CAN節點回復ACK。
如上所示,因為確認ACK錯誤(TEC = 0x03)導致的發送失敗,TEC遞增至十六進制的0x80(十進制128)。此時,不會再遞增了。
1.3、TEC會在什么情況下突破128,遞增至200多?觸發Bus-off離線?
如上所示,當短接CANH與CANL時,TEC會迅速暴漲至200以上。此時,觸發busoff離線。在busoff離線狀態下,STM32將無法發送與接收CAN報文。
比如,在實戰項目上,經常觸發busoff的話,建議檢查一下CAN總線的電氣線路。