LIN
参考链接
概述
LIN 具有以下特点:
- 网络由一个主机节点和多个从机节点构成。
- 使用 LIN 可以大幅度的削减成本,表现在以下方面:
- 开放型规范:规范可以免费从官方网站获得。
- 硬件成本削减:基于普通 UART/SCI 接口的低成本硬件实现,无需单独的硬件模块支持;从机节点无需 高精度时钟就可以完成自同步;总线为一根单线电缆。
- 装配成本削减:LIN 采用了工作流(Work Flow)和现成节点(Off-the-shelf Node)的概念,将网络装配标准 化,并可通过 LIN 传输层进行再配置。
- 缩短软件开发周期:LIN 协议将 API(Application Programming Interface,应用编程接口)标准化。
- 信号传输具有确定性,传播时间可以提前计算出。
- LIN 具有可预测的 EMC(ElectroMagnetic Compatibility,电磁兼容性)性能,。为了限制 EMI(ElectroMagnetic Interference,电磁干扰)强度,LIN 协议规定最大位速率为 20kbps。
- LIN 提供信号处理、配置、识别和诊断四项功能。
由于 LIN 网络在汽车中一般不独立存在,经常与上层网络(如 CAN)相连,因此子网的概念是相对于上层 网络而言。在不强调与上层网络相连的情况下,后面也称作 LIN 网络。

一个节点不一定对应一个 ECU(Electronic Control Unit,电子控制单元),因为一个 ECU 可能提供多个 LIN 接口,并且这些接口可能连接到不同的 LIN 通信子网中。
节点应用层向下层传输信号和消息。信号和消息位于帧中的数据段,是节点向其他节点传达的实质信息。 它们之间的区别在于信号封装于信号携带帧 (帧 ID 范围在 0x00~0x3B 之间)中,用于在运 行状态传递上层发生的事件,如温度传感器的测量结果等。消息封装于诊断帧(帧 ID 为 0x3C 或 0x3D)中,是有固定格式、最大长度不超过 4095 字节的信息。

LIN 的拓扑结构为单线总线,应用了单一主机多从机的概念。总线电平为 12V,传输位速率(Bitrate)最高为 20kbps。由于物理层限制,一个 LIN 网络最多可以连接 16 个节点,典型应用一般都在 12 个节点以下,主机节 点有且只有一个,从机节点有 1 到 15 个。 主机节点(Master Node)包含主机任务(Master Task)和从机任务(Slave Task),从机节点(Slave Node)只包含从 机任务。

主机任务负责:
- 调度总线上帧的传输次序;
- 监测数据,处理错误;
- 作为标准时钟参考;
- 接收从机节点发出的总线唤醒命令。
从机任务不能够主动发送数据,需要接收主机发送的帧头(帧的起始部分),根据帧头 所包含的信息(这里指帧 ID)判断:
- 发送应答(帧中除帧头外剩下的部分);
- 接收应答;
- 既不接收也不发送应答。
协议层
帧结构
帧(Frame)包含帧头(Header)和应答(Response)两部分。主机任务负责发送帧头;从机任务接收帧头并对帧头 所包含信息进行解析,然后决定是发送应答,还是接收应答,还是不作任何反应。帧在总线上的传输为:

帧头包括:
- 同步间隔段
- 同步段
- PID(Protected Identifier,受保护ID)段
应答包括:
- 数据段
- 校验和段

其中值“0”为显性电平(Dominant),值“1”为隐性电平(Recessive),总线上实行“线-与”:当总线上有 大于等于一个节点发送显性电平时,总线呈显性电平;所有的节点都发送隐性电平或不发送信息(不发送任何信 息时总线默认呈隐性电平)时,总线才呈现隐性电平,即显性电平起主导作用。图中帧间隔为帧之间的间隔;应 答间隔为帧头和应答之间的间隔;字节间间隔包括同步段和受保护ID段之间的间隔、数据段各字节间之间的间 隔以及数据段最后一个字节和校验和段之间的间隔。
同步间隔段
同步间隔段由同步间隔(Break)和同步间隔段间隔符(Break Delimiter)构成。同步间隔是至少持续 13 位(以主机节点的位速率为准)的显性电平,由于帧中的所有间隔或总线空闲时都应保持隐性电平,并 且帧中的任何其它字段都不会发出大于 9 位的显性电平,因此同步间隔可以标志一个帧的开始。同步间隔段的 间隔符是至少持续 1 位的隐性电平。

