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_LOSTARB 0x00000002U
当错误帧结构体中CAN_ID& CAN_ERR_LOSTARB为真时,表明该错误产生。
controller problems控制器出错
#defineCAN_ERR_CRTL 0x00000004U
当错误帧结构体中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_PROT 0x00000008U
当错误帧结构体中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表明间歇
收发状态错误
#define CAN_ERR_TRX 0x00000010U
当错误帧结构体中CAN_ID& CAN_ERR_TRX为真时,表明在收发时CAN状态有误。
详细信息存放在错误帧结构体data[4]中,data[4]中1个字节8bit中,高4位表示CANL值,分别代表如下CANH错误
高4位表示CANH值,分别代表如下CANL错误
高低位值以排列组合方式存在。
无ACK错误
#defineCAN_ERR_ACK 0x00000020U
当错误帧结构体中CAN_ID& CAN_ERR_ACK为真时,表明该错误产生。
总线关闭
#define CAN_ERR_BUSOFF 0x00000040U
当错误帧结构体中CAN_ID& CAN_ERR_BUSOFF为真时,表明总线关闭。
总线错误
#define CAN_ERR_BUSERROR 0x00000080U
当错误帧结构体中CAN_ID& CAN_ERR_BUSERROR为真时,表明该错误产生。
该错误通常与其它错误一起发出。
控制器重启
#define CAN_ERR_RESTARTED 0x00000100U
当错误帧结构体中CAN_ID& CAN_ERR_RESTARTED为真时,表明控制器重启。
全部0条评论
快来发表一下你的评论吧 !