汽车电子expert成长之路

本博客发布的个人原创精品----嵌入式系统技术文章,欢迎大家参考学习,并转发分享!

细说汽车电子通信总线之LIN总线协议详解

0
阅读(23278)

内容提要

  1. LIN总线概述
        1.1 LIN总线特点及发展历史
        1.2 LIN 总线协议的物理层(收发器)

  2. LIN总线报文帧结构(Message Frame Structure)详解
        2.1 LIN 总线报文帧的字节场与字节间隔
        2.2 LIN 总线报文帧之间隔场(Break Field)
        2.3 LIN 总线报文帧之同步场(Sync Field)
        2.4 LIN 总线报文帧之标识符场(PID Field)
        2.5 LIN 总线报文帧之数据场(Data Field)
        2.6 LIN 总线报文帧之校验和场(Checksum Field)
        2.7 LIN 总线报文帧之帧长度
        2.8 LIN 总线报文帧之调度表(Schedule Table)
        2.9 LIN 总线报文帧之偏移(jitter)

  3. LIN总线报文帧类型(Frame Type)详解
        3.1 LIN总线的无条件帧(Unconditional Frame)
        3.2 LIN总线的事件帧(Event Frame)
        3.3 LIN总线的零星帧(Sporadic Frame)
        3.4 LIN总线的诊断帧(Diagnostic Frames)
        3.5 保留帧(Reserved Frame)

  4. LIN总线网络拓扑结构与网络管理
        4.1 LIN 总线的主机任务与从机任务
        4.2 LIN 2.1 .vs LIN 1.3节点模型
        4.3 LIN总线的网络管理

   总结


1. LIN总线概述

1.1 LIN总线特点及发展历史

    LIN (Local Interconnect Network,局部互联网络总线是针对汽车分布式电子系统而定义的一种低成本的串行通讯网络,是对控制器区域网络(CAN)等其它汽车多路网络的一种补充,适用于对网络的带宽、性能或容错功能没有过高要求的应用。LIN总线是基于SCI(UART)数据格式,采用单主控制器/多从设备的模式,是UART中的一种特殊情况。

1.jpg

LIN总线有如下特点:

  • 串行通信:线间干扰小,节省线束,传输距离长;

  • 单线传输:增强的ISO9141 (ISO 15765-1) , 总线电压基于VBAT;

  • 最高速率20Kbit/s:满足车身上大部分的应用需求,常用波特率为9600bit/s、19200bit/s;

  • 单主多从结构:无需仲裁;

  • 基于通用UART/SCI的低成本接口硬件:几乎所有MCU有具备LIN总线的硬件基础;

  • 从节点无须晶振或陶瓷震荡器就可以实现同步:大幅度降低成本;

  • 一条总线最多可连接16个节点:由总线电气特性决定;

  • 支持诊断功能:支持UDS服务;

LIN发展历史如下:

  • 1998 的十月,在德国Baden Baden召开的汽车电子会议上LIN 总线的设想首次被提出

  • 1999 LIN 联盟成立(最初的成员有 奥迪, 宝马, 克莱斯勒, 摩托罗拉, 博世, 大众和沃尔沃)

  • 2000 LIN 联盟开始接收第一批成员

  • 2001 第一辆使用 LIN 总线汽车下线

  • 2002 LIN 规范V.1.3版本发布

  • 2003 LIN 规范V.2.0 版本发布

  • 2004 LIN 总线一致性测试规范发布

  • 2006 LIN 标准规范 V.2.1版发布

  • 2010 LIN 规范包Specification Package Revision 2.2A 发布

1.2 LIN 总线协议的物理层(收发器)

    LIN总线协议规定其物理层收发器(transceiver)功能为将MCU SCI串行通信模块输出的TX和RX的TTL/CMOS电平信号转换为LIN总线的显性(Dominant, 逻辑“0”,电气特性为GND(0V))和隐性电平(Recessive, 逻辑“1”,电气特性为VBAT(8~18V)):

2.png

    从而提高了通信时信号传输的抗干扰门限,保证其在强干扰的汽车电子环境中依然可以正常工作。

3.jpg

    LIN总线协议还进一步规定其物理层收发器在LIN Master和Slave节点的终端电路设计要求:

    LIN Master节点:需要一个上拉到VBAT的上拉电阻和防反接二极管串接在VBAT与LIN总线上,同时还需一个并联到地的负载电容;

    LIN Slave节点:只需要需一个并联到地的负载电容接口;

4.jpg

    Tips:由以上介绍可知,LIN总线的物理层收发器将全双工的MCU SCI转换成了半双工的LIN总线信号进行传输;

    

    常见的LIN收发器有NXP的TJA1021/ TJA1022/TJA1024/TJA1027/TJA1029等,其功能特性比较如下表;

5.jpg

    不同的LIN收发器,其集成的LIN通道数、EMC/ESD特性以及低功耗唤醒特性有所不同:

6.jpg

    Tips:市面上很多USB转LIN的工具(比如PEAK LIN),其内部未集成DC-DC将USB的5V电源升压到LIN收发器工作需要的12V电压,所以使用时需要通过LIN接口为其输入12V VBAT电源,否则将无法工作;

2. LIN总线报文帧结构(Message Frame Structure)详解

    一个完整的LIN总线报文帧(Message Frame)包含报头(Header)和响应(Response),其中报头有间隔场、同步场和标识符场构成,而响应由数据场和校验和场组成。

2.1 LIN 总线报文帧的字节场与字节间隔

    LIN 总线报文帧的字节场为标准串行通信的一个字节:

    1)基于SCI/UART的通信格式;
    2)发送一个字节需要10个位时间(TBIT);

