转自:https://zhuanlan.zhihu.com/p/343607068
CAN接口兼容规范2.0A和2.0B(主动),位速率高达1兆位/秒。它可以接收和发送11位标识符的标准帧,也可以接收和发送29位标识符的扩展帧。
扩展帧的仲裁域有29位,可以出现2^29中报文,且在数据链路上是有间隙的(对操作者透明)。
标准帧的仲裁域是连续的11位,可以出现2^11种报文;
控制帧中的DLC(数据长度)完全相同,但保留位不同,标准帧IDE、R0,扩展帧R1、R0,必须以显性电平发送(由数据链路层操作),对程序员透明;
其它的都一模一样,所以,其实CAN标准帧和扩展帧只是在ID的长度上不一样,扩展帧可以支持更多的CAN节点而已。
注意:这里的帧ID 并不是表示发送的目的地址,而是表示访问总线的消息的优先级(帧ID值越小,优先级越高,最小是0x00000000)。
-bus通信帧共分为数据帧、远程帧、错误帧、过载帧和帧间隔五种类型。
1. 显形隐形电平
CAN-bus发布了ISO11898和ISO11519两个通信标准,此两个标准中差分电平的特性不相同。
显性电平:总线上只要有1个节点驱动为显性,则总线表现为显性位电平,逻辑解析为“0”。
隐形电平:只有总线上的各节点都不将总线驱动成显性电平,总线才表现为隐形位对应的电平,逻辑解析为“1”。
位填充:位填充是为防止突发错误而设定的功能。当同样的电平持续 5 位时,则添加一个位的反型数据。
2. 数据帧
数据帧结构上由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 orif ((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); //14CRC[13] = CRC[12];CRC[12] = CRC[11];CRC[11] = CRC[10];CRC[10] = (CRC[9] ^ DoInvert); //10CRC[9] = CRC[8];CRC[8] = (CRC[7] ^ DoInvert); //8CRC[7] = (CRC[6] ^ DoInvert); //7CRC[6] = CRC[5];CRC[5] = CRC[4];CRC[4] = (CRC[3] ^ DoInvert); //4CRC[3] = (CRC[2] ^ DoInvert); //3CRC[2] = CRC[1];CRC[1] = CRC[0];CRC[0] = DoInvert;}U16 result = 0; // CRC Resultfor (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种。
序号 | 错误类型 | 详细 |
1 | CRC错误 | 发送节点计算得到的CRC值与接收到的CRC值不同 |
2 | 格式错误 | 传输的数据帧格式与任何一种合法的帧格式不符 |
3 | 应答错误 | 发送节点再ACK阶段没有接收到应答信号 |
4 | 位发送错误 | 发送节点在发送时发送总线电平与发送电平不同 |
5 | 位填充错误 | 通信线缆上传输信号违反“位填充”规则 |
当出现5种错误类型之一时,发送或接收节点将发送错误帧。错误帧的结构如下,其中错误标识分为主动错误标识和被动错误标识。
为防止自身由于某些原因导致无法正常接收的节点一直发送错误帧,干扰其他节点通信,CAN-bus规定了节点的3种状态机器行为。
5. 过载帧
当某些接收节点没有做好接收下一帧数据的准备时,将发送过载帧以通知发送节点;过载帧由过载标志和过载帧界定符组成。过载帧结构如下:
由于存在多个节点同时过载且过载帧发送有时间差问题,可能出现过载标志叠加后超过6个位的现象。
6. 帧间隔
帧间隔用于将数据帧或远程帧和他们之前的帧分离开,但过载帧和错误帧前面不会插入帧间隔。
7. 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&十六进制。同时可以将协议数据按包格式导出。