LIN(LocalInterconnectNetwork,局部互联网络总线是针对汽车分布式电子系统而定义的一种低成本的串行通讯网络,是对控制器区域网络(CAN)等其它汽车多路网络的一种补充,适用于对网络的带宽、性能或容错功能没有过高要求的应用。LIN总线是基于SCI(UART)数据格式,采用单主控制器/多从设备的模式,是UART中的一种特殊情况。
LIN总线有如下特点:
LIN发展历史如下:
1.2LIN总线协议的物理层(收发器)
LIN总线协议规定其物理层收发器(transceiver)功能为将MCUSCI串行通信模块输出的TX和RX的TTL/CMOS电平信号转换为LIN总线的显性(Dominant,逻辑“0”,电气特性为GND(0V))和隐性电平(Recessive,逻辑“1”,电气特性为VBAT(8~18V)):
从而提高了通信时信号传输的抗干扰门限,保证其在强干扰的汽车电子环境中依然可以正常工作。
LIN总线协议还进一步规定其物理层收发器在LINMaster和Slave节点的终端电路设计要求:
LINMaster节点:需要一个上拉到VBAT的上拉电阻和防反接二极管串接在VBAT与LIN总线上,同时还需一个并联到地的负载电容;
LINSlave节点:只需要需一个并联到地的负载电容接口;
Tips:由以上介绍可知,LIN总线的物理层收发器将全双工的MCUSCI转换成了半双工的LIN总线信号进行传输;
常见的LIN收发器有NXP的TJA1021/TJA1022/TJA1024/TJA1027/TJA1029等,其功能特性比较如下表;
不同的LIN收发器,其集成的LIN通道数、EMC/ESD特性以及低功耗唤醒特性有所不同:
Tips:市面上很多USB转LIN的工具(比如PEAKLIN),其内部未集成DC-DC将USB的5V电源升压到LIN收发器工作需要的12V电压,所以使用时需要通过LIN接口为其输入12VVBAT电源,否则将无法工作;
2.LIN总线报文帧结构(MessageFrameStructure)详解
一个完整的LIN总线报文帧(MessageFrame)包含报头(Header)和响应(Response),其中报头有间隔场、同步场和标识符场构成,而响应由数据场和校验和场组成。
2.1LIN总线报文帧的字节场与字节间隔
LIN总线报文帧的字节场为标准串行通信的一个字节:
LIN总线报文帧的字节间隔用于区分LIN报文帧中的同步场与标识符场,以及数据场的各个字节以及最后的校验和场:
2.2LIN总线报文帧之间隔场(BreakField)
LIN总线报文帧的间隔场(BreakFiled)用于区别串行通信(SCI/UART)数据帧,开始一帧LIN报文的传输,其具有如下特点:
1)表示一帧报文的起始,由主节点发出;2)间隔信号至少由13个显性位组成;3)隔界定符至少由1个隐形位组成;4)间隔场是唯一一个不符合字节场格式的场;
2.3LIN总线报文帧之同步场(SyncField)
LIN总线报文帧的同步场(SyncField)用于确保所有从节点(SlaveNode)使用与主节点(MasterNode)相同的波特率发送和接收数据。其为一个字节,结构固定为0x55,以产生一个方波信号给从节点做时钟同步:
2.4LIN总线报文帧之标识符场(PIDField)
LIN总线报文帧的标识符场(PIDField)用于标识一帧LIN报文,其由6-bit标识符(ID)+2-bitID的奇偶校验符(P0/P1)组成:
2.5LIN总线报文帧之数据场(DataField)
LIN总线报文帧的数据场(DataField)用于主节点发送数据/命令或者接收从节点的响应数据:
1)数据场长度1到8个字节;2)低字节先发,低位先发;3)如果某信号长度超过1个字节采用低位在前的LSB方式发送(小端);
2.6LIN总线报文帧之校验和场(ChecksumField)
LIN总线报文帧的校验和场(ChecksumField)用于校验接收的数据是否正确,其可以使用两种校验和计算方法:
1)经典校验(ClassicChecksum)仅校验数据场(LIN1.3)2)增强校验(EnhanceChecksum)校验标识符场与数据场内容(LIN2.0、LIN2.1及LIN2.2)
标识符为0x3C和0x3D的帧只能使用经典校验。
计算方法:反转8位求和(invertedeightbitsum)比如:Data=0x4A、0x55、0x93、0xe5,其计算过程如下:
2.7LIN总线报文帧之帧长度
由以上介绍可知,一帧LIN总线报文的帧长度如下:
最小帧长度
最大帧长度(考虑串口波特率时钟的最大抖动)
2.8LIN总线报文帧之调度表(ScheduleTable)
LIN报文帧调度表功能如下:
如何切换调度表?
主任务可以拥有多个调度表,并在不同的调度表之间切换,该处理方式增加通信的灵活性。
2.9LIN总线报文帧之偏移(jitter)
TFrame_Slot>jitter+TFrame_Maximum
3.LIN总线报文帧类型(FrameType)详解
介绍完LIN总线的报文帧,接下来,本章节来介绍一下LIN总线报文的帧类型。
总来说,LIN总线包括无条件帧(UnconditionalFrame)、事件帧(EventFrame)、诊断帧(DiagnosticFrames)、零星帧(SporadicFrame)和保留帧(ReservedFrame)5中帧类型:
3.1LIN总线的无条件帧(UnconditionalFrame)
无条件帧(UnconditionalFrame)使用频度最高的帧类型,顾名思义,其无任何发送条件;标识符(ID)为0到59(0x3B);由主任务发出报头,一个任务响应,一个或多个任务接收如下图:
3.2LIN总线的事件帧(EventFrame)
引入事件触发帧的目的是节省带宽。
下面来考虑一个真实的应用场景,车辆的BCM(LINMasterNode)需要获取4个车门(Door,LINSlaveNode))的状态,该如何实现?
方法1:使用上面介绍的无条件帧,每次向四个车门请求状态,浪费带宽,因为车门状态不是经常发生:
方法2:将请求四个车门状态的帧合并为一个事件触发帧,Master不需要每次发送四个帧请求车门的状态,只需要发送一个事件触发帧即可,哪个车门状态发生变化,对应的车门将响应该事件触发帧。
事件触发帧的响应会出现如下三种情况:
第一种:没有车门状态变化,无任何车门从节点响应,无冲突:
第二种:一个车门状态发生变化,仅发生状态改变的车门从节点响应,无冲突:
第三种:多个车门状态发生变化,此时将出现冲突。冲突处理时,Master需要像第一种处理方式一样,重新发送四帧分别请求单个车门状态。
Tips:LIN1.3与LIN2.0、LIN2.1处理方式有所区别,区别在于LIN1.3不切换调度表,占用事件触发帧的时隙发送,LIN2.0、LIN2.1将切换冲突调度表处理,如下图:
3.3LIN总线的零星帧(SporadicFrame)
零星帧(SporadicFrame)也叫偶发帧,引入零星帧的目的也是为了节省带宽,如:BCM(Master)需要发送对4个车窗的控制指令,但是,两个车窗的控制命令很少被同时执行,同样大量的带宽被浪费。
此时就可以使用零星帧,将四个车门的控制的无条件帧,组合为一帧零星帧发送,从而节省了LIN总线带宽:
3.4LIN总线的诊断帧(DiagnosticFrames)
诊断帧(DiagnosticFrames)用来传输诊断或配置信息,一般包含8个字节。
诊断帧(DiagnosticFrames)标识符分配如下:
具体诊断帧传输方式如下图所示:
3.5保留帧(ReservedFrame)
使用标识符:62(0x3E),63(0x3F);
在LIN2.x总线协议中未对保留帧(ReservedFrame)进行定义,留给用户自定义或将来的版本升级。
4.LIN总线网络拓扑结构与网络管理
一个LIN总线网络,至少包含一个主节点(masternode)和一个或多个从节点(salvenode),总线网络拓扑为星型网络。
下图为包含了一个主节点,两个从节点的实际LIN总线网络架构:
4.1LIN总线的主机任务与从机任务
LIN总线的主节点需要实现主机任务(mastertask)和从机任务(slavetask),而从节点则只需要实现从机任务即可:
在LIN总线通信中,主机任务决定了在LIN总线上传送的是哪一帧,即实现总线调度表切换,LIN报文帧头产生和发送,从机任务提供每一LIN报文帧响应数据/状态,其中主节点实现的从机任务主要目的是向从节点发送控制命令。
完整的主机任务功能实现状态机如下:
完整的从机任务功能实现状态机如下:
4.2LIN2.1.vsLIN1.3节点模型
LIN1.3协议中没有对诊断及节点配置进行规范,所以在LIN1.3中完成相应的功能都放在自定义诊断中完成。
4.3LIN总线的网络管理
LIN网络中的所有节点都有初始化状态、工作模式和睡眠模式三种状态,默认LIN节点复位中会自动进入初始化状态,完成节点初始化,初始化结束后,必须在100ms内进入工作模式,在工作模式,LIN节点可以正常收发数据,若LIN总线空闲4~10s(可灵活配置)或者接收到睡眠命令(从节点),LIN节点将进入低功耗睡眠模式。进入睡眠模式后,LIN节点将停止数据收发,直到接收到到唤醒信号(从节点)或者内部事件产生唤醒请求(主节点)将其唤醒,然后重新进节点初始化:
4.4LIN总线网络睡眠与唤醒
睡眠指令只有主节点可以发送,从节点在接到睡眠指令之后,也可以选择不进入睡眠状态而继续工作,这根据应用层协议而定。
在一个处于睡眠状态的LIN网络中,任何一个节点都可以发送唤醒信号。
唤醒信号是一个250us(在20Kbit/s波特率下的0x0F)到5ms(在1Kbit/s波特率下的0x0F)的显性电平:
LIN网络管理规定,每一个从节点都需要实现以下功能:
主节点除了需要完成唤醒功能外,还需要检查出发送唤醒信号的节点(利用信号)。
当从节点发出唤醒信号之后150ms,主节点仍未发送报文,从节点可以再次发送唤醒信号。当连续发送了3次唤醒信号之后如果主节点仍未发送报文,则从节点必须等待1.5s,才可以再次发送唤醒信号。
本文详细介绍了首先低速汽车总线--LIN总线协议的应用特点和发展历史以及物理层收发器;然后详细介绍了LIN报文的帧结构和帧类型及其特点和应用场景,并在此基础上介绍了LIN总线网络管理的一些基本知识,可以作为汽车电子工程师学习LIN总线的一个入门参考资料。
在汽车ECU开发中要真正使用LIN总线,还需要实现完整的LIN协议栈(stack),其牵涉的知识较多较广,这里不展开介绍:
如下为NXP为其汽车MCU(S08,S12(X),MagniVS12Z,KEA和S32K1xx系列)提供的免费LIN协议栈实现架构:
该协议栈(LIN2.xandSAEJ2602Stack)是严格按照LINSpec2.2开发的,提供源代码下载,感兴趣的读者可以通过以下链接下载学习/使用: