目录 2.2.3、帧结构-同步字节字段(Sync byte field) 2.2.6、帧结构-校验和段(Checksum field)
①低成本—基于UART串口通讯,几乎所有MCU都支持,成本低;
②一个主节点对应多个从节点,单主多从节点,由总线电气特性的原因,
一个LIN网络最多可以连接16个节点;
③ 从节点不需要时钟、晶振同步;
④最大传输速率可达20Kbit/s;
⑤ 一根LIN信号线就可以实现;
⑥信号传输是可预测的;
⑦可重构性,不需要改变LIN从节点的硬件软件就可以增加从节点;
⑧支持传输层和诊断功能。
从节点连接到主节点形成LIN集群,LIN集群设计工具解析相应的节点能力文件,然后在设计过程中生成LIN描述文件也就是LDF文件。LIN集群生成器解析LDF文件,以便在主节点和从节点中自动生成与LIN相关的功能。LIN总线分析仪或仿真也可以使用LDF文件进行集群调试。

TL: Transport Layer传输层; Signal interaction:信号交互; Framee handler:帧处理程序
集群的节点使用帧收发器与物理总线连接,应用程序不需要直接访问帧,应用程序与帧处理程序之间存在传输层接口。

集群由一个主节点和几个从节点组成,主节点包含主任务和从任务,从节点只包含从任务,但一个节点可以参与多个集群,如果节点具有多个总线接口,则这个节点只能与节点的单个总线接口相关。
Master task决定何时在总线上传输哪个帧,slave task提供每个帧所携带的数据并发送。主任务和从任务都是帧处理程序中的一部分。

LIN报文帧结构LIN报文帧包括帧头(header)与应答(response)两部分
主机负责发送帧头;
从机负责接收帧头并作出解析,然后决定是发送应答,还是接收应答或不回复,用响应 来补充帧头形成完整的报文。
报头由同步间隔字段、同步字段和PID(受保护ID)段组成。
响应由数据字段和校验字段组成。
多播/广播: 所有节点都可以接收总线上的帧。
数据传输: 在一个帧中可以传输两种类型的数据: 信号或诊断信息。
主任务在主节点中根据调度表来传输报头,调度表详细规定帧开始与下一帧开始之间的间隔。主任务可以在不用的调度表之间进行切换选择。
作用:
①负责调度网络各报文发送的顺序
②为每帧报文分配发送的时隙(Slot); 时隙: 报文可以被发送的时间
③不同报文的发送时隙可能不同
④调度表在开始的网络系统设计阶段确定,就导致LIN通信具有可预测性
⑤主任务可以有多个调度表,可在不同的调度表之间切换,也就增加了通信的灵活性

信号可以是标量值variable或者字节数组byte array。
①标量信号的长度在1-16位之间。其中1位的标量信号叫boolean信号,
大小在2-16位的标量信号被视为无符号整数。
②字节数组是1-8个字节之间的数组
③每个信号只有一个发布者,即它总是由集群中的同一节点写入,可能会有0个,1个 或多个对该信号订阅。
④所有的信号都有初始值。在节点向该信号写入新值之前,发布信号的初始值都是有效 的,直到从另一节点接收到新的更新值。
无论是标量还是字节数组信号,写入或读取必须是原子操作,即应用程序永远不可能接收部分更新的信号值。但任何信号之间的一致性并不能保证。
信号低位先出,高位后发送。


帧结构
如上图所示,帧头包括同步间隔段、同步段以及PID(Protected Identifier,受保护ID)段,应答包括数据段和校验和段,其中值“0”为显性电平(Dominant),值“1”为隐性电平(Recessive)。
总线上实行“线-与”:当总线上有大于等于一个节点发送显性电平时,总线呈显性电平;所有的节点都发送隐性电平或不发送信息(不发送任何信息时总线默认呈隐性电平)时,总线才呈现隐性电平,即显性电平起主导作用。
图中帧间隔为帧与帧之间的间隔;应答间隔为帧头和应答之间的间隔;字节间间隔包括同步段和受保护ID段之间的间隔、数据段各字节间之间的间隔以及数据段最后一个字节和校验和段之间的间隔。
除中断字段外,每个字节字段都作为图2.4中所示的字节字段进行传输。首先发送数据的LSB,最后发送MSB。起始位被编码为值为0(显性)的位,停止位被编码为值为1(隐性)的位。字节结构如下图所示:


