林可春 (福建船政交通职业学院汽车运用工程系,福建 福州350007)
随着工业制造水平的不断提高以及电子技术的快速发展,汽车能够容纳更多的电子设备,从而提升了汽车的舒适性和安全稳定性。但是,汽车中日益增多的电子设备也带来了诸如布线难度大、成本增加等问题。为此,笔者对基于CAN与LIN总线的BCM(Body Control Module,车身控制模块)通信协议栈进行了设计与实现,以便解决上述问题。
CAN(Controller Area Network,控制器局域网络)是由德国BOSCH公司提出的一种串行通信总线[1]。LIN(Local Interconnect Network,局域互联网)总线被看作是CAN总线的有效补充[2]。基于CAN与LIN总线的BCM通信协议栈总体架构如图1所示。根据Autosar体系[3],为BCM所设计的通信协议栈总体架构由驱动层、接口层和服务层所组成。
图1 BCM通信协议栈总体架构图
该模块用于对CAN控制器进行初始化,并负责CAN数据帧的收发。初始化主要是对控制器的工作模式、寄存器等进行配置。在传输CAN数据帧时,CAN驱动模块首先对数据格式进行转化,接着把转换后的数据帧传输给目的端。而在接收数据帧时,CAN驱动模块首先把收到的数据转换成标准格式,然后把转换后的数据放在缓存中,最后向上层发送新数据帧的到达通知。
该模块用于对SCI接口进行初始化,并根据LIN调度表来进行LIN通信,此外还对数据的收发进行监管。
CAN接口模块负责CAN接口的初始化、发送缓存、数据发送与数据接收的管理。
1)CAN接口的初始化 只有对CAN接口进行了初始化,上层与下层才能够通过它来进行数据的收发,而CAN接口的初始化工作只能在CAN接口处在未初始化或者停止状态时才能进行。函数CAN_Init()具体来完成初始化工作。初始化工作包括全局初始化以及CAN控制器的初始化。全局初始化除了要负责标识、结构体以及全局变量的初始化,还要对CAN接口的接收缓存与发送缓存进行初始化。CAN控制器的初始化是指对CAN控制器进行配置,并通过接口函数来对驱动层中的CAN驱动子模块进行初始化。在CAN控制器的初始化过程中,CAN驱动子模块与CAN接口子模块都处在停止状态,即不能进行数据的收发。
2)发送缓存的管理 CAN接口子模块的发送缓存在以下工作模式[4]:①丢弃模式。当PDU到达CAN接口子模块后,CAN接口子模块首先查询CAN驱动子模块是否空闲,如果不空闲,再查询其是否有可用的硬件资源,如果没有,那么该PDU将被丢弃。②缓存模式。当PDU到达CAN接口子模块并且CAN驱动子模块处于忙碌无空闲资源的情况下,PDU将被缓存在CAN接口子模块所提供的缓存区中。为了保证数据安全,应采用缓存模式。
3)发送数据的管理 当服务层有数据要发送时,其首先利用函数CANIF_Send()将数据PDU发送给CAN接口子模块,然后CAN接口子模块对该PDU进行编码以及格式转换,最后CAN接口子模块调用函数CAN_PDUWrite()把数据发送给CAN驱动子模块。此外,函数CAN_PDUWrite()的工作流程如下:其首先判断CAN驱动子模块是否空闲,如果该子模块空闲,其会把格式转换后的PDU写入到CAN驱动子模块的发送区,并且当数据被成功发送后,CAN驱动子模块利用回调函数将发送结果通知CAN接口子模块。否则,函数CAN_PDUWrite()需要判断CAN接口子模块是否有可用的发送缓存,如果有的话,待发送的数据帧将被存在发送缓存中,等待CAN驱动子模块空闲,否则将待发送的数据帧将被丢弃,同时函数CAN_PDUWrite()把发送失败的信息通知CAN接口子模块。
4)接收数据的管理 当CAN驱动子模块收到数据帧后,其会产生一个中断,来通知CAN接口子模块有新数据帧到达,接着CAN接口子模块开始进行数据过滤,其目的是验证数据帧的有效性。如果数据帧没有通过验证,CAN接口子模块通知CAN驱动子模块丢弃该数据帧,并通知服务层本次接收无效。如果数据帧通过验证,CAN接口子模块把CAN驱动子模块所接收到的数据帧拷贝到自己的接收缓存中,并向服务层发送新数据帧到达通知,以等待服务层读取该数据帧。
LIN接口子模块负责数据配置、任务状态机、API以及调度表的管理,根据LIN2.0协议进行该子模块的设计。数据配置管理主要是对LIN协议的版本号、传输的数据值、节点等进行配置。由于在LIN网络中,BCM只有一个,其它节点都为从节点,因而任务状态机管理需要对主从节点进行配置以及主从节点的行为进行管理,而API管理需要对API的初始化、读写操作以及信号更新进行管理。由于在LIN网络中信息的传递是根据调度表来进行的,因而调度表管理的内容包括对调度表的结构、调度时间等进行配置与管理等。
首先需要对该模块的工作状态、全局变量等进行初始化,同时还提供报文的拆分与组装服务。这是由于网络所能容纳的最大报文长度是一定的,而上层所发送的报文长度可能会大于该最大值,因而在发送该报文时需要对该报文进行拆分,在接收的时候,需要把拆分后的多个报文组装成原报文。
该子模块能够对网络中节点的权限进行配置,并且能够对网络运行进行监控。此外,还能够进行网络状态切换服务,如等待休眠、等待唤醒等。
此外,COM能够提供初始化、可靠性与信息交互服务。初始化服务包括通信端口、PDU、信号等的配置。而可靠性服务用于对PDU进行监控以及提供错误报告。信息交互服务提供信息(组)接收与发送功能。PDU Router相当于一个网关,其会把接收到数据包转发给相应的上层模块,同时把要发送的数据包发送到相应的CAN接口子模块。
为了对通信协议栈的性能进行测试,在PC端利用CodeWarrior Development Studio进行代码编写、调试并生成目标代码,然后将目标代码写入BCM开发板以实现对车身台架上设备的控制,同时通过串口把PC机与BCM开发板连接在一起。车身台架包含了整个CAN/LIN网络以及多个ECU(Electronic Control Unit,电控单元),其中,ECU负责控制车内电子设备,比如车窗的升降、车灯的控制等,同时ECU通过PC卡(CANCaseXL)与仿真网络节点进行连接,并利用CANNoe对整个网络进行检测(见图2)。
图2 BCM通信协议栈性能测试场景图
表1所示为通信协议栈性能测试结果。从表1可以看出,设计的通信协议栈能够正常工作,其不仅能够很好地承载车内电子设备之间的通信,而且能够将其控制信息及时地传递给车内电子设备,因而达到了设计要求。
表1 BCM通信协议栈性能测试结果表
针对汽车中日益增多的电子设备带来的诸如布线难度大、成本增加的问题,设计了基于CAN与LIN总线的BCM通信协议栈。通过性能测试,表明该通信协议栈既能很好地承载车内电子设备之间的通信,也能够及时地把BCM中的各种控制信息传递给车内电子设备,在降低了生产成本的同时又提高了汽车的安全稳定性,因而具有可行性。
[1] Farsi M,Ratcliff K,Barbosa M.An overview of controller area network [J] .Computing & Control Engineering Journal,1999,10(3):113-120.
[2] 谢芳,季爱明,俞一彪 .基于CAN总线的客车车身控制系统可配置模块设计 [J].客车技术与研究,2011,32(5):10-12.
[3] 蒋建春,万莹,易纲,等 .基于AUTOSAR架构的通信系统的研究与实现 [J].计算机测量与控制,2011,18(7):55-58.
[4] 何宏,郑义,李建文,等 .基于LIN总线的汽车车窗控制系统的设计 [J].天津理工大学学报,2013,29(6):17-20.