LIN 是什么?

LIN是Local Interconnect Network 的缩写,是基于 UART/SCI(Universal Asynchronous Receiver-Transmitter /Serial Communication Interface,通用异步收发器/串行通信接口)的低成本串行通信协议。可用于汽车、家电、办公设备等多种领域。

LIN 子网(Cluster)与节点(Node)

LIN 网络与主干线 CAN(Controller Area Network,控制器局域网)总线相连时,需要加入 CAN-LIN 网关,一般由主机节点来充当。

  1. 由于 LIN 网络在汽车中一般不独立存在,经常与上层网络(如 CAN)相连,因此子网的概念是相对于上层网络而言。在不强调与上层网络相连的情况下,后面也称作 LIN 网络。
  2. 一个节点不一定对应一个 ECU(Electronic Control Unit,电子控制单元),因为一个 ECU 可能提供多个LIN 接口,并且这些接口可能连接到不同的 LIN 通信子网中。

节点应用层向下层传输信号和消息。信号和消息位于帧中的数据段,是节点向其他节点传达的实质信息。它们之间的区别在于信号封装于信号携带帧 (帧 ID 范围在 0x00~0x3B 之间)中,用于在运行状态传递上层发生的事件,如温度传感器的测量结果等。消息封装于诊断帧(帧 ID 为 0x3C 或 0x3D,)中,是有固定格式、最大长度不超过 4095 字节的信息,例如第 5 章介绍的服务请求。应用程序通过信号处理实现信号的传递,通过传输层实现消息的传递。

主/从机节点与主/从机任务

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

主机节点(Master Node)包含主机任务(Master Task)和从机任务(Slave Task),从机节点(Slave Node)只包含从
机任务。

主机任务负责:

(1) 调度总线上帧的传输次序;
(2) 监测数据,处理错误;
(3) 作为标准时钟参考;
(4) 接收从机节点发出的总线唤醒命令。

从机任务

从机任务不能够主动发送数据,需要接收主机发送的帧头(帧的起始部分,参照 3.1 节的图 3.1),根据帧头
所包含的信息(这里指帧 ID,详细内容参照 3.1.3 节)判断:
(1) 发送应答(帧中除帧头外剩下的部分,参照 3.1 节的图 3.1);
(2) 接收应答;
(3) 既不接收也不发送应答。

LIN 的特点

LIN 具有以下特点:
(1) 网络由一个主机节点和多个从机节点构成。
(2) 使用 LIN 可以大幅度的削减成本。
(3)信号传输具有确定性,传播时间可以提前计算出。
(4) LIN 具有可预测的 EMC性能,为了限制EMI强度, LIN 协议规定最大位速率为 20kbps。
(5) LIN 提供信号处理、配置、识别和诊断四项功能。

LIN协议层

帧结构

帧(Frame)包含帧头(Header)和应答(Response)两部分。主机任务负责发送帧头;从机任务接收帧头并对帧头所包含信息进行解析,然后决定是发送应答,还是接收应答,还是不作任何反应。

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

值“0”为显性电平(Dominant),值“1”为隐性电平(Recessive),总线上实行“线-与”:当总线上有
大于等于一个节点发送显性电平时,总线呈显性电平;所有的节点都发送隐性电平或不发送信息(不发送任何信息时总线默认呈隐性电平)时,总线才呈现隐性电平,即显性电平起主导作用。图中帧间隔为帧之间的间隔;应答间隔为帧头和应答之间的间隔;字节间间隔包括同步段和受保护ID段之间的间隔、数据段各字节间之间的间隔以及数据段最后一个字节和校验和段之间的间隔。

帧间隔| 同步间隔段 | 同步段 |字节间间隔| 受保护ID段 |应答间隔| 数据段 |字节间隔| 校验和 |帧间隔

同步间隔段 (Break Field)

同步间隔段由同步间隔(Break)和同步间隔段间隔符(Break Delimiter)构成,如图 3.3所示。同步间隔是至少(注1)持续 13 位(以主机节点的位速率为准)的显性电平,由于帧中的所有间隔或总线空闲时都应保持隐性电平,并且帧中的任何其它字段都不会发出大于 9 位的显性电平,因此同步间隔可以标志一个帧的开始。同步间隔段的间隔符是至少持续 1 位的隐性电平。

同步段(Sync Byte Field)

