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账号...

(0)
blank

相关推荐

  • ip协议——ip报文格式[通俗易懂]

    ip协议——ip报文格式[通俗易懂]版本:占4位,指IP协议的版本号。目前的主要版本为IPV4,即第4版本号,也有一些教育网和科研机构在使用IPV6。在进行通信时,通信双方的IP协议版本号必须一致,否则无法直接通信。 首部长度

  • jmeter线程组的属性_netty线程模型详解

    jmeter线程组的属性_netty线程模型详解情境:最近用winform做一个小程序,主要是用来执行一些sql语句,无奈数据量太大,执行一次要二十分钟左右,执行期间界面根本不能再进行其它操作,就连最小化窗口都不行,一动就跟死机差不多了.因此到网上搜了一下,找到.net后台线程的概念.(高手请绕道!)前台线程和后台线程之间的选择.NETFramework中的所有线程都被指定为前台线程或后台线程。这两种线程唯一的区别是—后台线程不会

    2022年10月11日
  • CEGUI0.8.4例子

    CEGUI0.8.4例子#defineGLUT_DISABLE_ATEXIT_HACK#pragmacomment(lib,”glew32.lib”)#include<stdlib.h>#include<gl/glew.h>#include<gl/glut.h>#include<CEGUI/CEGUI.h>#include<CEGUI/RendererM…

  • ExpandableListView实例(一)_数据库增删改查处理和listitem点击长按处理

    ExpandableListView实例(一)_数据库增删改查处理和listitem点击长按处理本例说明:1.实例中表现层与数据处理层分开,代码可复用性强,如果能看懂代码对算法会有提高.2.组和子条目上”点击”事件处理,能够区分操作的是组还是子条目,并且得到组和子条目的内容.3.组和子条目上”长按”事件处理,能够区分组和子条目,并且得到组和子条目的内容.4.自定义条目样式,灵活与数据库中字段绑定.5.实现对DB的增删改查,并且操作后自动刷新.6.使用数据库处理框架AH

  • IIc通信协议(一)[通俗易懂]

    IIc通信协议(一)[通俗易懂]–>物理结构:–>通信原理:通过对SCL和SDA线高低电平时序的控制,来产生I2C总线协议所需要的信号进行数据的传递。在总线空闲状态时,这两根线一般被上面所接的上拉电阻拉高,保持着高电平。–>iic总线协议:1】起始和结束信号总是由主设备产生。起始信号:SCL高电平空闲,SDA由高变低;(SDA拉低后SCL再拉低)结束信号:SCL高电平空闲…

  • Go语言爱好者周刊:第 3 期

    Go语言爱好者周刊:第 3 期这里记录每周值得分享的Go语言相关内容,周日发布。欢迎投稿,推荐或自荐文章/软件/资源等,请提交issue[1]。鉴于大部分人可能没法坚持把英文文章看完,因此,周…

发表回复

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

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