从机任务接收帧头的同步间隔段时,以该从机任务所在节点的位速率为准,当检测总线上出现持续 11 位的显性电平时,认为是帧的开始。当从机节点使用精度较高的时钟时,识别阈值可以选择 9.5 位。 协议没有规定同步间隔段的发送和检测方法。
[!note]
需要注意的是:
- 发送显性电平的下限为 13 位,上限应保证帧的最大传输时间THeader_Maximum在规定范围之内。
- 当从机节点选择的时钟(精度不高的时钟)在容限范围内(±14%)时,$(13 - 11.18) / 13 = 14%$,即是说当处于最差情况下(时钟相差 14%)时,从机任务按照自身时钟测量的主机节点发送的 13 位显性电平不会低于 11.18 位,若识别阈值高于 11.18 位,那么当选用 14%的时钟时,就会出现主机发 送同步间隔,而从机检测不到的情形。由于在除同步间隔段以外,帧中任何其余部分都不会发送超过 9 位的显性电平,$(10.26 - 9) / 9 = 14%,$,即是说判断阈值必须大于 10.26 位,否则可能把帧中其余部分误判作为同步间隔段。综上,识别阈值为 11 位显性电平。
- 当从机节点选择的时钟(精度较高的时钟)在容限范围内(±1. 5%)时,识别阈值应在 9.135 位(由$(9.135 - 9) / 9 = 1.5%$计算而来)到 12.805 位(由($13 – 12.805) / 13 = 1.5%$计算而来)之间。具体设定阈值会随着所选时钟的精度,取值范围在 9.135 位到 12.805 位之间浮动。
同步段
在介绍同步段之前,首先介绍一下字节域(Byte Field)的概念,字节域包括 1 位起始位(Start Bit,显性) + 8 位数据位 + 1 位停止位(Stop Bit,隐性),是一种标准 UART 数据传输格式。在 LIN 的一帧当中, 除了同步间隔段,后面的各段都是通过字节域的格式传输的。在 LIN 帧中,数据传输都是先发送 LSB(Least Significant Bit,最低有效位),最后发送 MSB(Most Significant Bit,最高有效位)。

LIN 同步以下降沿为判断标志,采用字节 0x55(转换为二进制为 01010101b)。同步段的字节域如下:

从机节点可以不采用精度高的时钟,而采用片上振荡器等精度和成本相对较低的时钟,由此带来的与主机节点时钟产生的偏差,需要通过同步段进行调整,调整的结果是使从机节点数据的位速率与主机节点一致。同步段用于同步的基准时钟为主机节点的时钟。从机节点通过接收主机节点发出的同步段,计算出主机节点位速率,根据计算结果对自身的位速率重新作调整。计算公式如下:
$$
1\text{位时间}=\frac{\text{第7位的下降沿时刻 }-\text{起始位的下降沿时刻}}8
$$
通过计算,可以得到主机节点实际传输 1 位所用的时间,即位速率。
受保护ID段
受保护ID段的前6位叫作帧 ID(Frame ID),加上两个奇偶校验位后称作受保护 ID。

