![cover](https://img-blog.csdnimg.cn/a3d2fb865f6547e7a896bac08c25667a.png)
LIN 总线入门
LIN总线基本知识,包括主节点和从节点、LIN报文帧结构和类型、调度表、网络管理等。
目录
一. LIN总线概述
LIN总线(Local Interconnect Network)是一种低成本车辆总线,主要特点如下:
1.一个主节点(master),多个从节点(slave),由于物理层的限制,一个LIN网络最多可以连接16个节点(1主15从)
2.基于UART/SCI(Universal Asynchronous Receiver-Transmitter/SerialCommunication Interface通用异步收发器/串行通信接口)的低成本串行通信协议。
3.从节点自同步
4.确定的信号传输,可预估的信号传输时间
5.单线传输,成本低
6.速度可达20kbit/s
7.基于信号的应用交互
8.可预知的行为
9.可配置
10.支持传输层和诊断
二.LIN总线WORK FLOW
1个主节点与多个从节点连接构成一个 LIN cluster,在LIN cluster设计阶段,LIN cluster 设计工具解析关联节点兼容性文件来生成LDF文件(LIN description file). LIN cluster generator 解析LDF文件来自动生成对应LIN节点的功能(如图中所示的Master节点和Slave 3节点)。LDF还可用于LIN总线分析/仿真工具做cluster 的debugging.
三.LIN总线主节点和从节点
主节点包括主节点和从节点的任务,其它从节点只包括一个从节点的任务。1个节点可能参与多个cluster。主节点决定总线发送哪帧报文和发送时间,从节点提供各帧报文传输的数据。
主节点任务基于调度表传输帧头,调度表定义帧和帧之间的发送间隔,主节点应用可能使用多个不同的调度表。
四、LIN报文帧
报文帧包括帧头(主节点任务提供)和应答(从节点任务提供)。
帧头由帧ID、间隔场(break field)和同步场(sync field)组成。帧头唯一地定义了这帧报文的含义。指定的从节点基于帧ID发送应答,应答包括数据场和校验和场,如下图所示:
从节点任务关注帧头对应的数据,验证校验和并使用该数据。
LIN报文特点:
系统灵活性:新的节点可以被添加到LIN cluster,且不需要改变其它从节点的硬件和软件
消息路由:消息的内容基于帧ID定义
广播:基于单帧报文,多个节点可以同时接收和响应
LIN报文传输数据类型
信号:标量值或者字节数组打包进一帧报文的数据场,对于ID相同的报文,信号总是在数据场的相同位置。
诊断信息:诊断消息采用两个基于保留帧ID的报文传输。
LIN 报文帧结构
帧头包括同步间隔场、同步场、PID场(受保护ID)场,应答部分包括数据场与效验和场。
发送1帧报文的时间是发送各byte的时间加上Response space和inter-byte spaces.
帧头从间隔场的下降沿开始到PID的终止位结束。应答部分从PID的终止位开始到校验和场的终止位结束。
inter-byte space位于前一个场终止位和下一个字节起始位之间,Response space位于PID场和数据场第一个字节之间。
在 LIN 的一帧当中,除了间隔场,后面的各段都是通过字节域的格式传输的。字节域包括1位起始位(Start Bit,显性) + 8位数据位 + 1位停止位(Stop Bit,隐性),在 LIN 帧中,数据传输都是先发送LSB(Least Significant Bit,最低有效位),最后发送 MSB(Most Significant Bit,最高有效位)。起始位为0(显性),终止位为1(隐性).
间隔场
间隔场用来表示一帧报文的开始,由主节点任务生成,主值有至少13个标称位时间,后面跟着1个间隔符,间隔符至少有1个标称位时间长。
同步场
同步场是值为0x55的字节域,如下图所示
PID
受保护的ID场PID(protected identifier field)由2个子场组成:帧ID和奇偶校验码,0-5 bit 为帧ID,6-7 bit 为奇偶校验码。
帧ID
帧ID共6个bit, 取值范围0-63可以使用。
帧ID | 类型 |
0-59(0x3B) | 信号携带帧(无条件帧,事件触发帧,偶发帧) |
60(0x3C)-61(0x3D) | 诊断和配置帧,只能使用classic 标准校验 |
62(0x3E)-63(0x3F) | 保留帧(不能用于LIN 2.X cluster) |
奇偶检验码
奇偶校验码基于帧ID bits 计算,如下方公式所示:
P0 = ID0 ⊕ ID1 ⊕ ID2 ⊕ ID4
P1 = ¬(ID1 ⊕ ID3 ⊕ ID4 ⊕ ID5)
其中“⊕”代表“异或”运算,异或逻辑的关系是:当AB不同时,输出1;当AB相同时,输出0。“¬”代表“取非”运算。
帧ID和奇偶校验码在PID的mapping
PID和帧ID对照表
数据场
一帧报文数据场字节数范围为1个字节-8个字节,一个帧ID下的数据场字节数应由报文的发布方和所有订阅方协商一致确定。数据采用广播形式发送,总线上任何节点都能接收,节点的应用层如果需要该信号,则节点接收该帧的应答,如果不需要该信号,节点将忽略帧应答部分。发布和收听由哪个节点进行完全根据应用层的需要由软件或配置工具实现。
一个数据字节是字节域的一部分,如下图所示:
对于超过1个字节的数据实体,采用小端传输的方式,数据传输都是LSB(Least Significant Bit,最低有效位)在第1个传输字节, MSB(Most Significant Bit,最高有效位)在最后1个传输字节。
小端传输一般采用Motolora格式,详情参见以下专题:
【DBC专题】-4-DBC文件中的Signal信号字节顺序Motorola和Intel介绍_汽车电子助手的博客-CSDN博客_dbc大端小端
校验场
校验分为标准校验和增强型校验,采用标准型校验和还是增强型校验和由主机节点管理,发布节点和各收听节点根据帧 ID 来判断采用哪种校验和。标准校验和只保护数据段,增强型校验和同时保护数据段和帧PID段。LIN1.X 的节点只支持标准型校验和,LIN 2.X开始支持增强型校验和。另外,帧ID为 60(0x3C)/61(0x3D) 的诊断帧只支持标准校验和。
LIN报文帧类型
LIN报文帧类型影响报文帧传输的有效前置条件,一个节点或者cluster无需支持所有的报文帧类型。一帧报文中所有未被使用和定义的bit应设置为隐性(值为1)。
无条件帧
无条件帧是信号携带帧,帧ID范围从0(0x0)-59(0x3B), 无条件帧具有单一发布节点和单个或多个从节点,无论信号是否发生变化,帧头均会被无条件应答的帧。无条件帧在主机任务分配给它的帧时隙中传输。总线上一旦有帧头发送出去,必须有从机任务作应答(即无条件发送应答),如下图所示。
帧 ID = 0x30 应答部分的发布节点为从机节点 1,收听节点为主机节点。典型应用如从机节点 1 向主机节点报告自身某信号的状态。
帧 ID = 0x31 应答部分的发布节点为主机节点,收听节点为从机节点 1 和从机节点 2。典型应用如主机节点向从机节点发布信息。
帧 ID = 0x32 应答部分的发布节点为从机节点 2,收听节点为从机节点 1。典型应用如从机节点之间彼此通信(参考一文看懂LIN总线 - 知乎)
事件触发帧
事件触发帧旨在避免分配过多带宽用来轮询多个从节点来提高低频率事件LIN cluster响应度 。主机节点在一个帧时隙中查询各从机节点的信号是否发生变化(事件),当存在多个发布节点时,通过冲突解决调度表来解决冲突。当从机节点信号发生变化的频率较低时,主机任务一次次地轮询各个信号会占用一定的带宽。为了减小带宽的占用,引入了事件触发帧的概念。
与事件触发帧关联的多个无条件帧需要满足以下5个条件:
1.数据场所包含的数据字节数等长
2.使用相同的效验(LIN1.X和LIN2.X帧混用是不允许的)
3.数据场的第一个字节为该无条件帧的PID,
4.由不同的从机节点发布
5.不能与事件触发帧处于同一个进度表中
事件触发帧的帧头在分配的帧时隙传输,关联的无条件帧发送方如果其中的信号已更新应仅发送应答部分,如果应答成功传输,该信号不再被认为待更新。
如果没有从节点应答帧头,其它的帧时隙保持静默并且帧头将被忽略。
如果在同一个帧时隙,有多个从节点对帧头应答,冲突将会发生,主节点将会调用冲突解决调度表来依次向各个节点发送无条件帧(无条件帧只能有1个节点应答)来确定从机节点的信息状态,每个事件触发帧均有1个关联冲突解决调度表。当冲突发生后,在下个帧时隙开始时主节点会自动跳转到冲突解决调度表。
冲突解决调度表应包含所有的相关联无条件帧,此外还可能会有其它无条件帧,这些无条件帧可能数据长度不同。
在冲突解决调度表被调用一次后,主节点应切换回之前的调度表。
举例如下图:1个调度表仅包含1个事件触发帧(ID=0x10).该事件触发帧关联2个无条件帧:ID=0x11来自slave 1,另一个ID=0x12来自slave 2,冲突解决调度表包含以上2个无条件帧。
事件触发帧的典型应用就是中控锁系统监控四个车门的开关情况。与其利用无条件帧每个车门轮询一遍,不如同时对四个车门进行询问,如果其中一个车门打开(事件发生),该车门要对询问作应答,即事件触发。这样做可以减小带宽,但同时会导致两种现象,其一就是没有车门被打开,即无节点应答——事件触发帧允许一帧中只有帧头无应答;另外一种情况就是冲突,即同时有大于等于两个车门被打开,对于同时应答的问题——事件触发帧允许两个以上的节点对帧头作应答而不视为错误。当发生冲突时,主机节点重新轮询,这样会增加一些响应时间,但由于事件触发帧本身就用来处理低概率事件,总的来说还是节省了带宽。(参考LIN Bus – 第22条军规)
偶发帧
偶发帧是主机节点在同一帧时隙中当自身信号发生变化时向总线启动发送的帧。当存在多个关联的应答信号变化时,通过事先设定的优先级来仲裁。偶发帧主要用于主机发送不经常变化的信息,可以理解为主机用的事件触发帧。与事件触发帧一样,偶发帧的应答也关联了一组无条件帧。
偶发帧的传输可能出现 3 种状况:
1.当关联的无条件帧没有信号发生变化时,该时隙保持沉默,主机节点连帧头都不需要发送;
2.当其中一个关联的无条件帧包含的信号发生了变化, 则发送该关联的无条件帧的应答部分;
3.如果有两个或以上关联的无条件帧包含的信号发生了变化,则按照事先规定好的优先级,优先级较高的关联的无条件帧获得发送权,优先级较低的要等到下一个偶发帧的帧头到来时才能发送应答。由于主机节点是唯一的发布节点,所以主机节点事先就知道各个关联信号的优先级别,这样在传输时不会产生冲突。
引入偶发帧和事件触发帧是为了让LIN总线的通信机制更加灵活,只在信号变化或未变化时传输消息可有效提高总线的通信效率。 (参考LIN Bus – 第22条军规)
诊断帧
诊断帧包括主机请求帧和从机应答帧,主要用于配置、识别和诊断。诊断基于 ISO 15765-2 传输标准和 ISO 14229 UDS (Uniform Diagnostic Services)标准。主机请求帧的帧 ID = 0x3C,应答部分的发布节点为主机节点,一般用于诊断请求或配置从机;从机应答帧的帧 ID = 0x3D, 应答部分的发布节点为从机节点,一般为诊断应答。数据段规定为 8 个字节,一律采用标准型校验和。 (参考LIN Bus – 第22条军规)
五.传输层PDU
请求帧总是由Master节点发送,响应帧总是由Slave节点发送。
NAD是请求帧中slave节点被寻址的地址,因此仅slave节点拥有NAD。
一般来说从节点的NAD是唯一的,但是也存在多个 SLAVE 节点共享相同的 NAD的情况,此时需要满足以下条件避免出现通信冲突:
1.相同类型的设备:如果多个 SLAVE 节点是相同类型的设备(例如相同型号的传感器或执行器),它们可以共享相同的 NAD。这样,其他节点可以使用相同的标识符与它们通信。
2.不同类型的设备,但不会同时活动(active):如果多个 SLAVE 节点是不同类型的设备,但它们不会同时活动,那么它们也可以共享相同的 NAD。例如,如果一个传感器和一个执行器不会同时处于活动状态,它们可以使用相同的 NAD。
3.网络分段:在某些系统中,CAN 总线可能被分成多个网段,每个网段有不同的 NAD 范围。在这种情况下,不同网段的 SLAVE 节点可以使用相同的 NAD,因为它们不会在同一网段上同时活动。
六.调度表
以下调度表内容来自https://www.csdn.net/tags/OtTaMg1sMDg2MTctYmxvZwO0O0OO0O0O.html
调度表规定总线上帧的传输次序以及各帧在总线上的传输时间。
进度表位于主机节点,主机任务根据应用层需要进行调度。
进度表可以有多个,一般情况下,轮到某个进度表执行的时候,从该进度表规定的入口处开始顺序执行,到进度表的最后一个帧时,如果没有新的进度表启动,则返回到当前的进度表第一个帧循环执行;也有可能在执行某个进度表当中发生中断,执行另一个进度表后再返回,如事件触发帧的冲突解决过程就是一个典型的例子,如下图 所示。
进度表除规定了帧 ID 的传输次序外,还规定了帧时隙(Frame Slot)的大小。帧时隙是进度表规定的一个帧的帧头起始到下一个的帧的帧头起始的时间。每个帧的帧时隙都可以不同,一个帧时隙对应了进度表的一个入口,如图所示,其中 i = 1~8。
其中T Frame_Maximum 为帧在总线上传输的最大时间 。 抖动(Jitter)为帧的同步间隔段的下降沿与帧时隙起始时刻相差的时间 。 时基(Time Base)为LIN子网的最小计时单位,通常设定为 5ms或 10ms。帧时隙必须为时基的整数倍 , 并且起始于时基的开始时刻(称为时基的节拍(Tick)),切换到另外一个进度表时一定要等到当前帧时隙的结束。
由于调度表规定了帧的发送顺序和帧时隙,使得LIN通信具有可预测性。
七 网络管理
一、唤醒
当总线处于休眠状态时,主/从机节点都可以向总线上发送唤醒信号,唤醒信号持续 250μs~5ms。其余节点(除发送唤醒信号以外的节点)以大于 150μs 为阈值判定唤醒信号。每个从机节点必须在唤醒信号显性脉冲的结束处算起 100ms 以内准备接收来自主机的命令(帧头);主机节点也必须被唤醒,100ms 之内主机节点发送帧头开始通信。主机节点的同步间隔段也可以充当唤醒信号,由于从机节点需要作初始化处理,因此主机节点所发的这个帧有可能不会被正常接收。
如果节点发送出唤醒信号后,在 150ms~250ms 之内没有接收到总线上的任何命令(帧头),则可以重新发送一次唤醒信号。唤醒信号最多可以发送 3 次,3 次之后,必须等待至少 1.5s 之后才可以再次发送唤醒信号。
二、休眠
总线可以在两种情况下进入休眠:
(1) 利用诊断帧中的主机请求帧 0x3C 作休眠命令,要求数据段的第一个字节为 0x00,其余字节为 0xFF。 休眠命令由主机节点发出,总线上的从机节点只判断数据段的第一个字节,其余字节忽略。从机节点在接收到休眠命令后,不一定要进入低功耗模式,根据应用层需要设置。
(2) 当总线静默(没有显性和隐性电平之间的切换)4s~10s 时,节点自动进入休眠状态。
以上网络管理内容来自LIN总线协议详解5(网络管理)_dailbing的博客-CSDN博客_lin协议 休眠唤醒
参考文献:
LIN Specification Package Revision 2.1
【DBC专题】-4-DBC文件中的Signal信号字节顺序Motorola和Intel介绍_汽车电子助手的博客-CSDN博客_dbc大端小端
https://www.csdn.net/tags/OtTaMg1sMDg2MTctYmxvZwO0O0OO0O0O.html
![Logo](https://devpress.csdnimg.cn/79de2bf0b7994defa4242ef90d5513fa.jpg)
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)