第三章:LIN总线协议基础——帧结构、同步间隔场、同步场、标识符场、数据场、校验和场
好,咱们今天来聊聊LIN总线最核心的东西——帧结构。说实话,我刚接触LIN的时候,觉得它比CAN简单太多了,但真正做项目才发现,越是简单的东西,越容易在细节上翻车。你想想看,LIN总线就一根线,所有节点都挂在这根线上,那怎么保证大家不乱说话?靠的就是这套严谨的帧结构。
一个完整的LIN帧,说白了就是一场精心编排的对话。主节点先开口,从节点听着,然后按规矩回应。整个帧由这么几个部分组成:同步间隔场、同步场、标识符场、数据场、校验和场。咱们一个一个拆开讲。
3.1 同步间隔场(Break Field)
这个场是帧的开始,也是我最想提醒你注意的地方。同步间隔场的作用是什么?就是告诉总线上所有节点:“注意,我要开始说话了!”
它的电气特性很特别——主节点把总线拉低至少13个位时间。为什么是13?因为正常的字节传输,起始位加8个数据位加停止位,最多也就拉低9个位时间。13这个数字,就是为了跟正常数据区分开。我遇到过一个小白工程师,他把同步间隔场设成了10个位时间,结果从节点死活不响应,查了半天才发现是间隔场长度不够。
3.2 同步场(Sync Field)
同步场的内容固定是0x55,也就是二进制01010101。你可能会问,为什么非得是这个值?
原因很简单:0x55提供了最密集的电平跳变。每个位都在0和1之间切换,从节点可以利用这个信号来校准自己的位时钟。说白了,就是让从节点知道:“哦,原来主节点的一个位时间这么长,我得调整一下自己的时钟。”
我个人习惯在调试时,先用示波器抓一下同步场的波形。如果看到0x55的波形不是均匀的方波,那基本可以断定主节点的波特率有问题,或者总线上有干扰。
3.3 标识符场(Identifier Field, ID)
标识符场占一个字节,但实际只用了6位作为ID,高两位是奇偶校验位。所以LIN总线上最多支持64个不同的ID(0x00到0x3F)。
这里有个容易混淆的地方:ID并不代表节点的地址,而是代表消息的含义。比如ID=0x01可能表示“车速信号”,ID=0x02表示“发动机转速”。哪个节点发送这个ID的消息,是由系统设计时定好的。我见过有人把ID当成节点地址来用,结果通信乱成一锅粥。
| ID范围 | 用途 | 数据长度 |
|---|---|---|
| 0x00 - 0x3B | 普通信号 | 2/4/8字节 |
| 0x3C - 0x3D | 诊断请求/响应 | 8字节 |
| 0x3E | 保留 | - |
| 0x3F | 帧错误标识 | - |
嗯,这里要注意:ID=0x3C和0x3D是专门给诊断用的,普通信号别去占用。我曾经在一个项目里看到有人把车速信号定义在0x3C上,结果诊断工具一上来就冲突,查了两天才找到原因。
3.4 数据场(Data Field)
数据场就是真正要传的数据了。LIN 2.x规范中,数据长度可以是2、4、8字节,具体由ID决定。怎么决定的?看ID的低4位:
- 如果低4位在0x00-0x07之间,数据长度为2字节
- 如果低4位在0x08-0x3B之间,数据长度为8字节
- 诊断帧固定为8字节
这个规则我一开始也觉得有点绕,后来干脆写了个小函数来查表。你想想看,如果发送方和接收方对数据长度的理解不一致,那解析出来的数据全是错的。所以我的建议是:在系统设计阶段,就把每个ID对应的数据长度写进文档里,别靠代码去猜。
3.5 校验和场(Checksum Field)
校验和场是帧的最后一个字节,用来检查数据传输有没有出错。LIN 2.x支持两种校验和:
- 经典校验和(Classic Checksum):只对数据场做校验
- 增强校验和(Enhanced Checksum):对标识符场和数据场一起做校验
我个人更推荐用增强校验和,因为连ID都一起保护了,安全性更高。计算方法是:把所有参与校验的字节加起来,取低8位,然后取反。举个例子:
// 假设数据场是 0x55, 0xAA, 0x01
// 增强校验和:ID(0x01) + 0x55 + 0xAA + 0x01 = 0x01 + 0x55 + 0xAA + 0x01 = 0x101
// 取低8位:0x01
// 取反:0xFE
// 所以校验和字节是 0xFE
3.6 完整的帧结构
把上面这些场串起来,一个完整的LIN帧长这样:
| 同步间隔场 | 同步场(0x55) | 标识符场 | 数据场(2/4/8字节) | 校验和场 |
| 13+位低电平 | 0x55 | ID+奇偶 | 数据... | 校验和 |
总线上没有数据的时候,保持高电平(隐性)。主节点发送同步间隔场时,把总线拉低。从节点检测到低电平超过11位时间,就知道要开始接收新帧了。
说实话,LIN的帧结构比CAN简单太多了,但正因为简单,反而容易让人掉以轻心。我见过最离谱的问题,是一个工程师把同步间隔场和同步场的顺序搞反了,结果从节点一直收不到正确的同步信号。你想想看,顺序都错了,后面的数据怎么可能对?
好了,这一章的内容就到这里。下一章咱们聊聊LIN的调度表,那才是真正体现主节点“掌控力”的地方。到时候我会分享一些实际项目中的调度策略,保证让你少走弯路。