2 协议转换流程
当CAN总线上的设备向Ethernet网发送数据时,嵌入式网关将接收到的CAN数据包解析,提取数据域中的内容;然后按照TCP/IP协议进行封装,嵌入式网关将经过封装的数据发送给以太网控制芯片RTL8019AS。由RTL8019AS自动给这些数据添加以太网物理层和逻辑链路层所需的相关信息,通过物理接口传送到以太网。反之,当以太网向CAN总线上设备发送TCP/IP数据包时,它首先将数据发送到RTL8019AS,嵌入式网关从RTL8019AS中接收到数据后,提取实际要传送的数据,然后封装成CAN总线数据格式,通过CAN总线将数据发送到网络中的现场设备。
嵌入式网关硬件必须具有以太网接口和CAN总线接口,而软件要有TCP/1P协议栈和CAN总线驱动程序;通常嵌入式Linux内核中有完整的TCP/IP协议栈。由于REALTEK公司支持Linux的开发,Linux系统中已含有RTL8019AS芯片的通用驱动程序,CAN总线协议驱动并不是标准配置。因此,设计CAN总线接口及其编制驱动程序是实现嵌入式网关最主要的工作。
3 CAN驱动程序设计
Linux驱动程序属于Linux内核的一部分,是嵌入式系统控制硬件的接口,它为用户屏蔽设备的工作细节,并向用户提供透明访问硬件设备的机制。驱动程序的开发在嵌入式系统开发中具有举足轻重的地位。开发出稳定、完备的驱动程序可提高整个系统的性能。
3.1 CAN驱动程序流程
MCP2510的内部结构框图如图2所示。
MCP2510内含3个发送缓冲器和2个接收缓冲器,同时还具有灵活的中断管理能力。CAN协议机负责与CAN总线的接口,SPI接口逻辑用于实现同MCU的通信,而寄存、缓冲器组与控制逻辑则用来完成各种方式的设定和操作控制。
在Linux多任务操作系统中,CAN总线通信程序的设计可分为发送数据模块、接收等待模块和中断处理模块实现。系统中CAN总线的数据发送和接收是两个不同的线程。在驱动程序中建立数据发送和接收缓冲区。中断处理程序只负责填充(或读取)缓冲区中的数据,然后唤醒等待接收(或发送)数据的任务。数据的发送与接收都通过独立的缓冲区,并由中断来实现。操作系统的中断响应时间在软件上决定了CAN总线数据的最快收发速度。
3.2 CAN设备驱动程序的实现要点
3.2.1 CAN设备驱动操作函数
CAN设备驱动程序最终提供给应用程序的是一个流控制接口,主要包括:open,realse,read,write,ioctl等操作。添加设备驱动程序,实际上就是给上述操作编写相应的程序代码。驱动程序加载到内核时,会首先运行驱动程序的初始化函数,然后等待系统调用在file_operations数据结构中定义的相关函数,实现对设备的操作。系统使用Linux 2.4.18版本,其文件系统接口被写义为:
s3c2410_mcp2510_open负责对将要进行的I/O操作做好必要的准备工作,主要包括限制CAN打开次数、清空3个发送缓冲区和2个接收缓冲区等。
s3c2410_mcp2510_write将要发送的数据通过SPI总线将数据传送MCP2510的发送缓冲器,再通过MCP2510将数据发送到CAN总线。