CAN错误帧定义

供稿:成都英创信息技术有限公司

  • 关键词:CAN,错误帧
  • 作者:emtronix
  • 摘要:CAN总线产生的错误以错误帧的形式上报给应用层。设置注册表[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\CAN1] BusErrorReport项为1可以让驱动上报CAN总线错误帧,为0,驱动不会上报错误帧。

  CAN总线产生的错误以错误帧的形式上报给应用层。设置注册表[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\CAN1] BusErrorReport项为1可以让驱动上报CAN总线错误帧,为0,驱动不会上报错误帧。


帧格式


  CAN帧结构体定义如下,当CAN_FRAME中CAN_ID的error为1时,表示该帧为错误帧。

  typedef struct{

       unsigned int id:29;

       unsigned int error:1;      

       unsigned int remote:1;

       unsigned int extended:1;

  }CAN_ID;


  typedef struct _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仲裁丢失错误

  #define CAN_ERR_LOSTARB  0x00000002U

  当错误帧结构体中CAN_ID& CAN_ERR_LOSTARB为真时,表明该错误产生。


  controller problems控制器出错

  #define CAN_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通信协议出错


  #define CAN_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错误


  #define CAN_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为真时,表明控制器重启。

发布时间:2017年1月3日 15:28  人气:   审核编辑(李晨晖)
更多内容请访问(成都英创信息技术有限公司
相关链接

我有需求