帧 ID 的范围在 0x00~0x3F 之间,共 64 个。帧 ID 标识了帧的类别和目的地。从机任务对于帧头作出的反应(接收/发送/忽略应答部分)都是依据帧 ID 判断的。如果帧 ID 传输错误,将会导致信号无法正确到达目的地, 因此引入奇偶校验位。校验公式如下,其中“⊕”代表“异或”运算,“¬”代表“取非”运算。
$$
\begin{aligned}
&\mathrm{
P0 = ID0\oplus ID1\oplus ID2\oplus ID4
}\
&\mathrm{
P1=
}\neg\left(\mathrm{ID1}\oplus\mathrm{ID3}\oplus\mathrm{ID4}\oplus\mathrm{ID5}\right)
\end{aligned}
$$
由公式可以看出,PID 不会出现全 0 或全 1 的情况,因此,如果从机节点收到了“0xFF”或“0x00”,可判断为传输错误。 依据帧 ID 不同将帧进行分类:
| 帧的类型 | == | 帧ID |
|---|---|---|
| 信号携带帧 | 无条件帧 | 0x00~0x3B |
| : | 事件触发帧 | : |
| : | 偶发帧 | : |
| 诊断帧 | 主机请求帧 | 0x3C |
| : | 从机应答帧 | 0x3D |
| 保留帧 | == | 0x3E,0x3F |
注意:从机应答帧是一个完整的帧,与帧结构中的“应答”(帧的一部分)不同,注意区别
数据段
节点发送的数据位于数据段,包含 1 到 8 个字节,先发送编号最低的字节 DATA1,编号依次增加。 数据段包含了两种数据类型:
-
信号(Signal)
信号(Signal)由信号携带帧传递,一个帧 ID 对应的数据段可能包含一个或多个信号。信号更新时要保证其完整性,不能只更新一部分。一个信号通常由一个固定的节点发出,此节点称为该信号的发布节点(Publisher); 其余的一个或多个节点接收,它们称为信号的收听节点(Subscriber)。
[!tip]
协议没有规定帧中的哪一部分显示数据长度码的信息,数据的内容和长度是由系统设计者根据帧 ID事先约定好的。
总线上的数据是以广播形式被发送到总线上的,任何节点均能接收,但并非所有信号对每个节点都有用。 收听节点接收帧的应答是因为该节点的应用层会使用这些信号,而对于其余节点,由于用不到这些信号, 所以没有必要作接收处理,将忽略帧的应答部分。发布和收听由哪个节点进行完全根据应用层的需要由 软件或配置工具实现。一般情况下,对于一个帧中的应答,总线上只存在一个发布节点,否则就会出现 错误。事件触发帧例外,可能存在零个、一个或多个发布节点。
-
诊断消息(Diagnostic messages)。
诊断消息(Diagnostic message)由诊断帧传递,对消息内容的解析由数据自身和节点状态决定。

校验和段
校验和段是对帧中所传输的内容进行校验,如下图所示:

校验和分为标准型校验和(Classic Checksum)及增强型校验和(Enhanced Checksum):
| 校验和类型 | 校验对象 | 适用场合 |
|---|---|---|
| 标准型校验和 | 数据段各字节 | 诊断帧,与LIN1.x从机节点通信。 |
| 增强型校验和 | 数据段各字节以及受保护ID | 与 LIN2.x 从机节点通信(诊断帧除外)。 |
采用标准型校验和还是增强型校验和由主机节点管理,发布节点和各收听节点根据帧 ID 来判断采用哪种校验和。
校验方法为将校验对象的各字节作带进位二进制加法(每当结果大于等于 256 时就减去 255),并将所得最终的和逐位取反,以该结果作为要发送的校验和。接收方根据校验和类型,对接收数据作相同的带进位二进制加法,最终的和不取反,并将该和与接收到的校验和作加法,如果结果为 0xFF,则校验和无误,这在一定程度 上保证了数据传输的正确性。
例如:采用标准型校验和,Data1 = 0x4A,Data2 = 0x55,Data3 = 0x93,Data4 = 0xE5,计算方法如下表所示:
| 发送方/接收方 | == | == | == | == | == | == | == | == | == | == |
|---|---|---|---|---|---|---|---|---|---|---|
| 和 | 进位 | D7 | D6 | D5 | D4 | D3 | D2 | D1 | D0 | |
| 0x4A | 0x4A | 0 | 1 | 0 | 0 | 1 | 0 | 1 | 0 | |
| +0x55 = 加上进位 |
0x9F 0x9F |
0 | 1 1 |
0 0 |
0 0 |
1 1 |
1 1 |
1 1 |
1 1 |
1 1 |
| +0x93 = 加上进位 |
0x132 0x33 |
1 | 0 0 |
0 0 |
1 1 |
1 1 |
0 0 |
0 0 |
1 1 |
0 1 |
| +0xE5 = 加上进位 |
0x118 0x19 |
1 | 0 0 |
0 0 |
0 0 |
1 1 |
1 1 |
0 0 |
0 0 |
0 1 |
| 取反 | 0xE6 | 1 | 1 | 1 | 0 | 0 | 1 | 1 | 0 | |
| 接收方 | == | == | == | == | == | == | == | == | == | == |
| 0x19(重新计算的校验和,不取反)+ 0x E6(接收到的校验和)= | 0xFF | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
帧传输时间的计算
帧在总线上传输的时间计算如下表所示。其中,
-
$T_{Frame_Maximum}$为帧在总线上传输的最大时间;
-
$T_{Header_Maximum}$为帧头在总线上传输的最大时间;
-
$T_{Response_Maximum}$为应答在总线上传输的最大时间;
-
$T_{Header_Nominal}$为帧头额定传输时间:
$$
同步间隔段(包含同步间隔和同步间隔段间隔符)的最小传输时间 + 同步段传输时间 + 受保护ID段传输时间
$$ -
帧头的余量$T_{Header_Rest}$包含字节间间隔,规定为帧头额定传输时间的 0.4 倍;
-
$T_{Response_Nominal}$为应答额定传输时间:数据段传输时间 + 校验和段传输时间;
-
应答的余量$T_{Response_Rest}$包含 应答间隔以及字节间间隔,规定为应答额定传输时间的 0.4 倍;
-
$N_{data}$表示数据段包含N个字节。
| $T_{Frame_Maximum}$ | $T_{Header_Maximum}$ | == | == | == | == | $T_{Response_Maximum}$ | == | == |
|---|---|---|---|---|---|---|---|---|
| : | $T_{Header_Nominal}$ | == | == | == | $T_{Header_ Rest }$ | $T_{Response_Nominal}$ | == | $T_{Response_Rest}$ |
| : | 同步间隔(最小 值) | 同步间隔段间隔符(最小值) | 同步段 | 受保 护ID段 | $40% \times T_{Header_Nominal}$ | 数据段 | 校验和 | $40% \times T_{Response_Nominal}$ |
| 时间($T_{bit}$) | 13 | 1 | 10 | 10 | : | $10 \times N_{Data}$ | 10 | : |
帧在总线上的传输波形
帧在总线上的传输波形示例如下图所示。

