LIN总线基础讲解之二—LIN总线网络的物理层与帧结构
目录
1 概述
2 物理层详解
2.1 拓扑结构
2.2 传输介质与电平
2.3 位速率与同步
3 LIN帧结构
3.1 同步间隔段
3.2 同步段
3.3 受保护的ID段
3.4 数据段
3.5 校验和段
4 举例说明
5 总结
1 概述
在上一篇文章里,我们认识了LIN总线,知道它成本低、结构简单,主要用在车上的舒适功能控制。今天,我们就来把它“拆开看看”,一起走进导线内部,看看电信号是怎么工作的,也学一学LIN总线自己那套独特的“语言”——也就是它的帧结构。
搞懂物理层和帧结构,是设计LIN节点、排查故障、做深度优化的基本功。就像建筑师要懂材料,程序员要懂代码一样,这是绕不开的基础。
2 物理层详解
物理层定义了在传输介质上传输原始比特流所需的技术规范。简单说,就是“信号长什么样,用什么线来传”。
2.1 拓扑结构
LIN网络采用严格的主从结构和总线型拓扑。
主节点: 有且仅有一个。它通常是网络中的“大脑”,比如一个车身控制模块。主节点控制着整个网络的通信节奏。
从节点: 最多16个。它们是执行具体任务的“手脚”,如车窗电机控制器、门锁开关等。
总线型拓扑: 所有节点(主和从)都并联在同一根总线上。这种结构简单,易于扩展。
一个形象的比喻: 主节点就像课堂上的老师,而从节点就是学生。老师负责提问(发起通信),指定某位学生来回答(从节点响应)。没有老师的允许,学生不能随意发言,这保证了课堂秩序。

2.2 传输介质与电平
线束: LIN总线仅使用两根线:
- LIN信号线: 一根,用于传输数据。
- GND: 一根,作为公共参考地。
- 省去一根信号线(对比CAN总线)是其低成本的关键之一。
电压电平(核心概念):LIN总线通过信号线上的电压值来表示逻辑“0”和“1”。这里引入了两个非常重要的概念:显性电平 和 隐性电平。
- 显性电平: 代表逻辑‘0’。此时,总线电压被下拉至接近GND的电压(通常≤1.2V)。这个电平是“强大”的,因为它能够覆盖掉总线上的其他电压。
- 隐性电平: 代表逻辑‘1’。此时,总线通过一个上拉电阻被上拉至电池电压(通常是12V,在系统工作时,MCU端看到的通常是5V或3.3V)。这个电平是“弱小”的,默认状态。
为什么这么设计?——线与逻辑:这种显性/隐性的设计实现了一种“线与”逻辑。如果网络上任何一个节点将总线拉低到显性电平(‘0’),那么无论其他节点想输出什么,整个总线都被表现为显性电平。只有当所有节点都“放手”(输出隐性电平‘1’)时,总线才表现为隐性电平。这为错误检测和帧类型的扩展提供了基础。

2.3 位速率与同步
速率: LIN总线支持的速率范围为1 kbps 到 20 kbps。最常用的速率是19.2 kbps(在晶体振荡器精度支持下,可以达到很好的性价比)。
同步机制: 由于从节点可能使用成本较低、精度较差的RC振荡器,其自身产生的波特率可能与主节点不一致。为了解决这个问题,LIN帧中包含了同步段,专门用于从节点与主节点的波特率进行同步校准。这是LIN协议的一个精妙设计,我们稍后会详细解释。
3 LIN帧结构
LIN总线上的所有通信都以“帧”为单位进行。一帧LIN报文是承载信息的最小完整单元,就像一列火车,有车头、车厢和车尾。它由报头 和响应 两部分组成,具体的帧结构如下:

3.1 同步间隔段
- 作用: 这是一个“醒醒,注意了!”的信号。它用来唤醒处于休眠状态的从节点,并标志着一帧报文的开始。
- 形态: 它由一个持续至少13位时间的显性电平(‘0’),紧跟一个至少1位时间的隐性电平(‘1’) 的“间隔符”构成。
- 意义: 在正常的LIN通信中,不会出现如此长时间的显性位。因此,同步间隔段是一个独一无二、极易识别的“起始信号”,确保了所有从节点都能可靠地识别到一帧的开始。

3.2 同步段
(1)作用: 一个“对表”信号。用于从节点校准自己的波特率,使其与主节点保持一致。
(2)内容: 固定为 0x55(十六进制),用二进制表示是 01010101。
(3)工作原理:
- 主节点以精确的波特率发送这个0x55。
- 从节点接收到这个字节后,通过测量第一个下降沿(从‘1’到‘0’)和最后一个上升沿(从‘0’到‘1’)之间的时间,可以计算出主节点发送8个位(5个边沿)用了多少个自己的时钟周期。
- 从而,从节点可以调整自己的波特率分频器,使得在接下来的通信中,自己的位定时与主节点同步。
- 这个过程对于使用低成本RC振荡器的从节点至关重要,确保了通信的可靠性。

