LIN总线校验和对比解析
目录
核心概念:校验和的作用
1. 经典校验和
2. 增强校验和
对比总结表
如何区分使用哪一种?
举例说明
结论
核心概念:校验和的作用
首先,要明白校验和是干什么的。在LIN帧中,它位于数据场之后,用于检测数据传输过程中是否出现错误。它是对前面传输的一些字节进行一个简单的计算,接收方会进行同样的计算,如果结果不匹配,就认为数据有误,从而丢弃该帧。
关键区别在于:计算校验和时,所包含的字节范围不同。
1. 经典校验和
经典校验和是LIN 1.3及更早版本使用的标准方法。
-
保护对象:只保护数据场本身。
-
计算范围:仅对数据场的8个字节(0-7) 进行求和(如果数据不足8字节,也按8字节计算,未使用的部分视为0)。
-
计算方法:
-
将数据场所有字节(最多8个)相加,得到一个临时和。
-
忽略加法过程中产生的任何进位(即只取和的低8位)。
-
对结果执行“取反”操作(按位取反,即0变1,1变0)。
-
最终得到的这个字节就是经典校验和。
-
-
公式(伪代码):
Checksum_Classic = ~(Data_0 + Data_1 + ... + Data_7)
(注意:忽略进位,结果取单字节) -
优缺点:
-
优点:计算简单。
-
缺点:安全性较低。如果受保护的ID(即帧ID) 在传输中出错了,校验和是无法发现的,因为ID本身不参与计算。攻击者或严重的噪声可能伪造一个具有正确数据但ID错误的消息,而接收方无法识别。
-
适用场景:主要用于LIN 1.3及向下兼容的场合,对安全性要求不高的场景。
2. 增强校验和
增强校验和是从LIN 2.0开始引入的,也是目前推荐使用的方法,因为它提供了更好的错误检测能力。
-
保护对象:保护受保护的ID和数据场。
-
计算范围:包括受保护的帧ID和数据场的所有字节。
-
关键概念:受保护的ID
这不是原始的帧ID(0x00-0x3F),而是对原始ID进行了一个简单的变换,使其包含奇偶校验信息。具体来说:-
ID0 = ID[0] XOR ID[1] XOR ID[2] XOR ID[4] -
ID1 = ~(ID[1] XOR ID[3] XOR ID[4] XOR ID[5])
受保护的ID是一个字节,其低6位是原始ID,高2位是ID1和ID0(ID0是最低有效位)。
简单理解:在计算增强校验和时,你使用的不是原始的Frame ID,而是这个“受保护的ID”字节。
-
-
计算方法:
-
将 “受保护的ID”字节 与数据场所有字节相加,得到一个临时和。
-
同样,忽略加法过程中产生的任何进位。
-
对结果执行“取反”操作。
-
最终得到的这个字节就是增强校验和。
-
-
公式(伪代码):
Checksum_Enhanced = ~(Protected_ID + Data_0 + Data_1 + ... + Data_n)
(注意:忽略进位,结果取单字节) -
优缺点:
-
优点:安全性更高。因为它同时保护了帧ID和数据场,任何一方的传输错误(无论是ID还是数据)都能被检测到。
-
缺点:计算稍复杂一点点(需要先计算受保护的ID)。
-
适用场景:LIN 2.0及以上版本,是所有新设计的默认和推荐选择。
对比总结表
| 特性 | 经典校验和 | 增强校验和 |
|---|---|---|
| 引入版本 | LIN 1.3 及更早 | LIN 2.0 及以上 |
| 保护范围 | 仅数据场 | 受保护的帧ID + 数据场 |
| 计算输入 | Data_0 到 Data_7 | Protected_ID + Data_0 到 Data_n |
| 安全性 | 较低 | 较高 |
| 应用 | 向后兼容,低要求场景 | 现代LIN网络的标准和推荐 |
如何区分使用哪一种?
在LIN规范中,帧的ID决定了它使用哪种校验和。具体规则如下:
-
ID 0x00 - 0x3B:可以使用增强校验和。具体使用哪种由系统设计者决定,但现代设计通常默认使用增强型。
-
ID 0x3C - 0x3F:这些是保留ID,用于特殊功能(如主机请求帧0x3C,诊断帧0x3D/0x3E等)。规范强制规定这些帧必须使用经典校验和。
举例说明
假设有一个LIN帧:
-
帧ID:0x20
-
数据场:2个字节,
0x4A,0x55
-
计算受保护的ID(仅增强校验和需要):
-
原始ID
0x20的二进制是10 0000。 -
根据规则计算
ID0和ID1,得到受保护的ID。假设计算结果为0x80(此处为示例,非精确计算)。
-
-
计算校验和:
-
经典校验和:
Checksum = ~(0x4A + 0x55) = ~(0x9F) = 0x60
(计算时,如果数据不足8字节,其余按0处理) -
增强校验和:
Checksum = ~(0x80 + 0x4A + 0x55) = ~(0x11F) // 忽略进位,取0x1F = ~(0x1F) = 0xE0
-
结论
简单来说:增强校验和比经典校验和更好,因为它把帧的“地址”(ID)也纳入了保护范围,使得通信更可靠。 在现代LIN总线设计和应用中,除非有特殊的兼容性要求,否则都应使用增强校验和。