帧类型
无条件帧
无条件帧是具有单一发布节点,无论信号是否发生变化,帧头都被无条件应答的帧。 无条件帧在主机任务分配给它的固定的帧时隙中传输。总线上一旦有帧头发送出去,必须有从机任务作应答(即无条件发送应答),以下列出的帧 ID 的值只是为了举例说明,协议并未强制规定。

- 帧 ID = 0x30 应答部分的发布节点为从机节点 1,收听节点为主机节点。典型应用如从机节点 1 向主机节点报告自身某信号的状态。
- 帧 ID = 0x31 应答部分的发布节点为主机节点,收听节点为从机节点 1 和从机节点 2。典型应用如主机节点向从机节点发布信息。
- 帧 ID = 0x32 应答部分的发布节点为从机节点 2,收听节点为从机节点 1。典型应用如从机节点之间彼此通信。
事件触发帧
事件触发帧是主机节点在一个帧时隙中查询各从机节点的信号是否发生变化时使用的帧,当存在多个发布节点时,通过冲突解决进度表来解决冲突。
当从机节点信号发生变化的频率较低时,主机任务一次次地轮询各个信号会占用一定的带宽。为了减小带宽的占用,引入了事件触发帧的概念。
事件触发帧的典型应用就是轮询四个车门的开关情况。与其利用无条件帧每个车门轮询一遍,不如同时对 四个车门进行询问,如果其中一个车门打开了(事件发生),该车门要对询问作应答,即事件触发的含义。这样 做可以减小带宽,但同时会导致两种现象:
- 其一就是没有车门被打开,即无节点应答——事件触发帧允许一帧中只有帧头无应答;
- 另外一种情况就是冲突,即同时有大于等于两个车门被打开,对该问题同时作答——事件 触发帧允许两个以上的节点对帧头作应答而不视为错误。当发生冲突时,主机节点需要重新作轮询,这样会增 加一些响应时间,但由于事件触发帧本身就用来处理低概率事件,总的来说还是节省了带宽。
原先用作轮询的无条件帧,称为与该事件触发帧关联的无条件帧,即事件触发帧的应答部分是与其关联的无条件帧所提供的应答。当发生冲突时,需要立刻中断当前的进度表,启动冲突解决进度表(Collision Resolving Schedule),重新调用这些关联的无条件帧。其中,冲突解决进度表要求包含所有的关联的无条件帧。 下图描述了事件触发帧的传输状况。事件触发帧的帧 ID 为 0x10,与其关联的两个无条件帧的帧 ID 分 别是 0x11 和 0x12,这些帧 ID 的值只是为了举例说明,协议并未强制规定。