同步间隔段表示新的一帧的开始,同时也是唯一一个不符合图2.4(Figure 2.4)格式即UART字节帧的字段。
该字段由主节点发出,由同步间隔(Break)和间隔符(Break delimiter)构成,用于区别串行通信(SCI/UART)数据帧,开始一帧LIN报文的传输,如上图2.5所示。同步间隔是至少持续13位(以主机节点的位速率为准)的显性电平,由于帧中的所有间隔或总线空闲时都应保持隐形电平,而且帧中其它任何字段都不会发送大于9位的显性电平,所以它可以标志一个帧的开始。
间隔符是至少持续1位的隐形电平。
2.2.3、帧结构-同步字节字段(Sync byte field)
LIN总线报文帧的同步段(Sync Field)用于确保所有从节点(Slave Node)使用与主节点(Master Node)相同的波特率发送和接收数据。其为一个字节,结构固定为0x55,以产生一个方波信号给从节点做时钟同步,如图2.6所示:

字节域(Byte Field)包括 1 位起始位(Start Bit,显性) + 8 位数据位 + 1 位停止位(Stop Bit,隐性),是一种标准 UART 数据传输格式,后面的各段都是通过字节域的格式传输的。如下图所示:
LIN 同步以下降沿为判断标志,采用字节0x55(转换为二进制为 01010101b)。从机节点可以不采用精度高的时钟,而采用片上振荡器等精度和成本相对较低的时钟,由此带来的与主机节点时钟产生的偏差,需要通过同步段进行调整,调整的结果是使从机节点数据的位速率与主机节点一致。
同步段用于同步的基准时钟为主机节点的时钟。从机节点通过接收主机节点发出的同步段,计算出主机节点位速率,根据计算结果对自身的位速率重新作调整。计算公式如下:
1位时间 = (第7位的下降沿时刻 - 起始位的下降沿时刻) / 8
2.2.4、帧结构-受保护ID段(Protected identifier field)

如上图2.7所示,LIN总线报文帧的标识符场(PID Field)用于标识一帧LIN报文,由前6位叫做帧ID(Frame ID), 后2位奇偶校验位(P0/P1)组成。
帧ID 的范围为0到63(0x3F),分成3类:
①0-59(0x00-0x3B)用于信号承载帧
②60-61(0x3C-0x3D)用于携带诊断和配置数据
③62-63(0x3E-0x3F)保留用于将来的协议增强

注1:从机应答帧是一个完整的帧,与帧结构中的应答(帧的一部分)不同,注意区分。
接收/发送(忽略应答部分)都是依据帧ID判断的,如果帧ID 传输错误,将会导致信号无法正确到达目的地,因此引入奇偶校验位,校验公式如下:

LIN总线报文帧的数据段(Data Field)用于主节点发送数据/命令或者接收从节点的响应数据,其中:
①数据段长度1到8个字节;
②低字节Data 1先发,最低有效位先发;
③如果某信号长度超过1个字节采用低位在前的LSB方式发送(小端);
数据段包含信号和诊断消息两种数据类型,其中信号(Signal)由信号携带帧传递,一个帧 ID 对应的数据段可能包含一个或多个信号。信号更新时要保证其完整性,不能只更新一部分。一个信号通常由一个固定的节点发出,此节点称为该信号的发布节点(Publisher);其余的一个或多个节点接收,它们称为信号的收听节点(Subscriber)。
注:
1、协议没有规定中的哪一部分显示数据长度码的信息,数据的内容和长度是由系统设计者根据帧ID事先约定好的。
2、总线上的数据是以广播形式被发送到总线上的,任何节点均能接收,但并非所有信号对每个节点都有用。收听节点接收帧的应答是因为该节点的应用层会使用这些信号,而对于其余节点,由于用不到这些信号,所以没有必要作接收处理,可以忽略帧的应答部分。发布和收听由哪个节点进行完全根据应用层的需要由软件或配置工具实现。一般情况下,对于一个帧中的应答,总线上只存在一个发布节点,否则会出现错误。但事件触发帧例外,可能存在零个、一个或多个发布节点。
2.2.6、帧结构-校验和段(Checksum field)

