CAN總線產生的錯誤以錯誤幀的形式上報給應用層。設置注冊表[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\CAN1] BusErrorReport項為1可以讓驅動上報CAN總線錯誤幀,為0,驅動不會上報錯誤幀。
幀格式
CAN幀結構體定義如下,當CAN_FRAME中CAN_ID的error為1時,表示該幀為錯誤幀。
typedefstruct{
unsignedintid:29;
unsignedinterror:1;
unsignedintremote:1;
unsignedintextended:1;
}CAN_ID;
typedefstruct_can_frame
{
CAN_ID can_id; /* 32 bit CAN_ID + EFF/RTR/ERR flags */
BYTE can_dlc; /* frame payload length in byte*/
BYTE data[CAN_MAX_DLEN];
} CAN_FRAME, *PCAN_FRAME;
錯誤幀定義
可以參考例程中庫頭文件sdk_can.h,錯誤幀標記為CAN_ID的error,錯誤類型存放在CAN_ID中,根據不同類型的錯誤,詳細信息存放在幀結構體CAN_FRAME的data中。
一個錯誤幀中,可以包含多種錯誤類型的錯誤信息。
CAN_ERR_TX_TIMEOUT錯誤
WINCE中暫時保留。
lost arbitration仲裁丟失錯誤
#defineCAN_ERR_LOSTARB0x00000002U
當錯誤幀結構體中CAN_ID& CAN_ERR_LOSTARB為真時,表明該錯誤產生。
controller problems控制器出錯
#defineCAN_ERR_CRTL0x00000004U
當錯誤幀結構體中CAN_ID& CAN_ERR_CRTL為真時,表明該錯誤產生。
詳細信息存放在錯誤幀結構體data[1]中。
接收buffer溢出
data[0] &0x01為真,表明該錯誤產生。
需要及時處理接收到的數據包。
發送buffer溢出
data[0] &0x02為真,表明該錯誤產生。
可能由于瞬間發送的數據包過多導致。
接收錯誤達到警告級別
data[0] &0x04為真,表明該錯誤產生。
當該錯誤提示,表明短期內接收產生的錯誤較多。
發送錯誤達到警告級別
data[0] &0x08為真,表明該錯誤產生。
當該錯誤提示,表明短期內發送產生的錯誤較多。
接收錯誤達到嚴重錯誤級別
data[0] &0x10為真,表明該錯誤產生。
當該錯誤提示,表明短期內接收產生的錯誤過多。應當暫停CAN通信,檢查錯誤原因。
發送錯誤達到嚴重錯誤級別
data[0] &0x20為真,表明該錯誤產生。
當該錯誤提示,表明短期內發送產生的錯誤過多。應當暫停CAN通信,檢查錯誤原因。
恢復到錯誤激活狀態
data[0] &0x40為真,表明恢復到錯誤激活狀態。
CAN通信協議出錯
#defineCAN_ERR_PROT0x00000008U
當錯誤幀結構體中CAN_ID& CAN_ERR_PROT為真時,表明該錯誤產生。
詳細信息存放在錯誤幀結構體data[2]和data[3]中,其中data[2]表明協議錯誤類型,data[3]表明協議出錯的位置
(類型)單bit出錯
data[2] &0x01為真,表明協議單bit出錯。
(類型)幀格式出錯
data[2] &0x02為真,表明幀格式出錯。
(類型)位填充出錯
data[2] &0x04為真,表明位填充出錯。
(類型)dominant bit發送失敗
data[2] &0x08為真,表明dominant bit發送失敗。
(類型)recessive bit發送失敗
data[2] &0x10為真,表明recessive bi發送失敗。
(類型)總線過載
data[2] &0x20為真,表明總線過載。
(類型)active error announcement
data[2] &0x40為真,active error announcement。
(類型)傳輸出錯
data[2] &0x80為真,傳輸出錯。
位置
data[3]為0x03表明協議SOF幀頭位置
data[3]為0x02表明協議ID第28-21bits(SFF:10-3)
data[3]為0x06表明協議ID第20-18bits(SFF:2-0)
data[3]為0x04表明協議substitute RTR位(SFF:RTR)
data[3]為0x05表明協議identifier extension標準擴展位
data[3]為0x07表明協議ID第17-13bits
data[3]為0x0F表明協議ID第12-5bits
data[3]為0x0E表明協議ID第4-0bits
data[3]為0x0C表明協議RTR位
data[3]為0x0D表明接收bit 1
data[3]為0x09表明接收bit 0
data[3]為0x0B表明DLC位
data[3]為0x0A表明DATA位
data[3]為0x08表明CRC序列
data[3]為0x18表明CRC分隔符
data[3]為0x19表明ACK應答位
data[3]為0x1B表明ACK分隔符
data[3]為0x1A表明幀尾
data[3]為0x12表明間歇
收發狀態錯誤
#defineCAN_ERR_TRX0x00000010U
當錯誤幀結構體中CAN_ID& CAN_ERR_TRX為真時,表明在收發時CAN狀態有誤。
詳細信息存放在錯誤幀結構體data[4]中,data[4]中1個字節8bit中,高4位表示CANL值,分別代表如下CANH錯誤

高4位表示CANH值,分別代表如下CANL錯誤

高低位值以排列組合方式存在。
無ACK錯誤
#defineCAN_ERR_ACK0x00000020U
當錯誤幀結構體中CAN_ID& CAN_ERR_ACK為真時,表明該錯誤產生。
總線關閉
#defineCAN_ERR_BUSOFF0x00000040U
當錯誤幀結構體中CAN_ID& CAN_ERR_BUSOFF為真時,表明總線關閉。
總線錯誤
#defineCAN_ERR_BUSERROR0x00000080U
當錯誤幀結構體中CAN_ID& CAN_ERR_BUSERROR為真時,表明該錯誤產生。
該錯誤通常與其它錯誤一起發出。
控制器重啟
#defineCAN_ERR_RESTARTED0x00000100U
當錯誤幀結構體中CAN_ID& CAN_ERR_RESTARTED為真時,表明控制器重啟。
-
嵌入式主板
+關注
關注
7文章
6107瀏覽量
37069
發布評論請先 登錄
CAN被動錯誤恢復后為什么rt_device_write還會返回異常呢?
龍芯中科成功舉辦2025信息技術應用創新產教融合交流會
龍芯中科助力2025教育信息技術應用創新大賽成功舉辦
誠邁科技信創電腦助力2025第二屆教育信息技術應用創新大賽圓滿收官
寶馬南京信息技術有限公司開業
嵌入式接口通識知識之CAN接口
易華錄入選國家級信息技術應用創新典型解決方案
“信息技術應用產學協同人才培養行動計劃”正式發布,誠邁科技入選首批參與單位
佛瑞亞如何通過信息技術推動業務增長
飛騰主板為信創產業發展提高硬實力
DEKRA德凱成為沙特通信和信息技術設備技術法規認證機構
科普|信創是什么?一文讀懂“信息技術應用創新”戰略
如何驗證CAN控制器的錯誤響應機制?
英創信息技術關于新CAN驅動的錯誤幀定義
評論