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 网能与外界进行无线数据通信。