基于有限状态机在LIN总线开发中的应用简介随着汽车智能的提高和对快速升级的需求,汽车电子网络正从集中控制发展到分布式控制。
作为CAN总线的有效补充,LIN总线以低速和低成本的实现方式有效地解决了由分布式控制引起的成本增加的问题。
在作者开发的车身分布式控制系统中,采用CAN总线和LIN总线连接每个控制单元,完成各单元之间的数据交换,系统结构如图1所示。
图1车身控制系统车身控制系统包括灯模块,门模块,内饰模块,控制面板模块和仪表板模块,它们分别完成对相应负载的控制和监视,并通过CAN总线完成数据交换。
其中,灯模块和门模块基于CAN / LIN总线以分布式方式实现。
本文重点介绍LIN协议的实现。
LIN协议分析和状态机设计。
有限状态机由一组状态,一个初始状态,一个输入以及一个将输入从当前状态转换为下一个状态的转换函数组成。
它是一个特殊的有向图,包括一些状态节点和连接这些状态的有向弧。
对于特定的状态机,我们必须首先建立一些有效状态,然后设计相应的算法来完成状态转换。
完整的LIN帧由间隔字段,同步字段,PID,数据字段和校验和字段组成。
LIN协议驱动程序需要实现的是依次完成对时间间隔字段和同步字段,ID发送和接收以及数据字段的检测。
发送和接收字节,最后检查完成。
状态机的形式与LIN协议数据链路层规范的定义一致。
通过建立对应的状态来描述整个LIN帧,可以描述对应的字段,可以监视当前状态,并可以根据当前接收的字节切换其状态,从而完成各个字段的发送和接收按照状态转换的顺序。
设计以下状态:IDLE,BREAK,SYNBYTE,IDENTIFY,TRANCEIVE和CHECKS UM,设置标志状态以反映LINdriver,idle,pending,ss的状态,当处于LIN的中间状态时,正确的通讯状态为state = pending ,当LIN通信失败时,状态=空闲,当完成LIN通信完成时,状态=成功。
状态监视和转换是在UART接收中断服务程序中实现的。
因为LIN总线使用单线通信,所以UART连接到LIN物理层收发器,因此,当UART发送的总线数据与接收到的总线数据相同时,UART接收的数据就是发送的数据由UART接收中断服务程序。
完成图2中的状态转换算法。
通过判断当前状态和接收到的数据来切换LINdriver的状态,并同时更新标志位。
图2 LIN协议状态机的软件设计图3所示的软件设计过程。
首先进行初始化,包括UART模块的初始化和I / O引脚的初始化,设置波特率,启用接收中断,设置方向和电平。
LIN物理层收发器的相应I / O引脚,然后以状态机的形式完成UART LIN通信中的中断服务程序的接收。
下面结合LIN框架结构和LINdriver的状态转换来描述状态机算法。
图3软件流程图LIN帧以interval字段开始,LIN驱动程序的初始状态为IDLE,此时state = idle。
间隔字段是一个13位0字段,它引起接收中断并设置UART模块的帧错误位。
在UART接收中断服务程序中,当判断接收到的数据为0x00且frameerror标志为1时,则认为已接收到间隔。
此时,LINdriver从IDLE切换到BREAK,状态=待定。
同步字段是一个0x55字节。
当前状态为BREAK时,如果接收到的数据为0x55,则LINdriver切换为SYNBYTE,state = pending保持不变,否则切换为IDLE,state = idle; PID具有奇偶校验。
ID由低6位ID0-ID5表示,高2位P0和P1是ID的奇偶校验。
当前状态为SY NBYTE时,接收到的数据为PID。
首先,根据奇偶校验算法检查PID,然后
产品资料
行业信息