LIN总线

LIN总线

全称

LIN:Local Interconnect Net

本地连接网络

连接方式

1根信号线

1个主节点,最多16个从节点

主节点:通常既可以接收CAN总线信号,也可以接收LIN总线信号

从节点:可以根据主节点的请求,发送信号

特点

  1. 速度不高,容错率低

    速度:1-20kbit/s

    长度:最多40米

  2. 数据长度可变

    2,4,8字节

  3. 错误检查,校验,配置

    数据内容包含

  4. 工作电压 12V

  5. 没有信号优先级的概念(总线仲裁),只有按顺序发送数据

应用场景

汽车车窗,雨刮器,空调,座椅控制等设备

报文格式

同步间隔段

作用:提示整个总线上的设备,告诉它们我要发消息了。

方法:常见连续13+1或者20个0表示

注意

复制代码
在LIN总线中,0用低电平0V表示,1用高电平12V表示。整个总线上的显性电平是0V,如果同时遇到12V和0V,则以0V表示

同步段

由于时序等原因,不同设备间的信号读取可能不同步,因此设置同步段使得各设备之间实现同步读取

通常同不断使用0x55表示,即二进制01010101。LIN主节点发送同步段信号是从低位向高位发送,即首次应发送1.

这里注意,对照上图中发现第一位是0,这是因为同步段发送的第一位是起始位 ,这一位不算。必须从第二个开始计算。同时,最后一位也不算,同步段将其定义为停止位

受保护段(PID)

全称:Protected ID

长度:8位

组成:6位ID和2位校验

作用:告诉总线上的设备,现在要干什么

ID定义
ID值 帧类型
0x00~0x3B 信号携带帧:无条件帧,事件触发帧,偶发帧
0x3C 诊断帧:主机请求帧
0x3D 诊断帧:从机应答帧
0x3E 用户定义帧
0x3F 保留帧

其中,低4位组成了设备在总线中的ID值,6位中的高2位为校验位,只能是0,1,2,3

校验位

作用:保证报文传输正确

计算公式:

assembly 复制代码
p0 = ID0 xor ID1 xor ID2 xor ID4
p1 = NOT( ID1 xor ID3 xor ID4 xor ID5)

从节点读取受保护段数据后分析校验位是否正确以判断报文是否正确。

------------上述部分一定是主节点发送------------

接下来的部分是主节点或从节点发送

帧应答

长度:2,4,8字节

校验和段

作用:对帧传输内容进行校验

类型:标准型校验,增强型校验

  • 标准型校验:校验数据段各字节,计算公式如下,忽略所有的进位
mathematica 复制代码
Checksum_Classic = ~(Data_0 + Data_1 + ... + Data_7)

比如,现在有8个字节的数据

bash 复制代码
02 07 00 00 00 00 00 00

根据行数公式计算结果为F6

如果存在进位,则需要进行自动回卷 ,即当和超过0xFF(即255)时,仅保留 低8位加1(处理进位),无需额外的进位检查。

比如,现在有数据如下

mathematica 复制代码
80 80

相加后进行自动回卷,其值为0x01,取反后的校验和结果为0xFE

  • 增强型校验:数据段各字节+PID,计算公式如下,忽略所有的进位
mathematica 复制代码
Checksum_Enhanced = ~(Protected_ID + Data_0 + Data_1 + ... + Data_n)

假设 PID = 0x30(帧 ID 0x30 经过奇偶校验后得到的值)

数据为 2 字节:0x4A0x55

  1. 求和(带进位回卷)
    sum = 0x30 + 0x4A + 0x55 = 0xCF
    无进位,sum = 0xCF
  2. 取反
    checksum = ~0xCF = 0x30

校验和 = 0x30

进位的例子

假设 PID = 0x80

数据为 0x80, 0x80

  1. 求和(带进位回卷)

0x80 + 0x80 + 0x80 = 0x180

低 8 位 = 0x80,进位 = 0x01

回卷:0x80 + 0x01 = 0x81

  1. 取反

~0x81 = 0x7E
校验和 = 0x7E

帧分类及用途

无条件帧(最常用)

主节点发送报文头给指定从节点请求信息,从节点一定会应答

上图是无条件帧的三种情况。这里要说明,其核心思想是想要从机做什么,则主机发送什么报文

例如:

想要从机1发送报文给主机,那么主机1就发送ID=0x30的PID

想要主机1发送报文给所有主机,因为主机即可以发送也可以接收,所以主机可以看作master+slave,那么发送ID=0x31的PID

想要从机2向从机1发送报文,那么主机发送ID=0x32的PID到LIN总线

事件触发帧

主机不挨个点名,而是问"谁有情况?",有情况(数据更新)的从机再自己站出来回答

如果有且仅有一个从机有数据更新,它就发送。响应数据的第一个字节 是它自己的保护ID(PID),这样主机就知道是谁汇报的

如果多个从机同时有数据更新,它们会同时发送响应,导致总线冲突 。当主机检测到冲突时,它会暂停当前调度表,并跳转到"冲突解决调度表"。这个特殊调度表会依次单独询问所有相关的从机,保证不遗漏任何重要数据。

偶发帧

实际用的很少

诊断帧

主节点向从节点发送0x3CPID,数据段带上请求让从节点进行某种诊断。紧接着主节点向从节点发送0x3dPID,让从节点将诊断数据发回主节点。

相关推荐
風清掦3 小时前
【江科大STM32学习笔记-11】SPI通信协议 - 11.2 软件SPI读写W25Q64
笔记·stm32·单片机·嵌入式硬件·学习
LCG元3 小时前
STM32实战:基于STM32F103的智能饮水机温度控制
stm32·单片机·嵌入式硬件
EVERSPIN3 小时前
MCU单片机FOC汽车水泵方案
单片机·嵌入式硬件·mcu·汽车·mcu单片机
yongui478344 小时前
STM32 上实现 SPI 自发自收(Loopback)
stm32·单片机·嵌入式硬件
弘毅 失败的 mian4 小时前
STM32 时钟详解
经验分享·笔记·stm32·单片机·嵌入式硬件·嵌入式
jghhh014 小时前
STM32 控制 3 个步进电机方案
stm32·单片机·嵌入式硬件
Wave8454 小时前
STM32 串口通信 (UART) 全栈底层复习指南
stm32·单片机·嵌入式硬件
ILYT NCTR4 小时前
SocketTool、串口调试助手、MQTT中间件基础
单片机·嵌入式硬件·中间件
LCMICRO-133108477464 小时前
长芯微LCMDC8685完全P2P替代ADS8685,16位模数转换器(ADC)
单片机·嵌入式硬件·fpga开发·硬件工程·dsp开发·模数转换器adc