基于STM32的LIN总线的实现

这篇具有很好参考价值的文章主要介绍了基于STM32的LIN总线的实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

LIN总线的实现

你好! 这是使用STM32F105RBT6单片机实现的LIN总线。ST其它型号也可,仔细阅读这篇文章,了解一下LIN总线的实现过程。文章来源地址https://www.toymoban.com/news/detail-536056.html

配置USART2

void init_LIN(void)
{
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1ENR_USART2EN,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2ENR_IOPAEN,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2ENR_AFIOEN,ENABLE);
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	GPIO_SetBits(GPIOA,GPIO_Pin_4);
	
	USART_InitStructure.USART_BaudRate = Lin_Speed;
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;
	USART_InitStructure.USART_StopBits = USART_StopBits_1;
	USART_InitStructure.USART_Parity = USART_Parity_No;
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
	USART_Init(USART2, &USART_InitStructure);
	
	USART_LINBreakDetectLengthConfig(USART2,USART_LINBreakDetectLength_11b);
	USART_LINCmd(USART2,ENABLE);
	
	USART_ClearFlag(USART2,USART_FLAG_LBD);
	
	USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
	USART_ITConfig(USART2,USART_IT_LBD,ENABLE);
	
	NVIC_InitStructure.NVIC_IRQChannel=USART2_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
	NVIC_InitStructure.NVIC_IRQChannelSubPriority=0;
	NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
	NVIC_Init(&NVIC_InitStructure);	
	
	USART_Cmd(USART2,ENABLE);
	
	//参数初始化
	linTxMsg.Send_Complete=ENABLE;
	linRxMsg.Length=8;
}

校验和PID

u8 lin_Check_ProtectedID(u16 id,u8 len)//校验和PID
{
	u8 checkSum=id&0x3f;
	checkSum|=(((checkSum&0x01)^((checkSum&0x02)>>1)^((checkSum&0x04)>>2)^((checkSum&0x10)>>4))<<6)&0x40;
	checkSum|=(~((((checkSum&0x02)>>1)^((checkSum&0x08)>>3)^((checkSum&0x10)>>4)^((checkSum&0x20)>>5))<<7))&0x80;
	return checkSum;
}

LIN数据发送

void Lin_Send_Msg()
{
	Lin_Sending_Flag=ENABLE;
	linTxMsg.Protected_ID = lin_Check_ProtectedID(linTxMsg.ID,linTxMsg.Length);//校验和PID
	while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);//传输数据寄存器空标志
	USART_SendBreak(USART2);//同步时间间隔
	while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);//传输数据寄存器空标志
	USART_SendData(USART2,0x55);//同步段
	while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);//传输数据寄存器空标志
	USART_SendData(USART2,linTxMsg.Protected_ID);//发送PID
	for (u8 i = 0; i < linTxMsg.Length; i++) 
	{
		while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);//发送数据
		USART_SendData(USART2,linTxMsg.Data[i]);    
		linTxMsg.CheckSum += linTxMsg.Data[i];       //校验和
		if (linTxMsg.CheckSum >= 256)
			linTxMsg.CheckSum = (linTxMsg.CheckSum+1)&0xff;
	}
	linTxMsg.CheckSum=(u8)~linTxMsg.CheckSum;
	while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);//发送校验和
	USART_SendData(USART2,linTxMsg.CheckSum);
	while(USART_GetFlagStatus(USART2,USART_FLAG_TXE)==RESET);//等待发送结束
	linTxMsg.CheckSum=0;
	Lin_Sending_Flag=DISABLE;
}

lin数据接收

void Lin_SendData_Process(void(*Lin_Data_receiving_callback)(void))//接收数据的过程
{
	if(linRxMsg.Receive_Complete)
	{
		u16 checkSum;
		for(u8 i=0;i<8;i++)
		{
			checkSum += linRxMsg.Data[i];       //校验和
			if (checkSum >= 256)
				checkSum = (checkSum+1)&0xff;
		}
		checkSum=(u8)~checkSum;
		linRxMsg.ID=linRxMsg.Protected_ID&0x3f;
		if(linRxMsg.CheckSum==checkSum)
		{
			Lin_Reception_of_data=1;
			Lin_Data_receiving_callback();
		}
		linRxMsg.Receive_Complete=DISABLE;
	}
}


void Lin_Data_receiving_callback()//Lin接收回调函数
{
	if(Lin_Reception_of_data==1)
	{
		Lin_Reception_of_data=0;
		switch(linRxMsg.ID)
		{
			case 0x07:
				lin_data=linRxMsg.Data[1];
				break;
		}
	}
}

USART2作LIN的中断处理

void USART2_IRQHandler()
{
	if(USART_GetFlagStatus(USART2,USART_FLAG_LBD)!=RESET)//LIN中断检测标志
	{
		if(Lin_Sending_Flag==DISABLE)//没有发送数据
		{
			Lin_LBD_Flag=ENABLE;
		}
		USART_ClearFlag(USART2,USART_FLAG_LBD);//LIN断开
	}
	if(USART_GetFlagStatus(USART2,USART_FLAG_RXNE)!=RESET)//接收数据寄存器不为空标志
	{
		if(Lin_LBD_Flag==ENABLE)//lin中断使能可接收数据
		{
			u8 data=USART_ReceiveData(USART2);//接收数据
			
			if(linRxMsg.Index==1)
			{
				linRxMsg.Protected_ID=data;//接收PID
			}
			else if(linRxMsg.Index>1 && linRxMsg.Index<linRxMsg.Length+2)
			{
				linRxMsg.Data[linRxMsg.Index-2]=data;//接收数据				
			}
			else if(linRxMsg.Index==linRxMsg.Length+2)//接收校验场
			{
				linRxMsg.CheckSum=data;
			}
			linRxMsg.Index++;
			if(linRxMsg.Index>linRxMsg.Length+2)//数据接收完毕
			{
				linRxMsg.Receive_Complete=ENABLE;//接收数据使能
				Lin_LBD_Flag=DISABLE;//接收数据失能
				linRxMsg.Index=0;
			}
		}
		USART_ClearFlag(USART2,USART_FLAG_RXNE);//接收完毕,清除接收数据寄存器不为空标志
	}
}