与事件触发帧关联的多个无条件帧需要满足以下 5 个条件:
- 数据段包含的数据字节数等长;
- 使用相同的校验和类型;
- 数据段的第一个字节为该无条件帧的受保护 ID,这样才能够知道应答是哪个关联的无条件帧发送出来的;
- 由不同的从机节点发布;
- 不能与事件触发帧处于同一个进度表中。
偶发帧
偶发帧是主机节点在同一帧时隙中当自身信号发生变化时向总线启动发送的帧。当存在多个关联的应答信号变化时,通过事先设定的优先级来仲裁。
与事件触发帧一样,偶发帧的应答也关联了一组无条件帧。规定偶发帧只能由主机节点作为发布节点。偶发帧的传输可能出现三种状况:
- 当关联的无条件帧没有信号发生变化时,该时隙保持沉默,如下图第一个帧时隙所示,主机节点连帧头都不需要发送;
- 当其中一个关联的无条件帧包含的信号发生了变化, 则发送该关联的无条件帧的应答部分;
- 如果有两个或两个关联的无条件帧包含的信号发生了变化,则按照事 先规定好的优先级,优先级较高的关联的无条件帧获得发送权,优先级较低的要等到下一个偶发帧的帧头到来 时才能发送应答。由于主机节点是唯一的发布节点,所以主机节点事先就知道各个关联信号的优先级别,这样 在传输时就不会产生冲突。
引入偶发帧的目的在于为进度表增加一些动态特性——当主机节点的信号发生变化时才有通信发生。事件触发帧和偶发帧反映了帧在不同时机(信号变化或未发生变化)的传输状况,引入它们的目的是为 了增加通信的灵活性。

诊断帧
诊断帧包括主机请求帧和从机应答帧,主要用于配置、识别和诊断用。主机请求帧(Master Request Frame, MRF),帧 ID = 0x3C,应答部分的发布节点为主机节点;从机应答帧(Slave Response Frame,SRF),帧 ID = 0x3D, 应答部分的发布节点为从机节点。数据段规定为 8 个字节,一律采用标准型校验和。
保留帧
保留帧的帧 ID 为 0x3E 和 0x3F,为将来扩展用
进度表
进度表是帧的调度表,规定总线上帧的传输次序以及各帧在总线上的传输时间。进度表位于主机节点,主机任务根据应用层需要进行调度。进度表可以有多个,一般情况下,轮到某个进度表执行的时候,从该进度表规定的入口处开始顺序执行,到进度表的最后一个帧时,如果没有新的进度表启动,则返回到当前的进度表第 一个帧循环执行;也有可能在执行某个进度表当中发生中断,执行另一个进度表后再返回,如事件触发帧的冲 突解决过程就是一个典型的例子,如下图所示。

【注】1. 进度表的调入点称为进度表的一个入口(Entry),对应进度表的某个帧。
进度表除规定了帧 ID 的传输次序外,还规定了帧时隙(Frame Slot)的大小。帧时隙是进度表规定的一个帧的帧头起始到下一个的帧的帧头起始的时间。每个帧的帧时隙都可以不同,一个帧时隙对应了进度表的一个入 口,如下图所示,其中 i = 1~8。

其中$T_{Frame_Maximum}$为帧在总线上传输的最大时间。抖动(Jitter)为帧的同步间隔段的下 降沿与帧时隙起始时刻相差的时间。时基(Time Base)为LIN子网的最小计时单位,通常设定为 5ms或 10ms。帧时隙必须为时基的整数倍,并且起始于时基的开始时刻(称为时基的节拍(Tick)),切换到另外一个进度表时一定要等到当前帧时隙的结束。
状态机的实现
主机任务的状态机
当进度表启动后,主机任务依次发送同步间隔段、同步段和受保护 ID 段。