6.jpg

    LIN 总线报文帧的字节间隔用于区分LIN报文帧中的同步场与标识符场,以及数据场的各个字节以及最后的校验和场:

  • 字节间隔位于每个字节之间;

  • 响应间隔位于报头与响应之间;

  • 留给MCU足够的处理时间;

  • 帧长度可能增长;

    7.jpg

2.2 LIN 总线报文帧之间隔场(Break Field)

    LIN总线报文帧的间隔场(Break Filed)用于区别串行通信(SCI/UART)数据帧,开始一帧LIN报文的传输,其具有如下特点:

    1)表示一帧报文的起始,由主节点发出;
    2)间隔信号至少由13个显性位组成;
    3)隔界定符至少由1个隐形位组成;
    4)间隔场是唯一一个不符合字节场格式的场;

8.jpg


2.3 LIN 总线报文帧之同步场(Sync Field)

    LIN总线报文帧的同步场(Sync Field)用于确保所有从节点(Slave Node)使用与主节点(Master Node)相同的波特率发送和接收数据。其为一个字节,结构固定为0x55,以产生一个方波信号给从节点做时钟同步:

9.jpg


2.4 LIN 总线报文帧之标识符场(PID Field)

    LIN总线报文帧的标识符场(PID Field)用于标识一帧LIN报文,其由6-bit 标识符(ID) + 2-bit ID的奇偶校验符(P0/P1)组成:

  • ID的范围从0到63(0x3F);

  • 奇偶校验符(Parity)P0,P1计算方法如下:

10.jpg


2.5 LIN 总线报文帧之数据场(Data Field)

    LIN总线报文帧的数据场(Data Field)用于主节点发送数据/命令或者接收从节点的响应数据:

    1)数据场长度1到8个字节;
    2)低字节先发,低位先发;
    3)如果某信号长度超过1个字节采用低位在前的LSB方式发送(小端);

11.jpg


2.6 LIN 总线报文帧之校验和场(Checksum Field)

    LIN总线报文帧的校验和场(Checksum  Field)用于校验接收的数据是否正确,其可以使用两种校验和计算方法:

    1)经典校验(Classic Checksum)仅校验数据场(LIN1.3)
    2)增强校验(Enhance Checksum)校验标识符场与数据场内容(LIN2.0、LIN2.1及LIN2.2)

12.png

    标识符为0x3C和0x3D的帧只能使用经典校验。

    计算方法:反转8位求和(inverted eight bit sum)
    比如:Data=0x4A、0x55、0x93、0xe5,其计算过程如下:

13.jpg


2.7 LIN 总线报文帧之帧长度

    由以上介绍可知,一帧LIN总线报文的帧长度如下:

    最小帧长度

  • Theader_nominal=34*Tbit

  • Tresponse_nominal=10*(ndata+1)*Tbit  

  • Tframe_nominal=Theader_nominal+Tresponse_nominal

    最大帧长度(考虑串口波特率时钟的最大抖动)

  • Theader_max=1.4*Theader_nominal

  • Tresponse_max=1.4*Tresponse_nominal

  • Tframe max=Theader max+Tresponse max

    10.jpg


