摘 要:本文分析了CAN 总线和以太网的数据传输技术,利用已有的高性能嵌入式ARM7硬件开发平台,研究了CAN 总线网络与以太网互连的实现方案。该网关方案通过对帧的拆分和重组实现帧格式的相互转换,从而实现了以太网和CAN 总线网络互连,最终达到将基于TCP/IP 协议的计算机网络设备与基于CAN 总线协议的底层现场网络设备连通的目标。
关键词:CAN 总线;以太网;网关;协议转换;TCP/IP 协议;嵌入式
1.引言计算机技术和通讯技术的进步促进了网络技术的飞速发展和广泛应用,然而由此带来的信息共享在给人民生活提供巨大方便的同时,也引发了工业控制领域自动化系统体系结构的深刻变革。现在的工业现场控制信息不仅流动于控制层,而且会渗透于工厂自动化的各个层次,这其中也包括与企业信息网以及广域网的融合。现场总线技术代表了控制系统向网络化、全开放、全分散的系统结构的发展方向。其中CAN 总线是目前应用最广泛的一种现场总线,而以以太网(Ethernet)及TCP/IP 协议为代表的信息网络则满足了社会各行业对更广泛的信息交换及共享的需求。将控制网络与信息网络相融合,从而实现全厂乃至全世界范围内的信息共享,已经成为控制领域的热点问题。
在处理器方面,目前在8 位和16 位微控制器平台上运行的TCP/IP 协议栈可以将智能控制设备、仪器仪表等接入以太网,但它仅可完成简单、低速的数据传输,无法满足工业现场的实时性和可靠性要求,尤其是在连接请求较多或控制任务较复杂时,几乎没有实时性可言。
因此,必须采用功能更强、处理速度更快的32 位微处理器,并且运行基于特定应用的嵌入式实时操作系统进行合理的任务调度,才能满足工业现场对实时性和可靠性的要求。本文给出的就是一种基于ARM内核的32 位微控制器LPC2292 和嵌入式操作系统uCOS-II 的CAN总线与以太网互连网关的设计方案。
2.嵌入式网关硬件电路结构及通信协议嵌入式网关是以ARM7 系列微控制器LPC2292 为核心的硬软件系统,它由LPC2292、以太网接口、CAN 现场总线接口、液晶键盘接口、串口和实时时钟等电路组成。ARM 最小系统通过以太网控制器的接口与以太网相连,通过CAN 控制器的接口电路与现场总线相连。
2.1 电路中主要芯片介绍LPC2292 是PHILIPS 公司新推出的一款功能强大、超低功耗、支持实时仿真和跟踪的微控制器。它的内部集成有两路符合CAN2。0B,ISO11898-1 规范标准的CAN 控制器,总线数据波特率均可达1Mbps,可访问32 位的寄存器和RAM,全局验收过滤器可识别几乎所有总线的11 位和29 位标识符作为核心部件,LPC2292 不仅承担主控制器的作用,同时还作为CAN 网络的节点控制器,与网络中的其他节点实现数据传输与交换,最终实现不同协议网络之间的通讯。
CAN 总线耦合器采用ADI 公司推出的新型双通道数字隔离器ADUM1201,它采用的iCoupler 技术是一项专利隔离技术,具有比光电耦合器更高的数据传输速率,同时在同一芯片内提供正向和反向两个通信通道,简化了芯片间的硬件连接线路。MCP2551 是Microchip公司的一种可容错的高速CAN 器件,可作为CAN 协议控制器和系统物理总线的接口。该器件具有差分发送和接收能力,可将许多节点与同一网络相连接。
LPC2292 内部没有集成以太网控制器,所以需要在片外搭建以太网接口电路,此设计中采用DAVI-COM 公司的DM9000A(E)。RJ45 接口采用ST-J0012,内部集成有2 个耦合变压器,可抑制来自介质的共模噪声和干扰。接口自带2 个LED,分别显示链接/活动状态和速度状态(10M/100M),节省了硬件的线路连接。
2.2 CAN 总线通信协议CAN 总线控制器支持4 种不同的CAN 协议帧。
数据帧:携带数据由发送器至接收器;数据帧自一个发送节点携带数据至一个或多个接收节点,数据帧由7 个不同的位场组成,即帧起始、仲裁场、控制场、数据场、CRC 场、应答场和帧结束。
远程帧:通过总线单元发送,以请求发送具有相同标识符的数据帧;激活为数据接收器的站可以借助于传送一个远程帧初始化各自源节点数据的发送。远程帧由6 个不同的位场组成:帧起始、仲裁场、控制场、CRC 场、应答场和帧结束。
出错帧:山检测出总线错误的任何单元发送;出错帧由两个不同场组成,第一个场由来自各帧的错误标志叠加得到,后随的第二个场是出错界定符。
超载帧:用于提供当前的和后续的数据帧的附加延迟。超载帧包括两个位场:超载标志和超载界定符。存在两种导致发送超载标志的超载条件:一个是要求延迟下一个数据帧或远程帧的接收器的内部条件;另一个是在间歇场检测到显性位。
2.3 嵌入式TCP/IP 协议栈TCP/IP 协议栈由网络接口层、网际层、传输层和应用层这4 层构成。传输层实现传输控制协议TCP 和用户数据报协议UDP。
TCP 协议是面向连接的,可靠性高,费用也高;UDP 协议是提供最少服务和费用的传输层协议。系统中没有采用TCP 协议,因为CAN 协议数据报每个数据帧最多为8 个字节,如果采用TCP 传输协议,要传输8 个字节的CAN 协议数据,就要首先通过3 次握手建立连接,再传输数据,之后还要通过握手释放连接,这样传输效率对网络资源要求很高,而对于嵌入式网关,资源有限,为了减轻网关的处理任务和提高网络传输效率,故采用UDP 协议。
然而UDP 协议提供不可靠的传输,对于控制网络来说,是不允许的。因此,本系统采用UDP协议加回传校验机制提高通信的可靠性。应用层实现用户具体的应用,可根据具体应用编写用户协议实现。本系统的应用层实现以太网数据与CAN 总线数据的透明传输。
3.嵌入式uCOS-II 系统原理uCOS-II(Micro Controller Operating System)是专为嵌入式应用设计的开源代码的抢占式实时操作系统,通过了美国航空管理局的认证。它内核小可裁减;可管理最多56 个用户任务;实时性与稳定性高;提供了信号量、邮消息队列等系统服务;系统大部分代码采用C语言编写,便于移植;应用较成熟。uCOS-II 适合小型控制系统,具有执行效率高、占用空间小、实时性优良和可扩展性强等特点,最小内核可编译至2kB。
3.1 uCOS-II 任务管理与调度uCOS-II 可以管理多达64 个任务,其中优先级为0、1、2、3 的4 个任务和优先级最低的4 个连续任务保留。因此,用户可以有多达56 个应用任务。每个任务必须赋以不同的优先级,优先级号越低,任务的优先级越高。一个任务通常是一个无限的循环。
3.2 任务的状态uCOS-II 为用户的任务提供了五种运行状态:休眠态、就绪态、运行态、等待或挂起和中断服务。uCOS-II 采用可剥夺调度策略,任意时刻只有一个任务可以占用处理器,即处于运行态,其它任务处于其它四种状态。各个任务可以在这些状态之间转换。
3.3 uCOS-II 任务通信与同步uCOS-II 提供了信号量、邮箱和消息队列3 种系统服务,用于任务间通信与同步。
(l)信号量信号量由两部分组成:一个是信号量的计数值,它是一个16 位的无符号整数,另一个是由等待该信号量的任务组成的等待任务表。用户要在 OS_CFG。H 中将 OS_SEM_EN开关量常数置成1,这样uCOS-II 才能支持信号量。在建立信号量时将其初始计数值赋值(0~65535)。如果信号量是用来表示一个或者多个事件的发生,那么该信号量的初始值应设为0。
(2)邮箱邮箱是一个任务或者中断服务子程序向另一个任务发送的一个指针型的量,该指针指向一个包含了特定“消息”的数据结构。一个邮箱只能包含一这样的指针(邮箱为满时),或者一个指向NULL 的指针(邮箱为空时)。为了UCOS 一11 中使用邮箱,必须将OS_CFG。H 中的OS_MBOX_EN 常数置为1。
(3)消息队列消息队列是一个任务或者中断服务子程序向另一个任务发送的一个指针型的变量。因具体的应用有所不同,每个指针指向的数据结构变量也有所不同。为了使用ucos-II 的消息队列功能,需要在OS_CFG。H 文件中,将OS_Q_EN 常数设置为1,并且通过常数OS_MAX_QS来决定UCOS-H 支持的最多消息队列数。
4. uCOS-II 系统资源的使用在网关的软件设计中,为了满足信息传输实时高效的原则,引入了信号量、消息队列等信息传输机制。
4.1 信号量机制信号量(semaphore)是一种约定机制:两个或多个任务通过简单的信号进行合作,一个任务可以被迫在某一位置停止,直到它接收到一个特定的信号。在多任务内核中普遍将信号量用于标志某事件的发生、控制共享资源的使用权(满足互斥条件)、使两个任务的行为同步。
本设计中用到的信号量如下:
OSSemTcpRevMsg=OSSemCreate(1);在 TCP 报文接收中断中用于标识TCP 报文的接收;OSSemCANRevMsg=OSSemCreate(1);在 CAN 报文接收中断中用于标识CAN 报文的接收。
当接收报文中断触发后,服务程序将收到的数据保存到一个环形的软件缓冲区,然后将信号量加一,中段服务程序退出后,报文接收任务得到了信号量资源,由等待态转入运行态,然后读取软件缓冲区中的报文数据。
4.2 消息队列通信机制消息队列在初始化的时候,建立一个指定空间大小的数组,这个数组在使用的时候建立了环形缓冲区的概念。运行期间不会被消除,这样就避免了重复建立数组的时候内存空间的泄漏问题。当一个任务向消息队列发送一个信息的时候,相应的指针加1(OSQIn+1),队列满时(OSQEntries=OSQSize),OSQIn 则与OSQOut 指向同一单元。如果在OSQIn 指向的单元内插入新的指向消息的指针,就构成FIFO(first-in-first-out)队列。反之,如果在OSQOut所指向单元的下一个单元插入新的指针,就构成LIFO 队列(last-in-first-out)。
本软件系统建立了两个消息队列:
CommQTcptoCAN=OSQCreate(&CommMsgTcp[0], 10);CommQCANtoTcp=OSQCreate(&CommMsgCAN[0], 10);
4.3 主节点任务层设计本设计选用了uCOS-II 嵌入式操作系统作为软件支持平台。对于算法的选择则从两个方面考虑,在保证稳定性的前提下,选择相对简单,占用CPU 时间少的算法;在稳定性不能保证的情况下,考虑选择周全的算法。只有这样才能使操作系统在一定的配置环境下达到最高的运行效率。
本系统已经将uCOS-II 成功移植到了ARM-LPC2292 芯片上。整个互连系统的软件设计任务主要是处理网关协议转换和CAN 网络的互连通信。LPC2292 芯片主要负责对片内CAN模块和网络芯片8019AS 进行初始化以及CAN 信息报文收发多任务的管理和协议包的转换。
系统任务层主要包括4 个任务:
1. TCP/UDP 协议数据报接收任务TaskTcpRcvMsg(void* pdata);2. TCP/UDP 协议数据报发送任务TaskTcpSedMsg(void* pdata);3. CAN 总线发送数据报任务TaskCANSedMsg(void* pdata);4. CAN 总线接收数据报任务TaskCANRcvMsg(void* pdata)。
每个任务均有3 部分组成:应用程序、任务堆栈及任务控制块。优先权的设置由各任务的执行顺序以及对系统安全性影响的大小决定。其优先权从高到低依次为:CAN 总线接收数据报任务、TCP/UDP 协议数据报接收任务、CAN 总线发送数据报任务、TCP/UDP 协议数据报发送任务。本系统采用静态优先权设置,即运行过程中任务优先权不变。
4.4 网关协议转换流程当 CAN 总线上出现满足网关接收滤波器设置的报文时,CAN 报文被接收,触发CAN硬件接收中断。在中断服务程序中,CAN 报文被写入一个可存放n 条CAN 报文的软件缓冲区,然后置位CAN 报文接收信号量,退出中断[3]。这时, CAN 报文接收任务将得到信号量的使用权,任务由等待态转入运行态,开始从CAN 协议到TCP 协议的转换。转换结束后,将转换好的信息报文通过一个可以存储n 条消息的队列发送出去,转换任务由运行态转入到等待态。这时,TCP 报文发送任务由等待态转为运行态,将信息报文取出,然后封装并发送到以太网上。以太网数据到CAN 数据的转换过程同理。
4.5 嵌入式CAN-以太网协议转换网关软件设计4.5.1 CAN-以太网协议转换模块分析CAN-以太网协议转换软件负责将CAN 协议数据包与以太网协议数据包格式相互转换。
在整个网关的软件协议转换中,主要对IP 源地址, IP 目标地址,以及TCP 数据场的格式进行了相应的协议映射,如图4 所示。源IP 地址由4 B 组成,由于CAN 标识符位数有限,所以标识符仅分配了16 位的ID 映射值(CAN EXTID),如表1 所示。也就是说在IP 协议转换表里,可以静态存储65536 个外部IP 地址,对于一般的大中型现场网络, IP 节点已经足够使用,以后也可以根据需要进行扩展。当网络层信息向CAN 网传输时, 4 B 的源IP 地址转换成相应的CANEXTID 值,反之当CAN 网信息需要传输出去时,经过转换表则转换为相应的源IP 地址值,由于ARM2292 内部集成了双CAN 控制器,所以可连接节点可达到220 个[4]。4 个字节的目标IP 地址对应了8 位的CAN 网内地址(IN_ID)。当网络层信息向CAN网传输时IP 目标地址则转换成8 位的CAN 网ID 值,反之亦然,在TCP 协议信息传输过程中,将TCP 数据分割成相应的短帧格式,以便与CAN 数据报进行转换。数据报的开始用1B 来表示需要传输的短帧数据报的个数。一个完整的短帧数据报包括了5 位保留ID, 4 位DLC, 0~8 B 的数据,这恰好与CAN 的封装格式相对应。
4.5.2 协议转换软件实现在本系统中对CAN 协议进行了分解,物理层合并进CAN 驱动模块,成为uCOS-II 系统底层设备驱动模块的一部分;目标层和传送层组成我们系统中的CAN 协议栈;应用层的设备监控及检测通过系统调用,使用CAN 协议栈的函数来启动目标层和传送层的服务,进而通过CAN 驱动模块启动CAN 通讯模块完成通讯和控制[5]。
CAN 控制器协议转换模块主要由读程序CANRead()、写程序CANWrite()、初始化程序CANInit()、发送程序CANSxdata()和接收程序CANRxdata()组成。
网关软件主程序简述如下:
main(void){
SystemHardwareInitialization();∥系统相关硬件初始化
OSInit();∥操作系统初始化
OSTaskCreat();∥创建TCP/IP 协议的3 个处理任务以及两个协议转换任务
OSStart();∥多任务调度开始}
系统采用uCOS-II 默认的静态优先级抢占式调度策略(用户状态下有效),uCOS-II 应用模块根据需要定制并确定相应的加载方式和优先级。例如,在本文中,实时性要求高的CAN总线模块被赋予较高的优先级。
6.总结本文以 ARM7 为内核的32 位单片机LPC2292 和uCOS-II 操作系统进行设计,整个硬件和软件设计都更为简洁高效。与使用8 位单片机设计的网关相比,运行的效率大为提高。在实际应用中,两类网络之间转换的地址、报文类型等要根据具体情况在应用层定义。本文的创新点是:在该类网关中使用高性能的32 位微控制器,并引入嵌入式实时操作系统;制定了基于源/目的地CAN 报文格式;提高了网关的效能和可维护性能。
参考文献
[1] 孙亮清. 文题[J]船舶集成平台中嵌入式CAN/Ethernet 网关的设计与实现[J]. 微计算机信息,2006(1) : 11-13.
[2] [美]Jean J Labrosse. 嵌入式实时操作系统uCOS-II (第2 版)[M].邵贝贝等译.北京航空航天大学出社,2004:283-316
[3] 吴广霖,白瑞林.基于 uCOS-II 的uCIP 协议栈在ARM 系统中的实现[J].计算机工程与应用,2005(18):99-102
[4] 何轩,夏应清,李祥.基于ARM 微处理器的嵌入式以太网接口[J].电子工程师,2005(1):72-75
[5] 项敏,王学军.嵌入式工业以太网控制方案的研究[J].现代电子技术,2004(6):49-51