关于新CAN驱动的错误帧定义

 2016-12-30 17:59:37         

  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中。


  一个错误帧中,可以包含多种错误类型的错误信息。


    1. CAN_ERR_TX_TIMEOUT错误

        WINCE中暂时保留。



    2. lost arbitration仲裁丢失错误

        #define CAN_ERR_LOSTARB  0x00000002U

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



    3. controller problems控制器出错

      #define CAN_ERR_CRTL  0x00000004U

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

        详细信息存放在错误帧结构体data[1]中。


            接收buffer溢出

            data[1] &0x01为真,表明该错误产生。

        需要及时处理接收到的数据包。


            发送buffer溢出

            data[1] &0x02为真,表明该错误产生。

            可能由于瞬间发送的数据包过多导致。


            接收错误达到警告级别

            data[1] &0x04为真,表明该错误产生。

            当该错误提示,表明短期内接收产生的错误较多。


            发送错误达到警告级别

            data[1] &0x08为真,表明该错误产生。

            当该错误提示,表明短期内发送产生的错误较多。


            接收错误达到严重错误级别

            data[1] &0x10为真,表明该错误产生。

            当该错误提示,表明短期内接收产生的错误过多。应当暂停CAN通信,检查错误原因。


            发送错误达到严重错误级别

       data[1] &0x20为真,表明该错误产生。

       当该错误提示,表明短期内发送产生的错误过多。应当暂停CAN通信,检查错误原因。

 

            恢复到错误激活状态

       data[1] &0x40为真,表明恢复到错误激活状态。



    4. 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表明间歇



    5. 收发状态错误

      #define CAN_ERR_TRX  0x00000010U

    当错误帧结构体中CAN_ID& CAN_ERR_TRX为真时,表明在收发时CAN状态有误。

    详细信息存放在错误帧结构体data[4]中,data[4]中1个字节8bit中,高4位表示CANL值,分别代表如下CANH错误

CAN错误帧定义.gif

    高4位表示CANH值,分别代表如下CANL错误

CAN错误帧定义.gif

    高低位值以排列组合方式存在。



    6无ACK错误

      #define CAN_ERR_ACK  0x00000020U

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



    7总线关闭

      #define CAN_ERR_BUSOFF  0x00000040U

      当错误帧结构体中CAN_ID& CAN_ERR_BUSOFF为真时,表明总线关闭。



    8总线错误

      #define CAN_ERR_BUSERROR  0x00000080U

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

   该错误通常与其它错误一起发出。



    9控制器重启

      #define CAN_ERR_RESTARTED  0x00000100U 

    当错误帧结构体中CAN_ID& CAN_ERR_RESTARTED为真时,表明控制器重启。



示例

  当收到一帧错误帧,错误帧ID为0x88,data数据data[0]~data[4]为0x00,0x00,0x00,0x1b,0x00时

       查ID可知,当前CAN出现总线错误+通信错误,即0x80 && 0x08。根据通信错误data[2]和data[3]可知,上报故障为ACK解析出错,即data[3]=0x1b。由此判断有可能CAN总线受到干扰,或者有设备发送协议有错。