APP下载

一种基于ARM的嵌入式网关系统设计与实现

2010-05-13

现代电子技术 2009年12期
关键词:CAN总线驱动程序

徐 敏

摘 要:针对以太网与CAN现场总线之间互连的需求,提出一种基于ARM的嵌入式网关系统设计与实现,分别从网关硬件系统组成、协议转换流程以及嵌入式Linux下CAN设备驱动程序的开发方法进行分析与设计。通过软、硬件平台的搭建与测试,实现了以太网与CAN现场总线之间的协议转换,为CAN/Ethernet的互连提供了一种传输速度快、成本低、稳定性高的网关解决方案。

关键词:网关设计;CAN总线;协议转换;驱动程序

中图分类号:TP393文献标识码:B

文章编号:1004-373X(2009)12-131-03

Design and Realization of Embedded Gateway System Based on ARM

XU Min

(Xiamen University of Technology,Xiamen,361024,China)

Abstract:For the demands of interconnection between Ethernet and CAN fieldbus,ARM-based embedded gateway system is designed and implemented.Analysis and design are carried on respectively from the structure of gateway hardware systems,the processes of protocol transitions and development method of CAN device drivers under the embedded Linux.The protocol conversion between Ethernet and CAN fieldbus is achieved through the build and test of the hardware and software platform.In this paper,a gateway solution for the interconnection of CAN/Ethernet is provided with rapid-transmission,low- cost and high-stability.

Keywords:gateway design;CAN Bus;protocol conversion;driver program

0 引 言

CAN (Controller Area Network)为控制器局域网络,CAN总线规范已经被国际标准化组织制订为国际标准ISO11898,并得到众多半导体器件厂商的支持,推出各种集成有CAN协议的产品。CAN属于总线式串行通信网络,由于其采用了许多新技术和独特的设计,低成本、高可靠性、实时性、灵活性、抗干扰能力强等特点,已被广泛应用于各个自动化控制系统中。在汽车电子、自动控制、电力系统等领域,CAN总线具有无可比拟的优越性[1]。

以太网以其通信数据量大、传输速度快、开放性好、成本低等优点,弥补了现场总线通信速率低的缺陷,成为现阶段信息网络应用最广的局域网技术。用以太网直接进入工业控制领域,目前还存在一些问题,以太网的媒体访问方式CSDA/CD不能保证网络传输的确定性和实时性,不能满足工业现场恶劣环境的要求。将以太网引入工业测控领域,通过与现场总线(CAN BUS)分工合作,构成两种异构网络结构,将高效的以太网和低速的现场总线相结合,解决大规模测控系统实时性和可靠性矛盾,提高整个系统的工作效率。两种异构网络的互连,需要用嵌入式网关实现。

CAN/Ethernet网关设计的主要任务是协议转换,要求数据解析正确完整,同时响应迅速、耗时低、实时性和安全性好。基于RISC架构的ARM微处理器指令执行效率高,软件操作平台易于建设,同时具备丰富的外围扩展电路,能满足实时多任务要求。使用ARM技术构造以太网与CAN现场总线协议转换网关是一种高效可行的方案。

1 网关硬件系统组成

网关的主要功能是进行以太网数据报文与CAN数据帧之间的协议转换,实现以太网与CAN总线的互联。系统的硬件组成包括CAN总线接口设计和以太网接口设计,如图1所示。

S3C2410 是Samsung公司推出的一款低价位、低功耗、高性能的32 位RISC 嵌入式处理器。该芯片采用ARM920T内核,5级流水线和哈佛结构,工作频率高达266 MHz,运行速度可达1.1 MIPS。S3C2410 提供了丰富的内部资源,如:SDRAM控制器、LCD 控制器、3 通道的UART、4 通道的DMA、2 个SPI 模块,支持轮询、中断与DMA三种数据发送模式。虽然内部没有CAN 控制器,但可以通过SPI 接口进行扩展,接口电路简单,易于实现[2]。

图1 网关硬件接口原理图

CAN总线接口电路主要采用带SPI接口的独立CAN控制器MCP2510、CAN总线收发器TJA1050、高速光隔6N137和DC/DC电源隔离模块DCR010505等设备组成。独立CAN控制器MCP2510完全支持CAN总线的V 2.0A和V 2.0B 的技术规范。系统设计时,将MCP2510 作为从设备连接到S3C2410 的SPI0 口[3]。TJA1050总线收发器是CAN控制器和物理总线之间的接口芯片,增强了总线的驱动能力。为增强CAN总线节点的抗干扰能力,MCP2510的TXCAN 和RXCON并不直接与TJA1050的TXD和RXD相连,而是通过两片光电耦合器6N137与TJA1050相连,同时光隔芯片的两端电源采用DC/DC模块进行隔离。这样就实现了系统外总线CAN节点间的完全电气隔离,增强了节点的稳定性和安全性。总线两端都接有1个终端电阻(120 Ω)和1个TVS管,以消除反射信号,有效提高系统的抗干扰能力。

