CAN總線產(chǎn)生的錯(cuò)誤以錯(cuò)誤幀的形式上報(bào)給應(yīng)用層。設(shè)置注冊表[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\CAN1] BusErrorReport項(xiàng)為1可以讓驅(qū)動(dòng)上報(bào)CAN總線錯(cuò)誤幀,為0,驅(qū)動(dòng)不會(huì)上報(bào)錯(cuò)誤幀。
幀格式
CAN幀結(jié)構(gòu)體定義如下,當(dāng)CAN_FRAME中CAN_ID的error為1時(shí),表示該幀為錯(cuò)誤幀。
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;
錯(cuò)誤幀定義
可以參考例程中庫頭文件sdk_can.h,錯(cuò)誤幀標(biāo)記為CAN_ID的error,錯(cuò)誤類型存放在CAN_ID中,根據(jù)不同類型的錯(cuò)誤,詳細(xì)信息存放在幀結(jié)構(gòu)體CAN_FRAME的data中。
一個(gè)錯(cuò)誤幀中,可以包含多種錯(cuò)誤類型的錯(cuò)誤信息。
CAN_ERR_TX_TIMEOUT錯(cuò)誤
WINCE中暫時(shí)保留。
lost arbitration仲裁丟失錯(cuò)誤
#defineCAN_ERR_LOSTARB0x00000002U
當(dāng)錯(cuò)誤幀結(jié)構(gòu)體中CAN_ID& CAN_ERR_LOSTARB為真時(shí),表明該錯(cuò)誤產(chǎn)生。
controller problems控制器出錯(cuò)
#defineCAN_ERR_CRTL0x00000004U
當(dāng)錯(cuò)誤幀結(jié)構(gòu)體中CAN_ID& CAN_ERR_CRTL為真時(shí),表明該錯(cuò)誤產(chǎn)生。
詳細(xì)信息存放在錯(cuò)誤幀結(jié)構(gòu)體data[1]中。
接收buffer溢出
data[0] &0x01為真,表明該錯(cuò)誤產(chǎn)生。
需要及時(shí)處理接收到的數(shù)據(jù)包。
發(fā)送buffer溢出
data[0] &0x02為真,表明該錯(cuò)誤產(chǎn)生。
可能由于瞬間發(fā)送的數(shù)據(jù)包過多導(dǎo)致。
接收錯(cuò)誤達(dá)到警告級別
data[0] &0x04為真,表明該錯(cuò)誤產(chǎn)生。
當(dāng)該錯(cuò)誤提示,表明短期內(nèi)接收產(chǎn)生的錯(cuò)誤較多。
發(fā)送錯(cuò)誤達(dá)到警告級別
data[0] &0x08為真,表明該錯(cuò)誤產(chǎn)生。
當(dāng)該錯(cuò)誤提示,表明短期內(nèi)發(fā)送產(chǎn)生的錯(cuò)誤較多。
接收錯(cuò)誤達(dá)到嚴(yán)重錯(cuò)誤級別
data[0] &0x10為真,表明該錯(cuò)誤產(chǎn)生。
當(dāng)該錯(cuò)誤提示,表明短期內(nèi)接收產(chǎn)生的錯(cuò)誤過多。應(yīng)當(dāng)暫停CAN通信,檢查錯(cuò)誤原因。
發(fā)送錯(cuò)誤達(dá)到嚴(yán)重錯(cuò)誤級別
data[0] &0x20為真,表明該錯(cuò)誤產(chǎn)生。
當(dāng)該錯(cuò)誤提示,表明短期內(nèi)發(fā)送產(chǎn)生的錯(cuò)誤過多。應(yīng)當(dāng)暫停CAN通信,檢查錯(cuò)誤原因。
恢復(fù)到錯(cuò)誤激活狀態(tài)
data[0] &0x40為真,表明恢復(fù)到錯(cuò)誤激活狀態(tài)。
CAN通信協(xié)議出錯(cuò)
#defineCAN_ERR_PROT0x00000008U
當(dāng)錯(cuò)誤幀結(jié)構(gòu)體中CAN_ID& CAN_ERR_PROT為真時(shí),表明該錯(cuò)誤產(chǎn)生。
詳細(xì)信息存放在錯(cuò)誤幀結(jié)構(gòu)體data[2]和data[3]中,其中data[2]表明協(xié)議錯(cuò)誤類型,data[3]表明協(xié)議出錯(cuò)的位置
(類型)單bit出錯(cuò)
data[2] &0x01為真,表明協(xié)議單bit出錯(cuò)。
(類型)幀格式出錯(cuò)
data[2] &0x02為真,表明幀格式出錯(cuò)。
(類型)位填充出錯(cuò)
data[2] &0x04為真,表明位填充出錯(cuò)。
(類型)dominant bit發(fā)送失敗
data[2] &0x08為真,表明dominant bit發(fā)送失敗。
(類型)recessive bit發(fā)送失敗
data[2] &0x10為真,表明recessive bi發(fā)送失敗。
(類型)總線過載
data[2] &0x20為真,表明總線過載。
(類型)active error announcement
data[2] &0x40為真,active error announcement。
(類型)傳輸出錯(cuò)
data[2] &0x80為真,傳輸出錯(cuò)。
位置
data[3]為0x03表明協(xié)議SOF幀頭位置
data[3]為0x02表明協(xié)議ID第28-21bits(SFF:10-3)
data[3]為0x06表明協(xié)議ID第20-18bits(SFF:2-0)
data[3]為0x04表明協(xié)議substitute RTR位(SFF:RTR)
data[3]為0x05表明協(xié)議identifier extension標(biāo)準(zhǔn)擴(kuò)展位
data[3]為0x07表明協(xié)議ID第17-13bits
data[3]為0x0F表明協(xié)議ID第12-5bits
data[3]為0x0E表明協(xié)議ID第4-0bits
data[3]為0x0C表明協(xié)議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應(yīng)答位
data[3]為0x1B表明ACK分隔符
data[3]為0x1A表明幀尾
data[3]為0x12表明間歇
收發(fā)狀態(tài)錯(cuò)誤
#defineCAN_ERR_TRX0x00000010U
當(dāng)錯(cuò)誤幀結(jié)構(gòu)體中CAN_ID& CAN_ERR_TRX為真時(shí),表明在收發(fā)時(shí)CAN狀態(tài)有誤。
詳細(xì)信息存放在錯(cuò)誤幀結(jié)構(gòu)體data[4]中,data[4]中1個(gè)字節(jié)8bit中,高4位表示CANL值,分別代表如下CANH錯(cuò)誤
高4位表示CANH值,分別代表如下CANL錯(cuò)誤
高低位值以排列組合方式存在。
無ACK錯(cuò)誤
#defineCAN_ERR_ACK0x00000020U
當(dāng)錯(cuò)誤幀結(jié)構(gòu)體中CAN_ID& CAN_ERR_ACK為真時(shí),表明該錯(cuò)誤產(chǎn)生。
總線關(guān)閉
#defineCAN_ERR_BUSOFF0x00000040U
當(dāng)錯(cuò)誤幀結(jié)構(gòu)體中CAN_ID& CAN_ERR_BUSOFF為真時(shí),表明總線關(guān)閉。
總線錯(cuò)誤
#defineCAN_ERR_BUSERROR0x00000080U
當(dāng)錯(cuò)誤幀結(jié)構(gòu)體中CAN_ID& CAN_ERR_BUSERROR為真時(shí),表明該錯(cuò)誤產(chǎn)生。
該錯(cuò)誤通常與其它錯(cuò)誤一起發(fā)出。
控制器重啟
#defineCAN_ERR_RESTARTED0x00000100U
當(dāng)錯(cuò)誤幀結(jié)構(gòu)體中CAN_ID& CAN_ERR_RESTARTED為真時(shí),表明控制器重啟。
-
嵌入式主板
+關(guān)注
關(guān)注
7文章
6085瀏覽量
35218
發(fā)布評論請先 登錄
相關(guān)推薦
評論