完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
随着汽车电子技术的高速发展和广泛应用,实现智能化和网络化是汽车发展的必然趋势。为简化日益增加的汽车电控设备的线路连接,提升系统的可靠性和故障诊断水平,实现各电控设备之间的数据资源共享,并建成开发的标准化、模块化结构,汽车网络总线技术得到了很大发展。目前,已经开发出多种总线,如控制器局域网总线CAN、车内网络总线LIN、高速容错网络总线FlexRay、面向媒体的系统传输总线MOST、更高带宽和传输速率的车载以太网Ethernet等,这里给大家介绍在MM32F013x上实现LIN通信的功能应用。 Part.1 什么是LIN LIN 是 Local Interconnect Network 的缩写,是基于 UART/SCI(Universal Asynchronous Receiver-Transmitter /Serial Communication Interface,通用异步收发器/串行通信接口)的低成本串行通信协议,可用于汽车、家电、办公设备等多种领域。本文主要针对在MM32F013x上实现LIN在分布式的汽车电子网络系统中的应用。 LIN总线特点 低成本:几乎车规级微控制器都具备LIN 通信必需的硬件 极少的信号线即可实现国际标准ISO9141 规定 传输速率最高可达20Kbit/s 单主控器/多从设备模式无需仲裁机制 从节点不需晶振或陶瓷震荡器就能实现自同步,节省了从设备的硬件成本 保证信号传输的延迟时间 不需要改变LIN 从节点的硬件和软件就可以在网络上增加节点 Part.2 LIN总线 帧结构 帧(Frame)包含帧头(Header)和应答(Response)两部分。 帧头包括同步间隔段、同步段以及PID(Protected Identifier,受保护ID)段,应答包括数据段和校验和段。 如图所示,其中值“0”为显性电平(Dominant),值“1”为隐性电平(Recessive),总线上实行“线-与”:当总线上有大于等于一个节点发送显性电平时,总线呈显性电平;所有的节点都发送隐性电平或不发送信息(不发送任何信息时总线默认呈隐性电平)时,总线才呈现隐性电平,即显性电平起主导作用。 Part.3 程序配置 01 初始化MM32F013x UART1串口 从官网下载MM32F013x例程,参考MM32F0133C7P的UART例程的初始化以及中断服务函数,这里不在赘述。 02 LIN的发送 2.1 同步间隔段的发送 UART内部有Break信号的发送,通过使能LIN,即可实现LIN的间隔段,代码如下: bool LINSendbreak(void) { uint16_t Tempcnt = 0; UART2->CCR |= UART_CCR_LIN; //LIN Enable UART2->CCR |= UART_CCR_BRK; //Send Break while ((UART2->ISR & 0x00000080) == 0) //TXBRK_INTF { Tempcnt++; if (Tempcnt > 5000) return (false); } return (true); } 2.2 数据的发送 数据的发送沿用原有的UART接口数据发送即可: bool LINSendChar(uint8_t ch) { uint16_t Tempcnt = 0; while ((UART2->CSR & UART_IT_TXIEN) == 0)//The loop is sent until it is finished { Tempcnt++; if (Tempcnt > 5000) return (false); } UART2->TDR = (ch & (uint16_t)0x00FF); return (true); } 2.3 数据包的发送 有了上面2个基础函数进行发送,现在来看下数据包的具体发送,从下图中可以看出数据包是根据保护段的定义来进行区分是发送信号帧还是诊断帧。
信号帧的数据就可以做成以下的方式: bool LINSendMsg(void) { uint8_t check_sum, i; frame_send.error = 0; if (!LINSendbreak()) //Send Break return (false); if (!LINSendChar(0x55)) //Send Sync Byte return (false); msg_send.Data[0] = LINCalcParity(msg_send.Data[0]); for (i = 0; i < 9; i++) { if (!LINSendChar(msg_send.Data)) //Send Data return (false); } check_sum = LINCalcChecksum(msg_send.Data, 1); if (!LINSendChar(check_sum)) //Send Checksum return (false); frame_send.state = IDLE; return (true); } 而诊断帧的就是: bool LINSendID(void) { if (!LINSendbreak()) return (false); if (!LINSendChar(0x55)) return (false); msg_send.Data[0] = LINCalcParity(msg_send.Data[0]); if (!LINSendChar(msg_send.Data)) return (false); return (true); } 这样就可以在等待UART中断函数里收到从机返回的数据。 2.4 从机的接受与发送 从机收数据与正常的串口一样,只需要做BRK信号的处理即可,从机收到数据以后按正常的返回数据,返回数据就不需要发送BRK信号。 if (LIN_RxBuff[1] == LIN_PID_60_0x3C) { msg_send1.Data[0] = 0x3C; msg_send1.Data[0] = LINCalcParity(msg_send1.Data[0]); UART2->ICR |= UART_ICR_RXIDLE; //clear idle int bit UART2->IER |= UART_IER_RXIDLE; //enable uart rx idle int for (i = 1; i < 9; i++) { if (!LINSendChar(msg_send1.Data)) return (false); } check_sum = LINCalcChecksum(msg_send1.Data, 1); if (!LINSendChar(check_sum)) return (false); } Part.4 MM32F013x LIN通信功能演示 通过逻辑分析仪可以看到信号帧的数据: |
|
相关推荐
|
|
只有小组成员才能发言,加入小组>>
2253个成员聚集在这个小组
加入小组灵动微电子MM32全系列MCU产品应用手册,库函数和例程和选型表
11843 浏览 3 评论
【MM32 eMiniBoard试用连载】+基于OLED12864的GUI---U8G2
5980 浏览 1 评论
【MM32 eMiniBoard试用连载】移植RT-Thread至MM32L373PS
11127 浏览 0 评论
【MM32 eMiniBoard测评报告】+ 开箱 + 初探
4598 浏览 1 评论
灵动微课堂(第106讲) | MM32 USB功能学习笔记 —— WinUSB设备
4333 浏览 1 评论
[MM32软件] MM32F002使用内部flash存储数据怎么操作?
1346浏览 1评论
859浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-27 22:53 , Processed in 0.390314 second(s), Total 36, Slave 29 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (威廉希尔官方网站 图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号