单片机89C52P0口的P0~P4脚通过373八位锁存器作为地址线连接RTL8019AS的低5位地址线,RD、WR分别连接读写时序控制脚IORB、 IOWB;P0口作为数据线连接RTL8019AS的低8位数据线。图2中
AT24C512为64KBE2PROM,主要用来保存嵌入式透明SX-52网关的配置信息,如网关IP地址、MAC地址等。这样,可以灵活方便地修改网关参数,适应不同环境,同时也考虑到以后的扩展。
RTL8019AS除与89C52连接外,还将其网络收发器的4根引脚TPOUT+、TPOUT-、TPIN+、TPIN-通过外接的隔离滤波器T1`与以太网相连。采用隔离滤波器T1是为了提高网络通信的抗干扰能力。
以太网通信控制器RTL8019AS可以接收三种地址的数据: 一个是广播地址,一个是多播地址(我们用不上);一个是它自已的地址。
2 软件设计
Internet网上的协议格式有多种,对单片机来说不可能支持太多的协议格式。根据以太网的封装格式的物理传输帧整个系统的软件设计可以分为三部分:CAN总线设备接口通信程序、透明网关协议转换程序和以太网层应用程序设计。
2.1 CAN控制器协议模块
CAN控制器协议转换模块程序主要由寄存器读程序CANRead()、写程序CANWrite()、初始化程序CANInit()、发送程序txdsub()、接收程序rxdsub()程序组成。因为89C52芯片只有I/O端口,因此要编写单独的寄存器读、写子程序。
选用CAN2.0A协议构建CAN总线控制网络,初始化主要完成控制寄存器CR、验收代码寄存器ACR、验收屏蔽寄存器AMR、总线定时寄存器BTR0,1 和输出控制寄存器OCR的设置。初始化完成后,由总调度模块监控控制器。当CAN总线上有数据到达时,它调用接收子程序rxdsub(),把这一帧数据包存入数据缓冲区B中,然后释放接收缓冲器。同样,当有按CAN2.0A协议格式组合成的一帧数据报文在数据缓冲区A中要发送到CAN总线上去时,总调度模块将调CAN发送子程序txdsub()发送。
2.2 以太网控制器协议转换模块
以太网控制器协议转换模块主要负责从UDP数据包中解析出完整CAN协议报文,存入数据缓冲区A。同时,可能将数据缓冲区B中的完整CAN协议报文封装成UDP数据报,然后将其发送到以太网上。
在通信传输层采用UDP协议是考虑到CAN协议数据报为短帧形式(每个数据帧最多为8字节)。如果采用TCP传输协议,要传输8字节CAN协议数据,要先通过3次握手建立连接,再传输数据,之后还要通过握手释放连接。这样传输效率对有限的网络资源来说无疑是一种浪费。而UDP是无连接的传输,可以提高网络传输效率,同时,也减轻网关的处理任务。当然,UDP传输协议是不可靠的,对于控制网络来说,是不允许的。为了提高通信的可靠性,采用了回传校验机制。通过实验测试表明这种方式是行之有效的。
以太网控制器协议转换模块主要由以太网卡驱动、ARP、UDP协议的若干个API函数组成,主要有 NICInit()、NICDMAInit()、NICInitTXFrame()、NICSendTXFrame()、NICReadAgain()、 ARPCheckifis()、ARPSendresponse()、ARPSendStPacket()、ICMPProcPkin()、 UDPAppInit()、IPGenCheckSum()、UDPAppProcPktin()、UDPStartPktout()和 UDPEndPktout()等。所使用的变量有:remoteIP[3:0]、myIP[3:0] 、UDPRxSrcPortMSB、DPRxSxcPortLSB、UDPRxDataLenMSB、UDPRxDataLenLSB、 UDPTxSrcPortMSB、UDPTXSrcPortLSB、UDPTxDestPortMSB、UDPTxDestPortLSB、 UDPTxDataLenMSB、UDPTxDataLenLSB等。
系统首次执行或复位时,以太网控制器协议转换模块将首先调用NICInit ()和UDPAPPInit()等进行NIC、ARP、IP、UDP和应用程序的初始化。初始化完成后,即进入主循环。在主循环中,89C52将反复检测 RTL8019AS是否接收以太网帧。当有数据被接收时,89C52调用NICDMAInit()和NICReadAgain()读入以太网帧首部再调用 ARPCheckIFIs()判断接收帧是否为ARP数据。若是ARP,则转入ARPSendResponse()和ARPSendstPacket() 子程序进行ARP处理并发送响应ARP数据报;若不是ARP,则判断是否为IP数据报。若非IP数据报则清除该以太网帧;当所接收帧包含IP数据报时,则需进一步判断是ICMP数据报还是UPD数据报文。若是ICMP数据报则执行ICMPProcPktIn()子程序处理ICMP数据报并重发IP数据报;若数据为UDP数据报文,则调用UDPProcPktIn()子程序。该程序将读入UDP数据报文首部的数据并进行相应处理,还原出完整的CAN协议数据报文存入数据缓冲区B中,再通知总调度程序,由总调度程序调用CAN总线控制子程序将CAN协议数据报文发往CAN总线。
反过来,当总调度程序通知以太网控制器协议转换模块将数据缓冲区B中准备好的CAN协议数据发送到以太网上时,它将调用NICInitTxFrame()、 udpstartPktOut)、IPGenCheckSum()、IPStartPktout()、NICSendTxFrame()、 UDPEndPktOut()等子函数进行发送处理,从而实现CAN总线到以太网的数据传输。