大家好,又见面了,我是你们的朋友全栈君。
CAN-bus通信帧共分为数据帧、远程帧、错误帧、过载帧和帧间隔五种类型。
CAN-bus发布了ISO11898和ISO11519两个通信标准,此两个标准中差分电平的特性不相同。
显性电平:总线上只要有1个节点驱动为显性,则总线表现为显性位电平,逻辑解析为“0”。
隐形电平:只有总线上的各节点都不将总线驱动成显性电平,总线才表现为隐形位对应的电平,逻辑解析为“1”。
位填充:位填充是为防止突发错误而设定的功能。当同样的电平持续 5 位时,则添加一个位的反型数据。
数据帧结构上由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种状态机器行为。
当某些接收节点没有做好接收下一帧数据的准备时,将发送过载帧以通知发送节点;过载帧由过载标志和过载帧界定符组成。过载帧结构如下:
由于存在多个节点同时过载且过载帧发送有时间差问题,可能出现过载标志叠加后超过6个位的现象。
帧间隔用于将数据帧或远程帧和他们之前的帧分离开,但过载帧和错误帧前面不会插入帧间隔。
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