基于有限状态机在LIN总线开发中的应用
扫描二维码
随时随地手机看文章
图1 车身控制系统结构图
该车身控制系统包括车灯模块、车门模块、车内模块、控制面板模块和仪表盘模块,分别完成对相应负载的控制和监测,同时通过CAN总线完成数据交换。其中车灯模块和车门模块基于CAN/LIN总线以分布式的形式实现。本文重点论述的是LIN协议的实现。
LIN协议分析和状态机的设计
有限状态机是由一组状态、一个起始状态、输入以及将输入与当前状态转换为下一个状态的转换函数所组成,它是一个特殊的有向图,包括一些状态节点和连接这些状态的有向弧。对特定的状态机而言,首先要建立一些有效的状态,然后设计相应的算法完成状态的转换。
一个完整的LIN帧由间隔场、同步场、PID、数据场以及校验和场组成,LIN协议驱动器要实现的便是依序完成间隔场和同步场的检测、ID的发送和接收、数据场字节的发送和接收,最后完成校验。状态机形式与LIN协议数据链路层规范的定义相吻合,可以通过建立相应的状态来描述相应的场从而描述整个 LIN帧,且可以通过监控当前状态,按照当前接收到的字节切换其状态,从而以状态转换的方式依序完成各个场的发送和接收。设计以下几个状态:IDLE、BREAK、SYNBYTE、 IDENTIFY、TRANCEIVE和 CHECKS UM,设置标志位state反映LINdriver的状态,idle,pendin g,succe ss,当处于LIN正确通讯的中间状态时,state=pending,当LIN通讯失败,state=idle,当完成一次完整的LIN通讯,state=success。
状态的监控和转换是在UART接收中断服务程序中实现的。因为LIN总线采用单根线通信,UART外接 LIN物理层收发器,所以当UART发送的总线数据和接收到的总线数据一样时,UART接收到的数据便是UART发送的数据,在接收中断服务程序中完成状态转换算法,如图2。通过判断当前状态和接收到的数据切换LINdriver的状态,同时更新标志位。
图2 LIN协议状态机
软件设计
软件设计流程如图3所示。首先进行初始化,主要包括UART模块的初始化和I/O脚初始化,设置波特率,使能接收中断,设置LIN物理层收发器相应I/O脚方向及电平,然后在UART接收中断服务程序中以状态机的形式完成LIN通讯。下面结合LIN帧结构和 LINdriver的状态转换对该状态机算法进行阐述。
图3 软件流程图
LIN帧以间隔场起始的,LIN- driver的起始状态为IDLE,此时state=idle。间隔场是一个13位0的场,引起接收中断同时置位UART模块的frameerror位,在UART接收中断服务程序中,判断接收到的数据为0x00且frameerror标志位为1时,便认为接收到了间隔场,这时LINdriver从 IDLE切换到BREAK,state=pending。
同步场是一个0x55的字节,当前状态为BREAK时,如果接收到的数据为 0x55,LINdriver切换为SYNBYTE,state=pending保持不变,否则切换为IDLE,state=idle;
PID 是带奇偶校验的ID,它以低6 位 ID0-ID5表示ID,高两位P0、P1是对 该ID的奇偶校验,当前状态为SY NBYTE时,收到的数据便为PID。首先按照奇偶校验算法对PID进行校验,校验通过再按照应用层协议对该PID进行过滤,过滤成功则 LINdriver切换为TRANCEIVE,校验失败或者过滤失败则LINdriver返回IDLE,state=idle;
当前状态为 TRANCEIVE时,接收到的数据便是数据场中字节,当数据接收完毕,LINdriver切换为CHECKSUM。当前状态为CHECKSUM时,接收到的数据便为校验和场,校验成功,便置state=success,表示成功地完成了一次LIN通讯,这时数据场中的数据是有效的,可以用于应用程序;校验失败表示LIN通讯失败,数据场中数据无效。
结语
本文针对普通单片机,借助于其片上 UART,以状态机的形式实现了LIN协议驱动,降低了LIN的实现成本,运行可靠稳定,符合LIN总线以低成本作为CAN总线有效补充的初衷。