1、LIN的基础知识
推荐下面2篇博客
https://blog.csdn.net/zz56z56/article/details/95034165
https://blog.csdn.net/wqx521/article/details/79570881
2、LIN的数据发送
主机数据发送只管下发就行
void LINSendTest(void)
{
unsigned char check_sum, parity_id, i;
SendMsg[0].ID=0x17;
SendMsg[0].length=8;
SendMsg[0].Data[0] =0xAD ;
SendMsg[0].Data[1] =0X32 ;
SendMsg[0].Data[2] =0X09 ;
SendMsg[0].Data[3] =0X43 ;
SendMsg[0].Data[4] =0xAD ;
SendMsg[0].Data[5] =0X32 ;
SendMsg[0].Data[6] =0X09 ;
SendMsg[0].Data[7] =0X43 ;
LINSendBreak();//同步间隔段
LINSendChar(0x55);//同步段
parity_id = LINCalID(SendMsg[0].ID);//受保护的ID段
LINSendChar(parity_id);
for(i = 0; i < SendMsg[0].length; i++)//数据段
{
LINSendChar(SendMsg[0].Data[i]);
}
check_sum = LINCalChecksum(parity_id,SendMsg[0].Data);//校验段
// 发送校验和场
LINSendChar(check_sum);
}
3、LIN的数据接收
首先主机要发送帧头,即发送同步间隔段和同步段
void LINReq(void)
{
unsigned char parity_id;
ReqMsg.ID=0x10;
LINSendBreak();
LINSendChar(0x55);
parity_id=LINCalID(ReqMsg.ID);
LINSendChar(parity_id);
}
从机响应后主机进入中断处理数据
uint8_t data[100];
void LIN_INT_FUNC(void)
{
uint8_t ret;
if(USART_GetITStatus(LIN_CHANNEL, USART_IT_RXNE))
{
USART_ClearITPendingBit(LIN_CHANNEL, USART_IT_RXNE);
ret = USART_ReceiveData(LIN_CHANNEL);
data[iii]=ret;
iii++;
}
if(USART_GetITStatus(LIN_CHANNEL, USART_IT_LBD))
{
USART_ClearITPendingBit(LIN_CHANNEL, USART_IT_LBD); // 检测到同步间隔场
//LinStatusSet(SYNCH);
iii=0;
}
if(USART_GetFlagStatus(LIN_CHANNEL, USART_FLAG_ORE) == SET) // 溢出
{
USART_ClearFlag(LIN_CHANNEL, USART_FLAG_ORE);
USART_ReceiveData(LIN_CHANNEL);
}
}