前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CAN协议深度解析-简单易懂协议详解[通俗易懂]

CAN协议深度解析-简单易懂协议详解[通俗易懂]

作者头像
全栈程序员站长
发布2022-09-14 16:40:57
2.5K0
发布2022-09-14 16:40:57
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

CAN-bus通信帧共分为数据帧、远程帧、错误帧、过载帧和帧间隔五种类型。

  1. 显形隐形电平

CAN-bus发布了ISO11898和ISO11519两个通信标准,此两个标准中差分电平的特性不相同。

显性电平:总线上只要有1个节点驱动为显性,则总线表现为显性位电平,逻辑解析为“0”。

隐形电平:只有总线上的各节点都不将总线驱动成显性电平,总线才表现为隐形位对应的电平,逻辑解析为“1”。

位填充:位填充是为防止突发错误而设定的功能。当同样的电平持续 5 位时,则添加一个位的反型数据。

  1. 数据帧

数据帧结构上由7个段组成,其中根据仲裁段ID码长度的不同,分为标准帧(CAN2.0A)和扩展帧(CAN2.0B)。

2.1帧起始、帧结束

帧起始和帧结束用于界定一个数据帧,无论是标准数据帧或扩展数据帧都包含这两个段。

2.2仲裁段

CAN-bus是如何解决多个节点同时发送数据,即总线竞争问题?该问题由仲裁段给出答案。

CAN-bus并没有规定节点的优先级,但通过仲裁段帧ID规定了数据帧的优先级。根据CAN2.0标准版本不同,帧ID分为11位和29位两种。帧ID值越小,优先级越高。

2.3 控制段

控制段共6位,标准帧的控制段由扩展帧标志位IDE、保留位r0和数据长度代码DLC组成;扩展帧控制段则由IDE、r1、r0和DLC组成。

2.4 数据段

一个数据帧传输的数据量为0~8个字节,这种短帧结构使得CAN-bus实时性很高,非常适合汽车和工控应用场合。

与其他总线协议相比,CAN-bus的短帧结构具有以下优势:

优势1:数据量小,发送和接收时间短,实时性高。

优势2:数据量小,被干扰的概率小,抗干扰能力强。

2.5 CRC段

CAN-bus使用CRC校验进行数据检错,CRC校验值存放于CRC段。CRC校验段由15位CRC值和1位CRC界定符构成。

代码语言:javascript
复制
//算法1
U16 Can_FD_Analyzer::ComputeCrc15(std::vector<BitState> &bits, U32 num_bits)
{ 
   
    //X15 + X14 + X10 + X8 + X7 + X4 + X3 + X0.
    U16 crc_result = 0;
    for (U32 i = 0; i < num_bits; i++) { 
   
        BitState next_bit = bits[i];

        //Exclusive or
        if ((crc_result & 0x4000) != 0) { 
   
            next_bit = Invert(next_bit);    //if the msb of crc_result is zero, then next_bit is not inverted; otherwise, it is.
        }
        crc_result <<= 1;

        if (next_bit == mSettings->Recessive()) { 
    //normally bit high.
            crc_result ^= 0x4599;
        }
    }

    return crc_result & 0x7FFF;
}

//算法2
U16 Can_FD_Analyzer::MakeCRC15(std::vector<BitState> &bits, U32 num_bits)
{ 
   
    //X15 + X14 + X10 + X8 + X7 + X4 + X3 + X0.
    U16 CRC[15] = { 
    0 };
    for (U32 i = 0; i < num_bits; i++) { 
   
        U32 DoInvert = (bits[i] == mSettings->Recessive()) ^ CRC[14]; //XOR required?
        CRC[14] = (CRC[13] ^ DoInvert); //14
        CRC[13] = CRC[12];
        CRC[12] = CRC[11];
        CRC[11] = CRC[10];
        CRC[10] = (CRC[9] ^ DoInvert); //10
        CRC[9] = CRC[8];
        CRC[8] = (CRC[7] ^ DoInvert); //8
        CRC[7] = (CRC[6] ^ DoInvert); //7
        CRC[6] = CRC[5];
        CRC[5] = CRC[4];
        CRC[4] = (CRC[3] ^ DoInvert); //4
        CRC[3] = (CRC[2] ^ DoInvert); //3
        CRC[2] = CRC[1];
        CRC[1] = CRC[0];
        CRC[0] = DoInvert;
    }

    U16 result = 0; // CRC Result
    for (U32 i = 0; i < 15; i++) { 
   
        result = result | (CRC[i] << i);
    }
    return (U16)result;
}

2.6 ACK段

当一个接收节点接收的帧起始到CRC段之间的内容没发生错误时,它将在ACK段发送一个显性电平。

3. 远程帧

与数据帧相比,远程帧结构上无数据段,由6个段组成,同理分为标准格式和扩展格式,且RTR位为1(隐形电平)。

v 数据帧与远程帧的区别

4. 错误帧

4.1 CAN-bus 错误类型

尽管CAN-bus是可靠性很高的总线,但依然可能出现错误;CAN-bus的错误类型共有5种。

错误类型

详细

CRC错误

发送节点计算得到的CRC值与接收到的CRC值不同

格式错误

传输的数据帧格式与任何一种合法的帧格式不符

应答错误

发送节点再ACK阶段没有接收到应答信号

位发送错误

发送节点在发送时发送总线电平与发送电平不同

位填充错误

通信线缆上传输信号违反“位填充”规则

当出现5种错误类型之一时,发送或接收节点将发送错误帧。错误帧的结构如下,其中错误标识分为主动错误标识和被动错误标识。

为防止自身由于某些原因导致无法正常接收的节点一直发送错误帧,干扰其他节点通信,CAN-bus规定了节点的3种状态机器行为。

  1. 过载帧

当某些接收节点没有做好接收下一帧数据的准备时,将发送过载帧以通知发送节点;过载帧由过载标志和过载帧界定符组成。过载帧结构如下:

由于存在多个节点同时过载且过载帧发送有时间差问题,可能出现过载标志叠加后超过6个位的现象。

  1. 帧间隔

帧间隔用于将数据帧或远程帧和他们之前的帧分离开,但过载帧和错误帧前面不会插入帧间隔。

  1. CAN-bus整个链路层处理数据流程

8.波形实例

本实例使用 Kingst LA5016 usb 逻辑分析仪检测CAN数据通讯。下图2是一个完整的数据包分析截图。从图中可以看到,LA5016的CAN解析模块,将协议数据分析为 ID(协议id号),RTR(远程帧/数据帧标识), DLC(数据长度),Data(传输数据), CRC, ACK/NAK 。

图1数据包的ID号为0x002, RTR:false(数据帧), DLC:0x8(8个数据),Data:数据,CRC为0x3845(15位), ACK:应答。

圆形白点:逻辑数据。

方形白点:填充位。

图1 CAN解析参数设置

图2 CAN标准帧

图3 仲裁域

图4 CRC域及ACK

另外,CAN解析参数显示的格式可以分为:二进制,十进制,十六进制,ASCII,及 ASCII&十六进制。同时可以将协议数据按包格式导出。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/154167.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档