2.8 LIN 总线报文帧之调度表(Schedule Table)

    LIN报文帧调度表功能如下:

    负责调度网络各报文发送的顺序;
    为每帧报文分配发送时隙(slot);
    发送时隙:报文可以被发送的时间;
    不同报文的发送时隙可能不同;
    调度表在网络系统设计阶段确定;
    调度表使得LIN通信具有可预测性;

9.jpg

    如何切换调度表?

    主任务可以拥有多个调度表,并在不同的调度表之间切换,该处理方式增加通信的灵活性。

9.jpg

10.jpg


2.9 LIN 总线报文帧之偏移(jitter)

    偏移(jitter)是指一帧报文实际开始发送的时刻与帧时隙起点的时间差(该值在LDF文件中定义)。

    TFrame_Slot> jitter + TFrame_Maximum

9.jpg


3. LIN总线报文帧类型(Frame Type)详解

    介绍完LIN总线的报文帧,接下来,本章节来介绍一下LIN总线报文的帧类型。

    总来说,LIN总线包括无条件帧(Unconditional Frame)、事件帧(Event Frame)、诊断帧(Diagnostic Frames)、零星帧(Sporadic Frame)和保留帧(Reserved Frame)5中帧类型:

10.jpg



3.1 LIN总线的无条件帧(Unconditional Frame)

    无条件帧(Unconditional Frame)使用频度最高的帧类型,顾名思义,其无任何发送条件;标识符(ID)为0到59(0x3B);由主任务发出报头,一个任务响应,一个或多个任务接收如下图:

9.jpg

  • 帧 ID = 0x30应答部分的发布节点为从机节点1,收听节点为主机节点。典型应用如从机节点1向主机节点报告自身某信号的状态;

  • 帧 ID = 0x31应答部分的发布节点为主机节点,收听节点为从机节点1和从机节点2。典型应用如主机节点向从机节点发布信息;

  • 帧 ID = 0x32应答部分的发布节点为从机节点2,收听节点为从机节点1。典型应用如从机节点之间彼此通信;

3.2 LIN总线的事件帧(Event Frame)

    引入事件触发帧的目的是节省带宽。

    下面来考虑一个真实的应用场景,车辆的BCM(LIN Master Node)需要获取4个车门(Door, LIN Slave Node))的状态,该如何实现?

    方法1:使用上面介绍的无条件帧,每次向四个车门请求状态,浪费带宽,因为车门状态不是经常发生:

10.jpg

    方法2:将请求四个车门状态的帧合并为一个事件触发帧,Master不需要每次发送四个帧请求车门的状态,只需要发送一个事件触发帧即可,哪个车门状态发生变化,对应的车门将响应该事件触发帧。

9.jpg

    事件触发帧的响应会出现如下三种情况:

    第一种:没有车门状态变化,无任何车门从节点响应,无冲突:

9.jpg

    第二种:一个车门状态发生变化,仅发生状态改变的车门从节点响应,无冲突:

10.png

    第三种:多个车门状态发生变化,此时将出现冲突。冲突处理时,Master需要像第一种处理方式一样,重新发送四帧分别请求单个车门状态。


    Tips:LIN1.3与LIN2.0、LIN2.1处理方式有所区别,区别在于LIN1.3不切换调度表,占用事件触发帧的时隙发送,LIN2.0、LIN2.1将切换冲突调度表处理,如下图:

10.png


3.3 LIN总线的零星帧(Sporadic Frame)

    零星帧(Sporadic Frame)也叫偶发帧,引入零星帧的目的也是为了节省带宽,如:BCM(Master)需要发送对4个车窗的控制指令,但是,两个车窗的控制命令很少被同时执行,同样大量的带宽被浪费。

10.png

    此时就可以使用零星帧,将四个车门的控制的无条件帧,组合为一帧零星帧发送,从而节省了LIN总线带宽:

10.jpg


3.4 LIN总线的诊断帧(Diagnostic Frames)

    诊断帧(Diagnostic Frames)用来传输诊断或配置信息,一般包含8个字节。

    诊断帧(Diagnostic Frames)标识符分配如下:

  • 60(0x3C):主节点请求(request)帧

  • 61(0x3D):从接单响应(reponse)帧

    具体诊断帧传输方式如下图所示:

10.jpg


