汽车总线LIN总线协议

一、介绍
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给出相应
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u010835747/article/details/121869487
今日推荐