字节域(Byte Field) 字节域包括1 位起始位(Start Bit,显性) + 8位数据位 + 1 位停止位(Stop Bit,隐性),是一种标准 UART 数据传输格式,如图 3.4 所示。在 LIN 的一帧当中,除了上一节讲述的同步间隔段,后面的各段都是通过字节域的格式传输的。在 LIN 帧中,数据传输都是先发送LSB(Least Significant Bit,最低有效位),最后发送 MSB(Most Significant Bit,最高有效位)。

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

从机节点可以不采用精度高的时钟,而采用片上振荡器等精度和成本相对较低的时钟,由此带来的与主机节点时钟产生的偏差,需要通过同步段进行调整,调整的结果是使从机节点数据的位速率与主机节点一致。同步段用于同步的基准时钟为主机节点的时钟。从机节点通过接收主机节点发出的同步段,计算出主机节点位速率,根据计算结果对自身的位速率重新作调整。计算公式如下:

1位时间 =( 第7位的下降沿时刻 - 起始位的下降沿时刻 ) / 8

通过计算,可以得到主机节点实际传输 1 位所用的时间,即位速率。

受保护ID段

受保护 ID 段的前 6 位叫作帧 ID(Frame ID),加上两个奇偶校验位后称作受保护 ID。

帧 ID 的范围在 0x00~0x3F 之间,共 64 个。帧 ID 标识了帧的类别和目的地。从机任务对于帧头作出的反应(接收/发送/忽略应答部分)都是依据帧 ID 判断的。如果帧 ID 传输错误,将会导致信号无法正确到达目的地,因此引入奇偶校验位。校验公式如下,其中“⊕”代表“异或”运算, “¬”代表“取非”运算。

P0 = ID0 ⊕ ID1 ⊕ ID2 ⊕ ID4
P1 = ¬ (ID1 ⊕ ID3 ⊕ ID4 ⊕ ID5)

由公式可以看出, PID 不会出现全 0 或全 1 的情况,因此,如果从机节点收到了“0xFF”或“0x00”,可判断为传输错误。

依据帧 ID 不同将帧进行分类:

帧的类型 帧ID
帧信号携带 无条件帧 0x00 ~ 0x3B
帧信号携带 无条件帧 0x00 ~ 0x3B
帧信号携带 无条件帧 0x00 ~ 0x3B
诊断帧 主机请求帧 0x3C
诊断帧 从机应答帧 0x3F
保留帧 0x3E ,0x3F

从机应答帧是一个完整的帧,与帧结构中的“应答” (帧的一部分)不同,注意区别。

数据段

节点发送的数据位于数据段,包含 1 到 8 个字节(注 1),先发送编号最低的字节 DATA1,编号依次增加,

数据段包含了两种数据类型,信号(Signal)和诊断消息(Diagnostic messages)。

信号(Signal)由信号携带帧传递,一个帧 ID 对应的数据段可能包含一个或多个信号。信号更新时要保证其完整性,不能只更新一部分。一个信号通常由一个固定的节点发出,此节点称为该信号的发布节点(Publisher);其余的一个或多个节点接收,它们称为信号的收听节点(Subscriber)(注 2)。

诊断消息(Diagnostic message)由诊断帧传递,对消息内容的解析由数据自身和节点状态决定。

注:

  1. 协议没有规定帧中的哪一部分显示数据长度码的信息,数据的内容和长度是由系统设计者根据帧 ID 事先约定好的。

  2. 总线上的数据是以广播形式被发送到总线上的,任何节点均能接收,但并非所有信号对每个节点都有用。收听节点接收帧的应答是因为该节点的应用层会使用这些信号,而对于其余节点,由于用不到这些信号,所以没有必要作接收处理,将忽略帧的应答部分。发布和收听由哪个节点进行完全根据应用层的需要由软件或配置工具实现。一般情况下,对于一个帧中的应答,总线上只存在一个发布节点,否则就会出现错误。事件触发帧例外,可能存在零个、一个或多个发布节点。

校验和段

校验和段是对帧中所传输的内容进行校验,

校验和分为标准型校验和(Classic Checksum)及增强型校验和(Enhanced Checksum)。

校验和类型 校验对象 适合场合
标准型校验和 数据段各字节 诊断帧,与 LIN1.x 从机节点通信
增强型校验和 数据段各字节以及受保护 ID 与 LIN2.x 从机节点通信(诊断帧除外)。

采用标准型校验和还是增强型校验和由主机节点管理,发布节点和各收听节点根据帧 ID 来判断采用哪种校验和。

