原创 MM32 MCU LIN接口

2020-11-24 13:32 1805 6 3 分类: MCU/ 嵌入式 文集: MM32 MCU外设篇
  随着汽车电子技术的高速发展和广泛应用,实现智能化和网络化是汽车发展的必然趋势。为简化日益增加的汽车电控设备的线路连接,提升系统的可靠性和故障诊断水平,实现各电控设备之间的数据资源共享,并建成开发的标准化、模块化结构,汽车网络总线技术得到了很大发展。目前,已经开发出多种总线,如控制器局域网总线CAN、车内网络总线LIN、高速容错网络总线FlexRay、面向媒体的系统传输总线MOST、更高带宽和传输速率的车载以太网Ethernet等,这里给大家介绍在MM32F013x上实现LIN通信的功能应用。

LIN 是 Local Interconnect Network 的缩写,是基于 UART/SCI(Universal Asynchronous Receiver-Transmitter /Serial Communication Interface,通用异步收发器/串行通信接口)的低成本串行通信协议,可用于汽车、家电、办公设备等多种领域。本文主要针对在MM32F013x上实现LIN在分布式的汽车电子网络系统中的应用。

    

LIN帧(Frame)包含帧头(Header)和应答(Response)两部分。


帧头包括同步间隔段、同步段以及PID(Protected Identifier,受保护ID)段,应答包括数据段和校验和段。


如图所示,其中值“0”为显性电平(Dominant),值“1”为隐性电平(Recessive),总线上实行“线-与”:当总线上有大于等于一个节点发送显性电平时,总线呈显性电平;所有的节点都发送隐性电平或不发送信息(不发送任何信息时总线默认呈隐性电平)时,总线才呈现隐性电平,即显性电平起主导作用。



UART内部有Break信号的发送,通过使能LIN,即可实现LIN的间隔段,代码如下:

  1. bool LINSendbreak(void)
  2. {
  3. uint16_t Tempcnt = 0;
  4. UART2->CCR |= UART_CCR_LIN; //LIN Enable
  5. UART2->CCR |= UART_CCR_BRK; //Send Break
  6. while ((UART2->ISR & 0x00000080) == 0) //TXBRK_INTF
  7. {
  8. Tempcnt++;
  9. if (Tempcnt > 5000)
  10. return (false);
  11. }
  12. return (true);
  13. }


从下图中可以看出数据包是根据保护段的定义来进行区分是发送信号帧还是诊断帧:


号帧的数据就可以做成以下的方式

  1. bool LINSendMsg(void)
  2. {
  3. uint8_t check_sum, i;
  4. frame_send.error = 0;
  5. if (!LINSendbreak()) //Send Break
  6. return (false);
  7. if (!LINSendChar(0x55)) //Send Sync Byte
  8. return (false);
  9. msg_send.Data[0] = LINCalcParity(msg_send.Data[0]);
  10. for (i = 0; i < 9; i++)
  11. {
  12. if (!LINSendChar(msg_send.Data[i])) //Send Data
  13. return (false);
  14. }
  15. check_sum = LINCalcChecksum(msg_send.Data, 1);
  16. if (!LINSendChar(check_sum)) //Send Checksum
  17. return (false);
  18. frame_send.state = IDLE;
  19. return (true);
  20. }

而诊断帧配置如下,这样就可以在等待UART中断函数里收到从机返回的数据。

  1. bool LINSendID(void)
  2. {
  3. if (!LINSendbreak())
  4. return (false);
  5. if (!LINSendChar(0x55))
  6. return (false);
  7. msg_send.Data[0] = LINCalcParity(msg_send.Data[0]);
  8. if (!LINSendChar(msg_send.Data[i]))
  9. return (false);
  10. return (true);
  11. }

从机收数据与正常的串口一样,只需要做BRK信号的处理即可,从机收到数据以后按正常的返回数据,返回数据就不需要发送BRK信号。

  1. if (LIN_RxBuff[1] == LIN_PID_60_0x3C)
  2. {
  3. msg_send1.Data[0] = 0x3C;
  4. msg_send1.Data[0] = LINCalcParity(msg_send1.Data[0]);
  5. UART2->ICR |= UART_ICR_RXIDLE; //clear idle int bit
  6. UART2->IER |= UART_IER_RXIDLE; //enable uart rx idle int
  7. for (i = 1; i < 9; i++)
  8. {
  9. if (!LINSendChar(msg_send1.Data[i]))
  10. return (false);
  11. }
  12. check_sum = LINCalcChecksum(msg_send1.Data, 1);
  13. if (!LINSendChar(check_sum))
  14. return (false);
  15. }

有这些配置基础就可以开发LIN的通讯产品了。

Have Fun!GGSD,DDUP!





























作者: SnailWillow, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3931539.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

文章评论0条评论)

登录后参与讨论
相关推荐阅读
SnailWillow 2020-11-30 15:56
Ubuntu 16.04 LTS 搭建Nuttx开发环境
sudo apt-get updatesudo apt-get install automake bison build-essential flex gcc-arm-none-eabi gperf ...
SnailWillow 2020-11-26 16:31
MM32 MCU UART 9bit通讯功能
UART 9bit通信的作用是第9bit用于标识是地址或数据,第9bit 为1标识是从机地址,为0标识是数据,此外UART通信的第9bit也可作为数据的同步帧位使用。在双机通讯中,UART的8bit通...
SnailWillow 2020-11-19 15:14
MM32F0130 RevC 读保护设置
一. MM32-Link配合MM32Program方式1. 在MM32Program中做读保护设置2. 在汇编程序中的设置:如使用IAR开发项目,在\Device\MM3...
SnailWillow 2020-11-18 16:27
Linux下MM32开发环境的搭建
一、 安装eclipse IDE for C/C++ developers1.准备工作需要下载两个软件包(1)JDK:http://www.oracle.com/technetwork/ja...
SnailWillow 2020-11-18 11:01
MM32 MCU Toolbox简介
MM32 MCU ToolBox主要是协助FAE解决、分析和追溯客户端的芯片的定位工具,也面向MM32 MCU用户,方便MM32 MCU用户快速定位程序进入Hardfault的原因以及脱离IDE对芯片...
广告
我要评论
0
6
1
2
3
4
5
6
7
8
9
0
广告
关闭 热点推荐上一条 /6 下一条