LIN协议在车身控制器中的设计实现
扫描二维码
随时随地手机看文章
引言:
随着汽车智能化程度的提高和升级换代的需要,汽车电子系统正由集中式控制向基于总线的分布式控制发展,在车身控制领域,做为控制局域网(CAN,control area network)总线的有效补充,本地互联网(LIN,local interconnect network)总线以其成本低廉有效解决了分布式控制带来的成本增加问题,在通讯速率要求不高、成本要求更高的国产车车身电子系统上得到了大规模应用。笔者为某国产车基于LIN总线的车身控制系统设计了一款车身控制器(BCM,Body control module),做为LIN总线网络的主节点,BCM在实现对多路开关量、脉冲量检测以及负载控制等功能的同时,调度管理整个LIN网络的通信,实现与LIN从节点的命令和状态的交互,并实现网络管理功能。该LIN网络架构如图1所示:
图1 车身LIN网络架构
笔者结合BCM设计经验,首先分析下LIN协议的架构和通信机制,然后从数据链路层、应用层和网络管理的实现上详细介绍下主节点设计技术。
1 协议分析:
LIN总线采用一主多从的网络架构[1],主节点以时间片轮转的方式控制网络信号流,确定发送哪个帧并在帧之间保持正确的定时,从节点接收帧头并根据其标识符(ID,Identifier)决定如何响应。LIN通信基于主任务和从任务的行为模型,如图2所示,主任务负责产生并发送正确的报文头,从任务负责对报文头做出响应。这种方式无需总线仲裁且能保证最差状态下的信号传输延迟时间,网络负载可控并可以避免总线冲突。
图2 LIN通信行为模型
在LIN总线系统中,主节点的实现是最复杂的,下面从数据链路层、应用层、网络管理三个方面介绍下主节点LIN协议的设计实现。
2 LIN协议设计
2.1 数据链路层:
LIN总线基于异步串行通信接口,在底层传输上采用8N1格式的SCI串行数据链路格式[2]:8个数据位+1个停止位、无奇偶校验,且由于LIN总线在物理层上是单根线,在发送时也会触发接收中断,这样LIN的数据链路层便可以统一在串行通信接口(SCI,serial comuunication interface)接收中断处理函数中实现。
图2给出了LIN报文格式:LIN报文由帧头和响应两个部分组成[3],帧头包括间隔场、同步场和ID,响应包括数据场和校验和。根据LIN报文格式设计状态机,以报文的各个组成部分定义状态,随着LIN报文的发送和接收过程进行状态跳转,便可以以状态机的形式实现LIN数据链路层,具体设计在此不再详述,可以参考笔者的《有限状态机在LIN总线开发中的应用》一文[4]。
2.2 应用层:
应用层协议主要定义了报文调度表和报文信号矩阵,主节点要实现的便是依据调度表进行LIN报文的传输调度和LIN信号的提取和填充。
调度表是一个环形的报文序列,其每个条目包含一个报文及其所占据的时间片长度。主节点依据调度表实现对时间片的计时和轮转,当某报文时间片到达时,BCM发送包括间隔场、同步场和保护标识符(PID,protected indentifier)在内的帧头[5],然后由各个节点根据该PID决定响应方式(发送或接收数据场和校验和)。当该时间片计时满,切换调度表条目,进行下一个报文的传输,这样便实现了LIN报文的传输调度。调度表条目结构体设计如下:
typedef struct
{
uchar handle;/*the schedule table index*/
uchar pid;
l_Resp_mode mode;/*means BCM receive the datafield or send the datafiled */
uchar datalen;
uchar *data;
uchar ticks;/*the time slot length*/
}l_sch_table_item;
LIN报文调度表为l_sch_table_item结构体数组,handle索引具体的调度表条目,随时间片的切换而累加,累加到调度表表尾后再次切换时将handle置为调度表表头索引,再次依次轮转;pid为LIN报文的Protected ID,表示该时间槽内传输哪一条报文;mode表示该报文的响应是BCM发送还是其它节点发送;data为数据场地址,指向本条目所对应报文的数据场,datalen为数据场长度;ticks定义时间槽长度,决定时间片计时时间,计时满则切换到下一个时间槽进行下一条报文的传输。
LIN信号矩阵定义了每个报文的数据场中所包含信号的含义、长度及其在数据场中的位置,笔者通过一种巧妙的方式实现了LIN信号的填充和提取。
首先依据信号矩阵定义,为每个报文数据场单独设计一个结构体,结构体成员变量分别对应该报文中的信号,然后在对调度表进行初始化时,将每个报文结构体变量的地址赋给调度表条目中的*data(见上述l_sch_table_item结构体定义),这样对于由BCM发送数据场的报文来说,直接对该报文结构体变量中的成员变量赋值就实现了LIN信号的填充,在调度到该报文的传输时,所发送的数据场的数据便是已经得到填充更新的值。对于由BCM接收数据场的报文来说,当轮转完该时间槽后,该调度表条目中的*data已经包含了该报文的数据场,直接提取使用即可[6]。
2.3 网络管理
LIN协议定义了网络管理功能,实现LIN网络的休眠和唤醒,BCM做为车身LIN网络的主节点,控制所有LIN节点的休眠。进入休眠有两种方式:
一、BCM暂停主调度表的轮转,保持总线上无数据,持续4S后,从节点自动进入休眠;
二、BCM在总线上广播发送数据场首字节为0的诊断请求帧即睡眠帧,从节点收到该帧后进入休眠。
唤醒则是通过在总线上发送唤醒信号实现的,唤醒信号为持续时间超过150us的显性位,LIN网络每个节点都有唤醒功能。当BCM唤醒其它节点时,发送数据0即可,因为LIN总线最大速率为20K,数据0会把LIN总线拉低为显性位至少450us。当BCM被其它节点唤醒时,需要在进入休眠时禁能SCI模块的SCI功能,使能其IO功能并使能中断唤醒,这样当总线上出现显性位时,便可以被唤醒,检测IO脚低电平持续时间,判断是否为有效的唤醒信号,如果是,则将调度表切换为主调度表,开始正常通信,如果为无效的唤醒信号,则认为是毛刺,再次立即进入休眠。
结语
笔者结合设计某基于LIN总线的车身控制器的经验,深入分析了LIN协议规范及其通信原理,详细介绍了数据链路层协议规范及其实现技术,定义了应用层的主要任务并给出设计方法,分析了LIN网络管理的机制并给出了具体实现,对从事LIN开发的工程师有很好的借鉴意义。