3.5 保留帧(Reserved Frame)

    使用标识符: 62(0x3E), 63(0x3F);

    在LIN 2.x总线协议中未对保留帧(Reserved Frame)进行定义, 留给用户自定义或将来的版本升级。

4. LIN总线网络拓扑结构与网络管理

    一个LIN总线网络,至少包含一个主节点(master node)和一个或多个从节点(salve node),总线网络拓扑为星型网络。

下图为包含了一个主节点,两个从节点的实际LIN总线网络架构:

10.jpg


4.1 LIN 总线的主机任务与从机任务

    LIN总线的主节点需要实现主机任务(master task)和从机任务(slave task),而从节点则只需要实现从机任务即可:

    在LIN总线通信中,主机任务决定了在LIN总线上传送的是哪一帧,即实现总线调度表切换,LIN报文帧头产生和发送,从机任务提供每一LIN报文帧响应数据/状态,其中主节点实现的从机任务主要目的是向从节点发送控制命令。

  • 单主机任务,多从机任务;

  • 主节点包含主机任务和从机任务;

  • 从节点只包含从机任务;

  • 主机任务决定总线上的报文,从任务发送数据;

    完整的主机任务功能实现状态机如下:

10.jpg

    完整的从机任务功能实现状态机如下:

8.jpg


4.2 LIN 2.1 .vs LIN 1.3节点模型

    LIN2.1与LIN1.3节点模型的差别在于LIN1.3没有Transport layer(传输层),所以也就没有流控、传输时间控制的功能,

8.jpg

    LIN1.3协议中没有对诊断及节点配置进行规范,所以在LIN1.3中完成相应的功能都放在自定义诊断中完成。


7.jpg


4.3 LIN总线的网络管理

    LIN网络中的所有节点都有初始化状态、工作模式和睡眠模式三种状态,默认LIN节点复位中会自动进入初始化状态,完成节点初始化,初始化结束后,必须在100ms内进入工作模式,在工作模式,LIN节点可以正常收发数据,若LIN总线空闲4~10s(可灵活配置)或者接收到睡眠命令(从节点),LIN节点将进入低功耗睡眠模式。进入睡眠模式后,LIN节点将停止数据收发,直到接收到到唤醒信号(从节点)或者内部事件产生唤醒请求(主节点)将其唤醒,然后重新进节点初始化:

7.jpg


4.4 LIN总线网络睡眠与唤醒

    睡眠指令只有主节点可以发送,从节点在接到睡眠指令之后,也可以选择不进入睡眠状态而继续工作,这根据应用层协议而定。

6.jpg

    在一个处于睡眠状态的LIN网络中,任何一个节点都可以发送唤醒信号。

    唤醒信号是一个250us(在20Kbit/s波特率下的0x0F)到5ms(在1Kbit/s波特率下的0x0F)的显性电平:

7.jpg


    LIN网络管理规定,每一个从节点都需要实现以下功能:

  • 检测唤醒信号(持续150us以上的显性位)

  • 当检测到唤醒信号后,在100ms以内完成初始化工作

    6.jpg


    主节点除了需要完成唤醒功能外,还需要检查出发送唤醒信号的节点(利用信号)。

    当从节点发出唤醒信号之后150ms,主节点仍未发送报文,从节点可以再次发送唤醒信号。当连续发送了3次唤醒信号之后如果主节点仍未发送报文,则从节点必须等待1.5s,才可以再次发送唤醒信号。

总结

    本文详细介绍了首先低速汽车总线--LIN总线协议的应用特点和发展历史以及物理层收发器;然后详细介绍了LIN报文的帧结构和帧类型及其特点和应用场景,并在此基础上介绍了LIN总线网络管理的一些基本知识,可以作为汽车电子工程师学习LIN总线的一个入门参考资料。

    在汽车ECU开发中要真正使用LIN总线,还需要实现完整的LIN协议栈(stack),其牵涉的知识较多较广,这里不展开介绍:

7.jpg

    如下为NXP为其汽车MCU(S08, S12(X),MagniV S12Z, KEA和S32K1xx系列)提供的免费LIN协议栈实现架构:

6.jpg

    该协议栈(LIN2.x and SAE J2602 Stack)是严格按照LIN Spec 2.2开发的,提供源代码下载,感兴趣的读者可以通过以下链接下载学习/使用:

https://www.nxp.com/webapp/Download?colCode=FSL_LIN_2.X_DRIVER&location=null