在前一段时间推送的几篇文章中涉及到了几种不同的通讯方式,在每一个通讯方式讲解时都有提到校验,而且每一种通讯中的校验也是不尽相同的,今天小编就和大家一起看一看这些检验到底是怎么回事。
LIN通讯的校验我们先从比较简单的开始,在理解校验之前需要对通讯的基础知识有所了解,因为校验的计算会涉及到基础的概念,如果对基础概念还不清楚的朋友可以参看小编之前推送的文章《汽车上除了CAN通讯还有另外一种总线你需要知道》。
LIN通讯的校验分两种:经典型校验和增强型校验。而其应用又和协议的版本以及通讯的类型有关,LIN2.0以前通讯帧和诊断帧都是使用经典型校验,LIN2.0以及LIN2.0以后通讯帧使用的是增强型校验,而诊断帧还是使用的经典型校验,用一个表格来表示如下
LIN 2.0以前 | LIN2.0以及之后 | |
通讯帧 | 经典型 | 增强型 |
诊断帧 | 经典型 | 经典型 |
两种校验类型的计算
01
经典型校验
经典型校验算法涵盖的范围只有LIN的数据段,即一帧LIN信号的数据段包含几个字节的数据就计算几个字节,计算的时候是累加计算,因为校验字节只有一个字节,所以checksum的数值一定是小于255(0xFF),用一个公式来表示如下:
byte 0 + ... + byte n + checksum = 0xFF 的整数倍
即 checksum = 0xFF - 数据之和的低八位
举例说明:
假设一帧LIN数据如下
0xc0 0x00 0x00 0x0c 0x00 0x00 0x08 0x00
对应的checksum应该是多少呢?
首先计算所有数据的累加和
0xc0+0x00+0x00+0x0c+0x00+0x00+0x08+0x00 = 0xd4
再计算checksum
checksum = 0xff - 0xd4 = 0x2b
所以这一帧数据的checksum是2b
note:
在这个例子中数据的累加和没有超过0xff,如果超过了计算方法是类似的,比如有一个字节不是0x00,而是0xff, 如下:
0xc0 0x00 0x00 0x0c 0x00 0xff 0x08 0x00
那么计算的累加和就是0x1d4,对应的低八位还是0xd4,所以校验和还是0x2b.
02
增强型校验
增强型校验相比于经典型校验最大的区别就是计算的范围变化了,增强型校验需要计算的范围是除了数据段还要加上ID的数值,变化一下计算公式如下:
ID + byte 0 + ... + byte n + checksum = 0xFF 的整数倍
除此之外,在计算上和经典型校验完全一样
举例说明:
假设一帧LIN数据如下:
0x08(ID) 0x30 0x12 0x09 0x22 0x32 0x02 0x87 0x91
第一步仍然是计算累加和
0x08 + 0x30 + 0x12 +0x09 + 0x22 +0x32 +0x02 +0x87 + 0x91 = 0x1c1
第二步计算校验和
累加和低八位是0xc1,0xff - 0xc1 =0x3e
所以这一帧LIN信号的checksum为0x3e
03
3
通讯帧和诊断帧
前面说明了经典型和增强型校验算法,有的朋友可能会疑惑为什么诊断帧都是使用的经典型校验算法,因为在LIN的通讯中诊断帧的ID是固定的,请求的frame ID就是0x3c,响应的frame ID就是0x3d,所以计算不计算ID意义不是很大,所以不管哪个协议的LIN通讯,诊断帧都是使用的经典型校验算法。
CAN通讯的校验在CAN通讯的数据结构中,第五个部分是CRC段,不清楚CAN通讯数据结构的可以参看此前的一篇文章《相比于LIN通讯,大家可能对CAN更感兴趣》,文章对CAN的数据结构进行了详细的说明,这个CRC段就是CAN消息的校验,这个校验是如何计算的呢,下面我们来说一下。
01
生成多项式
理解CRC校验,首先需要了解生成多项式的概念,生成多项式也就是发送方和接受方约定的一个除数而已,发送方和接收方都使用这一个相同的除数进行模2运算,计算结果相同则说明传输数据没有问题,而如果计算结果不同可能传输的数据就出现了问题,目的就是为了保证数据传输的可靠性。
上面提到的模二计算本质上就是异或运算,相同的位为0,不同的位为1,也就是不考虑进位、错位的二进制加减法运算,例如:10011011 + 11001010 = 01010001.
常见的生成多项式:
CRC8 = X8 + X5 + X4 +1
CRC16 = X16 + X15 + X5 +1
CRC12 = X12 + X11 + X3 + X2 + 1
CRC32 = X32 + X26 + X23 + X22 + X16 + X12 + X11 + X10 + X8 + X7 + X5 + X4 + X2 + X1 + 1
每一个生成多项式都是与一个代码相对应的,比如CRC8对应的代码就是100110001
02
通讯校验的过程
假设被处理的报文的多项式为P(X),收发双方约定的多项式为G(X),使用P(X)除以G(X)求得余数多项式R(X),并将余数多项式R(X)附加到被处理报文多项式P(X)后,生成M(X),按照此计算,M(X)除以G(X)的余数应该是0,然后将M(X)发送给接收方,假设接收方接收的报文为N(X),除以同样的除数G(X),余数应该也是零,如果结果为零说明发送和接收序列一致,否则传输出现了问题。
举例说明:
假设待发送的信息为1011001,对应的多项式为X6+X4+X3=1,若选取约定多项式为G(X)=X4+X3+1,其对应的代码为11001,然后使用模二算法求出余数多项式,如下所示:
求余数之前需要将发送消息的生成多项式乘以约定多项式的最高次幂以后做被除数,然后求得的余数为1010,将余数1010附加到发送消息的后边,则发送消息变为10110011010。
接收方接收此数据后,再做除数运算,余数应该为0。
03
CAN总线中使用的生成多项式
前面讲述了CRC校验的基本规律,而在CAN通讯中使用的CRC算法和一般的算法的区别就是生成多项式不同,计算的方式是相同的。
通过下面一个图可以看出不同的CAN使用的生成多项式的差异
传统CAN使用的是CRC15的算法,这个通过CAN的数据结构也可以看出,CRC段的长度就是15位。CAN FD之所以有两种是因为CAN FD的数据长度是可变的,针对不同的数据长度使用的方法不同,低于16字节的使用的是CRC17,高于16字节的使用的是CRC21。
☆ END ☆●DBC文件到底是个啥
●顺着CAN总线的知识给大家说说仪表的故障灯是怎么点亮的
●相比于LIN通讯,大家可能对CAN更感兴趣
●汽车上除了CAN通讯还有另外一种总线你需要知道
点在看,让更多看见。