校验方法为将校验对象的各字节作带进位二进制加法(每当结果大于等于 256 时就减去 255),并将所得最终的和逐位取反,以该结果作为要发送的校验和。接收方根据校验和类型,对接收数据作相同的带进位二进制加法,最终的和不取反,并将该和与接收到的校验和作加法,如果结果为 0xFF,则校验和无误,这在一定程度上保证了数据传输的正确性。

帧的类型

无条件帧

无条件帧是具有单一发布节点,无论信号是否发生变化,帧头都被无条件应答的帧。无条件帧在主机任务分配给它的固定的帧时隙(参照 3.3 节)中传输。总线上一旦有帧头发送出去,必须有从机任务作应答(即无条件发送应答)。

事件触发帧的典型应用就是轮询四个车门的开关情况。与其利用无条件帧每个车门轮询一遍,不如同时对四个车门进行询问,如果其中一个车门打开了(事件发生),该车门要对询问作应答,即事件触发的含义。这样做可以减小带宽,但同时会导致两种现象,其一就是没有车门被打开,即无节点应答——事件触发帧允许一帧中只有帧头无应答;另外一种情况就是冲突,即同时有大于等于两个车门被打开,对该问题同时作答——事件触发帧允许两个以上的节点对帧头作应答而不视为错误。当发生冲突时,主机节点需要重新作轮询,样会增加一些响应时间,但由于事件触发帧本身就用来处理低概率事件,总的来说还是节省了带宽。

事件触发帧

事件触发帧是主机节点在一个帧时隙(参照 3.3 节)中查询各从机节点的信号是否发生变化时使用的帧,当存在多个发布节点时,通过冲突解决进度表(参照 3.3 节)来解决冲突。

当从机节点信号发生变化的频率较低时,主机任务一次次地轮询各个信号会占用一定的带宽。为了减小带宽的占用,引入了事件触发帧的概念

与事件触发帧关联的多个无条件帧需要满足以下 5 个条件:
(1) 数据段包含的数据字节数等长;
(2) 使用相同的校验和类型;
(3) 数据段的第一个字节为该无条件帧的受保护 ID,这样才能够知道应答是哪个关联的无条件帧发送出来的;
(4) 由不同的从机节点发布;
(5) 不能与事件触发帧处于同一个进度表(参照 3.3 节)中。

偶发帧

偶发帧是主机节点在同一帧时隙(参照 3.3 节)中当自身信号发生变化时向总线启动发送的帧。当存在多个关
联的应答信号变化时,通过事先设定的优先级来仲裁。

与事件触发帧一样,偶发帧的应答也关联了一组无条件帧。规定偶发帧只能由主机节点作为发布节点。偶
、发帧的传输可能出现三种状况:

1)当关联的无条件帧没有信号发生变化时,该时隙(参照 3.3 节)保持沉默,如图
3.12 第一个帧时隙所示,主机节点连帧头都不需要发送;

2)当其中一个关联的无条件帧包含的信号发生了变化,
则发送该关联的无条件帧的应答部分;

3)如果有两个或两个关联的无条件帧包含的信号发生了变化,则按照事先规定好的优先级,优先级较高的关联的无条件帧获得发送权,优先级较低的要等到下一个偶发帧的帧头到来时才能发送应答。

由于主机节点是唯一的发布节点,所以主机节点事先就知道各个关联信号的优先级别,这样在传输时就不会产生冲突。引入偶发帧的目的在于为进度表(参照 3.3 节)增加一些动态特性——当主机节点的信号发生变化时才有通
信发生。事件触发帧和偶发帧反映了帧在不同时机(信号变化或未发生变化)的传输状况,引入它们的目的是为
了增加通信的灵活性。

诊断帧

诊断帧包括主机请求帧和从机应答帧,主要用于配置、识别和诊断用。主机请求帧(Master Request Frame,MRF),帧 ID = 0x3C,应答部分的发布节点为主机节点;从机应答帧(Slave Response Frame, SRF),帧 ID = 0x3D,应答部分的发布节点为从机节点。数据段规定为 8 个字节,一律采用标准型校验和。

保留帧

保留帧的帧 ID 为 0x3E 和 0x3F,为将来扩展用。

进度表

