使用STM32开发LIN通信协议
LIN介绍
LIN 是 Local Interconnect Network 的缩写,是基于 UART/SCI,通用异步收发器/串行通信接口)的低成本串行通信协议。可用于汽车、家电、办公设备等多种领域。
作为一个低成本的辅助总线,LIN总线在汽车电子中应用广泛,车门、车窗、车灯以及中控锁等低速应用都使用LIN总线。其实如果在新能源汽车中,CAN实现这些功能会更简单,但限于汽车里的配件太多,在制作时要与各个配件的供应商来进行兼容,其中包括因为考虑成本使用LIN的低速配件供应商。现在LIN的使用还是挺广泛的,有必要学习一下。
LIN的特点
LIN与CAN的区别
1.单线传输,传输速率低
LIN总线在物理上是一个上拉带12V的集电极开漏总线,多个节点可以并联到一个主节点上。它与IIC的SDA线类似,但是不需要SCL时钟线,LIN靠主机从机双方约定的波特率来进行通信,类似于UART。与串口不同的是,它是通过同步场来进行同步,传输更加可靠。相对于CAN的双绞线结构来说,LIN一条线的抗干扰能力较弱,为了增强EMC电磁兼容性能,将通信速率限制在20Kbit/s。
2.单主多从结构
LIN总线的结构是主从结构的星型模型,所有的从机都连接到一个主机上。传输只能由主机发起,从机不能主动发起请求。可以把从机看做消息的发布者,主机看做消息的订阅者,要想获得一个消息(某个变量的值),主机必须不断的去读对应的报文。这个结构就决定了LIN总线只能传输少量的消息,来保证消息更新的实时性。
3.轻量的处理协议栈
在CAN总线的传输协议栈中,占有相当大的代码量,包括CAN的驱动层、TP、UDS等;LIN不需要这么复杂,只有简单的驱动、调度表、睡眠唤醒等,所以代码量少了一个数量级,但是在LIN的上层服务中还是要转换成CAN信号来进行传输,所以最后LIN还是要回归CAN信号。
4.网络拓扑结构
LIN总线是单主多从的星型结构,LIN总线一般不单独存在,主机经常与上层网络(如CAN)相连。
一个节点不一定对应一个ECU,因为一个ECU上面可能提供多个LIN接口
LIN协议
传输规则
帧主要包含帧头和应答两部分
帧的整体结构
帧头包括同步间隔段、同步段和受保护ID段(PID),由主机节点发送
应答包括数据段和校验和段,由从机节点发送
0
为显性电平,1
为隐性电平
同步间隔段
同步间隔段由同步间隔和同步间隔段间隔符组成
同步段
字节域:标准的UART数据传输格式
字节域包括1位起始位(显性)+8位数据位+1位停止位(隐性)
受保护ID段(PID)
受保护ID段由6位帧ID和2位奇偶校验位组成
PID并不是从机节点地址,而是想要订阅的报文ID。一个从机节点可以提供多个报文ID的服务,比如一个车灯控制ECU,可以提供灯控制、状态、故障码等多个LIN的ID服务,而从机节点地址是隐性的与其所提供的报文ID有对应关系的。
帧ID范围为0x00~0x3F共64个
这里因为数据发送先发送LSB,所以先发送奇偶检验位的P1,发送的时候帧ID上面的位被2个奇偶检验位占据,所以ID就相当于整个帧的低6位而不是高6位
校验公式如下,其中“⊕”代表“异或”运算, “¬”代表“取非”运算。
P0 = ID0⊕ID1⊕ID2⊕ID4
P1 = ¬(ID1⊕ID3⊕ID4⊕ID5)
由公式可以看出, PID 不会出现全 0 或全 1 的情况,因此,如果从机节点收到了“0xFF”或“0x00”,可判断为传输错误。
帧的类型
数据段
节点发送的数据位于数据段,最高8个字节,先发送编号最低的DATA1,依次增加发送。
LIN一帧数据最大传输8个字节。在LUN2.x中规定,LIN可以传输的字节数可以是2,4,8而并不是1-8内任意一个数字。一般而言,车内会选择一个统一字节数,最常用的比如每帧都传8个字节
数据段包含了两种数据类型,信号或诊断消息
当帧ID类型为信号携带帧,数据段存储的是信号,一个帧ID对应一个或多个信号
当帧ID类型为诊断帧时,数据段存储的是诊断消息
校验和段
校验和段是对帧中所传输的内容进行校验。
校验和分为标准型校验和和增强型检验和
采用标准型校验和还是增强型校验和由主机节点管理,发布节点和各收听节点根据帧 ID 来判断采用哪种校验和。
校验方法为将校验对象的各字节作带进位二进制加法(每当结果大于等于 256 时就减去
255),并将所得最终的和逐位取反,以该结果作为要发送的校验和。接收方根据校验和类型,对接收数据作相同的带进位二进制加法,最终的和不取反,并将该和与接收到的校验和作加法,如果结果为
0xFF,则校验和无误,这在一定程度上保证了数据传输的正确性。
例子
采用标准型校验和, Data1 = 0x4A, Data2 = 0x55, Data3 = 0x93, Data4 = 0xE5,计算方法如表 3.3所示:
作者:废物兄弟