以太网接口电路是在S3C2410片上扩展网络接口芯片RTL8019AS,RTL8019AS是台湾REALTEK公司生产的一种基于ISA总线的高度集成的以太网控制器。它实现了以太网媒介访问层(MAC)和物理层(PHY)的全部功能,包括MAC数据帧的收发、地址识别、循环冗余检验(Cyclic Redundancy Check,CRC)编码/校验、曼彻斯特编解码、超时重传、链路完整性测试、信号极性检测与纠正等。RTL8019AS与主处理器有3种接口模式,跳线模式(Jumper),即插即用模式(PnP)和免跳线模式(Jumperless)。系统采用常见的跳线模式来选择I/O端口和中断[4]。

2 协议转换流程

当CAN总线上的设备向Ethernet网发送数据时,嵌入式网关将接收到的CAN数据包解析,提取数据域中的内容;然后按照TCP/IP协议进行封装,嵌入式网关将经过封装的数据发送给以太网控制芯片RTL8019AS。由RTL8019AS自动给这些数据添加以太网物理层和逻辑链路层所需的相关信息,通过物理接口传送到以太网。反之,当以太网向CAN总线上设备发送TCP/IP 数据包时,它首先将数据发送到RTL8019AS,嵌入式网关从RTL8019AS中接收到数据后,提取实际要传送的数据,然后封装成CAN总线数据格式,通过CAN总线将数据发送到网络中的现场设备。

嵌入式网关硬件必须具有以太网接口和CAN 总线接口,而软件要有TCP/IP 协议栈和CAN 总线驱动程序;通常嵌入式Linux 内核中有完整的TCP/IP协议栈。由于REALTEK公司支持Linux的开发,Linux系统中已含有RTL8019AS芯片的通用驱动程序,CAN 总线协议驱动并不是标准配置。因此,设计CAN 总线接口及其编制驱动程序是实现嵌入式网关最主要的工作[5]。

3 CAN驱动程序设计

Linux 驱动程序属于Linux 内核的一部分,是嵌入式系统控制硬件的接口,它为用户屏蔽设备的工作细节,并向用户提供透明访问硬件设备的机制。驱动程序的开发在嵌入式系统开发中具有举足轻重的地位。开发出稳定、完备的驱动程序可提高整个系统的性能。

3.1 CAN驱动程序流程

MCP2510 的内部结构框图如图2所示。MCP2510内含3个发送缓冲器和2个接收缓冲器,同时还具有灵活的中断管理能力。CAN协议机负责与CAN总线的接口,SPI接口逻辑用于实现同MCU 的通信,而寄存、缓冲器组与控制逻辑则用来完成各种方式的设定和操作控制[6]。

图2 MCP2510 内部结构框图

在Linux多任务操作系统中,CAN总线通信程序的设计可分为发送数据模块、接收等待模块和中断处理模块实现。系统中CAN总线的数据发送和接收是两个不同的线程。在驱动程序中建立数据发送和接收缓冲区。中断处理程序只负责填充(或读取)缓冲区中的数据,然后唤醒等待接收(或发送)数据的任务。数据的发送与接收都通过独立的缓冲区,并由中断来实现。操作系统的中断响应时间在软件上决定了CAN总线数据的最快收发速度。

3.2 CAN设备驱动程序的实现要点

3.2.1 CAN设备驱动操作函数

CAN 设备驱动程序最终提供给应用程序的是一个流控制接口,主要包括:open,realse,read,write,ioctl 等操作。添加设备驱动程序,实际上就是给上述操作编写相应的程序代码[7-9]。驱动程序加载到内核时,会首先运行驱动程序的初始化函数,然后等待系统调用在file_operations 数据结构中定义的相关函数,实现对设备的操作。系统使用Linux 2.4.18版本,其文件系统接口被写义为:

static struct file_operations s3c2410_fops = {

owner: THIS_MODULE,

open: s3c2410_mcp2510_open,

read:s3c2410_mcp2510_read,

write: s3c2410_mcp2510_write,

ioctl: s3c2410_mcp2510_ioctl,

release: s3c2410_mcp2510_release,

};

s3c2410_mcp2510_open 负责对将要进行的I/O操作做好必要的准备工作,主要包括限制CAN打开次数、清空3个发送缓冲区和2个接收缓冲区等。

s3c2410_mcp2510_write 将要发送的数据通过SPI 总线将数据传送MCP2510 的发送缓冲器,再通过MCP2510 将数据发送到CAN总线。

s3c2410_mcp2510_read 用于将MCP2510 从CAN 总线上接收到接收缓冲器的数据,通过SPI 总线读到用户区,并返回所读出的字节数。

