摘 要: 基于Cortex-A8嵌入式开发平台和SAE J1939协议,通过解析CAN总线报文、后台数据处理和前端应用程序开发,设计出了一套车载信息服务系统。经过测试表明,该系统能稳定显示车辆实时运行状况,并能分析和保存故障信息,方便车主的维护和保养;其易操控性和良好的人机交互体验使本系统具有一定的实用价值。
关键词: Cortex-A8;SAE J1939协议;车载信息;人机交互
车载信息系统是现代汽车电子重要组成之一。目前市场上的乘用车车载信息系统智能化程度比较高,技术已趋向成熟,但是商用车却相对滞后。这也意味着商用车车载信息服务系统市场亟待开发,主要有以下几个方面的原因:一是行业的内在需求。商用车作为运营车辆,如客运、旅游公交、物流公司对车辆的安全、运营、成本管理等的内在需求愈发强烈。二是技术的日渐成熟。车载总线技术的推广普及为车辆信息采集提供了基础;大规模集成电路的迅速发展为车联网硬件开发提供了基础;通信技术中的3G技术已经成熟,4G网络在快速建设,很快将完成城市和公路范围覆盖。三是国家相关政策陆续出台。商用车,尤其是客车作为运营车辆,事关人身安全、财产安全以及社会稳定,国家对其管理要求也是格外重视,自2003年起便推出了道路运输车辆卫星定位动态监管系统标准、强制安装记录仪标准、JT-T415-2006道路运输电子政务平台标准及汽车行驶记录仪新国家标准,这为商用车的车载信息服务系统的快速普及提供了强大的政策推动。商用车车载信息服务系统及相关技术发展潜力巨大。
为此,本文借助Cortex-A8嵌入式开发平台,基于SAE J1939协议,针对商用车设计了一套功能完善、整体性强且性价比高的车载信息系统。
1 系统总体设计方案
本系统主要功能为:实时监控车辆运行参数,给驾驶人员提供丰富的车辆实时运行状况信息;建立车载数据库,存储采集到的车辆实时运行动态信息和故障信息,以备查询使用;实现车辆故障自诊断功能,方便相关人员对车辆进行故障检测。系统结构原理图如图1所示。
图1中,CAN控制器模块采集车内各CAN节点的报文信息,其通过SPI接口与主处理器进行通信;GPS模块提供车辆的实时定位信息;通过GPRS模块可将车辆的实时运行状态与移动通信设备进行信息交换;存储模块主要储存车辆的故障信息,方便车辆的维护和保养;人机交互模块主要用来显示针对本系统开发的应用软件,给用户以人性化体验。
2 系统主要硬件结构
主控芯片采用基于ARMv7架构的Cortex-A8处理器,其主频达1 GHz,是三星推出的一款适用于智能手机和平板电脑的应用处理芯片。本系统采用的开发平台具有丰富的板载资源:板载RS232串口、RS485串口、外扩I2C、SPI、PWM等接口,板载CAN总线接口、GPS模块、工业级GSM/GPRS模块等,大大方便了本系统的开发。
其中,CAN总线模块主要由CAN独立控制器、CAN收发器和时钟电路组成。控制器选用MCP2510,并以晶振电路作为时钟源;收发器选用CTM1050T(内部集成光电隔离电路)。电源部分:MCP2510采用3.3 V电源供电,CTM1050T采用5 V供电,与CAN总线电源电压一致。由于CTM1050T内部集成了光电隔离电路,因此GND和CANG两个接地引脚,分别接系统地线和CAN总线地线。数据线接线部分:MCP2510通过标准SPI串行接口与Cortex-A8通信,通过收发器CTM1050T与车内CAN总线网络连接。信号线接线部分:MCP2510有8个中断源,有中断发生时,通过INT引脚向主处理器发送中断请求,然后主处理器通过查询中断标志寄存器(CANINTF)确定中断源。另外,接收缓冲器满引脚(RX0BF和RX1BF)也可用来显示有效报文是否分别成功载入RXB0或RXB1。本设计使用中断引脚INT与Cortex-A8的外部中断引脚EINT19相连,用于发送中断信息,RX0BF和RX1BF外接LED,用于指示数据传输状态。CAN总线模块电路原理图如图2所示。
3 系统的软件设计
本文所设计的车载信息服务系统是基于操作系统的嵌入式产品。传统的基于操作系统的嵌入式产品可以分为应用层、文件系统及驱动层和底层3个部分。借助于功能强大的Cortex-A8嵌入式开发平台,本文主要工作集中在应用层上面,其软件设计流程图如图3所示。系统地看,CAN设备经过驱动以后,从车载CAN总线网络上接收报文,读取设备文件函数后,数据流向后台数据处理程序,经过后台数据处理,最后交由前端Qt页面显示。
本系统所做工作的核心部分即为后台数据处理程序设计和前端人机交互程序设计。后台数据处理程序接收CAN报文后,基于SAE J1939协议进行解析处理;人机交互是将处理后的数据显示在用户图形界面上。
3.1 SAE J1939协议
SAE J1939协议是美国汽车工程师协会(SAE)在CAN2.0B协议基础上制定的针对客车和货运车网络通信应用层协议,目前在汽车电子网络中得到广泛应用。SAE J1939协议以CAN2.0B协议为基础,所不同的是在很多方面做了更具体的规定。例如,在物理层,选用屏蔽双绞线作为传输介质,传输速率规定为250 kb/s;在数据链路层使用CAN扩展帧,并对CAN标识符重新定义,摒弃了CAN协议中对报文标识的方法,重新采用对节点地址编号。SAE J1939协议总体按照ISO/OSI模型制定相关标准,在CAN2.0B协议的基础上又增加了应用层定义、网络层定义、网络管理和故障诊断定义,传输层、会话层和表示层暂未定义。SAE J1939协议各层使用的是格式统一的协议数据单元PDU(Protocol Data Unit),每个协议数据单元的功能由所携带的参数组编号PGN(Parameter Group Number)标识。SAE J1939作为一种控制局域网协议,网络中大部分数据都是以参数的形式在应用层完成传递的。
下面以动机瞬时油耗为例说明报文解析的具体过程:如接收到的PDU的帧ID为0x18FEF200,其数据区前两个字节值为138(0x008A),则该报文部分域值如图4所示。
由图4可知,优先级P为6,目标地址PS为0xF2,源地址SA为0x0。此时地址为0xF2的节点会接收该报文并交由上层应用程序处理,而其他节点则不进行处理,直接丢弃。根据R(保留位)、DP(数据页)、PF(PDU格式)、PS(特定PDU)的值的计算可得本报文的参数组编号PGN为0x00-
FEF2。SAE J1939对该参数组编号定义如表1所示。
由表1可知,此报文数据区携带了4个参数,前两个字节内定义的参数是燃油使用率,可疑参数编号SPN为183。具体燃油使用率的值可以按照SAE J1939协议对SPN183的定义计算出来,协议对SPN183的定义如表2所示。
由表2,根据计算公式:参数实际值=分辨率×总线传输数值+偏移量,代入数据便可以得到参数的实际物理值:瞬时油耗=0.05 L/h×138+0=6.9 L/h。
3.2 CAN总线底层配置
CAN总线驱动程序的报文发送、接收任务都是围绕控制器MCP2510展开的,因此驱动程序主要是对控制器MCP2510内部寄存器进行操作。在Linux为所有设备都提供的统一函数接口file_operations中,其中can_ioctl()函数可以设置CAN总线通信波特率、通信帧ID、CAN总线接收滤波器以及MCP2510工作模式等参数。因此CAN总线驱动程序主要内容就是对CAN总线控制器MCP2510的操作和file_operations结构的设计。
3.2.1 CAN总线控制器MCP2510的设置
首先对MCP2510进行初始化,具体步骤为:(1)软件复位,进入配置模式;(2)设置CAN总线波特率;(3)关闭中断,设置ID过滤器;(4)切换MCP2510至工作状态;(5)清空接收和发送缓冲区;(6)开启接收缓冲区,开中断。
由于MCP2510与Cortex-A8的SPI0直接相连,因此接下来需要编写驱动SPI0控制器的接口函数,具体包括SPI_init()、SPI_putch()、SPI_getch()、SPI_mcp_select()、SPI_mcp_unselect()函数等。它们的作用分别是初始化SPI控制器;通过SPI发送一个字节;通过SPI接收一个字节;后两个函数是MCP2510的片选的选择和取消。
MCP2510为微控制器提供读指令、写指令、请求发送指令、状态读指令、复位指令和位修改指令6种指令操作。编写的相应的SPI接口函数为:SPI_mcp_RD()读操作;SPI_mcp_WR()写操作;SPI_mcp_rts()请求发送操作;SPI_mcp_RD_status()状态读操作;SPI_mcp_reset()复位操作;SPI_mcp_write_bits()位修改操作。
3.2.2 CAN驱动程序的实现
CAN设备属于字符设备,根据Linux设备驱动程序的通用模式, CAN驱动程序软件结构如图5所示。
由图5可知,CAN总线驱动程序设计具体步骤如下:
(1)通过can_init()函数实现初始化,具体包括:初始化硬件、注册字符设备驱动、注册中断和创建设备文件系统节点。硬件的初始化主要通过调用函数SPI_init()和mcp_init()实现。注册字符设备驱动是通过register_
chrdev()函数实现的。向内核注册中断使用了函数request_irq()。创建设备文件系统节点则是通过函数devfs_register()实现的,它将为CAN总线设备创建文件节点/dev/can。
(2)CAN驱动程序的编写选择适用的文件操作接口file_operations结构,具体如下所示:
Static struct file_operations can_fops={
owner:THIS_MODULE;
open:can_open;
release:can_release;
ioctl:can_ioctl;
write:can_write;
read:can_read;
};
在该结构中,应用程序可以通过can_ioctl()函数改变CAN总线通信中诸如CAN总线通信波特率、通信帧ID、CAN总线接收滤波器以及MCP2510工作模式等参数的设置。
(3)通过函数can_exit()用来卸载和取消设备。在模块被卸载时,可以通过调用unregister_chrdev()和free_irq()函数注销字符型设备驱动和已经申请的中断。
3.3 应用程序设计
应用软件是车载信息系统的重要组成部分。本系统使用Qt/Enbedded 应用程序架构开发应用程序。根据车载信息系统的功能需求,系统应用程序的设计分为人机交互界面、CAN总线数据处理、GPS、GPRS信息处理和数据存储等部分。由于需要执行多个任务,若在单一线程里实现,可能会导致阻塞、降低系统整体性能。因此,本系统采取多线程技术,可以提高处理器效率,还能避免程序阻塞、交互界面卡顿等现象。本文着重介绍车辆实时状态监控程序设计部分。
车辆状态监控主要包括实时监控车辆各项实时运行参数和故障信息。结合前面的报文解析过程,其流程图如图6所示。
根据SAE J1939协议的规定,车辆各项参数会以规定周期在网络上广播,如果有故障发生,就会广播相应的故障码。本程序只需监测网络,提取携带这些有用信息的报文进行相应的解析即可。该部分功能在车辆状态监控子线程中实现,该线程启动后循环读取来自MCP2510从总线上接收的报文。如果报文中携带的是车辆状态参数,则根据相应的PGN查表确定该报文数据域的参数和它们的SPN,再根据SPN查表获得这些参数在数据域中的位置、数据分辨率、数据长度和偏移量等信息,最后通过计算获得该参数具体的物理值;如果是故障报文,则需要根据报文中的诊断故障代码(DTC)来确定故障参数和故障类型。获得以上这些信息后把它们存入到相应的全局变量以供其他线程使用,同时刷新LCD显示值。
本文设计的车载信息系统实时监控画面如图7所示。在实际测试中,本系统能稳定地显示车辆的实时运行数据,方便车主对车辆进行维护和保养,满足用户的基本需求;人性化的操控界面和快捷灵敏的反应速度使本系统具有一定的应用价值。
参考文献
[1] 尹占威.商用车车载信息服务市场升温[N].中国电子报,2011,15(11):2.
[2] 陈一新,李武屹,莫家贵.基于SAE J1939协议的车辆信息采集与诊断模块[J].电子技术,2010(7):65-67.
[3] 张继辉,许勇.基于SAE J1939的车辆监测与故障诊断车载系统[J].计算机系统应用,2013,22(3):73-75.
[4] 赵俊旭,唐厚君,钟溢原.基于Cortex-A8的仓库管理移动终端设计[J].微型电脑应用,2011,27(10):35-37.
[5] 田帅,柳晓鸣.车载信息系统的研究[D].大连:大连海事大学,2007.
[6] SAE J1939-71:vehicle application layer[S].Society of Automotive Engineers,2008.
[7] SAE J1939-21:data link layer[S].Society of Automotive Engineers,2006.
[8] SAE J1939-73:vehicle application layer-Diagnostics[S].Society of Automotive Engineers,2006.