从机任务的状态机
从机任务负责发布或者接听帧的应答。包括两个状态机:
- 同步间隔段和同步段检查器
- 帧处理器
从机任务状态机如表所示,其中帧处理的状态机如图所示。
| 从机任务状态机 | == | 说明 |
|---|---|---|
| 检测同步间隔段/同步段序列 | == | 要求节点处于任何状态下都能识别出该序列,包括已经检测到序列或进入帧处理的状态。 |
| 帧处理 | 接收并分析 PID | 对接收到的受保护ID 进行分析,按照事先的设计,选择是接收应答部分, 还是发送应答部分,或者不接收也不发送。 在这五个子状态中,如果收到同步间隔段/同步段序列,将重新跳到"接收并 分析PID"的子状态,通信不停止,根据需要置位相应的错误标志。 |
| : | 接收数据 | : |
| : | 接收校验和 | : |
| : | 发送数据 | : |
| : | 发送校验和 | : |

网络管理
网络管理主要指的是网络的休眠和唤醒管理:

唤醒
当总线处于休眠状态时:
- 主/从机节点都可以向总线上发送唤醒信号,唤醒信号持续 250μs~5ms。其余节点(除发送唤醒信号以外的节点)以大于 150μs 为阈值判定唤醒信号。
- 每个从机节点必须在唤醒信号显性脉冲的结束处算起 100ms 以内准备接收来自主机的命令(帧头);
- 主机节点也必须被唤醒,100ms 之内主机节点发送帧头开始通信。
- 主机节点的同步间隔段也可以充当唤醒信号,由于从机节点需要作初始化处理,因此主机节点所 发的这个帧有可能不会被正常接收。
如果节点发送出唤醒信号后,在 150ms~250ms 之内没有接收到总线上的任何命令(帧头),则可以重新发送 一次唤醒信号。唤醒信号最多可以发送 3 次,3 次之后,必须等待至少 1.5s 之后才可以再次发送唤醒信号,如图所示。

休眠
总线可以在两种情况下进入休眠:
-
利用诊断帧中的主机请求帧 0x3C 作休眠命令,要求数据段的第一个字节为 0x00,其余字节为 0xFF。 休眠命令由主机节点发出,总线上的从机节点只判断数据段的第一个字节,其余字节忽略。从机节点在接 收到休眠命令后,不一定要进入低功耗模式,根据应用层需要设置。

-
当总线静默(没有显性和隐性电平之间的切换)4s~10s 时,节点自动进入休眠状态。
状态管理
状态管理是为了检测运行中的错误。错误一旦被发现,根据设计需要采取不同的措施进行排除,一种方法 是简单替换掉错误节点,另一种方法是让发生问题的节点进入到自我保护/安全模式(Limp Home Mode)。
网络报告
协议强制规定,每个从机节点都要在它发布的某个无条件帧中包含一个长度为一位的标量信号 response_error,向主机节点报告自身状态。主机节点负责接收这个信号并且执行分析,如下表所示。事件触 发帧由于允许总线冲突,需特殊处理。
| response_error | 主机节点对信号的解释 |
|---|---|
| FALSE | 从机节点操作正确。 |
| TRUE | 从机节点有偶发错误。 |
| 从机节点无应答 | 从机节点、总线或主机存在严重错误。 |
LIN 协议并没有标准化错误类型,用户可根据需要自行制定。下表列出了可能出现的一些错误类型供参 考。
| 错误类型 | 解释 |
|---|---|
| 位错误 | 通常,在一个时刻,LIN 总线上只有一个节点在向外发送信息,发送的同时回读总线上的数据,当发送节点发送电平与回读电平不一致时,视为位错误。 |
| 同步段错误 | 根据接收的同步段重新计算的位速率超出了规定的容限,认为是同步段错误。 |
| PID 错误 | 接收节点对帧 ID(PID 的前六位)按照校验规则重新计算校验位(P0 和 P1),若与接收到的校验位不符,则接收节点认为是 PID 传输错误。 |
| 无应答错误 | 发送完帧头后,如果总线上没有节点应答,视为无应答错误(事件触发帧除外)。 |
| 应答不完整错误 | 收听节点接收的数据段不完整或没有接收到校验和段。 |
| 校验和错误 | 收听节点接收到的校验和与重新计算的校验和(不取反)加起来不等于 0xFF。 |
| 帧错误 | 字节域的停止位上出现了显性电平。 |
| 物理总线错误 | 总线短路或直接连到电源上导致总线无法通信,该错误由主机节点负责检测。 |
节点内部报告
节点自身需要设定两个状态位:Error_in_response 和 Successful_transfer。当发送或接收应答的时候发现错误,将置位 Error_in_response;成功传输则置位 Successful_transfer。节点需要将这两个状态位报告给应用层。
传输层
传输层的任务单一,就是充当一个“翻译官”,把来自诊断服务的消息(Message)“翻译”成协议层可以处理的 PDU (Packet Data Unit,分组数据单元),或者反过来,把协议层收到的 PDU“翻译”成诊断服务需要的消息。消 息到 PDU 的转换过程称为拆分(Packing),PDU 到消息的转换过程称为重组(Unpacking)。PDU 对应着帧结构的数据段,并通过诊断帧发送或接收。
PDU结构
为满足汽车行业的要求,LIN 传输层 PDU 的格式与 ISO 制定的基于 CAN 网络的诊断标准 非常相似(是 ISO 标准的子集)。这种兼容性大大减少了在 CAN 和 LIN 之间转换数据格式的工作量,降低了对节点计算能力的要求。
从发送格式上,PDU 单元可分为:
- 单帧(Single Frame,SF)
- 首帧(First Frame,FF)
- 续帧(Consecutive Frames, CF)
从发送源上,主机发送请求 PDU,从机发送应答 PDU。 如下图所示,为 PDU 格式,包括:
- 节点地址(NAD)
- 协议控制信息(PCI)
- LEN
- 服务 ID(SID)
- 应答服务 ID(RSID)
- 消息字节段(D1~D6)
首字节 NAD 首先发送,末字节 D4,D5,D6 最后发送。