s3c2410_mcp2510_ioctl 用于控制CAN总线通信的波特率、设置帧ID、设置工作模式、设置设备滤波器等工作。

s3c2410_mcp2510_release 用于释放所占用的内存、中断等资源。

3.2.2 CAN 设备的初始化函数

CAN 设备的初始化函数主要负责创建CAN 设备的节点设备文件、注册CAN 设备的中断处理函数、初始化MCP2510 等工作。

static int _init s3c2410_mcp2510_init(void)

{ …

init_MCP2510(BandRate_250kbps);

ret=register_chrdev(0,DEVICE_NAME,&s3c2410;_fops);

tsMajor=ret;

ret=request_irq(IRQ_MCP2510,s3c2410_isr_mcp2510,SA_INTERRUPT,DEVICE_NAME,s3c2410_isr_mcp2510);

#ifdef CONFIG_DEVFS_FS

devfs_can_dir=devfs_mk_dir(NULL,"can",NULL);

devfs_canraw =devfs_register ( devfs_can_dir,"0",DEVFS_FL_DEFAULT,tsMajor,SPIRAW_MINOR,S_IFCHR|S_IRUSR|S_IWUSR,&s3c2410;_fops,NULL);

#endif

return 0;

}

在Linux系统中,初始化函数从s3c2410_mcp2510_init( )开始。通过调用register_chrdev 向系统注册字符型设备驱动程序;通过devfs_register( )函数创建设备文件系统的CAN设备节点。同时,CAN设备驱动程序通过调用request_irq 函数来申请中断,向系统注册CAN设备的CAN中断处理函数s3c2410_isr_mcp2510( )。在实现了MCP2510的各个接口函数后,还需要编写MCP2510 的模块加载函数module_init( )和模块卸载函数module_exit( ),用于向内核注册设备及注销设备[10]。

3.2.3 驱动程序的加载与使用

Linux设备驱动会以内核模块的形式出现。Ethernet/CAN 网关设备驱动程序作为内核的一部分,应在编译时把设备驱动程序编译成可加载的模块。当使用insmod命令加载内核模块时,模块的加载函数module_init(初始化函数名)会自动被内核执行,将初始化函数加入内核全局初始化函数列表中,在内核初始化时执行驱动的初始化函数,从而完成驱动的初始化和注册,之后驱动便停止等待,被应用程序调用。当用rmmod 命令卸载某内核模块时,模块的卸载函数module_exit(退出处理函数名)也会自动被内核执行,完成与模块加载函数相反的功能。当驱动程序加载到内核中后,就可将CAN设备文件进行open,read,write,release等操作。

4 结 语

随着工业控制系统性能的提高,以太网在工业上的应用也会越来越广泛。在此详细介绍了一种嵌入式网关的设计与实现。作为连接以太网和现场总线的纽带,实现以太网与CAN现场总线之间的协议转换,为CAN/Ethernet的互联提供了一种传输速度快、成本低,稳定性和安全性高的解决方案。同时,利用嵌入式ARM处理器,接口资源丰富,设计通用性强,便于扩展其他现场总线与以太网的互联,具有较好的应用推广价值。

参考文献

[1]李正军.现场总线及其应用技术[M].北京:机械工业出版社,2008.

[2]Samsung Electronics Limited.User′s Manual of S3C2410[Z].2002.

[3]MicroChip Technology Inc.MCP2510 data sheet.2002.

[4]符意德,陆阳.嵌入式系统原理及接口技术[M].北京:清华大学出版社,2007.

[5]罗苑棠,杨宗德.嵌入式Linux应用系统开发实例精讲[M].北京:电子工业出版社,2007.

[6]杨庆华,张景元.单片机和MCP2510 的CAN 总线通信模块设计[J].单片机与嵌入式系统应用,2007(3):35-37.

[7]邵如峰,宋益青.基于ARM9和嵌入式Linux的CAN网关设计[J].微计算机信息,2008(24):15-16.

[8]陈祖爵,周明.嵌入式Linux 下CAN 控制器的驱动程序设计[J].计算机工程与设计,2006(11):4 097-4 100.

[9]刘淼.嵌入式系统接口设计与Linux驱动程序开发[M].北京:北京航空航天大学出版社,2006.

[10]宋宝华.Linux设备驱动开发详解[M].北京:人民邮电出版社,2008.

作者简介 徐 敏 男,1963年出生,福建龙岩人,副教授。主要研究方向为嵌入式技术与智能控制。

猜你喜欢

CAN总线驱动程序
阻止Windows Update更新驱动程序
计算机硬件设备驱动程序分析
论网络通信技术
CAN总线通信技术在电梯监控系统中的应用
基于CANoe的J1939协议在ECU通信中的应用
基于MPC8280的CPU单元与内部总线驱动程序设计
基于WDM的 USB键盘驱动程序开发*
妙用鼠标驱动
驱动程序更新与推荐