分类:
2007-03-08 16:31:17
以太网接口芯片的设置
RTL8019AS的三种工作模式:
跳线模式:这种模式与早期的网络控制器兼容。RTL8019AS的端口基地址、中断口等都
由开关或跳线器(或者由CPU的通用IO口模拟跳线器)决定。跳线模式简单,但配置资源麻烦。
PnP模式:与微软的PnP协议兼容(play and plug),适于PC机模式。在这种模式下,RTL8019AS的端口基地址、中断口等都由EEPROM93C46设定,但需要进行PnP芯片的识别,不便与DSP接口。
RT模式:为了避免PnP模式下的PnP芯片识别和配置过程,readlted公司提供RT模式。
Boot程序存于BROM或Flash种。在RT模式下,RTL8019AS的端口基地址、中断口等也是由EEPROM93C46决定的。将SMEMR和SMEMW引脚接高电平,屏蔽了远程自举加载功能。
事实上,在嵌入式系统设计中,RTL8019AS固定于嵌入板上,而且单片机可以很方便的对其初始化和各种控制,因此可以使用跳线模式,但不用跳线器,也不用通用IO来模拟,直接把控制字写入各配置寄存器就可以了,如PAR,CONFIG等。当然config可以不设置,按默认就可以了:
IO起始地址:0x300(即范围:0x300~0x31f)
中断:int0
接口选择:10baseT
寄存器表(通过CR中的ps0,1来确定页:这种安排太对调试太恶劣了!!)
初始化时必须设置号RCR TCR DCR三个有关接收、传输、数据格式的寄存器。ISR和IMR实现中断功能。
注意:ISR寄存器不只和中断有关,当接收缓冲溢出时,如果不清ISR(写入FFH),芯片将一直停止接收。在流量较大时溢出经常发生,此时不清ISR,就会导致网卡芯片死机。另外,有时一些无法识别的包或没有对该包作出应答包时,ISR的RST位也会置1,导致8019死机。原因不祥。所以最好在每次中断服务程序的结束处对ISR的RST位清零。
18H-1FH共8个地址,为复位端口。对该端口地址的读或者写入任何数,都会引起网卡的复位。
让人遗憾的是,勤研电子的板子,8019与ARM的地址连线错:8019A0—ARMA1,导致8019中的这些8位寄存器无法正常寻址,解决办法是用16位地址模拟,CR的地址:0x300,CLDA0:0x302,…,CNTR2:0x31e。这样写入是正确的,但在AXD中从0x06000300中读出的数页必须按16位理解,即奇数地址忽略掉。
以太网帧格式:
PR 同步位 用于收发双方的时钟同步 同时也指明了传输的速率 10M和100M 的时钟频率不一样 所以100M 网卡可以兼容10M 网卡 是56 位的二进制数101010101010.....
SD: 分隔位,表示下面跟着的是真正的数据,而不是同步时钟,为8位的10101011,跟同步位不同的是最后2位是11而不是10.
DA:目的地址,以太网的地址为48位(6个字节)二进制地址,表明该帧传输给哪个网卡.如果为FFFFFFFFFFFF,则是广播地址,广播地址的数据可以被任何网卡接收到.
SA:源地址,48 位,表明该帧的数据是哪个网卡发的,即发送端的网卡地址,同样是6个字节.
TYPE 类型字段 表明该帧的数据是什么类型的数据 不同的协议的类型字段不同 如 0800H 表示数据为IP 包 0806H 表示数据为ARP包 814CH 是SNMP包,8137H 为IPX/SPX 包 小于0600H 的值是用于IEEE802 的 表示数据包的长度
DATA 数据段 该段数据不能超过1500 字节 因为以太网规定整个传输包的最大长度不能超过1514字节 14 字节为DA SA TYPE
RTL8019AS是ISA总线式网卡,速率为10M。
NIC帧格式(位于16KSRAM种的接受和待发送的帧结构)
值得注意的是,收到的数据包格式并不是802.3帧的真子集,而是如下图所示。明显地,8019自动添加了“接收状态、下一页指针、以太网帧长度(以字节为单位)”三个数据成员(共4字节)。这些数据成员的引入方便了驱动程序的设计,体现了软硬件互相配合协同工作的设计思路。当然,发送数据包的格式是802.3帧的真子集,如图3所示。
RTL8019AS接收帧结构,不为Enthernet的真子集 | ||||||||
接收状态 |
下一页指针 |
以太网帧长度 |
目的IP地址DA |
源IP地址SA |
类型TYPE |
数据域DATA |
填充PAD |
校验CRC |
8bits |
8bits |
16bits |
48bits |
48bits |
16bits |
<=1500B |
可选 |
32bits |
RTL8019AS发送帧结构,为Enthernet的真子集 | ||||||||
以太网帧长度 |
目的IP地址DA |
源IP地址SA |
类型TYPE |
数据域DATA |
填充PAD |
校验CRC |
|
|
16bits |
48bits |
48bits |
16bits |
<=1500B |
可选 |
32bits |
|
|
16k的SRAM地址:0x4000~0x7fff,对应页地址:0x40~0x7f(每页256B),其地址与IO(寄存器)、EEPROM、BROM的地址是分开的,具体的我也不清楚。
8019有两个DMA:Local DMA和Remote DMA,分别位于双端口SRAM的两边,64页SRAM分为两步分:58页的Rx buffer和6页的Tx buffer(6页为1536Byte,恰可容那一个Tx或Rx的NIC以太帧,其最大长度为1500B)。Local DMA完成NIC到SRAM的数据传输,它是8019自动完成的,无需Host干预;Remot DMA完成SRAM到Host RAM的数据传送,需要host干预,即通过相关的有关传输数据起始、长度的寄存器的设定,并通过Read、write等命令(位于CR寄存器)来完成传输。16KSRAM不能直接寻址,只有通过0x10~0x1f的寄存器来实现数据传输。主机设置好远端DMA开始地址(RSAR0,1)和远端DMA数据字节数 (RBCR0,1),并在CR中设置读/写,就可以从远端DMA口寄存器里读出芯片RAM里的数据/把数据写入芯片RAM。
接收缓冲区构成一个循环FIFO队列,PSTART、PSTOP两个寄存器限定了循环队列的开始和结束页,CURR为写入指针,受芯片控制,BNRY为读出指针,由主机程序控制。根据CURR==BNRY+1?可以判断是否收到新的数据包,新收到的数据包按Rx NIC格式存于以CURR指出的地址为首址的RAM中。当CURR==BNRY时芯片停止接收数据包。
注意:很多时候一个网间通信连接(一对通信进程)往往使用不同的端口号,如TFTP的目标端口号:69,但源端口号可以不是(本程序是1124)。
网络字节顺序。其独立于两端的主机的字节顺序。ARM、Windows均使用little Endian格式;SUN则使用big endian格式。“互联网联网标准”要求采用“网络字节顺序”为Big Endian。对于4Byte的字和2Byte 的半字在通信协议程序实现的两端都必须进行字节顺序的转换,否则协议无法识别。对于以Byte为单位的数据则无所谓。本程序使用函数:Swap_Word()和Swap_HalfWord()来实现顺序转换功能。转换是可逆的。
校验和的计算。
IP头部的校验和计算:16字节对齐,check=0,对每个16位二进制数反码求和(也可先求和再取反,只是要注意16位溢出后的处理,见CheckSum()函数),结果放在check字段中;接收时对头部再进行相同的计算,结果应为全1,否则IP头出错。注意在上述算法中,IP头时网络字节顺序。
UDP头部的校验和计算:不仅包含了UDP头,还有一个12Bytes的伪头部,包含一些IP包的信息(见NetConfig.h中的定义)。UDP头中的check字段式两步分校验和之和,算法依然是反码求和。接收时对头部再进行相同的计算,结果应为全1,否则UDP头出错。另外,UDP的校验和是个可选项,也可以不进行校验和计算,此时check=0;接收时也应该做相应的判断。
TCP头部的校验和计算:和UDP头的计算完全相同,也需要一个12Bytes的伪头部。有点区别是TCP头部计算是个强制项,不能设伪零。
本程序的功能:实现IP层管理(即用ICMP)的ping命令的支持;实现简单文件传输(TFTP)。TCP/IP协议处理流程图如下:
TCP/IP协议栈设计
在C中用struct定义各协议的枕头和分组,详细的设计参见NetConfig.h文件;
在Host RAM中开辟一个以太分组的Buffer(能容纳一个以太分组就可以了);
分组封装:高层—>四层—>三层—>二层(以太)—>NIC,解包反之,使用指针通过共享存储空间来实现参数传递;
ARP分组格式:
协议类型:ARP:0x0806,IP:0x0800;
IP分组格式:
IP头采用标准的20Byte结构;
TOS通常不使用,即置零;
16位的标志用于区分不同的IP包,从1计数至65536,循环往复;
IP包通常不进行分片,16位偏移置零,IP分组长度不大于以太帧最大长度就可以了(1500Byte);
TTL通常设为128;
8位协议:ICMP:1 TCP:6 UDP:17;