一、LIN总线协议简介
LIN(Local Interconnect Network)总线是基于UART/SCI(通用异步收发器/串行接口)的低成本串行通讯协议。其目标定位于车身网络模块节点间的低端通信,主要用于智能传感器和执行器的串行通信,而这正是CAN总线的带宽和功能所不要求的部分。
LIN的一大优点是成本低,但其最大传输速率为20Kbps。建议的通信速率如下,低速2400bps,中速9600bps,高速19200bps。根据OSI参考模型,LIN总线仅规范了数据链路层和物理层。
在低速对带宽要求不高的场合,LIN具有较高的成本优势,是比CAN更好的替代选择,但LIN并不能完全取代CAN总线(速度+可靠性)。一般地,LIN总线主要应用在汽车内对安全和整车性能影响不大的子系统,比如车门窗控制、雨刮器、空调、座椅调整、照明灯等。
1、LIN总线网络结构
下图示例LIN总线在车顶/雨刮区域的应用, Central ECU 是LIN 总线的主节点,包括车后视镜、车门开启器、雨/光传感器和刮雨器四个从机。主节点同时作为 Gateway 模块接入到底盘CAN、车身CAN和诊断CAN。
LIN总线是一个SUB-BUS,与主干网(back-bone BUS)之间需要网关(进行不同网络协议转换),通常LIN总线不会单独存在。
与CAN总线 的关系
LIN总线网络结构
2、LIN网络主从节点的功能
LIN网络中的节点任务分为主机任务和从机任务两类。
- 主节点可以执行主任务和从任务;
- 从节点只能执行从任务;
- 单主任务,多从任务;
-
(1)主机任务(master task)主要执行以下功能:
定义总线上的通信速率。
(同步场?待考)- 发送报文帧头,包含同步间隔场、同步场和标识符场三个部分
- 监控总线通信,通过校验和确定数据正确性与否
-
(2)从机任务(slave task)主要执行以下功能:
等待主机任务发送的同步间隔,使从机与主机于同步场中获得同步
- 分析标识符场,若与自己相关,则接收或发送数据,若与自己无关则什么都不做
- 检查和发送校验和
- 接受主机任务的唤醒和睡眠请求
3、LIN总线特点:
- 串行通信
- 基于UART/SCI(通用异步收发器/串行接口)的低成本串行通讯协议
- 线间干扰小,节省线束,传输距离远
- 几乎所有的MCU有具备LIN总线的硬件基础
- 单线传输
- 仅使用一根信号线便可完成信息的传输,即所谓的单总线设备
- 总线电压基于V**BAT**
- 单主多从结构
- 无需仲裁
- 最多可连接16个节点(1主15从)
- 为CAN总线网络提供辅助功能
- 应用场合有智能传感节点、自动车窗节点等
- 传输速率最高20Kbps
- 符合A类网络标准,满足大部分车身控制需要
- 从节点无需晶振就可以实现同步
- 可计算的信号传输时延
- 网络通信可预期
- 支持多报文传输
-
二、物理层
1、信号规范
显性电平(Dominant)与 隐性电平(Recessive)
此处显性/隐性的含义与 CAN 总线的定义相同,即总线上实行“线与”逻辑:当总线上有大于等于一个节点发送显性电平时,总线呈显性电平;所有的节点都发送隐性电平或不发送信息(发送任何信息时总线默认呈隐性电平)时,总线才呈现隐性电平,即显性电平起主导作用。
- LIN总线要求所有节点的信号电压相同,信号电压参考收发器供电电压 V__SUP,一般使用12V电压,低于VSUP的 40% 视为显性电平(Dominant),即为“0”,高于VSUP的 60% 视为隐性电平(Recessive),即为“1”。
VBAT = 8~18V V**SUP = VBAT - Vdiode **
LIN总线电平
VSUP 指总线收发器的电源电压,注意它并不等同于蓄电池电压(VBAT)。考虑将电池引入到ECU单元在电源滤波(二极管等)电路上的压降,VSUP要低于电池电压VBAT,如图。
外部供电VBAT和内部供电VSUP的区别
2、收发器
LIN总线收发器本质上是个双向工作的电平转换器,LIN 规范要求总线收发器要能承受 ±11.5% 的电源波动和参考点电平波动,并且能承受电源和参考点之间 8% 的电位差波动。在要求不高的场合,可采用简单的收发器电路如图21所示。
简易的 LIN 收发器电路
3、端接电阻
为实现“线与”特性,LIN协议规定了主机和从机节点的端接电阻,端接电阻一端连LIN总线,另一端通过串接二极管。主机端接电阻 1K(范围:0.9 ~ 1.1K),从机端接电阻 30K(范围:20 ~ 60K)。如图22所示,图中串接二极管是必须的,当ECU电源断路时,它可以防止LIN总线上电源倒灌。
LIN总线端接电阻
LIN所有节点并联在一起,构成图所示的等效电路。其中,总线负载电阻等于各节点端接电阻的 并联等效电阻,总线负载电容等于各节点输入电容和总线分布电容的并联等效电容。总线电阻决定了总线收发器驱动级的功率和通信期间的功耗;总线电容可以吸收周围环境的噪声干扰。总线电阻和总线电容构成的 RC 滤波器还有助于控制压摆率。
为确保最恶劣情况下正常通信的需要, LIN 规范除了限制节点的端接电阻、电容和时间常数。协议规定主机/从机端接电容典型值为 220pF ,根据具体应用调整主机/从机端接电容满足 EME/EMI 性能,从机端接电容可调范围不大,主要通过调整主机电容实现。有的 收发器 规定主机 1nF,从机 220pF,具体参考收发器应用手册。协议还规定 LIN 总线长度不超过 40 米,一个 LIN 网络的最大节点数目不超过 16。由于端接电阻连接着电源和 LIN 总线,当出现 LIN 总线对地短路时,如果不采取保护措施,会有较大的电流流过端接电阻,产生显著的功耗。
总线等效电路
三、数据帧规范
1、帧
- 总线上传输的实体,是作为一个完整单元传输的数据
- 帧的数据场中包含一个或多个信号
2、信号
- 信号一般是反映真实世界的物理量或逻辑量。如发动机转速、电机的状态
- 信号由帧来传输,一个帧可以包含一个或多个信号
- 每个信号由固定的节点产生,但是可以由不同的节点接收
-
3、LIN报文帧结构
LIN总线是基于主从模式的通信系统。在LIN总线上仅允许有一个主机,主机控制总线上所有通信过程,从机只有在主机许可的下才能向总线上发送消息。主机通过向总线上发送请求(帧头,Frame Header),相关的从机或主机本身据此帧头发送应答(Response),请求和应答构成LIN总线的帧(Frame),如下图所示。
LIN数据传输原理
通信原理:主任务发送报头,从任务用响应来补充报头形成完整的报文。
报文传输:报文的内容由ID来定义。
广播:所有节点都能够接受总线上的帧。
帧的整体结构(1)间隔场(段)
1)表示一帧报文的起始,由主节点发出;
2)间隔信号至少由13个显性位组成;
3)隔界定符至少由1个隐形位组成;
4)间隔场是唯一一个不符合字节场格式的场;
5)从节点需要检测到至少连续11个显性位才认为是间隔信号;
(2)同步场(段)
1)确保所有从节点使用与节点相同的波特率发送和接收数据;
2)一个字节,结构固定:0X55;
(3)标识符场(段)(PID)
1)ID的范围从0到63(0x3F);
帧ID标识了帧的目的地和类别:从节点是发送还是接受。
2)奇偶校验符(Parity)P0,P1; P0 = ID0 ⊕ ID1 ⊕ ID2 ⊕ ID4
- P1 = ID1 ⊕ ID3 ⊕ ID4 ⊕ ID5
注意:P0\P奇偶校验位在数据传输时实际在低位(先传输过来)
所谓奇偶校验就是在发送的每一个字节后都加上一位,使得每个字节中1的个数为奇数个或偶数个。接收方通过计算数据中1的个数是否满足奇偶性来确定数据是否有错。这个不用背,用的时候可以查表。
#include <stdio.h>
#include <windows.h>
int main()
{
short p0=0,p1=0;
short LIN_ID=0x22,PID=0x00;
p0 = (LIN_ID & 0x01) ^ ((LIN_ID & 0x02) >> 1) ^ ((LIN_ID & 0x04) >> 2) ^ ((LIN_ID & 0x10) >> 4); //按位异或
p0 = p0 & 0x01;
p1 = ~(((LIN_ID & 0x02) >> 1) ^ ((LIN_ID & 0x08) >> 3) ^ ((LIN_ID & 0x10) >> 4) ^ ((LIN_ID & 0x20) >> 5));
p1 = p1 & 0x01;
PID = (p1 << 7) | (p0 << 6) | LIN_ID;
printf("p0=%#x,p1=%#x,PID=%#X\n",p0,p1,PID);
system("pause");
return 0;
}
(4)数据场(段)
1)数据场长度1到8个字节;
2)低字节先发,低位先发;
3)如果某信号长度超过1个字节采用低位在前的方式发送(小端);
4)协议中并没有规定哪一部分显示数据长度码的信息(这点与CAN总线不同),数据的内容与长度均是由系统设计者根据帧ID事先约定好的。
(5)校验和场(段)
用于校验接收的数据是否正确
1)经典校验(Classic Checksum)仅校验数据场(LIN1.3)
2)增强校验(Enhance Checksum)校验标识符场(PID,不仅仅是ID)与数据场内容(LIN2.0、LIN2.1)
标识符为0x3C和0x3D的帧只能使用经典校验
计算方法:反转8位求和(inverted eight bit sum)
例:Data=0x4A、0x55、0x93、0xe5
0x4A+0x55 = 0x9F这个没有疑问,再加0x93 = 0x132,很明显,超过了0xFF,分解为0x1和0x32,突出的高8位删除,加到低8位中,0x1+0x32=0x33。再加0xE5 = 0x118,又超了,0x1+0x18=0x19。取反(Not),0xE6。
4、帧长度(帧传输时间)
(1)最小帧长度
THEADER_NOMINAL=34TBIT
TRESPONSE_NOMINAL=10(NDATA+1)*TBIT
TFRAME_NOMINAL=THEADER_NOMINAL+TRESPONSE_NOMINAL
(2)最大帧长度
LIN协议规定帧的最大传输时间为额定传输时间的 1.4 倍,即为帧传输预留 40% 的裕量。该特性是考虑到总线上节点设备性能参差不齐,允许节点不必收到指令后立即执行。也就是说,协议允许节点推迟下一个 UART 字符的发送,但推迟的总时间不能超出额定值的40%。延迟时间包括两类:Interbyte Space 和 Response Space。它们在帧中的位置如下图所示。
LIN总线帧的最大传输时间
帧的最大传输时间计算公式如下:
THEADER_MAX=1.4THEADER_NOMINAL
TRESPONSE_MAX=1.4TRESPONSE_NOMINAL
TFRAME MAX=THEADER MAX+TRESPONSE MAX
四、帧类型
LIN总线上数据传输包括 5 种不同的帧,分别为无条件帧、事件触发帧、偶发帧、诊断帧、保留帧
(1)无条件帧
帧ID _0_ ~ _59_。无条件帧(_Unconditional Frame_)是具有单一发布节点,无论信号是否发生变化,帧头都被无条件应答的帧。无条件帧在主机任务分配给它的固定的帧时隙中传输。总线上一旦有帧头发送出去,必须有从机任务作应答(即无条件发送应答)。<br />![](https://cdn.nlark.com/yuque/0/2020/webp/1568683/1606522981610-755a88ee-bcc3-4fe9-beb1-c641f135d91a.webp#crop=0&crop=0&crop=1&crop=1&height=354&id=pNmFf&margin=%5Bobject%20Object%5D&originHeight=354&originWidth=435&originalType=binary&ratio=1&rotation=0&showTitle=false&size=0&status=done&style=shadow&title=&width=435)
- 帧 ID = 0x30应答部分的发布节点为从机节点1,收听节点为主机节点。典型应用如从机节点1向主机节点报告自身某信号的状态。
- 帧 ID = 0x31应答部分的发布节点为主机节点,收听节点为从机节点1和从机节点2。典型应用如主机节点向从机节点发布信息。
- 帧 ID = 0x32应答部分的发布节点为从机节点2,收听节点为从机节点1。典型应用如从机节点之间彼此通信。
(2)事件触发帧
帧ID 0 ~ 59。事件触发帧(Event-triggered Frame)是主机节点在一个帧时隙中查询各从机节点的信号是否发生变化(事件)时使用的帧,当存在多个发布节点时,通过冲突解决进度表(Collision Resolving Schedule)来解决冲突。
当从机节点信号发生变化的频率较低时,主机任务一次次地轮询各个信号会占用一定的带宽。为了减小带宽的占用,引入了事件触发帧的概念。同一个 PID 的事件触发帧进和无条件帧对应的第一个字节数据是相同的,从机只有在自身数据变化时才发送应答,当总线上没有任何从机应答时,该帧的应答部分为空。如果总线上有超过一个从机应答,则发生冲突,主机则通过发送无条件帧轮询所有从机,解决冲突的问题。
事件触发帧的典型应用就是轮询四个车门的开关情况。BCM(Master)需要获取4个车门的状态,该如何实现?
第一种方式:轮询
每次向四个车门请求状态,浪费带宽,因为车门状态不是经常发生。
第二种方法:合并请求
将车门状态合并成一个事件
将请求四个车门状态的帧合并为一个事件触发帧,Master不需要每次发送四个帧请求车门的状态,只需要发送一个事件触发帧即可,哪个车门状态发生变化,对应的车门将响应该事件触发帧。
事件触发帧的响应会出现如下三种情况:
第一种:没有车门状态变化
第二种:一个车门状态发生变化
第三种:多个车门状态发生变化,此时将出现冲突
冲突处理时,Master需要像第一种处理方式一样,重新发送四帧分别请求单个车门状态。LIN1.3与LIN2.0、LIN2.1处理方式有所区别,区别在于LIN1.3不切换调度表,占用事件触发帧的时隙发送,LIN2.0、LIN2.1将切换冲突调度表处理,如下图:
(3)偶发帧
帧ID 0 ~ 59。偶发帧(Sporadic Frame)是主机节点在同一帧时隙中当自身信号发生变化时向总线启动发送的帧。当存在多个关联的应答信号变化时,通过事先设定的优先级来仲裁。
偶发帧主要用于主机发送不经常变化的信息,可以理解为主机用的事件触发帧。与事件触发帧一样,偶发帧的应答也关联了一组无条件帧。
偶发帧的传输可能出现 3 种状况:
- 当关联的无条件帧没有信号发生变化时,该时隙保持沉默,主机节点连帧头都不需要发送;
- 当其中一个关联的无条件帧包含的信号发生了变化, 则发送该关联的无条件帧的应答部分,如下图上半部分所示;
- 如果有两个或以上关联的无条件帧包含的信号发生了变化,则按照事先规定好的优先级,优先级较高的关联的无条件帧获得发送权,优先级较低的要等到下一个偶发帧的帧头到来时才能发送应答。由于主机节点是唯一的发布节点,所以主机节点事先就知道各个关联信号的优先级别,这样在传输时不会产生冲突,如下图下半部分所示
偶发帧
引入偶发帧和事件触发帧是为了让LIN总线的通信机制更加灵活,只在信号变化或未变化时传输消息可有效提高总线的通信效率。
(4)诊断帧
诊断帧包括主机请求帧和从机应答帧,主要用于配置、识别和诊断。诊断基于 ISO 15765-2 传输标准和 ISO 14229 UDS (U_niform Diagnostic Services)标准。主机请求帧的帧 ID = **_0x3C,应答部分的发布节点为主机节点,一般用于诊断请求或配置从机;从机应答帧的帧 ID = 0x3D, 应答部分的发布节点为从机节点,一般为诊断应答。数据段规定为 _8**_ 个字节,一律采用标准型校验和。诊断帧的帧头和应答方向如下图所示。
诊断帧
五、进度表
进度表是帧的调度表,规定了总线上帧的传输次序以及传输时间。进度表位于主机节点,主机任务根据应用程需要进行调度。进度表可以有多个,一般情况下,轮到某个进度表执行的时候,从该进度表的入口处开始执行,到进度表的最后一个帧时,如果没有新的进度表启动则返回到当前进度表的第一个帧开始执行;也有可能在执行到某个进度表时发生中断,跳到另一个进度表后再返回,如事件触发帧就是一个典型的例子。
状态机的实现
白话LIN总线
1、总线原理:
物理上就一根线,关联节点都接上,有且仅有一个主设备,N多从设备,每个节点要通信的内容都事先编号号。
这就好比大家开晚会,话筒就一个,主持人一个,N个嘉宾,每人的话题都有一个编号。
2、表达顺序
晚会开始前,大家睡觉的睡觉,闲的闲
1 主持人,把话筒对着大鼓,敲-停-, 敲-停-, … 敲-停-
这样大家都被吵醒了,晚会开始了
晚会都是谈话内容,都是下面步骤的重复
t1 主持人把话筒同音闭了一会,--LIN总线的Break
t2 主持人试了试话题,呼呼呼呼--LIN总线的同步期
t3 主持人说,下面是由 PID编号的人讲话--LIN总线的PID
t4 有PID的人,就开始说了 D0,D1,D2,D3,D4,D5,D6,D7 --LIN总线的数据
t5 有PID的人,接着说了就这样了--LIN总线的 CRC
就这样重复了多次之后,主持人
e1 主持人把话筒同音闭了一会,--LIN总线的Break
e2 主持人试了试话题,呼呼呼呼--LIN总线的同期
e3 主持人说,下面是由 PID编号是睡眠的人讲话(就他自己)--LIN总线的PID
e4 有PID的人,就开始说了 Go to sleep --LIN总线的数据,最多8个Byte
e5 有PID的人,接着说了就这样了--LIN总线的 CRC
3、特点
- 物理上就一根线,多节点送信,又没有冲突检测,怎么办,主设备调度啊
- 速度怎么样,和CAN相比,十几kbps不算高,不过连接上的设备就那么大信息量,正好啦
- 价额怎么样,便宜啊,一个物理tranceiver,一个带UART的CPU,再来的点软件,搞定了
- 安全系数怎么样,PID带校验,数据带CRC校验,能发现错误,报告
- 扩展性怎么样,用两个特定的PID,做数据链路层,创送上层的大包TP层,
- TP层上面在支持个诊断功能,能做些其他事情了
- 各版本兼容性怎么样,主设备版本高,就能管理协调好
- 反之,从设备版本高,有些浪费