stm32 lin通信协议

LIN介绍

LIN 是 Local Interconnect Network 的缩写,是基于 UART/SCI,通用异步收发器/串行通信接口)的低成本串行通信协议。可用于汽车、家电、办公设备等多种领域。

作为一个低成本的辅助总线,LIN总线在汽车电子中应用广泛,车门、车窗、车灯以及中控锁等低速应用都使用LIN总线。其实如果在新能源汽车中,CAN实现这些功能会更简单,但限于汽车里的配件太多,在制作时要与各个配件的供应商来进行兼容,其中包括因为考虑成本使用LIN的低速配件供应商。现在LIN的使用还是挺广泛的,有必要学习一下。

LIN的特点

  • 串行通信
    • 单线传输,总线电压为12V
    • 线间的干扰比较小,节省线的资源,传输距离长(不超过40米)
  • 最高速率20Kbit/s
    • 满足汽车上大多数低速应用的要求
  • 单主多从结构
    • 不存在冲突,不需要仲裁
  • 成本低
    • 几乎所有MCU都具有LIN总线的硬件基础
    • 相对于CAN可以大幅度消减成本
    • 利用报头里的同步场来实现同步,无需时钟线,大幅度降低成本
  • 信号传输延迟可计算
    • 传输具有确定性,传播时间可以提前计算
  • EMC(电磁兼容性)性能可预测
    • 为了增强EMC,LIN协议限制传输速率最大为20Kbit/s
  • 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.网络拓扑结构
stm32 lin通信协议_第1张图片
LIN总线是单主多从的星型结构,LIN总线一般不单独存在,主机经常与上层网络(如CAN)相连。

一个节点不一定对应一个ECU,因为一个ECU上面可能提供多个LIN接口

LIN协议
传输规则
stm32 lin通信协议_第2张图片

帧主要包含帧头和应答两部分

  • 主机任务负责发送帧头
  • 从机任务收到帧头之后进行解析,然后决定是发送应答,还是接收应答,还是不作反应

帧的整体结构
stm32 lin通信协议_第3张图片
帧头包括同步间隔段、同步段和受保护ID段(PID),由主机节点发送

应答包括数据段和校验和段,由从机节点发送

0为显性电平,1为隐性电平

同步间隔段
stm32 lin通信协议_第4张图片
同步间隔段由同步间隔和同步间隔段间隔符组成

  • 同步间隔段表示一帧的开始
  • 同步间隔段至少有13个显性位,间隔符至少有一个隐形位
  • 同步间隔段不遵循字节域格式,其它段都遵循
  • 从节点开始连续监测到至少11个显性位才认为是间隔信号

同步段
stm32 lin通信协议_第5张图片

字节域:标准的UART数据传输格式
字节域包括1位起始位(显性)+8位数据位+1位停止位(隐性)

  • 数据传输都是先发送LSB,最后发送MSB
  • 这里确保所有从机节点都和主机节点波特率相同发送和接收数据
  • 同步段固定一个字节,值固定为0x55

受保护ID段(PID)
stm32 lin通信协议_第6张图片
受保护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”,可判断为传输错误。

帧的类型
stm32 lin通信协议_第7张图片

数据段
stm32 lin通信协议_第8张图片

节点发送的数据位于数据段,最高8个字节,先发送编号最低的DATA1,依次增加发送。

LIN一帧数据最大传输8个字节。在LUN2.x中规定,LIN可以传输的字节数可以是2,4,8而并不是1-8内任意一个数字。一般而言,车内会选择一个统一字节数,最常用的比如每帧都传8个字节

数据段包含了两种数据类型,信号或诊断消息

当帧ID类型为信号携带帧,数据段存储的是信号,一个帧ID对应一个或多个信号

当帧ID类型为诊断帧时,数据段存储的是诊断消息

校验和段
stm32 lin通信协议_第9张图片

校验和段是对帧中所传输的内容进行校验。

校验和分为标准型校验和和增强型检验和

  • 标准型校验和:诊断帧采用
  • 增强型检验和:除了诊断帧其余的帧
  • 一个字节

采用标准型校验和还是增强型校验和由主机节点管理,发布节点和各收听节点根据帧 ID 来判断采用哪种校验和。
校验方法为将校验对象的各字节作带进位二进制加法(每当结果大于等于 256 时就减去
255),并将所得最终的和逐位取反,以该结果作为要发送的校验和。接收方根据校验和类型,对接收数据作相同的带进位二进制加法,最终的和不取反,并将该和与接收到的校验和作加法,如果结果为
0xFF,则校验和无误,这在一定程度上保证了数据传输的正确性。

例子
采用标准型校验和, Data1 = 0x4A, Data2 = 0x55, Data3 = 0x93, Data4 = 0xE5,计算方法如表 3.3所示:
stm32 lin通信协议_第10张图片

你可能感兴趣的:(stm32,单片机)