LIN总线报文帧的校验和段(Checksum Field)用于校验接收的数据是否正确,其可以使用 两种校验和计算方法:
①经典校验(Classic Checksum)仅校验数据段(LIN1.3),适用于诊断帧,及与LIN1.x从 机节点通信
②增强校验(Enhance Checksum)校验标识符段与数据段内容(LIN2.0、LIN2.1及LIN2.2), 适用于与LIN2.x从机节点通信(诊断帧除外)
标识符为0x3C和0x3D的帧只能使用经典校验。
计算方法是带进位二进制相加最后逐位取反,结果作为要发送的校验和,而接收方对接收的数据做相同的带进位二进制相加,但最终的和不取反,将它与接收到的校验和再做加法,若结果为 0xFF ,则校验和没错。
下图举例采用标准型校验和,Data1 = 0x4A,Data2 = 0x55,Data3 = 0x93,Data4 = 0xE5,如下图所示:

|
TFrame_Maximum | THeader_Maximum | TResponse_Maximum |
| ||||||
| THeader_Nominal | THeader_Rest | TResponse_Norminal | TResponse_Rest |
| |||||
| 同步间隔(最小值) | 同步间隔段间隔符(最小值) | 同步段 | 受保护ID段 |
40% x THeader_Nominal |
数据段 | 校验和 |
40% x TResponse_Nominal | ||
| 时间(Tbit) | 13 | 1 | 10 | 10 | 10xNData | 10 | |||
一帧LIN总线报文的帧长度如上表所示,其中
TFrame_Maximum为帧在总线上传输的最大时间;
THeader_Maximum为帧头在总线上传输的最大时间;
TResponse_Maximum为应答在总线上传输的最大时间;
THeader_Nominal为帧头额定传输时间;
THeader_Rest帧头的余量包含字节间间隔,规定为帧头额定传输时间的 0.4 倍;TResponse_Nominal为应答额定传输时间:数据段传输时间 + 校验和段传输时间;
TResponse_Rest应答的余量包含应答间隔以及字节间间隔,规定为应答额定传输时间的0.4 倍;
Ndata表示数据段包含N个字节。
帧长度计算:
①最小帧长度:
THeader_Nominal = 34 * TBit (3)
TResponse_Nominal = 10 * (NData + 1) * TBit (4)
TFrame_Nominal = THeader_Nominal + TResponse_Nominal (5)
②最大帧长度(考虑串口波特率时钟的最大抖动):
THeader_Maximum = 1.4 * THeader_Nominal (6)
TResponse_Maximum = 1.4 * TResponse_Nominal (7)
TFrame_Maximum = THeader_Maximum + TResponse_Maximum (8)
总的来说,LIN总线包括无条件帧(Unconditional Frame)、事件帧(Event Frame)、诊断帧(Diagnostic Frames)、零星帧(Sporadic Frame)和保留帧(Reserved Frame)5种帧类型。
2.2.8.1、帧类型-无条件帧(Unconditional Frame)
无条件帧(Unconditional Frame)使用频度最高的帧类型,顾名思义,其无任何发送条件;无条件帧在主机任务分配给它的固定的帧时隙中传输。总线上一旦有帧头发送出去,必须有从机任务作应答(即无条件发送应答)。
标识符(ID)为0到59(0x3B);由主任务发出帧头,一个任务响应,一个或多个任务接收如下图:
灰色区域为帧时隙,白色箭头为头,黑色箭头为应答,箭头指向方是收听方,另一方为发布节点。
帧 ID = 0x30应答部分的发布节点为从机节点1,收听节点为主机节点。
典型应用:如从机节点1向主机节点报告自身某信号的状态;
帧 ID = 0x31应答部分的发布节点为主机节点,收听节点为从机节点1和从机节点2。 典型应用:如主机节点向从机节点发布信息;
帧 ID = 0x32应答部分的发布节点为从机节点2,收听节点为从机节点1。
典型应用:如从机节点之间彼此通信;
2.2.8.2、帧类型-事件触发帧(Event triggered Frame)
事件触发帧的目的是提高LIN集群的响应性,而不会将太多的总线带宽分配给很少发生事件的多个从节点的轮询,节省带宽。
与事件触发帧关联的多个无条件帧需要满足以下5个条件:
(1) 数据段包含的数据字节数等长;
(2) 使用相同的校验和类型;
(3) 数据段的第一个字节为该无条件帧的受保护 ID,这样才能够知道应答是哪个关 联的无条件帧发送出来的;
(4) 由不同的从机节点发布;
(5)不能与事件触发帧处于同一个进度表中。
示例:调度表仅包含一个时间触发帧(ID=0x10),时间触发帧与来自从节点1(0x11)、从节点2(0x12)的两个无条件帧相关联。总线上的行为如下图所示:

