关键词:CAN总线; 以太网;TCP/IP协议
0 应用背景:
在企业网络集成系统中,车间内部一般采用现场总线,而上层生产管理层采用以太网,两者采用工控机连接。现场总线通过PCI板卡连接到工控机,然后由工控机通过网卡连接到企业的管理层。这种连接方式成本高,开发周期长。针对这些情况,本文提出了一种基于微处理器的嵌入式CAN-以太网网关互连系统的设计方案,成功地实现以太网和CAN现场总线网络的直接数据传输。
1 硬件设计:
硬件的实现方案有多种,对于TCP/IP协议,可以用软件来实现TCP/IP协议栈,也可以直接利用集成TCP/IP协议栈芯片,如W3100A。对于CAN协议,可以使用集成有CAN协议的微处理器如PIC18f258,也可以使用单独的协议芯片如SJA1000。本文采用的是微处理器P89C51RD2,外加CAN控制器SJA1000、CAN收发器P82c250以及网络芯片RTL8019AS,组成协议网关。
CAN网络采用SJA1000独立控制器,它是PHLIPS公司的PCA82C200控制器的替代产品。
以太网协议芯片采用台湾的Realtek公司生产的RTL8019AS,它是以太网控制器芯片,集成了介质访问控制子层(MAC)和物理层的性能,可以方便地设计基于ISA总线的系统,简单的与通用单片机进行接口。另外,它还具有与NE2000兼容、软件移植性好,以及低价格廉等优点 。它提供给微控制器控制以太网的简单接口,使微控制器只需要对其进行相应读写即可完成对以太网的操作。电路中扩展一片62256,用于存储中转的数据,扩展x5045,用于芯片复位及存储网络地址,CAN节点地址等信息。这里仅给出RTL8019AS的硬件连线图。
2 软件设计:
软件设计分为CAN网络的软件设计和TCP/IP的软件设计,以及CAN到以太网通讯的程序设计。
2.1 CAN协议:
CAN协议编程相对简单,只需要对SJA1000相应的寄存器进行读写操作即可。在该模式下,报文识别码为11位,在经过验收滤波器的筛选后,符合条件的报文才能被接收,并存入SJA1000接收缓冲区。识别码值越小,优先级越高。如果总线上出现报文冲突,优先级高的报文选占据总线。CAN节点间每次最多传送的数据为10个字节,以下是SJA1000的接收数据流程图:
2.2 以太网的驱动编写:
RTL8019的操作是比较简单的,驱动程序只需要将要发送的数据按一定的格式写入芯片并启动发送命令,RTL8019会自动把数据包转换成物理帧格式在物理信道上传输。反之,8019收到物理信号后将其还原成数据,按指定格式存放在芯片RAM中以便主机程序取用。简言之就是8019完成数据包和电信号之间的相互转换。以太网协议由芯片硬件自动完成,对程序员透明。驱动程序有3种功能:芯片初始化、收包、发包。
RTL8019AS负责网络上数据的接收和发送,为了能够使其启动并处于准备接收或准备发送数据的状态,必须对相应的寄存器进行初始化,这些寄存器包括CR、DCR、 RBCR、 PSTART、 PSTOP 、ISR、IMR 、PAR0-PAR5、 MAR0-MAR7、 CURR、TCR、RCR等。
Void Intnet()
{
Reg00=0x21; //使芯片处于停止模式,这时进行寄存器设置
Delay_MS(10); //延时10毫秒,确保芯片进入停止模式
page(0);
Reg0a=0x00; //清rbcr0
Reg0b=0x00; //清rbcr1
Reg0c= 0xe0; //RCR,监视模式,不接收数据包
Reg0d= 0xe2; //TCR,loop back模式
Reg01=0x4c;
Reg02=0x80;
Reg03=0x4c;
Reg04=0x40; //TPSR,发送起始页寄存器
Reg07=0xff; //清除所有中断标志位,中断状态寄存器
Reg0f=0x00; //中断屏蔽寄存器清0,禁止中断
Reg0e=0xc8; // 数据配置寄存器,8位dma方式
page(1);
Reg07=0x4d;
Reg08=0x00;
Reg09=0x00;
Reg0a=0x00;
Reg0b=0x00;
Reg0c=0x00;
Reg0d=0x00;
Reg0e=0x00;
Reg0f=0x00;
Reg00=0x22; //这时让芯片开始工作
SetMacID(); //将芯片物理地址写入到MAR寄存器
page(0);
Reg0c=0xcc; //将芯片设置成正常模式,跟外部网络连接
Reg0d=0xe0;
Reg00=0x22; //启动芯片开始工作
Reg07=0xff; //清除所有中断标志位
}
发送数据程序,先将数据按照一定的格式,放入ram中,设定发送数据的起始页地址和发送的长度,然后填写发送命令,芯片会自动的将数据转化为物理帧格式在物理信道上传输。同时发送的结果会写入状态寄存器,可以通过查询该寄存器判断数据是否成功发送出去,以便进行后续处理。主程序通过查询或是接收中断的方式得知有新的数据到来,数据接收到之后,会放到有pstart和pstop两个寄存器所限定的循环列队中。
2.3 TCP/IP协议:
TCP/IP是一个分层的协议,每一层实现一个明确的功能,对应一个或是几个传输协议,每层相对它的下层都作为一个相对独立的数据包来实现。 协议分层结构,如图所示:
图3 以太网数据分用示意图
图是按照TCP/IP协议的四层参考模型而设计的,实际上也是以太网接收数据的流程,同时也体现了一种以太网数据分用的思想。
主机收到以太网的数据帧后,就开始从协议中由数据链路层向上升,同时会被剥离其中各层协议所加的首部,最后只留下用户数据,这部分工作由用户程序来完成。Rtl8019AS仅负责把数据接收进其内部的数据缓冲区。
在编程的时候,使用如下的程序框架
if(以太网数据报到达)
{ if( 以太网首部帧类型==0x0806 )
{ ARP处理程序 }
if( 以太网首部帧类型==0x0805 )
{ RARP处理程序 }
if( 以太网首部帧类型==0x0800 )
{ 根据IP包的协议类型分别区分是TCP包还是UDP包}
}
发送数据时要对数据进行逐层封装,即加上相应的首部,作为所经过每层的标识。具体原理是将用户数据加上本层的标志,然后发往协议的下一层,然后加上下一层的协议标志,继续向下传,这样依次向下传,到最后可以得到所传送的真正数据。
根据以上的介绍,在接收的过程中体现数据分用的思想,自以太网数据发送的过程中体现数据封装的思想。
2.4 CAN与以太网的数据交换:
数据交换原理简单说就是对以太网收到的数据进行分层。取出TCP中的数据,校验分析,然后按照CAN模式进行发送。反过来,当接收到CAN网络的数据后,除去地址和个数等信息,将其余数据按照TCP/IP协议进行封装发送。进入由CAN接收数据引起外部中断后,将数据存入缓冲区,并根据自己定义的协议判断是否是最后一帧,如果不是,则保存数据,退出中断,否则,关闭其他中断,调用以太网发送子程序,将数据发向以太网。进入由以太网引起得中断后,取出其中TCP中的有效数据,并分析,如果需要发送,关闭其他的中断,将数据打包,调用CAN发送子程序。同时也可以通过命令,重新设置该模块的IP地址,或是该模块CAN节点号等。
3 结论:
由于CAN总线每次只能传输8个有效地字节,为了有效的和以太网通讯,我们在CAN网络使用了自己定义的协议。同时,为了实现设定IP或是更改节点号等功能,我们在基于TCP协议的应用层,也定义了自己的协议。通过该模块实现了CAN与以太网的基本的数据交换。经过测试,取得的良好的效果。随着分布式测控系统的优势凸现,CAN/TCP嵌入式网关在实际中的应用也会越来越广泛。
参考文献:
[1] 基于嵌入式web服务器的UPS监测系统 微计算机信息 2005年13期
[2]RTL8019AS datasheet , http://www.realtek.com.cn