您现在的位置是:首页 > 汽车

CAN/GPRS无线车载网关的设计与实现

2019-12-30 18:28:11

1 引言
随着汽车电子技术的不断发展,车上的电子装置越来越多,并与传感器和执行器一起共同组成了许多复杂的电子控制系统。结果连接这些电子装置的电子线路迅速膨胀,布线变得越来越困难,导致了车身重量明显增加,车辆运行的可靠性降低。传统点对点的连接方式已经无法满足现代汽车电子技术发展的要求,多路传输的车载网络技术成为解决这些问题的必然选择。德国BOSCH 公司[1]推出的控制局域网CAN(Controller Area Network)依靠其稳定的性能、低廉的价格和很高的可靠性和实时性,现在已经被广泛地应用于汽车内部网络。CAN总线的采用使汽车内部的信息数据共享成为现实。然而,现在信息数据的共享不仅仅局限于汽车内部,许多数据信息需要与外界进行交换。这些信息主要用于汽车导航、汽车GPS 定位、汽车防盗、汽车远程监控、汽车远程调度和收费等方面。由于汽车可移动性的特点,很多与外界交互的信息需要通过无线传输,所以我们选择具有覆盖面广、接入速度快、按流量计费等优点的通用分组无线业务GPRS(General Packet Radio Service)来承载无线数据通信。GPRS 是在GSM 基础上发展起来的一种无线分组交换技术[2],被称为2.5G,最高带宽可达171.2Kb/s,可较好的满足无线通信的要求。
2 总体网络拓扑
总体网络拓扑如图 1 所示,汽车内部的电子控制单元都挂接到CAN 网上,汽车的内部数据信息通过CAN 总线进行传递,而需要与外界交互的数据则通过CAN/GPRS 无线车载网关进行收发。

数据经过基站收发信机 BTS(Base Transceiver StaTIon)、基站控制器BSC(Base StaTIon Controller)和GPRS 服务支持节点SGSN(Serving GPRS Support Node)进入GPRS 骨干网;然后再通过GPRS 网关支持节点GGSN(Gateway GPRS Support Node),进入Internet 互联网;并可以通过TCP 或UDP 协议把数据传送到Internet 远程服务器。
3 CAN/GPRS 无线车载网关硬件实现
因为整个汽车内部CAN网与外界交互的数据都需要通过CAN/GPRS无线车载网关进行收发,所以网关需要配备一个性能较高的微处理器。我们选择具有较高性价比的一款三星公司的32 位ARM9 微处理器S3C2410X 来作为网关的主控制器。S3C2410X 包含ARM920T核,最高处理速度为203MHz[6],丰富的外围设备包括3 通道的UART、4 通道的DMA、2个SPI 接口、117 个通用I/O 口和24 个外部中断源等。采用一片三星的K9F1208 NAND Flash芯片(64M *8Bit)来储存网关软件系统的Bootloader,Linux 内核,根文件系统和网关程序。由两片HYNIX 的HY57V561620 DRAM 芯片(4Banks*4M*16Bit)构成64M 的SDRAM,用于加载Linux 操作系统和运行程序。采用12MHz 的有源晶振。设计了一个20 针JTAG 接口,用来烧写Bootloader。使用1 片MAX3232 构成UART 调试接口。因为整个系统的输入电压为5V,所以需使用AMS1117-3.3 和AMS1117-1.8 分别得到稳定的3.3V 和1.8V 电压。
CAN 控制器选择Microchip 的MCP2510,CAN 收发器选择Philips 的TJA1050 以组成网关的CAN 通信模块。MCP2510 支持CAN 总线V2.0A 和V2.0B 技术规范,通信数率可达1Mb/s,拥有3 个发送缓冲器、2 个接收缓冲器,高速SPI 接口支持0,0 和1,1SPI 模式。TJA1050具有对总线差分信号的收发功能和抗汽车环境下的瞬间干扰等能力。网关的GPRS 接口采用SIMCOM 公司的SIM300 GSM/GPRS 模块,该模块可为GSM 语音、短消息和GPRS 上网等业务提供无线接口。采用6 脚SIM 卡座来连接SIM 卡。网关的硬件结构如图2 所示。

