全面解析LIN总线的应用/帧结构/分类

lin总线是目前常见的一种a类网络协议。lin的全称为local interconnect network。lin主要功能是为can总线网络提供辅助功能,应用场合有智能传感节点、自动车窗节点等。目前最新的lin协议是lin2.2,制定于2010年。lin的一大优点是成本低,但其最大传输速率为20kbps。建议的通信速率如下,低速2400bps,中速9600bps,高速19200bps。根据osi参考模型,lin总线仅规范了数据链路层和物理层。
lin的部分应用
lin的特点如下:
1.采用单主多从的组网方式,无can总线那样的仲裁机制,最多可连接16个节点(1主15从)。 2.对硬件要求简单,仅需uart/sci 接口,辅以简单驱动程序便可实现 lin 协议。故几乎所有的mcu均支持lin。 3.不需要单独的晶振,便能完成主、从节点的同步,硬件成本大幅降低。 4.仅使用一根信号线便可完成信息的传输,即所谓的单总线设备。 5.传输速率最高可达20kbps,符合a类网络标准,满足车身控制需要。 6.lin 网络中新节点的加入,对网络中其他原有节点的软硬件设计不会造成影响。
lin网络主从节点的功能
lin网络中的节点任务分为主机任务和从机任务两类。其中,主机任务只在主机节点上运行,而从机任务在主机节点和从机节点上均可运行。也就是说,主机节点可以实现主机任务和从机任务。 a.主机任务主要执行以下功能: 1.定义总线上的通信速率。(同步场?待考) 2.发送报文帧头,包含同步间隔场、同步场和标识符场三个部分。 3.监控总线通信,通过校验和确定数据正确性与否。 4.使从机进入唤醒或睡眠状态,并响应从机的唤醒要求。 b.从机任务既可运行于主机又可运行于从机,它主要完成以下功能: 1.等待主机任务发送的同步间隔,使从机与主机于同步场中获得同步。 2.分析标识符场,若与自己相关,则接收或发送数据,若与自己无关则什么都不做。 3.检查和发送校验和。 4.接受主机任务的唤醒和睡眠请求。 综上,主机报文的标识符能触发与之对应的不同从机之间的通信。
lin报文的帧结构
lin 总线上具有“显性”和“隐性”两种互补的逻辑电平。其中,显性电平(参考地电压)是逻辑 0,隐性电平(电源电压)是逻辑1。 lin在总线上以具有固定格式的报文进行传递,但是这种报文数据段的长度是可以调整的。lin网络中的所有节点(包括主机节点)都具有从机任务,当接到主机任务的报文信息时,它们中的某一个要对报文做出响应。
报文头仅可以由主机节点发出 lin总线的一帧主要由两部分组成,即报文头(header)和报文响应(response)。其中,报文头是由一个主机节点的主机任务发出的,而报文响应(以下简称响应)是由一个主机节点或从机节点的从机任务发出的。其中报文头由同步间隔场(最小13个显性位)、同步场(1个字节,数据不变,0x55)、和pid场(1个字节)三部分组成;报文响应由2/4/8个字节的数据场、校验和场(1个字节)所组成。报文头和响应之间有一个帧内空间分隔,最小空间为0。
lin的帧结构(英文版)
lin的帧结构(彩图版)
lin的帧结构
示波器采出来的lin波形,能看出0x00和0x55 lin 的字节场格式就是通常的“sci”或“uart”串行数据格式(n81编码)。即每个字节场的长度是10个位定时(bit time):1bit起始位+8bits数据位+1bit停止位。 起始位(start bit)是一个“显性”位,它标志着字节场的开始。接着是8个数据位,首先发送最低位。停止位(stop bit)是一个“隐性”位,它标志着字节场的结束。lin报文帧中的同步场、标识符场、数据场、校验和场的格式都符合上述字节场的格式。 下面对几个重要的部分详细说明。
同步间隔场
间隔场是唯一一个不符合字节场格式的场。从节点需要检测到至少连续11个显性位才认为是间隔信号。
同步场
一个字节,即0x55。
lin的被保护标识符场(pid场)
pid场定义了报文的内容和长度。如图,pid场分为6个标识符位和2个id奇偶校验位。6个标识符位我们称之为id。如果加上2个奇偶校验位就变成pid了,即protected id。6个标识符位中,标识符后两位为数据长度控制位。总的来看,id的范围是0-0x3f。注意是id,不是pid。要区分开。这一段要讲的是我们需要将lin的id与pid分清楚,不能混淆。
上图中的id4和id5为数据长度控制位(id4是低位)。值为00或10时,数据长度为2个字节。值为01时,数据长度为4个字节。值为11时,数据长度为8个字节。在实际应用中,我并没有发现id4和id5与真实的数据长度有什么关系。接触到的lin报文均为8个字节的数据。 p0和p1为奇偶校验位,算法如下:
#include #include 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 ,p0,p1,pid); system(pause); return 0; } 所谓奇偶校验就是在发送的每一个字节后都加上一位,使得每个字节中1的个数为奇数个或偶数个。接收方通过计算数据中1的个数是否满足奇偶性来确定数据是否有错。这个不用背,用的时候可以查表。
数据场
数据场主要需注意每个字节先传输的是最低位。即如果某一信号长度超过1个字节,采用低位在前的方式发送(小端)。
校验和场(checksum)
校验和场是数据场所有字节的和的反码。所有数据字节的和的补码,与校验和字节相加所得的和必须是0xff。 算法(classical):累加所有字节。对每次加和进行判断,如果和大于0xff,那么就把高八位的1,与低八位相加,其实就是低八位加1(翻转八位和)。得到最后的结果后,取其反码,我们就得到了最后的校验和。参照下图理解一下。
如何算出lin的校验和场 讲解一下上面的图,0x4a+0x55 = 0x9f这个没有疑问,再加0x93 = 0x132,很明显,超过了0xff,分解为0x1和0x32,突出的高8位删除,加到低8位中,0x1+0x32=0x33。再加0xe5 = 0x118,又超了,0x1+0x18=0x19。取反(not),0xe6。 练习:下图是一些lin总线数据,以最后一组为例,2个0xff之和为0x1fe,处理后仍然为0xff。故8个0xff加和之后仍为0xff,取反码为0x00。
一组lin报文
校验和场的两种类型
校验和场通常会有两种不同的类型,英文简称为cst(checksum type)。一种是classic checksum(lin 1.3),一种是enhanced checksum(lin 2.0及以上)。上文讲到的校验和场算法实际上是classic的,即只对data(数据场)进行校验和的计算。enhanced checksum在计算时需要把pid也加入到计算队列中。
9600波特率下,checksumtype为classic 下图是cst(校验和类型)为enhanced时的报文形态。此时校验和的计算需要包含前面的pid字节。举例,下图中第一帧报文,id为0x02,pid通过查表(参考文献5)可得到对应的pid是0x42,0x42的反码是0xbd。原理上一样,只不过计算校验和的时候,需要把pid也放进去。
plin-usb收到的lin报文,很详细 这里有个知识点一定要注意:标识符为0x3c和0x3d的帧只能使用经典校验,这两组帧是lin的诊断帧。即lin 2.0及以上才有的诊断帧,需要使用经典校验,不能将pid也加入到校验计算序列。自己写lin驱动的小伙伴要格外注意。
用kvaser收到的第一个lin报文 lin总线的布线组网 lin网络的节点数量不应超过16个,否则节点增加将减少网络阻抗,会导致环境条件变差,从而不能进行正常的无错误通讯。bosch汽车电气与电子中这样描述,“lin总线规范中没有规定总线允许的最大节点数。......但实际应用中,为了保证数据传输的可靠性,总线允许的最大节点数为16个。“ 实验证明(该实验需要考证),每增加一个节点,就会减少约3%的阻抗;网络中的通讯导线长度应小于或等于40m;主机节点的总线端电阻典型值是1kΩ,从机节点是30 kΩ。
lin总线的应用
lin总线上可以传输的两类数据,信号报文和诊断报文。 诊断报文的输送是在具有两个保留标识符的帧里面完成的。数据场的判读取决于数据场本身以及通讯节点的状态。 lin具有调度表机制。调度表负责调度网络各报文发送的顺序。调度表在网络系统设计阶段确定。调度表使得lin通信具有可预测性。主任务可以拥有多个调度表,并在不同的调度表之间切换。 lin的描述文件叫做ldf文件,可以设置报文帧,信号和调度表等。
lin帧的分类
lin帧按照帧类型来分类可以分为普通帧、事件触发帧、零星帧、诊断帧、用户自定义帧和保留帧。 普通帧的标识符(id)为0到0x3b。主任务发出报文头,一个任务响应,一个或多个任务接收。 事件触发帧的标识符为0到0x3b。事件触发帧必须有一个独立的id,该id可以与多个普通帧相关联。在事件触发帧时隙内发送帧头,只有当相关联的无条件帧内有信号被更新时,才发送帧响应。帧响应的第一个数据字节等于标识符,即响应最多可以传输7个字节的数据;如果没有帧响应,帧头被忽略。帧响应可由多个节点发送,发生冲突时切换到“冲突解决调度表”,之后再切换回到原来的调度表。 零星帧表示共用一个时隙、在需要时才被发送的一组普通帧。标识符为0到0x3b。 诊断帧用来传输诊断或配置信息,一般包含8个字节数据。0x3c为主请求帧,0x3d为从响应帧(注意校验方式是classic!)。诊断响应基于iso15765-2传输层和iso14229应用层。
诊断帧 用户自定义帧标识符为0x3e,可以传输任何用户自定义的信息。 保留帧的标识符为0x3f。略。   关于lin的版本 lin2.0新增加了下列属性:“增强校验和(enhanced)”、“重新配置和诊断”、“波特率自动探测”、“响应错误状态监控”。lin2.0从机节点无法与lin1.3主机节点操作。 关于睡眠 主节点可以发送一帧id为0x3c,第一个字节为零的主请求帧来使处于工作状态的从节点进入睡眠。这帧报文称为睡眠指令。 从节点在接到睡眠指令之后,也可以选择不进入睡眠状态而继续工作,这根据应用层协议而定。 当总线空闲4到10秒的时候,所有从节点必须进入睡眠状态。(注:空闲的定义是没有显性位和隐性位之间的转换。) 关于唤醒 在一个处于睡眠状态的lin网络中,任何一个节点都可以发送唤醒信号。 唤醒信号是一个250us到5ms的显性电平。 问题:这里的唤醒信号可否按照恒润的教程理解为在20kbit/s波特率下的0x0f,或在1kbit/s波特率下的0x0f? 当从节点发出唤醒信号之后150ms,主节点仍未发送报头时,从节点可以再次发送唤醒信号。当连续发送了3次唤醒信号之后如果主节点仍未发送报头,从节点要等待1.5秒以后才可以再次发送唤醒信号。


