无线CPU模块中C—CAN总线的车载应用解析
鲍海森
摘 要:文章以Q2686无线CPU为例,介绍了OpenAt嵌入式系统在Q2686无线CPU上的应用,以及基于Q2686模块的SPI扩展CAN总线设计应用,提出了基于Q2686模块的低成本车载远程GPRS诊断系统设计思路。
关键词:OpenAt;C-CAN;SPI;车载;GPRS
随着工业领域通信的发展,控制器局域网络(Controller Area Network,CAN)总线日益取代传统的小型网络通信模式,应用到越来越多的工业化产品中,尤其是汽车电子产品。但是CAN属于现场总线,需要有线连接,如何将有线连接的CAN总线数据和无线的GPRS网络连接起来,成为近来研究的热点。将CAN总线数据通过GPRS网络接入Internet,传输至远程服务器系统,实现汽车CAN总线数据的远程读取,可以为车载诊断产品提供一种新的发展思路。本文讨论基于GPRS无线CPU的C-CAN总线开发的广泛应用。
1 OpenAt系统和Q2686模块硬件平台
OpenAt嵌入式系统是为GPRS无线CPU开发的一款操作系统,集成了内存分配、Flash管理、数据流管理、GPIO管理、总线管理、定时器管理等多种功能。底层为嵌入式API应用层,包括程序初始化API,AT指令API,操作系统API,标准API,流控API,总线API等。包含了建立在OpenAt基础之上的应用开发层函数库。应用开发层函数库(Application Development Layer Library,ADL)为开发人员提供了上层应用接口,简化了嵌入式应用的开发;同时ADL还提供了嵌入式应用程序框架,包括消息解析器和服务声明机制。基于以上原因,OpenAt应用程序开发人员在开发应用程序时,更多的时间用于调用服务处理函数,使系统更专注于程序本身的优化[1]。
Q2686模块是Sierra wireless公司为车载应用开发的汽车级GPRS无线CPU,支持嵌入式OpenAt系统,适用于汽车级的恶劣环境,具备抗强电磁干扰能力。内部集成了32位的ARM9芯片,最高频率为104 MHz,集成了32 M的Flash空间和8 M的RAM,拥有44个GPIO,两路SPI,两路UART口。内嵌嵌入式OpenAt操作系统,支持USB Slave和I2C总线[2]。
Q2686支持4个频段的GSM网络,可以在世界上任何国家使用。内嵌TCP/IP,UDP,HTTP,FTP等多种网络协议,为GPRS网络开发应用提供了丰富的资源,尤其在车载应用方面,Q2686模块可以在﹣40~85 ℃恶劣环境下正常工作,作为独立CPU模块使用,可以为系统硬件节省掉一个外部CPU,大大降低硬件系统的BOM成本。
在Q2686内部,OpenAt嵌入式系统与客户应用程序的关系如图1所示。
2 SPI扩展C-CAN应用
基于上面对于Q2686硬件平台的介绍,Q2686无线CPU本身不具备CAN总线硬件接口。由于Q2686无线CPU本身是为车载应用设计的,所以为了满足车载电子产品领域对于CAN总线应用的需求,OpenAt系统在Q2686模块的SPI总线上扩展CAN总线的应用,称之为C-CAN(全称Companion-CAN)总线,在应用层上完全等同于CAN总线。
在Q2686模块中,SPI总线最高支持13 MHz的速率,扩展为C-CAN总线后,完全满足CAN总线的最高数据速率。基于SPI总线扩展的C-CAN总线支持CAN2.0A,CAN2.0B协议规范,最高支持1 Mbps的高速CAN总线数据传输。在硬件接口上,Q2686模块支持NEC78k0专用CAN控制器,外部CAN数据传输器选择TJA1041A高速CAN数据传输芯片[3]。硬件框如图2所示。
3 C-CAN总线数据采集和传输
OpenAt嵌入式系统为C-CAN总线提供了丰富的API函数库,通过对CAN总线数据的读取并分析,可以诊断出汽车内部状态和故障,并将系统状态数据和相关故障代码通过GPRS发送至服务器端[4]。
C-CAN数据链路的建立:
if ( can_ifInit() == OK ) {//C-CAN总线API初始化完成
canInitChannel(CAN_BUS_CHANNEL_1);//初始化C-CAN通道
}
在canInitChannel()函数中启动C-CAN声明函数:can_busCreateChannel (eBusChannel, CAN_BUS_BDRT_500K, CAN_BUS_HIGH_SPEED, (can_busEventHandler_f) busEventHandler);其中,busEventHandler返回函數为C-CAN总线事件状态函数,其定义如下:
void busEventHandler(can_busChannel_e eBusChannel, can_busEvent_e eBusEvent){
switch (eBusEvent){
case CAN_BEV_BUS_OFF:
can_busRequest (eBusChannel, CAN_BUS_RESTART_FROM_BUSOFF);//启动CAN总线链路
break;
case CAN_BEV_CTRL_READY:
demo_canInitChannel(CAN_BUS_CHANNEL_1);//重新初始化总线和信息
break;
}
}
can_busCreateChannel 函数返回状态如下:
busEventHandler(can_busChannel_e eBusChannel, can_busEvent_e eBusEvent){
switch (eBusEvent) {
case CAN_BEV_CHANNEL_DONE: break;
case CAN_BEV_STARTED: break;
case CAN_BEV_BUS_NORMAL: break;
case CAN_BEV_BUS_WARNING_LEVEL: break;
case CAN_BEV_BUS_ERROR_PASSIVE: break;
case CAN_BEV_BUS_OFF:
can_busRequest (eBusChannel, CAN_BUS_RESTART_FROM_BUSOFF);//总线数据请求
case CAN_BEV_TRCV_SLEEP: break;
case CAN_BEV_TRCV_WAKE_UP: break;
case CAN_BEV_FIFO_WARNING: break;
case CAN_BEV_FIFO_FULL: break;
case CAN_BEV_CTRL_RESET: break;
case CAN_BEV_CTRL_READY:
canInitChannel(CAN_BUS_CHANNEL_1);//CAN总线重新初始化
default: break; }}
CAN总线数据的读取是通过can_msgRead()函数完成,数据的写操作是通过can_msgWrite()函数进行。CAN总线数据收发流程如图3所示[5]。
4 GPRS数据链路的建立
在OpenAt嵌入式系统中,启动GPRS的功能模块是WIP插件库,该插件库集成了TCP/IP,UDP,FTP,HTTP等多种网络协议栈,根据需要启动相应的协议栈函数库。我们建立TCP/IP客户端作为远程诊断终端的设备类型。
OpenAt系统中,启动WIP登陆GPRS网络首先启动系统的Bearer,Bearer在OpenAt中作为一种数据通道,在一个Bearer下可以建立多条不同协议栈的数据链路。Bearer的建立示例代码如下[4]:
void StartWipHandler(u8 ID){
s8 sReturn;
if ( wip_netInit()==0){ //初始化网络协议栈
sReturn=wip_bearerOpen(&br,"GPRS",BearerHandler,NULL);//打开Bearer的GPRS链路
if ((sReturn==0)||(sReturn==WIP_BERR_ALREADY)){
sReturn=wip_bearerSetOpts(br,WIP_BOPT_GPRS_APN,”CMNET”,
WIP_BOPT_LOGIN,NULL,WIP_BOPT_PASSWORD,NULL, WIP_BOPT_END);//设置GPS参数,APN接入点,PPP协议的认证用户名和密码
if (sReturn==0) sReturn=wip_bearerStart(br);//建立PPP连接
}}}
Bearer通道建立完成后,当BearerHandler返回函数返回WIP_BEV_IP_CONNECTED事件,表明当前的PPP连接建立成功。在本系统中,建立基于TCP协议栈的客户端SOCKET连接。启动函数为:
Channel=wip_TCPClientCreate(“202.113.23.56”,9000,ClientEventHandler,NULL);
其中Channel值即在Bearer上建立的TCP链路返回句柄。ClientEventHandler返回函数定义如下:
void ClientEventHandler(wip_event_t *event, void *ctx) {
switch(event->kind){
case WIP_CEV_READ:break; //TCP数据包读操作
case WIP_CEV_WRITE: break; //TCP数据包写操作
case WIP_CEV_OPEN:break; //TCP链路建立完成
}}
在ClientEventHandler返回函数中,WIP_CEV_OPEN事件表明与指定服务器的端口TCP数据链路连接建立完成,系统已经搭建完成从远程诊断终端到Internet服务器的数据链路。在OpenAt嵌入式系统中,TCP/IP数据包通过wip_write(u8 *Data)函数发送,将数据直接送至wip_write(u8 *Data)函数,GPRS无线CPU立即将数据包以分组方式发送至服务器端。同样,系统采用wip_read(u8 *Data)函数接收,将来自服务器的数据依次分组接收下来,从而完成了数据包从发送到接收的全过程。
5 C-CAN总线在汽车远程诊断系统中的应用
Q2686模块本身是一款GSM/GPRS无线CPU,可以比较方便地建立GPRS数据链路连接,实现GPRS数据的稳定传输。由于CAN总线系统在汽车电子领域的广泛应用,以CAN总线为标准的C-CAN总线技术,可以将车载有线CAN数据传输,方便地扩展为GPRS远程数据传输。将汽车的CAN总线诊断数据通过GPRS实现远程传送至Internet上的诊断服务器,实现随车车载诊断;也可以对车辆实现远程的碰撞检测,气囊打开检测,紧急救援协助,车门开启报警等,结合GPS定位模块,还可以实时进行路线跟踪,保养提醒,防盗追踪等。
6 结语
基于Q2686模块和OpenAt嵌入式系统的车载应用,将GPRS无线数据传輸与CAN现场总线的有线数据实现了有机的结合,实现了Internet到CAN现场总线数据的交互,为车辆的远程诊断和控制提供了技术上的支持,为车主能提供更优质的服务,同时为车载电子产品的增值服务提供了技术手段,既扩展了车载电子产品的应用范围,也为Internet的扩展应用和物联网的发展奠定了一定基础。在国内,将CAN总线诊断以及汽车的发动机控制与GPRS技术的结合应用尚存在广阔的发展空间。
[参考文献]
[1]洪利,王敏,章扬.无线CPU与移动IP网络开发技术[M].北京:北京航空航天大学出版社,2008.
[2]Wavecom Corporation.WM Q2686 modules spec sheet[S].2007.
[3]Wavecom Corporation.CAN1 product technical specification[S].2009.
[4]Wavecom Corporation.CAN plug in API definition communication[S].2009.
[5]金民锁,孙秀娟.基于CAN总线的矿井监控系统的设计[J].工业控制计算机,2009(10):56-57.