尹冀波,耿 爽,徐宏祥,李 贺
(中国电子科技集团公司第四十七研究所,沈阳 110032)
CAN,全称为Controller Area Network,即控制器局域网,是国际上应用最广泛的现场总线之一。由CAN总线构成的单一网络中,理论上可以挂接无数个节点。实际应用中,节点数目受网络硬件的电气特性所限制。CAN可提供高达1Mbit/s的数据传输速率,这使实时控制变得非常容易。由于CAN总线具有很高的实时性能,因此,CAN已经在汽车工业、航空工业、工业控制、安全防护等领域中得到了广泛应用。
经过测试,介绍一种基于PC机控制CAN网络节点的方法,该方法在实际应用中取得了很好的效果。也可以配合其它电路一起使用,用于电路测试与其它整机配套使用。
CAN的高层协议是一种在现有的物理层和数据链路层等底层协议之上实现的协议,高层协议是在CAN规范的基础上发展起来的应用层。在许多系统中,可以制定一个合适的应用层,相关组织已经研究并开放了应用层标准,以使系统的综合应用变得十分容易。
本系统根据实际需求,采用CAN2.0B标准帧格式。CAN标准帧信息为11个字节,包括两部分:信息和数据部分。前3个字节为信息部分。字节1为帧信息。第7位 FF表示帧格式,在标准帧中,FF=0;第6位RTR表示帧的类型,RTR=0表示为数据帧,RTR=1表示为远程帧;DLC表示在数据帧时实际的数据长度。字节2、3为报文识别码,11位有效。字节4-11为数据帧的实际数据,远程帧时无效。
在2.0B版本中,CAN控制器的标志符长度可以是11位或29位。遵循CAN2.0B协议的CAN控制器可以发送和接收11位标识符的标准格式报文,或29位标识符的扩展格式报文。如果禁止CAN2.0B,则CAN控制器只能发送和接收11位标识符的标准格式报文,而忽略扩展格式的报文结构,但不会出现错误。
CAN2.0B标准帧格式的解析,如表1所示。
表1 CAN2.0B标准帧格式
测试软件系统按功能可以分为驱动模块、消息队列模块、CAN节点模块、配置模块、核心处理模块、控制模块六个模块,如图1所示。
图1 测试软件系统模块设计图
3.1.1 驱动模块
驱动模块主要负责在系统异常的情况下复位CAN卡,软件卸载之前关闭CAN卡,通过适配器接收和发送数据,获取CAN卡接收缓冲区里面已经接收到的CAN帧的数量。软件运行之前启动CAN卡,在系统启动之后调整CAN卡参数,读取CAN卡硬件信息,读取CAN控制器信息,包括:模式寄存器、状态寄存器、仲裁丢失寄存器、错误寄存器、错误警告限制寄存器、接收错误计数寄存器和发送错误计数寄存器。
3.1.2 消息队列模块
消息队列模块即缓冲器,起到防止消息浪涌的作用。在具体设计时,需要建立两个消息队列:发送队列和接收队列。需要特别说明的是,队列里面的元素必须符合CAN消息的数据结构。此外,在接收和发送CAN消息的时候必须进行读写锁的保护处理。
3.1.3 配置模块
配置模块起到修改CAN卡参数的作用。该模块的主要功能有:①生成缺省XML配置文件;②读写XML配置文件;③验证XML配置文件;④保存和获取CAN卡的类型、CAN卡索引和CAN卡端口索引。
3.1.4 CAN 节点模块
CAN节点模块负责建立若干CAN节点表,反映各个CAN节点的生存状态。根据上层模块申请,添加和撤销回调指针和节点标识。接到各个CAN节点发来的Reset复位信号,查找该节点所拥有的标识,然后根据路由表找到对应的回调指针,通知相应的上层软件模块。在软件实际运行时,调用该模块更改CAN节点需求值,获取该节点对应的生存状态。3.1.5 核心处理模块
核心处理模块是整个系统的关键模块,它主要负责对流经的所有数据进行准确识别和分类。该模块由五部分组成:工作处理、命令发送、消息接收、消息分发、生存监测。工作处理负责声明该模块当前状态,建立路由表,获取XML配置文件信息,调整CAN卡需求,初始化CAN卡,启动命令发送、消息接收、消息分发和生存监测四项任务。命令发送负责获取命令队列的元素,将命令转化为CAN帧,填充发送队列,提交CAN帧到硬件接口。消息接收负责监测消息队列的元素,判断CAN帧的类型,转换CAN帧到命令格式送到接收队列。消息分发负责根据回调指针处理所有接收到的CAN消息,如果运行失败则修改路由表,并发出警告提示。生存监测每隔一定时间,广播一个特种CAN帧并且检查路由表,如果对应的连接状态为假,使用回调指针发出通信错误消息。
3.1.6 控制模块
控制模块负责确定源节点、选择CAN节点,发出CAN公有及私有命令参数,记录时间和CAN帧长度。控制模块还负责解析收到的CAN消息,维护发送列表和接收列表,获取CAN卡的PCB和MCU消息,提示各个CAN节点的生存状态。
CAN总线系统测试流程如下:
(1)系统打开之后,首先监测各个功能模块的状态,检查提示信息。
(2)如果配置文件出现异常情况,建立缺省配置文件。
(3)调整CAN卡参数,获取CAN控制器的各种寄存器状态和CAN卡的消息。
(4)观察CAN节点的生存状态,如果节点处于在线状态,可以通过控制模块下达命令。
(5)核心处理模块接收到命令,进行格式转换,命令由CAN卡发送到CAN总线。
(6)CAN节点获取到属于自身的命令,进行解析,根据命令内容执行相应任务。
(7)CAN节点实时监测任务的执行状态,并且将执行结果发送到CAN总线上的控制机。
(8)接到CAN卡传送来的CAN消息,核心处理模块进行解析。除了特种CAN帧之外,所有的CAN帧都要发送到对应的上层模块。
(9)控制模块接到CAN消息之后进行解析,判定CAN消息的来源以及内容。
该设计已经在作者所用的项目里面得到应用,达到了满足实际需求的目的,其中各种测试在硬件平台上验证时工作正常。
在下一步的改进中,在现有基础上,考虑应用CAN2.0B扩展帧以增加所携带的数据载荷,提高系统的稳定性;进一步优化软件算法,提高测试效率。
[1]CAN History[M].Micro System Corporation,2001.
[2]广州周立功单片机发展有限公司.非智能单通道CAN接口卡产品数据手册[M].广州周立功单片机发展有限公司,2007.
[3]潘爱民.COM原理与应用[M].北京:清华大学出版社,2000.
[4]刘晓华.精通MFC[M].北京:电子工业出版社,2003.