ISA总线接口即远程DMA接口,是指主机对RTL8019AS进行控制和操作的总线,本地DMA接口是指RTL8019AS与网线的连接通道,作用是完成控制器和网络线的数据交换。PNP(即插即用)逻辑部分主要是用来解决和PC机的连接问题,BootROM端口作用是解决远程启动问题;EEPROM端口是用来操作RTL8019AS和EEPROM芯片24C64的接口,SRAM用来存放接收和要发送的数据;MAC逻辑完成数据的发送和接收过程中的一些控制;当主机要发送数据时,将一帧数据经过远程DMA信道送到以太网络控制器中的发送缓存内存中,然后发出传送命令,以太网络控制器在送出前一帧的数据后继而完成此帧的发送;接收数据时,串行数据组成字节送到FIFO和CRC,发送逻辑将FIFO送来的字节在发送时脉的控制下逐步按位移出并送到CRC,CRC逻辑在接收时对输入的数据进行CRC校验,将结果与帧尾的CRC比较,如不同该帧数据将被拒收,如相同则送到接收缓冲区中。等到接收缓冲区收满一帧后以中断或缓存器标志的方式通知主处理器把数据读走。
2.2 RTL8019AS的 I/O地址分配
以太网络控制器内建的16KB的SRAM,可划分为接收缓冲区和发送缓冲区两个部分,缓冲区以帧为单位,每页256个字节,16KB的SRAM的页范围规定在0x40—0x80,由PSTART和PSTOP寄存器来设定接收缓冲页的范围,CURR指向接收到的帧的起始页,BNRY指向还未读取的帧之起始页亦即下一帧的页地址,当CURR到达了接收缓冲页的底部即与PSTOP相等时CURR又会自动指到PSTART处,因此这16KB的SRAM是设计成环状缓冲区的,以达到可再使用的目的。
3 硬件描述
整个系统的设计核心是台湾凌阳科技股份有限公司推出的具有总线结构的16位高性能CMOS微处理器,可以进行高速运算、灵活的I/O口控制和高效的数据操作。SPCE061A具有2K字的SRAM和32K字的闪存ROM.与现有的8位微处理器相比,其提供了速度较高的16位x16位乘法运算指令Mul和内积运算指令Muls,加上优化的指令集,SPCE061A的吞吐量大为提高,这使得精简的指令集能够在其中可靠运行。系统硬件电路组成框图如图2所示。
该硬件结构主要包括两部分:1.反映信息家电工作状态的信息采集2.数据经过TCP/IP协议压缩后,通过以太网控制芯片输出到internet,或接收来自internet的控制数据并进行解包。该系统基于IEEE1451.2和TCP/IP协议构建,具有标准化的网络接口,允许与Internet或Ethernet网络进行即时连接,从而实现了家电设备和外部网络的直接通讯,解决了监控设备和通讯网络的接口问题,为实现基于WEB的远程监控提供了底层的硬件互联。
4 单片机控制以太网卡进行数据传输
单片机接入以太网必须嵌入TCP/IP协议,其加载TCP/IP协议控制以太网卡进行数据传输,并通过TCP/IP协议连接到互联网的基本思路是:在远程控制端进行的操作首先通过路由器寻找到目标,再通过网卡的ISA接口传入单片机。在单片机中加载的驱动程序将之转换成物理帧格式,最后由TCP/IP协议将之转换为应用层控制命令。因为单片机内部资源有限,要完成上网任务必须精简TCP/IP协议,本系统中使用了ARP、RARP、IP、UDP等部分协议,即可保证单片机接入以太网,亦保证足够小的代码量。单片机主要完成网络数据的解包和串口数据的打包,当以太网有数据到达该设备,单片机采用查询方式读取网络数据并分析,如果是ARP(物理地址解析协议)数据包,则转入ARP处理程序,并发送RARP数据包,将IP地址和物理地址加入到局域网中建立映射。如果是UDP数据包且IP地址和端口号正确,则接收数据包,数据解包后,将数据部分通过串口输出,控制现场设备。反之,如果现场设备通过串口发送数据到单片机,单片机将数据按照UDP协议格式打包,送入RTL8019AS,由RTL8019AS将数据输出到局域网中。根据需要还可以在收到串口数据时,先完成数据预处理,再将处理好的数据送到局域网。
5软件实现部分
软件设计主要包括:以太网控制器初始化程序、驱动程序、TCP/IP协议栈程序、系统网络配置程序。以太网控制器驱动程序用于设置以太控制芯片的工作状态即工作方式,分配收发数据的缓冲区;系统网络配置程序用于给监测系统分配IP地址及域名。限于篇幅,下面仅给出了采用汇编语言编写的RTL8019AS初始化的部分代码。
.include hardware.inc;//配置单元定义
.public _init //RTL8019AS初始化子程序
_init:
R1=0xffff; //初始化A口为输出
[P_IOA_Attrib]=R1;
[P_IOA_Dir]=R1;
R1=0xfc07; //将IOB0~IOB2,IOB10~IOB15设置为输出,其他为输入
[P_IOB_Attrib]=R1;
[P_IOB_Dir]=R1;