2.2.8.3、帧类型-零星帧(Sporadic Frame)
零星帧也叫偶发帧,是主机节点在同一帧时隙中当自身信号发生变化时向总线启动发送的帧。当存在多个关联的应答信号变化时,通过事先设定的优先级来仲裁。引入偶发帧的目的也是为了节省带宽,增加通信的灵活性。
与事件触发帧一样,偶发帧的应答也关联了一组无条件帧。规定偶发帧只能由主机节点作为发布节点。偶发帧的传输可能出现三种状况:
1)当关联的无条件帧没有信号发生变化时,该时隙保持沉默,如下图第一个帧时隙所示,主机节点连帧头都不需要发送;
2)当其中一个关联的无条件帧包含的信号发生了变化,则发送该关联的无条件帧的应答部分;
3)如果有两个或两个关联的无条件帧包含的信号发生了变化,则按照事先规定好的优先级,优先级较高的关联的无条件帧获得发送权,优先级较低的要等到下一个偶发帧的帧头到来时才能发送应答。
由于主机节点是唯一的发布节点,所以主机节点事先就知道各个关联信号的优先级别,这样在传输时就不会产生冲突。

2.2.8.3、帧类型-诊断帧(Diagnostic Frames)
诊断帧(Diagnostic Frames)用来传输诊断或配置信息,一般包含8个字节。
诊断帧(Diagnostic Frames)标识符分配如下:
60(0x3C):主节点请求(request)帧
61(0x3D):从节点响应(reponse)帧
具体诊断帧传输方式如下图所示:

2.2.8.4、帧类型-保留帧(Reserved Frame)
使用标识符: 62(0x3E), 63(0x3F);
在LIN 2.x总线协议中未对保留帧(Reserved Frame)进行定义, 留给用户自定义或将 来的版本升级。
LIN报文帧调度表功能如下:
①负责调度网络各报文发送的顺序以及各帧在总线上的传输时间;
②为每帧报文分配发送时隙(slot);
③发送时隙:报文可以被发送的时间;
④不同报文的发送时隙可能不同;
⑤调度表在网络系统设计阶段确定;
⑥调度表使得LIN通信具有可预测性;
调度表可以有多个,一般情况下,轮到某个调度表执行的时候,从该调度表规定的入口处开始顺序执行,到调度表的最后一个帧时,如果没有新的调度表启动,则返回到当前的调度表第一个帧循环执行;也有可能在执行某个调度表当中发生中断,执行另一个调度表后再返回,如事件触发帧的冲突解决过程就是一个典型的例子,如下图所示:
①当只有一个调度表时,采用循环执行

②当有三个调度表存在时,顺序执行
③当调度表发生中断

帧时隙是进度表规定的一个帧的帧头起始到下一个的帧的帧头起始的时间。每个帧的帧时隙都可以不同,一个帧时隙对应了进度表的一个入口。如下图所示:

其中TFrame_Maximum为帧在总线上传输的最大时间,i为1-8。
抖动(Jitter)为帧的同步间隔段的下降沿与帧时隙起始时刻相差的时间。
时基(Time Base)为LIN子网的最小计时单位通常设定为 5ms或 10ms。
帧时隙必须为时基的整数倍,并且起始于时基的开始时刻(称为时基的节拍(Tick)), 切换到另外一个进度表时一定要等到当前帧时隙的结束。
LIN总线的主节点需要实现主机任务(master task)和从机任务(slave task),而从节点则只需要实现从机任务即可,具体如下:
①在LIN总线通信中,主机任务决定了在LIN总线上传送的是哪一帧,即实现总线调度表切换,LIN报文帧头产生和发送;从机任务提供每一个LIN报文帧响应数据/状态。其中主节点实现的从机任务主要目的是向从节点发送控制命令。
②单主机任务,多从机任务;
③主节点包含主机任务和从机任务;
④从节点只包含从机任务;
⑤主机任务决定总线上的报文,从任务发送数据;
状态机是由一组状态、一个起始状态、输入以及将输入与当前状态转换为下一个状态的转换函数所组成,它是一个特殊的有向图,包括一些状态节点和连接这些状态的有向弧。
一个完整的LIN帧由间隔段、同步段、PID、数据段以及校验和段组成,LIN协议驱动器要实现的便是依序完成间隔段和同步段的检测、ID的发送和接收、数据段字节的发送和接收,最后完成校验。状态机形式与LIN协议数据链路层规范的定义相吻合,可以通过建立相应的状态来描述相应的段从而描述整个LIN帧,且可以通过监控当前状态,按照当前接收到的字节切换其状态,从而以状态转换的方式依序完成各个段的发送和接收。
因此设计以下几个状态:IDLE、BREAK、SYNBYTE、IDENTIFY、TRANCEIVE和CHECKSUM,设置标志位state反映LIN driver的状态: idle, pending, success。
①当处于LIN正确通讯的中间状态时,state = pending;
②当LIN通讯失败,state = idle;
③当完成一次完整的LIN通讯,state = success。
主机任务状态机如下图所示:

从机任务状态机如下图所示:

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

在总线处于休眠时,任何一个主/从节点都可以发送唤醒信号。
唤醒信号是一个250us(在20Kbit/s波特率下的0x0F)到5ms(在1Kbit/s波特率下的0x0F)的显性电平,如下图所示:


LIN网络管理规定,每一个从节点都需要实现以下功能:
①检测唤醒信号(持续150us以上的显性位),如下图2.16所示
②当检测到唤醒信号后,在100ms以内完成初始化工作
当从节点发出唤醒信号之后150ms,主节点仍未发送报文,从节点可以再次发送唤醒信号。当连续发送了3次唤醒信号之后如果主节点仍未发送报文,则从节点必须等待1.5s,才可以再次发送唤醒信号。
发送节点发送的长时间唤醒信号如下图2.18所示:

长时间唤醒信号其中的一个唤醒信号块(就是上面图2.18的一个信号块)如图2.17所示:

2.4.2、休眠
睡眠指令只有主节点可以发送,从节点在接到睡眠指令之后,也可以选择不进入睡眠状态而继续工作,根据应用层协议而定总线可以在两种情况下进入休眠:
(1)利用诊断帧中的主机请求帧 0x3C 作休眠命令,要求数据段的第一个字节为 0x00,其余字节为 0xFF。 休眠命令由主机节点发出,总线上的从机节点只判断数据段的第一个字节,其余字节忽略,如下图所示:

(2) 当总线静默(没有显性和隐性电平之间的切换)4s~10s 时,节点自动进入休眠状态。
状态管理是为了检测运行中的错误。错误一旦被发现,根据设计需要采取不同的措施进行排除,一种方法是简单替换掉错误节点,另一种方法是让发生问题的节点进入到自我保护/安全模式 (Limp Home Mode) 。
Limp Home(跛行模式),是指汽车的电控设备出现故障的时候,一开始主要集中于发动机控制和变速箱单片机,在模块或者传感器信号出现故障的时候,模块仍旧能够完成基本的功能,使得汽车仍能以最低要求的性能水平行驶。
该模式保证汽车能自动点亮所有相关车灯,使之安全的开回维修地点维修,避免故障车辆在行驶过程中可能导致的严重安全事故。
协议强制规定,每个从机节点都要在它发布的某个无条件帧中包含一个长度为1位的标量信号response_error,向主机节点报告自身状态。 主机节点负责接收这个信号并且执行分析,如下表所示。事件触发帧由于允许总线冲突,需特殊处理。LIN协议并没有标准化具体的错误类型,用户可根据需要自行制定。
| response_error | 主机节点对信号的解释 |
| False | 从机节点操作正确 |
| True | 从机节点存在偶发错误 |
| 从机节点无应答 | 从机节点、主机节点或总线存在严重错误 |
节点自身需要设定两个状态位:Error_in_response 和 Successful_transfer。当发送或接收应答的时候发现错误,将置位 Error_in_response;成功传输则置位 Successful_transfer。节点需要将这两个状态位报告给应用层。
三、传输层规范
从应用层的角度来看,LIN 提供四项功能即信号处理、配置、识别和诊断,这四项功能共同构成了 LIN 的应用层。而传输层是配置、识别和诊断这三项功能的通信载体,实现了应用层消息与帧之间的格式转换和传输。
传输层针对的是在骨干总线(例如CAN)上执行诊断的系统,以及系统希望在LIN的子总线集群上使用相同的诊断功能。
传输层把来自诊断服务的消息(Message)“翻译”成协议层可以处理的PDU (Packet Data Unit,分组数据单元) ,或者反过来,把协议层收到的 PDU“ 翻译 ” 成诊断服务需要的消息。消息到PDU的转换过程称为装包(Packing),PDU 到消息的转换过程称为拆包 (Unpacking) 。PDU对应着帧结构的数据段,并通过诊断帧发送或接收。
为满足汽车行业的要求,LIN 传输层 PDU 的格式与 ISO 制定的基于 CAN 网络的诊断标准非常相似,PDU格式如图3.2所示,包含节点地址(NAD)、协议控制信息(PCI)、LEN、服务ID(SID)、应答服务ID(RSID)、消息字节段(D1-D6),首字节NAD先发送,末字节D4、D5、D6最后发送:

