1 简介
LIN(Local Interconnect Network)总线是针对汽车分布式电子系统而定义的一种低成本的串行通讯网络,用于实现汽车中的分布式电子系统控制。LIN 的目标是为现有汽车网络(例如CAN 总线)提供辅助功能,因此LIN总线是一种辅助的总线网络,适用于对网络的带宽、性能或容错功能没有过高要求的应用。
LIN的适用范围包括车窗、座椅、天窗、门锁、空调、照明等舒适性相关的领域。
LIN总线是基于SCI(UART)数据格式,采用单主控制器/多从设备的模式,是UART中的一种特殊情况。
2 LIN总线
2.1 CAN/LIN总线区别
由于LIN网络在汽车中一般不独立存在,通常会与上层CAN网络相连,形成CAN-LIN网关节点。
LIN线在物理上是一个上拉到12V的集电极开漏总线,多个节点可以并联到同一根线上,与IIC的SDA类似,但其没有独立的时钟线,靠通信双方约定的波特率进行通信,与UART类似,但不同于UART之处在于,LIN可以通过同步场进行时钟同步,使传输变得更可靠。
![](https://img-blog.csdnimg.cn/f087b74ea3ef42f1972e5b7128dedb9a.png#pic_center)
此外,可以看到LIN的显性电平为低电平(<40%Vout),隐性电平为高电平(>60%Vout)。这与CAN的显隐性电平的电压高低相反。
LIN采用UART功能进行传输时,需要传送包括1位起始位和1位停止位、共10位数据。传送按照LSB方式从最低位开始传输。
起始位和停止位用于判断报文的开始与结束。起始位的逻辑值为“0”,电压为GND,停止位的逻辑值为“1”,电压为电源电压(12V)。
LIN收发器按照ISO9141标准,使用单线通信。LIN收发器控制着输入电压、信号振幅、以及节点的睡眠与唤醒。
LIN由于EMC和时钟同期等原因,规定最大传输速率为20kbps。一般常使用的传输速率为2.4kbps、 9.6kbps、 19.2kbps。
在汽车电子开发中,CAN总线协议栈占有相当大的代码量,包括CAN 驱动层、TP、NM、UDS、router、bootloader等等,但LIN开发量也会少一个数量级,包括驱动、调度表,简单的睡眠唤醒,简单的TP等,其上层的服务还是要转成CAN的信号进行传输。
LIN和CAN相比不需要CAN Controller,节约了硬件的成本,同时配线也从2根变成了1根,也能够降低费用。
2.2 LIN总线的主从关系
LIN总线采用的是单线传输形式(另外还有一个无固定时间基准的节点同步时钟线),应用了单主机多从机的概念,总线电平一般为12V,传输速率最高限制为20kbps。由于物理层的限制,一个LIN网络最多可以连接16个节点。
2.3 LIN报文
LIN报文帧包括帧头(hearder)与应答(response)两部分。主机负责发送帧头;从机负责接收帧头并作出解析,然后决定是发送应答,还是接收应答或不回复。
![](https://img-blog.csdnimg.cn/383b1b25d802484b8063c0892d92d4b3.png#pic_center)
(主机)帧头结构包括同步间隔段、同步段、PID段(受保护ID)段,应答部分包括数据段与校验和段。其中值“0”为显性电平(低电平)、“1”为隐性电平(高电平),这点与CAN总线相类似。在总线上实行**“线与”机制**:当总线有至少一个节点发送显性电平时,总线呈现显性电平;所有节点均发送隐性电平或者不发送信息时,总线呈隐性电平,即显性电平起着主导作用。
![](https://img-blog.csdnimg.cn/89bb969749ce4af894fd4be266cd3d6f.png#pic_center)
2.3.1 同步间隔段
同步间隔段至少是由13位的显性电平组成,由于帧中的所有间隙或者总线空闲时总线均保持隐性电平状态。所以同步间隔段可以标志一个帧的开始。其中同步间隔段的间隔符至少为1位隐性电平。
![](https://img-blog.csdnimg.cn/54fa222ebce04ca586d61a8d3b0fdadf.png#pic_center)
2.3.2 同步段
LIN同步以下降沿为判断标志,采用字节0x55(01010101b)进行同步。在从机节点上可以不采用高精度的时钟,由此带来的偏差,需要通过同步段来进行调整。
LIN出于对成本削减的考虑没有专门布置用于时钟同步的配线,同时,对于LIN的从节点,同样出于对成本削减的考虑一般采用误差较大的CR时钟。这样如果什么都不做的话,LIN的各个节点间容易产生误差。
通过搭载高精度晶振的主节点,将同步信号在总线上发送给各个从节点,各个从节点再根据此信号进行误差补正,从而达到信号同步的目的。
这里提一下,LIN协议中对误差的要求是±14%,而一般高精度晶振的误差为±1.5%。
![](https://img-blog.csdnimg.cn/571f2d72d64248548c7ead9a35eac47a.png#pic_center)
2.3.3 PID段
受保护的ID的前6位叫做帧ID,加上两个奇偶效验码后称作受保护的ID。帧ID的取值范围为0x00~0x3f总共64个,帧ID标识了帧的类别和目的地。从机任务会根据帧头ID作出反应(接收/发送/忽略应答)。其中P0与P1效验如下:
P0根据ID0、ID1、ID2、ID4四位的异或值;
P1根据ID1、ID3、ID4、ID5四位的异或值取反;
LIN总线根据帧ID号的不同,把报文分为信号携带帧、诊断帧、保留帧。
注1:诊断帧中的从机应答帧并非上述主机帧结构中的应答结构。
2.3.4 数据段
数据段可以包含1-8个字节,其中包含有两种数据类型,信号(singal)和诊断消息(diagnostic messages)。信号由信号携带帧传递,诊断消息由诊断帧传递。
协议中并没有规定哪一部分显示数据长度码的信息(这点与CAN总线不同),数据的内容与长度均是由系统设计者根据帧ID事先约定好的。
总线上的数据是以广播形式发出,任何节点均可以收到,但并非对每个节点有用(与CAN相同)。具体到发布与接听是由哪个节点进行完成这个取决于应用层的软件配置,一般情况下,对于一个帧中的应答,总线上只存在一个发布节点,否则就会出现错误。事件触发帧例外,可能出现0,1,多个发布节点。
2.3.5 校验和段
校验和段是为了对帧传输内容进行效验。校验分为标准型校验与增强型校验。采用标准型还是增强型是由主机节点管理,发布节点和收听节点根据帧ID来判断采用哪种效验和。
![](https://img-blog.csdnimg.cn/a5fa6a5379fe410aa790da296db37af8.png#pic_center)
![](https://img-blog.csdnimg.cn/e9f66dd50d0f4ca6b016fe9d25dc8113.png#pic_center)
2.4 LIN总线波形
下图为LIN总线的通讯方式,可以看出无论什么时候帧头总是由主机节点发布,当主机节点想发布数据时,整个帧全部由主机节点发送。当从机节点想发布数据时,帧头部分由主机节点发布,应答部分由从机节点发布,这样其余节点都能收到一个完整的报文帧。可以很直接的观察到,LIN总线的通讯都是由主机节点发起的,只要合理的规定要每个节点的配置,这样就不会存在总线冲突的情况(事件触发帧冲突时采用采用冲突解决进度表)。
![](https://img-blog.csdnimg.cn/e3099674a6144b3092fd6c35e0c7c0a3.png#pic_center)
2.5 LIN总线通讯
2.5.1 无条件帧
无条件帧是具有单一发布节点的,无论信号是否发生变化,帧头均会被无条件应答的帧。
![](https://img-blog.csdnimg.cn/e3ead980a1314fc5a590887116cc5b71.png#pic_center)
如上图中帧ID=0x30应答部分的发布节点为从机节点1,收听节点为主机节点,应用在从机节点向主机节点报告自身状态;
帧ID=0x31中,应答部分为主机节点,收听部分为从机节点,应用在主机节点向从机节点发送消息;
帧ID=0x32中应答部分的发送节点为从机节点2,收听节点为从机节点1,应用与从机节点之间的通信。
2.5.2 事件触发帧
事件触发帧是主机节点在一个帧间隙中查询各从机节点的信号是否发生变化时使用的帧。 当存在多个发布节点时,通过冲突解决进度表来解决冲突。
当从机节点信号发生变化的频率较低的时候,主机任务一次次地查询各个节点信息会占用一定的带宽。为了减小带宽的占用,引入了事件触发帧的概念。 其主要原理就是:当从机节点信息状态没有发生变化的时候,从机节点可以不应答主机发出的帧头;当有多个节点信息同时发生变化的时候,同时应答事件触发帧头会造成总线的冲突。当主机节点检测到冲突时,便会查询冲突解决进度表来依次向各个节点发送无条件帧(无条件帧只有能1个节点应答)来确定从机节点的信息状态。
![](https://img-blog.csdnimg.cn/413d60c12d9245b688441b042d7d29d8.png#pic_center)
与事件触发帧关联的多个无条件帧需要满足以下5个条件:
- 数据段所包含的数据字节数等长;
- 使用相同的校验与类型;
- 数据段的第一个字节为该无条件帧的受保护ID(这样才能够知道应答是哪个关联的无条件帧发送出来的);
- 由不同的从机节点发布;
- 不能与时间触发帧处于同一个进度表中。
2.5.3 偶发帧
偶发帧是主机节点在同一帧时隙中当自身信号发生变化时向总线启动发送的帧。 当存在多个关联的应答信号变化时,通过预先设定的的优先级来仲裁。与事件触发帧类似,偶发帧也定义了一组无条件帧。规定偶发帧只有由主机节点发布。
偶发帧的传输可能出现三种情况:
- 当关联的无条件帧没有信号发生变化,这是主机连帧头也不需要发送;
- 当关联的一个无条件帧信号发生变化则发送该帧;
- 当有多个无条件帧发生信号变化时,则按照事先规定要的优先级依次发送。
![](https://img-blog.csdnimg.cn/c8b3609ecf714f88b0e1955a111c089f.png#pic_center)
2.5.4 诊断帧
诊断帧包括主机请求帧和从机应答帧,主要用于配置、识别和诊断。主机请求帧ID=0x3c,应答部分的发布节点为主机节点;从机应答帧ID=0x3d,应答部分的发布节点为从机节点。数据段规定为8个字节,一律采用标准校验和。
2.5.5 保留帧
保留帧的ID=0x3e与0x3f,为将来扩张需求用。
2.5.6 进度表
进度表是帧的调度表,规定了总线上帧的传输次序以及传输时间。 进度表位于主机节点,主机任务根据应用程需要进行调度。进度表可以有多个,一般情况下,轮到某个进度表执行的时候,从该进度表的入口处开始执行,到进度表的最后一个帧时,如果没有新的进度表启动则返回到当前进度表的第一个帧开始执行;也有可能在执行到某个进度表时发生中断,跳到另一个进度表后再返回,如事件触发帧就是一个典型的例子。
![](https://img-blog.csdnimg.cn/6ea2945a46fc43988ae70ab8c0f916e7.png#pic_center)
2.6 报文种类
LIN的报文种类有“普通报文(Unconditional)”、“事件触发报文(Event triggered)”、“零星报文(Sporadic)”和“诊断报文(Diagnostic)”4种。
2.6.1 普通报文(ID0~0x3B)
通常使用的报文种类,在各节点间传输数据时使用。
2.6.2 事件触发报文(ID0~0x3B)(LIN2.0追加)
对于从节点上发生频度较低的事件,1个Header可以对应多个Response,Header按照时间表发送,Response只有在需要的时候才会发送。为了判断是某个节点发送的Response,数据的第一位会发送自己的PID。
因为事件触发报文的ID对应多个Response,所以可能会有冲突发生,发生冲突会导致数据的丢失,所以,主节点需要根据冲突发送对每一个从节点发送普通报文的Header。LIN2.1中追加了事件触发报文冲突发生时使用“冲突解决时间表”的内容。
作为事件触发报文的常用使用场景,车身控制器监视4个车门的状态。如果利用事件触发报文可以在一个Slot里处理4个门的状态监视,但是,4个门中有多个门同时开启关闭这样的事情也是偶尔会发生的。如果发生冲突,就对4个门要求轮流发送数据,避免状态丢失。
2.6.3 零星报文(ID0~0x3B)(LIN2.0追加)
对于主节点上特定信号更新的时候使用此报文。1个零星报文的Header可以对应多个Response,当有多个零星报文需要发送时,按照优先级进行发送。信号没有更新时,零星报文的Header也可以不用发送。
2.6.4 诊断报文(ID3C~0x3D)
LIN网络的诊断,节点的配置,睡眠模式等使用的报文,ID60被称为“主Request”,主节点发送Response,ID61被称为“从Response”,从节点发送Response。
2.6.5 预留报文(ID3E~0x3F)
预留的报文ID,LIN2.x还未使用。