NAD
PDU 单元的第一个字节是 NAD(node address),用于区分不同从机节点的地址。 如下表所示,列出了 NAD 的取值范围:
| 地址 | 解释 |
|---|---|
| 0x00 | 用于休眠命令 |
| 0x01~0x7D | 从机节点地址,即NAD |
| 0x7E | 功能节点地址 (功能NAD) |
| 0x7F | 广播节点地址 (广播NAD) |
| 0x80~0xFF | 用户自定义 |
PCI
PDU 单元的第二个字节是 PCI(Protocol Control Information)信息,包含了 PDU 单元类型和消息字节长度 的信息。如下表所示:
| 类型 | PCI 类型 | == | == | == | 附加信息 | == | == | == |
|---|---|---|---|---|---|---|---|---|
| B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | |
| SF(单帧) | 0 | 0 | 0 | 0 | Length | == | == | == |
| FF(首帧) | 0 | 0 | 0 | 1 | Length 高 4 位 | == | == | == |
| CF(续帧) | 0 | 0 | 1 | 0 | 帧计数器 | == | == | == |
单帧中,附加信息 Length 表示消息字节数加 1。(Length就是PCI之后的长度)
首帧中,附加信息只表示 Length 的高 4 位,低 8 位在 LEN 中表示。因此在消息长度为 12 位数据,最大长度为 4095(0xFFF)。
续帧中的附加信息表示首帧后,跟随的续帧的编号,第一个续帧编号为 1,之后累加 1。如果续帧数多于 15 个,那么帧计数器在第 16 个续帧时从 0 重新计数。
SID 与 RSID
SID(Service Identifier)表示了从机节点应完成的服务请求。节点配置服务的 SID 区间为 0xB0~0xB7,诊断 服务的 SID 区间为 0x00 ~ 0xAF,0xB8~0xFE。 RSID(Response Service Identifier)表示从机节点应答的内容,它的值是 SID+0x40。
消息字节段
消息字节段的内容取决于服务的种类。在单帧中,消息字段最多 6 个字节。在首帧和续帧中,所有 PDU 的 消息字段,经过“重组”组成一个完成的消息。
传输层通信
- 应用层发出的消息如果长度不超过单帧的容量,传输层会按单帧的格式交给协议层发送。传输层收到的单帧也会直接作为消息送往应用层;
- 如果消息长度超过单帧的容量,传输层先要把消息拆分成首帧和续帧并排好次序,然后再交给协议层依次发送。反过来,协议层收到的首帧和续帧,传输层先要按照接收次序将其重组为 消息,最后交给应用层处理。
- LIN 传输层只能按顺序接收续帧。
- LIN 传输层具备出错重传功能。
应用层
LIN 应用层提供信号处理、配置、识别和诊断四项功能。配置、识别和诊断功能又包含若干项目,称为服 务(Service)。为了区别,每项服务都有固定、唯一的服务代号(Service ID,SID)。图 5.2 描述了 LIN 应用层及其 关联。