从发送格式上看,PDU单元 可分为单帧(Single Frame,SF) 、首帧(First Frame,FF) 和 续帧(Consecutive Frames,CF) 三种。
从发送源上,主机发送请求PDU,从机发送应答PDU。
PDU单元的第一个字节是 NAD (node address),用于区分不同从机节点的地址。 如下表所示,列出了 NAD 的取值范围:
| 0x00 | 用于休眠命令 |
| 0x01~0x7D | 从机节点地址即NAD |
| 0x7E | 功能节点地址即(功能NAD) |
| 0x7F | 广播节点地址(广播NAD) |
| 0x80~0xFF | 用户自定义 |
PDU 单元的第二个字节是 PCI ( Protocol Control Information )信息,包含了 PDU 单元类型和消息字节长度的信息。如下表所示 :
| 类型 | PCI类型 | 附加消息 | ||||||
| B7 | B6 | B5 | B4 | B3 | B2 | B1 | B0 | |
| SF(单帧) | 0 | 0 | 0 | 0 | Length | |||
| FF(首帧) | 0 | 0 | 0 | 1 | Length高4位 | |||
| CF(续帧) | 0 | 0 | 1 | 0 | 帧计数器 | |||
单帧中,附加信息 Length 表示消息字节数加 1。
首帧中,附加信息只表示 Length 的高4位,低8位在LEN中表示。因此最大长度为4095(0xFFF),因为高4位表示PCI的类型。
续帧中的附加信息表示首帧后,跟随的续帧的编号,第一个续帧编号为1,之后累加1。如果续帧数多于15个,那么帧计数器在第16个续帧时从0重新计数。
SID(Service Identifier)表示了从机节点应完成的服务请求。节点配置服务的 SID 区间为 0xB0~0xB7, 诊断服务的 SID 区间为 0x00~0xAF, 0xB8~0xFE 。
RSID(Response Service Identifier)表示从机节点应答的内容,它的值是 SID+0x40。
消息字节段的内容取决于服务的种类。在单帧中,消息字段最多 6 个字节。在首帧和续帧中,所有 PDU 的消息字段,经过“重组”组成一个完成的消息。
应用层发出的消息如果长度不超过单帧的容量,传输层会按单帧的格式交给协议层发送。传输层收到的单帧也会直接作为消息送往应用层;如果消息长度超过单帧的容量,传输层先要把消息拆分成首帧和续帧并排好次序,然后再交给协议层依次发送。
反过来,协议层收到的首帧和续帧,传输层先要按照接收次序将其重组为消息,最后交给应用层处理。
①LIN 传输层只能按顺序接收续帧。
②LIN 传输层具备出错重传功能。
③单帧传输SF最多传输6个字节(包括SID),功能寻址message只能是单帧SF。
④通过分割和传输多个PDU时,传输超过6个字节(包括SID)的消息,最多可传输4095 (0xFFF)个字节。分段传输从第一帧PDU(FF)开始,后面接着多个连续帧(CF)。
节点配置用于在集群中设置从属节点。它是一组服务,以避免从节点冲突。标识符用于标识从属节点。
节点配置是通过拿到一个地址空间来完成的,它包括一个LIN产品标识和每个从节点的初始NAD。使用这些值,可以将唯一的帧标识符映射到集群中传输的所有帧。
①每个从属节点都有一个LIN产品标识,如表4.1所示。产品标识是出厂时赋予的,除非修改产品,否则其内容不变。产品标识保存在不需要电源就能维持记录的地方,例如 ROM 或者非易失性存储器(Non-volatile Random Accessible Memory,NVRAM)。在进行配置服务时,从主机接收的产品标识必须和从机节点保存的产品标识一致,才能正常进行配置服务。

