一、介绍
LIN的全称为Local Interconnect Network,是一种汽车上用的总线,实现一根信号线和多台设备通信
二、原理
1、硬件原理
本质上就是串口+LIN驱动芯片
当然需要单片机串口支持lin模式,也就是能发出11bit的低电平
2、软件上
常用速率波特率:最大传输速率为20Kbps。建议的通信速率如下,低速2400bps,中速9600bps,高速19200bps
流程上
和i2c类似,因为只有一根数据线,收发都是在上面,所以用的应答模式,分为lin主机和lin从机,一个网络里面只有一个主机,多个从机,上图中,mcu就是主机,其他就是从机
帧协议
header:显性间隔break+同步场sync+标识符pid
break就是11bit以上的低电平
sync就是0x55
pid就是id+校验,id 6bit,校验2bit
pid校验算法
short pid_check(unsigned char LIN_ID)
{
short PID=0x00;
short p0=0,p1=0;
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;
return PID;
}
所谓奇偶校验就是在发送的每一个字节后都加上一位,使得每个字节中1的个数为奇数个或偶数个。接收方通过计算数据中1的个数是否满足奇偶性来确定数据是否有错
response:数据字节+校验和场
数据字节:就是要发送的数据或者从机要回的数据
校验和场:校验
校验和算法:
累加所有字节。对每次加和进行判断,如果和大于0xFF,那么就把高八位的1,与低八位相加,其实就是低八位加1(翻转八位和)。得到最后的结果后,取其反码,
unsigned char Lin_Checksum(unsigned char id , unsigned char *data)
{
unsigned char t ;
unsigned short sum ;
sum = data[0];
if(id == 0x3c) // 如果是诊断帧,用经典校验
{
for(t=1;t<8;t++)
{
sum += data[t];
if(sum&0xff00)
{
sum&=0x00ff;
sum+=1;
}
}
sum = ~sum;
return (u8)sum ;
}
for(t=1;t<8;t++)
{
sum += data[t];
if(sum&0xff00)
{
sum&=0x00ff;
sum+=1;
}
}
sum+=Lin_CheckPID(id);
if(sum&0xff00)
{
sum&=0x00ff;
sum+=1;
}
sum = ~sum;
return (u8)sum ;
}
分为header和响应,header是主机发出,响应是从机发或者主机发
当主机给从机发送数据:主机发送header和响应
当主机读从机数据:主机发header,从机收到header给出相应