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

CAN协议深度解析-简单易懂协议详解[通俗易懂]CAN-bus通信帧共分为数据帧、远程帧、错误帧、过载帧和帧间隔五种类型。显形隐形电平CAN-bus发布了ISO11898和ISO11519两个通信标准,此两个标准中差分电平的特性不相同。显性电平:总线上只要有1个节点驱动为显性,则总线表现为显性位电平,逻辑解析为“0”。隐形电平:只有总线上的各节点都不将总线驱动成显性电平,总线才表现为隐形位对应的电平,逻辑解析为“1”。位填充:位填充是为防止突发错误而设定的功能。当同样的电平持续5位时,则添加一个位的反型数据。数据帧数据帧结构上

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

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界定符构成。
在这里插入图片描述

//算法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&十六进制。同时可以将协议数据按包格式导出。
在这里插入图片描述
在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(1)


相关推荐

  • DS18B20温度传感器的工作原理_基于ds18b20的温度报警仿真

    DS18B20温度传感器的工作原理_基于ds18b20的温度报警仿真数字温度传感器(DS18B20)传感器参数

  • Windows下openssl安装及使用「建议收藏」

    配置过程中需要生成一些mak文件,这些生成代码用perl脚本生成,所以要安装一个ActivePerl.网址:http://www.activestate.com/activeperl/下载后直接安装就行了!下载openssl网址http://www.openssl.org/我用的是openssl-0.9.8g版本,解压到c盘根目录。安装步骤:(可以参照o…

  • php采集程序的方法有哪些_php采集插件

    php采集程序的方法有哪些_php采集插件php采集程序的方法在我们程序开发的过程中是经常要遇到的,那我们常用的采集方法有哪些呢,下面我们一起来看具体的方法,还附带有具体实例,让大家一看就明白,会用。方法一:file_get_contents($url);$url=”http://www.seostudying.com”;$con=file_get_contents($url); //采集到的内容将存储到$c

  • C++临界锁CCriticalSection在线程中的使用

    C++临界锁CCriticalSection在线程中的使用#define_AFXDLL#include<afxmt.h>#include<iostream>usingnamespacestd;CCriticalSectioncritical;inttick=0;DWORDWINAPIFunc1(LPVOIDlpParam);DWORD__stdcallFunc1(LPVOIDlpParam){critical.Lock();tick+=10;cout&lt.

  • centos安装python3

    centos安装python3centos安装python31、查看安装默认安装位置whereispython2、python2.7默认安装是在/usr/bin目录中,切换到/usr/bin/cd/usr/bin/3、安装相关的依赖包yuminstall-yepel-releasezlib-develbzip2-developenssl-develncurses-develsqlite-develreadline-develtk-develgccmake4、安装pipyuminsta

  • 龙族h路明非和诺诺_龙族六

    龙族h路明非和诺诺_龙族六清晨,路明非正在熟睡,‘起床了路明非,太阳照屁股了!’芬格尔大喊,路明非终于被惊醒,揉了揉眼睛不满道:‘芬格尔你搞毛线啊!今天可是星期天!’‘星期你妹啊!今天要出任务了你TM还睡!’路明非一听有任务脑子瞬间清醒拿起手机一看“卧槽(#゚Д゚)!都八点了,要迟到了,再晚就要挨骂了。”芬格尔忙说“那你赶紧穿上衣服走了”。“哦,好好,那咱们走吧”。两人穿好衣服急急忙忙的向机场过去。等两人终于到…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号