Hugging Face更改文本推理软件许可证,不再“开源”
三星盖世S8黄金版已出,彰显贵族气质!
从DDR4到DDR5高速连接器如何助一臂之力
手机黑屏应该如何解决
二阶双二次型带通滤波电路
全面解析LIN总线的应用/帧结构/分类
&quot;燧原科技面向AIGC模型训练的液冷集群&quot;荣获2023世界人工智能大会&quot;SAIL之星&quot;
金升阳 | 高性价比240W三相导轨电源——LIT240-26Bxx系列
可穿戴设备两大心率传感器技术解析
安森美提供全方位汽车解决方案 全面提升中国汽车电子市场竞争力
努比亚Z17S发布会倒计时:努比亚Z17S外观、渲染图、配置亮点提前看
医疗废物在线管理的好处
PCB布局布线的相关基本原理和设计技巧100问
RFID消防应急物资智能仓储管理系统简介
沃尔沃首台Drive Me自驾已亮相 描述最贴近现实的无人驾驶汽车
国有银行业第一次大规模集体投资一家人工智能企业
简述星辰处理器的全志XR806鸿蒙开发板上手体验
iPhone 12s系列将加入大存储版本
ZNrun-K411—适用于IEEE 802.3ck高速以太网电缆组件的自动化测试方案
基于Mimble Wimble的匿名资产平台Kepler介绍