到了这里,关于基于STM32的LIN总线的实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 单片机毕设 基于STM32的智能药箱系统设计与实现

    Hi,大家好,今天向大家介绍一个学长做的单片机项目 基于STM32的智能药箱系统设计与实现 大家可用于 课程设计 或 毕业设计 照顾老人, 特别是提醒老人准时吃药已经成为了一个社会关心的问题。长期记录吃药种类、 吃药时间能为分析老人的病理提供有力的依据。 基于目

    2024年02月04日
    浏览(72)
  • 【毕业设计】基于STM32的智能药箱系统设计与实现 - 物联网 单片机

    Hi,大家好,这里是丹成学长,今天向大家介绍一个学长做的单片机项目 基于STM32的智能药箱系统设计与实现 大家可用于 课程设计 或 毕业设计 单片机-嵌入式毕设选题大全及项目分享: https://blog.csdn.net/m0_71572576/article/details/125409052 照顾老人, 特别是提醒老人准时吃药已经成

    2024年02月01日
    浏览(78)
  • [毕业设计] 基于单片机的智能快递柜设计与实现 - stm32 物联网

    Hi,大家好,这里是丹成学长,今天向大家介绍一个 单片机项目 基于单片机的智能快递柜设计与实现 大家可用于 课程设计 或 毕业设计 单片机-嵌入式毕设选题大全及项目分享: https://blog.csdn.net/m0_71572576/article/details/125409052 一般来说,传统快递服务方式是人对人,即快递员进

    2024年01月16日
    浏览(88)
  • 【毕业设计】基于STM32的智能路灯设计与实现 - 物联网 嵌入式 单片机

    Hi,大家好,这里是丹成学长,今天向大家介绍一个 单片机项目 基于STM32的智能路灯设计与实现 大家可用于 课程设计 或 毕业设计 单片机-嵌入式毕设选题大全及项目分享: https://blog.csdn.net/m0_71572576/article/details/125409052 每当夜幕降临,城市中各种各样、色彩缤纷的路灯亮起,

    2024年01月16日
    浏览(63)
  • 毕业设计 - 基于STM32的智能路灯设计与实现 - 物联网 嵌入式 单片机

    Hi,大家好,今天向大家介绍一个 单片机项目 基于STM32的智能路灯设计与实现 大家可用于 课程设计 或 毕业设计 🔥 项目分享与指导: https://gitee.com/sinonfin/sharing 每当夜幕降临,城市中各种各样、色彩缤纷的路灯亮起,为城市披上了一层绚丽的外衣。但在这绚丽的外表下则隐

    2024年02月05日
    浏览(53)
  • 基于STM32单片机的智能家居烟雾温度火灾防盗报警的设计与实现

        功能介绍 以STM32单片机作为主控系统; LCD1602液晶显示屏来显示显示测得的值; SR501人体红外感应是否有人进行防盗; 通过烟雾传感器MQ-2获取前的烟雾值; 通过DHT11温湿度传感器来获取当前的温湿度; 所有的信息通过通过esp8266 wifi把数据传输到手机端进行显示;    

    2024年02月15日
    浏览(94)
  • 【毕业设计】基于单片机的智能鱼缸系统设计与实现 - 嵌入式 物联网 stm32 51单片机 智能鱼缸

    Hi,大家好,今天向大家介绍一个 单片机项目, 大家可用于 课程设计 或 毕业设计 基于单片机的智能鱼缸系统设计与实现 🔥 项目分享与指导: https://gitee.com/sinonfin/sharing 近年以来,随着我国综合实力飞速飙升,人们对物质和精神生活质量的要求也不断提升,各式各样的智能

    2024年02月04日
    浏览(85)
  • 物联网毕设 - 基于单片机的智能鱼缸系统设计与实现 - 嵌入式 物联网 stm32 51单片机 智能鱼缸

    Hi,大家好,今天向大家介绍一个 单片机项目, 大家可用于 课程设计 或 毕业设计 基于单片机的智能鱼缸系统设计与实现 🔥 项目分享与指导: https://gitee.com/sinonfin/sharing 近年以来,随着我国综合实力飞速飙升,人们对物质和精神生活质量的要求也不断提升,各式各样的智能

    2024年02月03日
    浏览(75)
  • LIN总线详细介绍

    车载总线众多,有CAN、CAN FD、LIN、FlexRay、Ethernet等等,初学者可能疑惑很多。如果你想对这些总线有个初步认识的话,请参考博主的这篇文章: 常用车载总线CAN、CAN FD、LIN、FlexRay、Ethernet介绍 本文主要介绍LIN总线的发展历史,LIN总线的特点,在汽车领域的使用场景,LIN总线

    2024年02月12日
    浏览(31)
  • LIN总线物理层介绍之总线特性

    LIN总线具备如下特点: (1)LIN总线网络采用单主节点多从节点的组网方式,没有CAN总线的仲裁机制,一个LIN总线网络最多可连接16个节点,即一个主节点,最多15个从节点; (2)仅使用一根信号线就可以完成信息的传输; (3)最大传输速率是20kbps; (4)从节点无需晶振或

    2024年02月11日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包