在实际硬件连接时,S3C2410 的SPI 接口与MCP2510 的SPI 接口直接相连。MCP2510的TXCAN、RXCAN 引脚分别与TJA1050 的TXD、RXD 引脚相连,而TJA1050 的CANH和CANL 引脚分别接到CAN 总线的CANH 线和CANL 线上。因为S3C2410 的UART 口并没有引出DCD、 DTR、DSR 和RI 信号引脚,要通过SIM300 无线联网,最好使用全部的信号引脚,所以我们使用PHILIPS 的SC16C550 从S3C2410 上扩展出标准的UART 接口与
SIM300 的UART 接口进行连接。CAN/GPRS 网关主要通信模块的硬件电路原理图如图3 所示。

4 CAN/GPRS 无线车载网关软件实现
4.1 ARM-Linux 操作系统移植.使用韩国 MIZI 公司开发的VIVI 作为bootloader、选择2.6 内核的ARM-Linux 作为嵌入式操作系统,并用busybox 制作Linux 的根文件系统。在K9F1208 NAND Flash 芯片上存储区域的划分如表1 所示。


4.2 ARM-Linux 下SPI 驱动程序编写
使用 S3C2410 自带的SPI 通道0 与MCP2510 进行通信,其SPI 驱动程序流程[3]如下:
(1)写SPPRE0 寄存器,设置波特率。
(2)写SPCON0 寄存器,设置数据传输为0,0SPI 模式。
(3)向SPIDAT0 寄存器写10 次0xFF,以初始化MCP2510。
(4)设置GPIO 引脚,用来充当片选,设定低电平以激活MCP2510。
(5)检查SPSTA0 寄存器的发送状态位REDY 是否为1,若是,则可以向SPTDAT0 寄存器写数据并发送出去。
(6)SPCON0 寄存器的TAGD 不使能,向SPTDAT0 寄存器写入0xFF,在确认REDY 有效后,可从SPRDAT0 寄存器中读数据;TAGD 使能,确认REDY 后,也可从SPRDAT0 寄存器中读数据。
(7)设置GPIO 引脚,信号设为高电平,片选不使能。
4.3 ARM-Linux 下CAN 驱动程序编写
因为 CAN 应用层协议是基于CAN2.0B 技术规范设计的,所以通信报文采用CAN2.0B扩展帧格式。
初始化:(1)发送0xc0 复位指令,MCP2510 复位;(2)进入配置模式,设置CAN 总线波特率,关中断;(3) 设置屏蔽寄存器RXM(0、1)SID(L/H)、RXM(0、1)EID(8/0)和滤波寄存器RXF(0~5)SID(L/H)、RXF(0、1)EID(8/0)并启动;(4)设置CAN 设备为普通模式并切换到正常模式;(5)清空接收和发送缓冲区。(6)开启接收或发送缓冲区,开启中断。发送报文:(1)写标识符寄存器TXB(0~2)SID(L/H)、TXB(0~2)EID(8/0);(2)向发送缓冲器数据长度寄存器TXB(0~2)DLC 写入要发送的报文长度;(3) 写数据时,需依次向MCP2510 发送0x02 写指令、发送缓冲器数据寄存器TXB(0~2)DM 的8 位地址码和需要发送的报文数据;(4)必须进行发送有效性检测,即:检测发送缓冲器控制寄存器TXB(0~2)CTRL 的TXREQ 位。为1 时,说明正在发送报文,须等待;当此报文发送完毕后,该位将被自动清零,这时才可写入下一个将要发送的报文数据。接收报文:(1) 向MCP2510 发送0xA0 状态读指令,并不断检测中断标志寄存器CANINTF,当发现RX(0、1)IF 位为1,说明接收缓冲器已收到报文;(2)这时可从接收缓冲器标识符寄存器中读出帧的ID,从接收缓冲器数据长度寄存器RX(0、1)BDLC 读出收到的报文长度;(3)读数据时,需依次向MCP2510 发送0x03 读指令、接收缓冲器数据寄存器RXB(0、1)DM 的8 位地址码后MCP2510 才会将数据通过SO 引脚发送出来。读完数据,RX(0、1)IF 位需清零。
4.4 ARM-Linux 下串口驱动程序修改及加载
因为我们使用的是与 16c550 寄存器兼容的UART 控制器芯片SC16C550,所以需要加载其在Linux 下的驱动程序serial_8250.c。但SC16C550 芯片是通过外部总线和S3C2410 微处理器连接的,所以在驱动程序的serial8250_isa_init_ports 函数中需加入对SC16C550 芯片所在Bank 空间的初始化,包括设置读/写时序、速度和总线宽度等信息[4]。
4.5 ARM-Linux 下GPRS 联网
GPRS 通过PPP(Point-to-Point Protocol,点对点协议)来完成联网。PPP 是在直接连接的串行链路上创建和运行IP 网际协议或其他网络协议的一个方案。在ARM-Linux 下对PPP的支持需要内核和应用程序配合管理。对于Linux2.6 内核,在配置内核时需要选择对PPP的支持,如:在Network device support 菜单下,选择支持PPP 协议、PPP 异步/同步串口通信和PPP 压缩。此外,还需要移植Linux 下PPP 的应用程序工具包,即把交叉编译后得到的pppd、chat 程序加入根文件系统。在根文件系统的/etc/ppp 目录下,还需编写3 个脚本文件:opTIons(pppd 配置脚本)、gprs-connect(pppd 连接脚本)、gprs-disconnect(pppd 断开脚本)。在opTIons 脚本中需指定串口控制台设备/dev/ttse/0、连接波特率115200、连接和断开脚本的存放路径; 在gprs-connect 脚本中运行chat 程序, 并指定APN 接入点, 如:'AT+CGDCONT=1,"IP","CMNET","",0,0'和ISP 呼叫号码:'ATD*99***1#'等。这样系统启动
后,直接使用pppd &命令即可实现GPRS 无线接入互联网。
4.6 CAN 应用层协议与UDP 或TCP 协议转换
因为 GPRS 网络是建立在TCP/IP 协议基础上的,所以通过GPRS 网络与Internet 远程服务器通信可以使用UDP 或TCP 协议。由于S3C2410 上不仅移植了Arm-Linux 操作系统,其本身已支持TCP/IP 协议,而且我们也把CAN 的应用层协议加载了上去。所以在网关上无线发送数据时,只需将汽车CAN 网上的CAN 数据包数据域中的数据加上UDP 或TCP包头即可发送出去;当在网关上无线接收数据时,只需去掉UDP 或TCP 数据包的包头,得
到的数据可以遵照CAN 应用层协议的报文格式向CAN 网上发送。协议转换如图4 所示。

4.7 心跳程序的实现
因为 CAN/GPRS 无线网关与Internet 远程服务器通信时,可能会出现连接的异常情况,所以需要使用心跳程序来检测异常情况的发生,并通过心跳程序重新拨号来保证无线通信链路的正常连接[5]。我们可以定时Ping 远程服务器,若能Ping 通,则表示无线通信链路工作正常;若多次无法Ping 通,则必须断开连接,重新拨号。
5 结论
本文详细介绍了 CAN/GPRS 无线车载网关的实现,所实现的网关在实验通信网络中能较好地完成汽车内部CAN 网数据信息与外界的交互任务,并能长时间稳定运行,基本上达到了工作要求。
本文作者创新点:在CAN/GPRS 无线车载网关上能成功地运行ARM-Linux 嵌入式操作系统、心跳程序和底层硬件驱动程序,完成了CAN 应用层协议与TCP 或UDP 协议的转换,使得汽车内部CAN 网能与外界进行无线数据通信。