3.3 受保护的ID段
(1)作用: LIN报文的“身份证”和“指令牌”。它告诉从节点两件事:
- 这帧数据是什么意思? (即帧的身份)
- 谁应该来响应(回复数据)或者谁应该来收听?
(2)长度: 6位(实际标识符) + 2位奇偶校验位 = 8位。
(3)标识符编码:
- ID[5:4] 通常表示帧的类型(我们在后续文章会深入讲解)。
- ID[3:0] 与 ID[5:4] 共同决定了帧的具体含义。
(4)奇偶校验: 后两位是前六位的奇偶校验位,用于保护标识符在传输中不发生错误,计算公式如下:
- P0 = ID0 XOR ID1 XOR ID2 XOR ID4
- P1 = NOT (ID1 XOR ID3 XOR ID4 XOR ID5)
(5)关键点:
- 标识符并不代表节点的地址,而是代表这帧数据内容的含义。
- 从节点通过监听标识符来判断自己是否需要响应或接收。例如,一个控制左前车窗的从节点,它会“订阅”标识符为“车窗控制”的帧。当主节点发出这个标识符的报头后,该从节点就知道:“轮到我了,我要回复当前车窗的状态数据”;而其他节点则会忽略这帧。

3.4 数据段
(1)作用: 承载实际传输的数据。
(2)长度: 可包含 2、4或8个字节 的数据。8字节是最常用的格式。
(3)内容: 数据段可以包含一个或多个“信号”。信号是LIN总线中最基本的数据单元,比如“车窗开关状态”、“电机电流值”、“温度值”等。这些信号按照LDF文件中的定义,被“打包”进数据段的各个字节的特定位置。

3.5 校验和段
(1)作用: 保证数据在传输过程中的完整性,确保数据没有因干扰而出错。
(2)类型:
- 经典校验和: 仅对数据段的内容进行计算(LIN 1.3)。
- 增强型校验和: 对标识符段和数据段的内容一同进行计算(LIN 2.0及以上)。这是目前的主流方式,提供了更好的保护。
(3)计算方法: 将所有需要保护的字节相加,然后取256的补码(即求和后,反转所有位,再加1,最后只取低8位)。
(4)工作流程: 发送方计算校验和并附在数据段之后。接收方按照同样的规则计算接收到的数据的校验和,并与接收到的校验和字节进行比较。如果一致,则认为数据正确;否则,丢弃该帧。

4 举例说明
让我们以一个“主节点查询车内温度”的实例,将整个帧结构串联起来:
(1)主节点决定要读取温度值。它在调度表中查到,温度数据对应的帧标识符是 0x23。
(2)主节点在LIN总线上发送报头:
- 先拉低总线至少13位时间(同步间隔段),再拉高1位时间(间隔符)。
- 然后发送
0x55(同步段),让所有从节点校准波特率。 - 最后发送
0x23这个字节(标识符段),其中包含了6位标识符和2位奇偶校验位。
(3)温度传感器(从节点) 一直在监听总线。它识别出标识符 0x23 是自己负责响应的帧。
(4)温度传感器开始发送响应:
- 它将测量到的温度值(例如25°C)打包成1个或2个字节的数据段。
- 它根据增强型校验和规则,对
0x23和温度数据字节进行计算,得到校验和字节。 - 它将数据段和校验和段依次发送到总线上。
(5)主节点接收到完整的帧后,验证校验和是否正确。如果正确,它就提取出温度值,可以自己使用,或者通过CAN总线转发给其他需要这个信息的模块(如空调控制器)。
(6)网络中的其他从节点(如车窗控制器)也听到了这个标识符,但它们发现与自己无关,于是忽略这帧数据的响应部分。
5 总结
通过本次的讲解,我们清晰地看到了LIN总线通信的物理基础和报文骨架。从显性/隐性电平的“线与”逻辑,到精妙的同步机制,再到通过标识符来寻址内容的通信模式,每一个设计都体现了其“低成本、高可靠性”的核心思想。
理解帧结构是理解LIN通信的基石。在下一篇文章中,我们将更进一步,探讨LIN网络的 “交通规则”——调度表 和帧类型,看看主节点如何高效地管理多个从节点之间的通信,以及LIN总线如何应对不同类型的数据传输需求。我们下次再见!