供应商ID(Supplier ID)为16位值,最高有效位等于零。最高位设置为1是保留给未来的扩展编号系统。供应商ID由LIN联盟分配给每个供应商。供应商ID应代表完全可操作的从属节点的供应商。
功能ID是由每个供应商分配的16位值。如果两个产品的功能不同,则它们的功能ID应不同。但对于相同的功能,功能ID应保持不变。
可变ID是一个8位的值。当产品发生更换,但功能不变时,应随时更换。可变ID是从属节点的属性,而不是LIN集群的属性。
②从节点可以有一个序列号,以标识从节点产品的特定实例。序列号为4个字节,如表格4.2所示:

4.2、从节点模型
4.2.1、从节点存储模型
从节点模型如图4.1所示,图中NVRAM和ROM都是断电后仍能保持数据。但NVRAM可以通过内部进程(例如应用程序)进行修改。ROM是不能通过内部进程(例如应用程序)进行修改的固定内存。
ld_set_configuration: 该功能将根据数据给出的配置来配置NAD和PID。目的是恢复已保存的配置或设置初始配置。

4.2.2、初始化NAD
每个从属节点都有一个在NCF(Node Configuration Files)文件中定义的初始NAD列表。对于没有进行初始NAD的实例生成的从属节点,该列表只包含一个条目。实例生成将根据初始NAD列表设置初始NAD。使用ld_set_configuration或分配NAD(Assign NAD)将NAD设置为配置的NAD。如果初始NAD已经等于已配置的NAD,则不采取任何操作。图4.2显示了初始NAD列表、初始NAD和已配置的NAD之间的关系。

4.2.3、从机节点PID配置
从机节点各个帧的 PID,是主机进行分配的。通过分配PID列服务,主机一次最多可给从机节点分配4个帧的PID。分配PID列服务的PDU结构如下表所示:

其中,消息字节段的第一字节是开始帧索引,表示分配第一个帧的排列号。从机节点中各帧的排列顺序是 按照节点配置文件(NCF)和 LIN 描述文件(LDF)中定义的顺序定义的。第一帧的索引编号是 0。后续四个字节是给从机节点分配的 PID。如果分配的 PID 值为 0,表示对应的信号携带帧无效。如果分配的 PID 值为 0xFF,表示保持对应帧的 PID 不变。
除了对从机节点NAD和PID的配置,LIN规范还定义了其他配置服务,如条件变更NAD,数据导入,保存配置。配置功能由配置与识别API完成。下表列出了配置服务与API的对应关系。

4.4、识别功能
识别功能是指主机节点能够获取逻辑节点的信息,例如产品标识等。借助识别功能,主机节点和逻辑节点还可以实现一些自定义的操作。
在识别服务中,主机发送的请求PDU单元结构如下表所示:

其中,从机根据目标 ID 的值来回应相应的信息。目标 ID 指定的相关信息如下表所示:

五、诊断规范
LIN诊断系统定义了分别在主节点、诊断仪和从节点之间实现诊断数据传输的方法。定义了三种不同类型的诊断节点。第I类使用正常信号,第II类和第III类使用传输层,使用传输层参见5.1。在应用层与诊断的流程如下图所示:

5.1、使用传输层
使用传输层存在两个通信案例:
①测试人员希望向从节点发送诊断请求
②从节点希望向测试人员发送诊断响应。下面图5.1和图5.2显示了这两种情况下的 消息流。


SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手
最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
尝试通过SSL连接到ImgurAPI时出现错误。这是代码和错误:API_URI=URI.parse('https://api.imgur.com')API_PUBLIC_KEY='Client-ID--'ENDPOINTS={:image=>'/3/image',:gallery=>'/3/gallery'}#Public:Uploadanimage##args-Theimagepathfortheimagetoupload#defupload(image_path)http=Net::HTTP.new(API_URI.host)http.use_ssl=truehttp.verify
一、什么是MQTT协议MessageQueuingTelemetryTransport:消息队列遥测传输协议。是一种基于客户端-服务端的发布/订阅模式。与HTTP一样,基于TCP/IP协议之上的通讯协议,提供有序、无损、双向连接,由IBM(蓝色巨人)发布。原理:(1)MQTT协议身份和消息格式有三种身份:发布者(Publish)、代理(Broker)(服务器)、订阅者(Subscribe)。其中,消息的发布者和订阅者都是客户端,消息代理是服务器,消息发布者可以同时是订阅者。MQTT传输的消息分为:主题(Topic)和负载(payload)两部分Topic,可以理解为消息的类型,订阅者订阅(Su
文章目录一、项目场景二、基本模块原理与调试方法分析——信源部分:三、信号处理部分和显示部分:四、基本的通信链路搭建:四、特殊模块:interpretedMATLABfunction:五、总结和坑点提醒一、项目场景 最近一个任务是使用simulink搭建一个MIMO串扰消除的链路,并用实际收到的数据进行测试,在搭建的过程中也遇到了不少的问题(当然这比vivado里面的debug好不知道多少倍)。准备趁着这个机会,先以一个很基本的通信链路对simulink基础和相关的debug方法进行总结。 在本篇中,主要记录simulink的基本原理和基本的SISO通信传输链路(QPSK方式),计划在下篇记
一、RIPV2协议简介 RIP(RoutingInformationProtocol)路由协议是一种相对古老,在小型以及同介质网络中得到了广泛应用的一种路由协议。RIP采用距离向量算法,是一种距离向量协议。RIP-1是有类别路由协议(ClassfulRoutingProtocol),它只支持以广播方式发布协议报文。RIP-1的协议报文无法携带掩码信息,它只能识别A、B、C类这样的自然网段的路由,因此RIP-1不支持非连续子网(DiscontiguousSubnet)。RIP-2是一种无类别路由协议(ClasslessRoutingProtocol),支持路由标记,在路由策略中可根据路由标记对
【动态规划】一、背包问题1.背包问题总结1)动规四部曲:2)递推公式总结:3)遍历顺序总结:2.01背包1)二维dp数组代码实现2)一维dp数组代码实现3.完全背包代码实现4.多重背包代码实现一、背包问题1.背包问题总结暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化!背包问题是动态规划(DynamicPlanning)里的非常重要的一部分,关于几种常见的背包,其关系如下:在解决背包问题的时候,我们通常都是按照如下五部来逐步分析,把这五部都搞透了,算是对动规来理解深入了。1)动规四部曲:(1)确定dp数组及其下标的含义(2)确定递推公式(3)dp数组的初始化(4)确定遍历顺
我尝试执行此页面中显示的ruby示例:http://tomayko.com/writings/unicorn-is-unix但我得到的只是echo.rb:9:in`bind':Addressfamilynotsupportedbyprotocolfamily-bind(2)(Errno::EAFNOSUPPORT)fromecho.rb:9:in`'有什么想法吗? 最佳答案 我遇到了同样的问题。只需将localhost更改为0.0.0.0:address=Socket.pack_sockaddr_in(4242,'0.0.0.0')
最近我使用了一个由单个开发人员创建的不错的gem,它托管在Github上。在我的工作中,我不得不对它进行一些实质性的修改,添加一些改进。有些是特定于项目的,有些是特定于gem的,还有一些是独立的改进。对于特定于gem的改进(例如,错误修复),我fork了存储库,应用了修复,并提出了拉取请求。然后,然而,我注意到独立的改进有点属于原始gem的并行、持续的分支类别。更清楚地说,你以前见过它;我重写了原始gem的View以使用TwitterBootstrap框架。因此,我也将它推送到了Github,但是,当然,我没有提出拉取请求——相反,我更新了README以解释不同之处,并感谢gem的原作
1,Camera基本工作原理答案:光线通过镜头Lens进入摄像头内部,然后经过IRFilter过滤红外光,最后到达sensor(传感器),senor分为按照材质可以分为CMOS和CCD两种,可以将光学信号转换为电信号,再通过内部的ADC电路转换为数字信号,然后传输给DSP(如果有的话,如果没有则以DVP的方式传送数据到基带芯片baseband,此时的数据格式RawData,后面有讲进行加工)加工处理,转换成RGB、YUV等格式输出。数据流是如何从sensor到APP的?上述描述结束后,在ISP处理后面的阶段,数据会进行分流,分为capture,preview,video等以供后续动作使用。例如