Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2320314
  • 博文数量: 318
  • 博客积分: 8752
  • 博客等级: 中将
  • 技术积分: 4944
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-23 07:56
文章分类

全部博文(318)

文章存档

2019年(1)

2017年(2)

2016年(12)

2015年(2)

2014年(1)

2013年(17)

2012年(22)

2011年(9)

2010年(37)

2009年(33)

2008年(44)

2007年(43)

2006年(95)

分类:

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程序存于BROMFlash种。在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,就会导致网卡芯片死机。另外,有时一些无法识别的包或没有对该包作出应答包时,ISRRST位也会置1,导致8019死机。原因不祥。所以最好在每次中断服务程序的结束处对ISRRST位清零。

18H1FH8个地址,为复位端口。对该端口地址的读或者写入任何数,都会引起网卡的复位。

 

让人遗憾的是,勤研电子的板子,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

 

 

 

   16kSRAM地址:0x40000x7fff,对应页地址:0x400x7f(每页256B),其地址与IO(寄存器)、EEPROMBROM的地址是分开的,具体的我也不清楚。  

8019有两个DMALocal DMARemote DMA,分别位于双端口SRAM的两边,64SRAM分为两步分:58页的Rx buffer6页的Tx buffer6页为1536Byte,恰可容那一个TxRxNIC以太帧,其最大长度为1500B)。Local DMA完成NICSRAM的数据传输,它是8019自动完成的,无需Host干预;Remot DMA完成SRAMHost RAM的数据传送,需要host干预,即通过相关的有关传输数据起始、长度的寄存器的设定,并通过Readwrite等命令(位于CR寄存器)来完成传输。16KSRAM不能直接寻址,只有通过0x100x1f的寄存器来实现数据传输。主机设置好远端DMA开始地址(RSAR0,1)和远端DMA数据字节数 (RBCR0,1),并在CR中设置读/写,就可以从远端DMA口寄存器里读出芯片RAM里的数据/把数据写入芯片RAM

 

    接收缓冲区构成一个循环FIFO队列,PSTARTPSTOP两个寄存器限定了循环队列的开始和结束页,CURR为写入指针,受芯片控制,BNRY为读出指针,由主机程序控制。根据CURR==BNRY+1?可以判断是否收到新的数据包,新收到的数据包按Rx NIC格式存于以CURR指出的地址为首址的RAM中。当CURR==BNRY时芯片停止接收数据包。

注意:很多时候一个网间通信连接(一对通信进程)往往使用不同的端口号,如TFTP的目标端口号:69,但源端口号可以不是(本程序是1124)。

 

网络字节顺序。其独立于两端的主机的字节顺序。ARMWindows均使用little Endian格式;SUN则使用big endian格式。“互联网联网标准”要求采用“网络字节顺序”为Big Endian。对于4Byte的字和2Byte 的半字在通信协议程序实现的两端都必须进行字节顺序的转换,否则协议无法识别。对于以Byte为单位的数据则无所谓。本程序使用函数:Swap_Word()Swap_HalfWord()来实现顺序转换功能。转换是可逆的。 

校验和的计算

IP头部的校验和计算:16字节对齐,check0,对每个16位二进制数反码求和(也可先求和再取反,只是要注意16位溢出后的处理,见CheckSum()函数),结果放在check字段中;接收时对头部再进行相同的计算,结果应为全1,否则IP头出错。注意在上述算法中,IP头时网络字节顺序。

UDP头部的校验和计算:不仅包含了UDP头,还有一个12Bytes的伪头部,包含一些IP包的信息(见NetConfig.h中的定义)。UDP头中的check字段式两步分校验和之和,算法依然是反码求和。接收时对头部再进行相同的计算,结果应为全1,否则UDP头出错。另外,UDP的校验和是个可选项,也可以不进行校验和计算,此时check0;接收时也应该做相应的判断。

TCP头部的校验和计算:和UDP头的计算完全相同,也需要一个12Bytes的伪头部。有点区别是TCP头部计算是个强制项,不能设伪零。

 

本程序的功能:实现IP层管理(即用ICMP)的ping命令的支持;实现简单文件传输(TFTP)。TCP/IP协议处理流程图如下:

 

TCP/IP协议栈设计

    C中用struct定义各协议的枕头和分组,详细的设计参见NetConfig.h文件;

    Host RAM中开辟一个以太分组的Buffer(能容纳一个以太分组就可以了);

    分组封装:高层—>四层—>三层—>二层(以太)—>NIC,解包反之,使用指针通过共享存储空间来实现参数传递;

 

ARP分组格式

协议类型:ARP0x0806IP0x0800 

 

IP分组格式

IP头采用标准的20Byte结构;

TOS通常不使用,即置零;

16位的标志用于区分不同的IP包,从1计数至65536,循环往复;

IP包通常不进行分片,16位偏移置零,IP分组长度不大于以太帧最大长度就可以了(1500Byte);

TTL通常设为128

8位协议:ICMP:1 TCP:6 UDP:17

阅读(1636) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~