进度表是帧的调度表,规定总线上帧的传输次序以及各帧在总线上的传输时间。进度表位于主机节点,主机任务根据应用层需要进行调度。进度表可以有多个,一般情况下,轮到某个进度表执行的时候,从该进度表规定的入口处开始顺序执行,到进度表的最后一个帧时,如果没有新的进度表启动,则返回到当前的进度表第一个帧循环执行;也有可能在执行某个进度表当中发生中断,执行另一个进度表后再返回,

进度表除规定了帧 ID 的传输次序外,还规定了帧时隙(Frame Slot)的大小。帧时隙是进度表规定的一个帧的帧头起始到下一个的帧的帧头起始的时间。每个帧的帧时隙都可以不同,一个帧时隙对应了进度表的一个入口。

状态机(State Machine)实现

主机任务的状态机

当进度表启动后,主机任务依次发送同步间隔段、同步段和受保护 ID 段,

—-> 空闲—–进度表启动,准备传送帧—>同步间隔段(发送同步间隔段)—>同步段(发送同步段)—>受保护ID段(发送受保护ID)
| |
|<———————————————————————————————|

从机任务的状态机

从机任务负责发布或者接听帧的应答。包括两个状态机:

  1. 同步间隔段和同步段检查器
  2. 帧处理器

网络管理

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

唤醒

当总线处于休眠状态时,主/从机节点都可以向总线上发送唤醒信号,唤醒信号持续 250μs~5ms。其余节点(除发送唤醒信号以外的节点)以大于 150μs 为阈值判定唤醒信号。每个从机节点必须在唤醒信号显性脉冲的结束处算起 100ms 以内准备接收来自主机的命令(帧头);主机节点也必须被唤醒, 100ms 之内主机节点发送帧头开始通信。主机节点的同步间隔段也可以充当唤醒信号,由于从机节点需要作初始化处理,因此主机节点所发的这个帧有可能不会被正常接收。

如果节点发送出唤醒信号后,在 150ms~250ms 之内没有接收到总线上的任何命令(帧头),则可以重新发送一次唤醒信号。唤醒信号最多可以发送 3 次, 3 次之后,必须等待至少 1.5s 之后才可以再次发送唤醒信号

休眠

总线可以在两种情况下进入休眠:

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

(2) 当总线静默(没有显性和隐性电平之间的切换)4s~10s 时,节点自动进入休眠状态。

状态管理

状态管理是为了检测运行中的错误。错误一旦被发现,根据设计需要采取不同的措施进行排除,一种方法是简单替换掉错误节点,另一种方法是让发生问题的节点进入到自我保护/安全模式(Limp Home Mode)。

网络报告

协议强制规定,每个从机节点都要在它发布的某个无条件帧中包含一个长度为一位的标量信号response_error,向主机节点报告自身状态。主机节点负责接收这个信号并且执行分析,如表所示。事件触发帧由于允许总线冲突,需特殊处理。

response_error 主机节点对信号的解释
FALSE 从机节点操作正确
TRUE 从机节点有偶发错误
从机节点无应答 从机节点,总线或主机存在严重错误

节点内部报告

节点自身需要设定两个状态位: Error_in_response 和 Successful_transfer。当发送或接收应答的时候发现错误,将置位 Error_in_response;成功传输则置位 Successful_transfer。节点需要将这两个状态位报告给应用层。

帧收发的硬件实现

组成

收发 LIN 帧需要的硬件包括协议控制器(Protocol Controller)、总线收发器(Bus Transceiver)和 LIN 总线三部分

LIN的硬件特点

  • 单线通信
  • 从机节点无需高精度时钟源
  • EMI 低而且可控
  • 最高通信速率 20kbps

协议控制器

协议控制器的主体是一个基于 UART/SCI 的通信控制器,工作方式是半双工。协议控制器既可以使用专用模块实现,也可以用“UART/SCI+定时器”实现。发送时,协议控制器把二进制并行数据转变成高-低电平信号,并按照规定的串行格式(8 数据位, 1 停止位,无校验位)送往总线收发器;接收时,协议控制器把来自总线收发器的高-低电平信号按照同样的串行格式储存下来,然后再将储存结果转换成二进制并行数据。

实现方案

依据硬件资源不同可以分为 3 类:

1、UART/SCI+定时器+外部中断
2、硬件 LIN(Hardware LIN)
3、LIN 模块(LIN Module),分别面向对成本和性能有不同侧重的应用。

总线收发器

总线收发器的主体是一个双向工作的电平转换器,完成协议控制器的高-低电平与 LIN 总线的隐性-显性电平(注 1)之间的转换。