《2022年网络芯片的驱动实用 .pdf》由会员分享,可在线阅读,更多相关《2022年网络芯片的驱动实用 .pdf(19页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、1第三章网络芯片的驱动从最底层驱动来看,单片机是怎么从物理线路上接收到数据?接收的又是什么样的数据?通过对本章以太网帧管理和网络芯片驱动的介绍,可以了解数据是怎样上送和下发的,从而了解物理层和数据链路层的工作原理。31 以太网的帧结构现在是网络时代, 大家都喜欢在网上冲冲浪。 但电脑能上网的前提条件是电脑硬件中必须有网卡,如板载网卡、独立网卡、或无线网卡等。网卡是电脑与网络相互连接的必需设备。单片机要上网, 无疑也需要一个网卡。 网卡的功能主要有: 一是将需要发送的数据封装成物理传输帧,并通过网线(或电磁波 )发送到网络上去;二是识别和接收网络上其它设备传过来的物理传输帧,并组合成数据提供给本
2、机CPU。网线中传输的是电信号, 因此网卡具备将数据转化为电信号发出去,并将网线上的电信号解析成数据的功能。 同时,要想电信号都能被其它网卡解析和接收,网卡必须满足网络传输规定的机械和电气规范。从 TCP/IP 的协议分层的结构上看,网卡至少完成物理层的功能。但为了方便控制器的使用, 现在的网卡还将数据链路层的功能集成到芯片中。网卡能起到过滤作用,只接受广播帧/组播帧或专门发往本机物理地址的数据帧,对本网络上的其余帧不予理会。 网卡接收到一帧完整的数据后, 就可以将数据交给网络层处理。对于使用网卡的开发者来说, 对网卡的物理结构, 硬件检测机制和冲突退避算法不需深究, 主要要了解下相应的物理传
3、输帧结构。根据组建的网络类型不同(如以太网,令牌环网等)和使用的底层网络协议不同,帧结构也不相同。就常用的以太网来说, 也有 Ethernet_II, IEEE 802.3, IEEE 802.2 等协议。我们以 IEEE 802.3 数据帧来分析数据链路层和网卡的工作内容。IEEE 802.3 是电气和电子工程师协会 (IEEE) 制定的一种描述物理层和数据链路层的实现方法的网络协议,主题是在多种物理媒体上以多种速率采用CSMA/CD 访问方式。其规定的帧结构如下:表 31 以太网( 802.3)帧结构PRSDDASALENGTH/TYPEDATAPADFCS56 位 8 位 48 位 48
4、 位 16 位 n 1500(字节)可选 32 位 表一以太网( 802.3)帧结构FR(前导码):包括了 7 个字节的二进制 “1”、“0”间隔的代码,即 101010共 56 位。当帧在链路上传输时,接收方就能建立起同步,因为这种“1”、“0”间隔的传输波形为一个周期性方波。同时也指明了传输的速率 (10M 和 100M 的方波频率不一样,所以100M 网卡可以兼容 10M 网卡) 。SD(帧数据定界符):它是长度为 1 个字节的 10101011二进制序列,此码表示表示下面跟着的是真正的数据。DA(目的地址):目的以太网的物理地址,由48 位二进制组成 (6 个字节 ),说明该帧传输给哪
5、个网卡。如果地址为FFFFFFFFFFFF(广播地址),则该网络名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1 页,共 19 页 - - - - - - - - - 2上的所有网卡都能接收到本帧数据。这个地址和下面的SA 就是我们常说的网卡的 MAC 地址。具体信息我们待会介绍。SA(源地址):48位,说明该帧的数据是哪个网卡发的,即发送端的网卡物理地址( MAC ) 。LENGTH/TYPE(长度 /数据类型): 指示后面的数据属于什么类型。 如 0800H 表示数据为 IP
6、包,0806H 表示数据为 ARP 包。这样,交给网络层后就可以由相应的协议对后面的数据解析。如果这个字段小于0600H 的值,则表示数据包的长度,在单片机的网络编程中不考虑这种用法。DATA(数据段):由网络层负责发送和解析的数据,因为以太网帧传输的数据包最小不能小于64 字节,最大不能超过 1518字节。除去 14 字节为 DA、SA、TYPE 以及 4 字节的 FCS,DATA 不能超过 1500 字节。如果不够 46(6418)字节,余下的由 PAD 填充。PAD(填充位):当 DATA 的数据不足 46 字节时,缺少的字节需要补上(可补任意值)。FCS(帧校验序列):由 32 位(4
7、 字节)循环冗余校检码( CRC)组成,其校验范围不包括前导码FR 及帧数据定界符 SD。此序列由发送端网卡自动生成,自动填充到帧的最后。一般情况下,接收端网卡对收到的数据校验后也不会将FCS放到数据中上报。由于网卡的自动管理,并且前导码FR 和帧数据定界符 SD 的值是固定的,也由网卡自动生成和插入。 所以,网络层向网卡发送的数据或者网络层接收到的数据一般是由 DA、SA、TYPE 和 DATA 组成( DATA 不足 46 字节需要用 PAD补齐) 。如表二。假如网络层的一个IP 包要发送出去,首先要填充接收网卡的地址和本网卡的地址 (MAC 地址) ,同时将 TYPE 填充成 0800H
8、,紧跟着就是发送的数据。网卡获取到这些数据后会组成物理传输帧发送出去。表 32 网络层管理的帧结构DASATYPEDATAPAD48 位 48 位 16 位 n 1500(字节) 可选 由以太网的帧结构知道,在数据链路层就需要使用MAC 地址(即物理地址)进行通讯, MAC 地址是数据的第一道关卡,由硬件自动识别来接收。因此,MAC 地址就像是是网络设备的“身份证”一样,需要具有全球唯一性。我们在实验室里做测试,可以修改MAC 地址,但也应该保证本地网络里MAC 的唯一性。以太网的 MAC 地址由 48bit (6 字节)组成,如 08:02:10:3A:85:23 就是一个MAC 地址。前
9、24 位(08:02:10)是由生产网卡的厂商向IEEE 申请的厂商地址,后 24 位(3A:85:23)是由厂家自己分配。每个厂商必须确保它所制造的每个以太网设备都具有相同的前三个字节以及不同的后三个字节,这样就可保证世界上每个以太网设备都具有唯一的MAC 地址。网卡的 MAC 地址通常是由生产厂家烧入网卡的 EPROM 中(NE2000系列网卡常用 93C46,在网卡上可以找到)。MAC 地址又可以分成 3 类:(1)广播地址:只能用作目的地址。如果一个以太网帧的目的地址是广播名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - -
10、名师精心整理 - - - - - - - 第 2 页,共 19 页 - - - - - - - - - 3地址,则网络中的所有设备都能接收和处理该帧。广播地址的每一位都是1,即:FF:FF:FF:FF:FF:FF。(2)组播地址: 也只能用作目的地址。 如果一个帧的目的地址是组播地址,那么网络中预先定义的一组设备都能接收并处理该设备。以太网网 MAC 的最高有效字节的最低位为1 表示以太网帧是组播帧。如01:03:52:3A:85:23 就是组播地址。 101 的最低位为 1。(3)单机地址:除了广播和组播的地址就是单机地址,非广播和组播数据包就要与这个地址匹配了才能被接收和处理。32 以太网
11、的芯片RTL8019 介绍及编程网卡主要由网络芯片、数据汞、总线插槽接口、EEPROM、晶振、 RJ45 接口、 指示灯、固定片等器件等组成, 其核心是网络芯片。这节我们重点介绍Realtek公司生产 RTL8019AS 芯片,看看它是怎样实现上节提到的以太网的帧结构的。图 31 RTL8019 硬件电路图3.2.1RTL8019 的工作方式及与单片机的接口RTL8019 是 NE2000 系列中一种, 因此其它 NE2000 系列网卡编程思路也相符合的。 (NE2000 是一个由 Novell 公司所创立并且被业界广泛采用的网络卡的标准,大多数ISA 网卡都与 NE2000 兼容,如 Nat
12、 Semi 的 DP83902,Davicom的 DM9008 ,NSI 的 DP8390 ,MXIC 的 MX98905 等) 。RTL8019 是 10M 网卡芯片。RTL8019 有 3 种工作方式:(1)跳线方式,网卡的i/o 和中断由跳线决定。(2)免跳线方式,网卡的 i/o 和中断由外接的 93c46里的内容决定。(3)即插即名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 19 页 - - - - - - - - - 4用方式,由软件进行自动配置plug an
13、d play(PnP) 。电脑上常使用即插即用方式方式,单片机不予考虑。 对免跳线方式, 需要在芯片外部接EEPROM 93c46 (很多电脑用的网卡上能找到这芯片,大家有兴趣可以看下),用来保存网卡的MAC地址等参数,同时,需要单片机操作RTL8019 来控制 93c46 的读写,不仅费钱还费力,一般也不采用。参数保存可放在单片机自身的EEPROM 里,上电后写入网卡芯片就可以了。因此,单片机比较适合使用跳线方式。怎么才能让 RTL8019 工作在跳线方式下呢?这个由JP管脚(第 65 脚)决定。当 JP管脚为低电平时, RTL8019 工作在即插即用方式或免跳线方式,高电平时处于跳线方式。
14、因此,我们将JP管脚接高电平( VCC) ,使用跳线方式,网卡的 I/O 和中断就不是由 93C46的内容决定而是由跳线决定。 主要使用的跳线如下:IOS3,IOS2,IOS1,IOS0 管脚(第 85,84,82,81 脚)决定了芯片的I/O地址。如下图,我们将IS03-IO0 都悬空(内部下拉,即都为0) ,则芯片 I/O 的起始地址是 300H。芯片的中断线由 IRQS2,IRQS1,IRQS0 管脚(第 80,79,78 脚)决定。我们可以使用默认配置, 并将网卡的中断 9,接到单片机的中断INT0(P3.2)上。名师资料总结 - - -精品资料欢迎下载 - - - - - - - -
15、 - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 19 页 - - - - - - - - - 5芯片的 BTRM 地址由 BS4,BS3,BS2,BS1管脚(第 72,71,69,68,67)决定, BTRM 在电脑里用来做无盘工作站的时候用到,这样可以从网卡进行引导,而需要从硬盘的 c 盘等引导系统。由于单片机里不需要使用,可以不管。AUI 管脚(第 64 脚) ,该管脚决定使用 AUI 还是 BNC 接口。高电平时使用AUI 接口,悬空(为内部下拉的低电平)时使用BNC 接口。网卡的接口一般是BNC 的可以支持 8 线双绞或同轴电缆。因此
16、将该引脚悬空即可。网络媒体类型由 PL0,PL1(第 74,77脚)决定。PL1 PL0 网络媒体类型0 0 TP/CX 自动检测( 10BaseT 链环测试时激活的)0 1 10BASET 链 环 测 试 是 不 可 用的。1 0 10BASE5 1 1 10BASE2 其它重要管脚的连线:所有 GND 管脚接地, VCC 管脚接 5V 的电源。RSTDRV(第 33 脚):用来复位网卡,我们一般将它连到单片机的管脚上,用来快速复位 RTL8019,这个管脚拉高复位持续时间至少2ms,建议拉高 100ms左右再拉低来达到复位效果。IOCS16B 管脚(第 96 脚)是 16 位/8 位数据位
17、的选择脚。如果这个管脚下拉,则选择 8 位模式,如果这个管脚接高电平,将选择16 位的模式。由于单片机是 8 位的数据总线,因此这个管脚需要下拉。IOWB(第 30 脚) , IORB (第 29 脚)接到单片机的 P3.6,P3.7 (/WR , /RD) ,用来控制读写时序。X1 和 X2(第 50,51 脚)用来接 20M 的晶振。 TPIN+,TPIN-管脚( 59,58)和 HD,LD 管脚( 45,46)都接隔离变压器上,通过RJ45接口与网络相连。由于使用 8 位数据位, SD0 SD7 管脚接到单片机的P0.0p0.7管脚,SD8SD15不需要使用。SA0 SA19 为网卡的地
18、址线,共 20根, 这个需要怎么接呢?前面说过, IOS3,IOS2,IOS1,IOS0 管脚决定了芯片的I/O 地址。假如将 IS03-IO0 都悬空(内部下拉,即都为 0) ,则芯片 I/O 的起始地址是 300H。从 RTL8019 的芯片手册中知道,I/O 访问的寄存器只有32个,在后面会介绍这些寄存器。 即需要直接访问的网卡寄存器是 300H31FH。将它转化为二进制的地址线的电平就很直观了。如下表。地址线A19 A18 A17 A16 A15 A14A13 A12A11 A10 A9 A8A7 A6 A5 A4 A3 A2 A1 A0300H 0 0 0 0 0 0 0 0 0 0
19、 1 1 0 0 0 0 0 0 0 0 . 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 X X XXX31FH 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 1 1 1 1 从表中知道, SA19SA10,SA7SA6 固定接低电平(地),SA9-SA8 固定接高电平(VCC) 。 只要控制 SA4SA0 就可以访问到 300H 到 31FH 的 32 个寄存器。于是,我们将这 5 根地址线接到单片机的P0.4P0.1上。为了采用外部地址访问,将 P2口的 p2.7 接到 RTL8019 的片选 CS 上。这样,如果单片机访问8000H名师资料总结 - -
20、-精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 5 页,共 19 页 - - - - - - - - - 6地址就相当于访问 RTL8019 的 300H了, 访问 801FH 地址就相当于访问 RTL8019的 31FH。地址映射关系为:单片机地址端口P2,P0 网卡(I/O) 10000000 00000000(8000H) 300H 10000000 000XXXXX 3XXH 10000000 00011111(801FH) 31FH 程序里对寄存器使用如下定义来访问:#include /* 定义
21、了 XBYTE :#define XBYTE (unsigned char volatile xdata *) 0) */ #define reg00 XBYTE0 x8000 /* 300H*/ #define reg01 XBYTE0 x8001 /* 301H*/ #define reg02 XBYTE0 x8002 #define reg03 XBYTE0 x8003 #define reg04 XBYTE0 x8004 #define reg05 XBYTE0 x8005 #define reg06 XBYTE0 x8006 #define reg07 XBYTE0 x8007 #d
22、efine reg08 XBYTE0 x8008 #define reg09 XBYTE0 x8009 #define reg0a XBYTE0 x800a #define reg0b XBYTE0 x800b #define reg0c XBYTE0 x800c #define reg0d XBYTE0 x800d #define reg0e XBYTE0 x800e #define reg0f XBYTE0 x800f #define reg10 XBYTE0 x8010 #define reg18 XBYTE0 x8018 #define reg1c XBYTE0 x801c /* 31
23、cH*/ #define reg1f XBYTE0 x801f /* 31fH*/ 单片机通过地址线访问的RTL8019 寄存器也就是以上32 个寄存器。但RTL8019 内部的空间不仅仅是这32 个寄存器,它还有 256 字节的 PROM 和 16K字节的 RAM BUFFER 。如下图。 PROM 内容是网卡复位时从93c46里读出来的部分参数和配置。由于单片机使用跳线方式,不接93C46,所以这段空间不用关注。 RAM BUFFER 用来存放需要网口发送出去的数据和网卡自动接收到的数据。相当于以太网帧的缓存。 单片机对这段缓存的操作并不需要按地址去访问,而是通过前面的 32 个寄存器间接
24、读取。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 6 页,共 19 页 - - - - - - - - - 7图 32 RTL8019 RAM BUFFER 结构RAM BUFFER 空间以页为存储单位, 每 256 字节为一页。如 4000H 到 40FFH为一页,我们称之为第 40 页。从 40 页到 7F 页共有 64页。以页为单位要怎么使用呢?打个比方,我们把4600H7FFFH 的地址作为接收缓存,当网卡收到64字节的一帧数据时,存放在4600H 开始的页上,再收到28
25、0字节的一帧数据时,并不接着 4664 地址放,而是放在4700 开始的页,占用两页空间。具体对RAM BUFFER 的操作在网卡数据收发时描述。3.2.2RTL8019 的寄存器介绍从上节知道,能通过地址线访问RTL8019的寄存器共有 32 个,每个寄存器是 8bit (1 字节)结构。其中reg00reg0f共 16 个寄存器为通用寄存器,reg10reg17 共 8 个寄存器为远程DMA 数据读写寄存器, 对 8 位数据位的单片机来说,只需用到 reg10,用来对 RAM BUFFER里数据的获取和写入。reg18reg1f共 8 个寄存器为复位寄存器, 只要对其中偶数地址的寄存器读或
26、者写,就会复位网卡,我们称为热复位网卡(使用RSTDRV 管脚复位称为冷复位,一般使用冷复位就行了)。对单片机来说,也只需使用reg18。 下面重点介绍reg00reg0f寄存器。RTL8019通用寄存器有四页(page ),也就是说 reg00reg0f处在不同页的话含义可能不一样,当寄存器处在第一页和第 4 页时,对同一寄存器读和写的含义也可能不一样。详细见下表。这样计算,RTL8019可读写的通用寄存器远不止16 个。怎么去访问呢?(1)通过命令寄存器 CR中的 PS1和 PS0决定访问的页面。(2)地址线决定访问的寄存器是0 x0到 0 xf 中的哪个。(3)读/ 写信号决定是读操作还
27、是写操作中的寄存器。假设定义 ucTemp为 unsigned char 型变量,PS1=0,PS0=0, 使用reg010 x46,即将 0 x46 写入 PSTART。使用 ucTemp reg01,即将CLDA0 中的值读到 ucTemp中。 第 0 页 第 1 页 第 2 页 第 3 页 寄存器 (地址) 读操作 写操作 读/ 写 只能读 读操作 写操作 reg00 CR CR CR CR CR CR reg01 CLDA0 PSTART PAR0 PSTART 9346CR 9346CR reg02 CLDA1 PSTOP PAR1 PSTOP BPAGE BPAGE reg03 B
28、NRY BNRY PAR2 CONFIG0 reg04 TSR TPSR PAR3 TPSR CONFIG1 CONFIG1 reg05 NCR TBCR0 PAR4 CONFIG2 CONFIG2 reg06 FIFO TBCR1 PAR5 CONFIG3 CONFIG3 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 19 页 - - - - - - - - - 8reg07 ISR ISR CURR TEST reg08 CRDA0 RSAR0 MAR0 CSNSA
29、V reg09 CRDA1 RSAR1 MAR1 HLTCLK reg0a 8019ID0 RBCR0 MAR2 reg0b 8019ID1 RBCR1 MAR3 INTR reg0c RSR RCR MAR4 RCR FMWP reg0d CNRT0 TCR MAR5 TCR CONFIG4 reg0e CNTR1 DCR MAR6 DCR reg0f CNTR2 IMR MAR7 IMR 由于第 3 页不是标准的 NE2000系列定义的寄存器,并且主要是对93c64 的操作和网卡的配置,在单片机使用跳线方式下可以不用理会。下面重点介绍前3页的寄存器。当然,要完全掌握寄存器的使用,还是要根据
30、后面的程序分析下。1CR (命令寄存器) 从寄存器表知道,每页的reg00 都是 CR命令,因为在任何一页要跳转到其它页需要依赖 CR命令。其功能有:(1)选择寄存器中的页面。(2)定义数据传输模式。(3)启动/ 停止数据收发。 CR命令的位格式如下: 位7 6 5 4 3 2 1 0 名字PS1 PS0 RD2 RD1 RD0 TXP STA STP CR 的相应位的含义:位符号描述PS1 PS0 含义0 0 选择 0 页0 1 选择 1 页1 0 选择 2 页76 PS1 PS0 1 1 选择 3 页RD2 RD1 RD0 含义0 0 0 不允许0 0 1 远程读0 1 0 远程写0 1
31、1 发送包53 RD2-RD0 1 结束或完成远程 DMA2 TXP 这一位在置 1 时启动本地 DMA 进行帧发送,在发送完毕或终止时自动清零。写0 没影响。STA:命令生效位,当设置CR 寄存器后将此位置 1,开始命令执行。 STP:设置 1 时,网卡停止收发数据。STA STP 功能10 STA STP 1 0 开始执行命令名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 8 页,共 19 页 - - - - - - - - - 90 1 停止命令2CLDA0 、CLDA1 (当
32、前的本地DMA 寄存器寄存器) 这两个寄存器在第0 页的 reg01 和 reg02,只读,可以通过读这两个寄存器得到当前的本地DMA 地址。关于本地DMA 和远程 DMA 的介绍放在数据收发中讲解。 3BNRY (边界寄存器) BNRY 在第0页的reg03, 可读可写, 用于防止接收缓存环把还没被主机(单片机)读的数据给写了。BNRY 由单片机控制,其内容是指向某一页的地址,如 58H ,则说明单片机将前面的页的内容读走了,再读数据的话从 58H 的页开始读。读完后将下一页的地址写入BNRY 。 4TSR (发送状态寄存器) 在第 0 页的 reg04,只读。显示数据发送的状态。 位 符号
33、 描述 7 OWC超出窗口冲突范围, 置1时说明因发送冲突而终止包的传输应。这时正常的重发操作将被启动 . 6 CDH网卡监测在一个传输完成后帧间的间隙的第一个6.4微秒期间的CD 信号跳动在发送这个跳动失败时置1. 5 总为1 4 CRS当传送过程中发现丢失了包就置1. 3 ABT置1表明网卡由于冲突次数超过上限而取消传输 . 2 COL显示传输中至少发生了一次冲突,其次数记录在NCR中. 1 总为1. 0 PTX显示传输完成,没错误. 5NCR (冲突数寄存器) 这个寄存器记录发送一个包过程所发生的冲突次数,只读。 6FIFO (FIFO 寄存器) 设置为回环模式时, 发送出去的数据返回来
34、后存放在FIFO 寄存器中,可以用来检测芯片。 7ISR(FIFO 寄存器) 在第0页的reg07,可读写,反映网卡的中断状态,上电后必须清零。 位 符号 描述 7 RST当网卡进入复位状态时置1,当一条命令由CR 确认后清零。当接收缓冲区溢出时置1,而读出一个包以后自动清零。 6 RDC当远程DMA 操作完成后置1. 5 CNT当MSB 的一个或多个网络计数器启动时置1. 4 OVW当接收缓冲区满时置1. 3 TXE发送一个包时 因冲突等原因失败时置1. 2 RXE当接收到一个包时发现一下错误时置1,(CRC 校验错误、帧队列失败、丢失包). 名师资料总结 - - -精品资料欢迎下载 - -
35、 - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 9 页,共 19 页 - - - - - - - - - 101 PTX这一位显示发送无错误. 0 PRX这一位显示接收无错误. 8IMR(中断允许寄存器寄存器) 所有位都对应 ISR 寄存器中的相应位,相应位置1则使能相应的中断。 9CRDA0、CRDA1(当前的远程DMA 地址寄存器) 这两个寄存器在第0 页的 reg08 和 reg09,只读,可以通过读这两个寄存器得到当前的远程 DMA 地址。 108019ID0 、8019ID1 (RTL8019ID 寄存器) 记录 RTL
36、8019的芯片 ID,用来区分其它 NE2000芯片,分别存放 50H和 70H 。11RSR (接收状态寄存器) 位 符号 描述 7 DFR延时状态,发送冲突时置1。 6 DIS置1表示接收禁止。 5 PHY当接收到的时组播包或广播包时置1,接收到本机MAC 地址的包时清零 4 MPA由于在监测模式或缺少缓冲区而丢失了接收包则置1,然后计数器CNTR2加1 3 总为1 2 FAE接收的包有对齐错误时则置1,计数器CNTR0加1。 1 CRC接收的包CRC 错误时也置1,计数器CNTR1加1 0 PRX显示接收完成没错误 12CNRT0 、CNRT0 、CNRT0 (接收错误统计寄存器) 见
37、RSR寄存器中描述。分别统计了接收的包中对齐错误, CRC错误,包丢失错误的计数。 13PSTART、PSTOP (开始页和结束页寄存器) 用来设置接收缓存环的开始页地址和结束页地址。这个地址从40H 到 80H间选取。注意:PSTOP是指结束页地址的下一页。所以最大页为7FH ,则 PSTOP可设置为 80H 。 14TPSR (发送开始页寄存器) 用于设置要发送的包的起始页。即发送缓存起始地址的高8 位。 15TBCR0 、TBCR1 (发送字节计数) 用于设置要发送的包的长度(字节)。 16RSAR0、RSAR1(远程起始地址寄存器) 用于设置远程 DMA 的起始地址。 17RBCR0、
38、RBCR1(远程自动增加计数寄存器) 用于记录远程 DMA 的数据字节数。 18RCR (接收配置寄存器) 接收配置寄存器指定接收帧的操作方式和接收哪些帧的类型。 位 符号 描述 7 总为1。 6 总为1。 5 MON置1监测模式。 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 10 页,共 19 页 - - - - - - - - - 114 PRO如果为1,所有包的目标MAC 地址都接收; 如果为0,只有当目标MAC 地址和PAR0-5 的值一一对应才接收。 3 AM如果为1,
39、接收目标地址为组播地址的包; 如果为0,不接收目标地址为组播地址的包。 2 AB如果为1,接收目标地址为广播地址的包。 如果为0,不接收目标地址为广播地址的包。 1 AR1:长度小于64个字节的包也接收。 0:长度小于64个字节的包不接收。 0 SEP1:包有接收错误也接收; 0:包有接收错误不接收。 19TCR (传输配置寄存器) 传输配置寄存器决定网卡在发送帧时的行为方式,如是否填充CRC 。 位 符号 描述 7 总为1。 6 总为1。 5 总为1。 4 OFST冲突消除使能 3 ATD自动传输禁止。0:普通操作;1:接收组播模式。 21 LB1,LB0LB1,LB0 都为0时为普通模式。
40、LB1 为0、LB0 为1时内部回环模式。 LB1 为1时外部回环模式。 0 CRC如果置1则在发送时不添加CRC , 功能否则在发送时附加CRC 。 20DCR (数据配置寄存器) 数据配置寄存器决定了网卡的访问宽度是8 位还是 16 位,是否配置环回。 位 符号 描述 7 总为1。 65 FT1,FT0FIFO 的选择。 4 ARM远程自动初始化。1,禁止帧命令发送。0,允许执行帧命令发送。 3 LS回环选择.0: 选择回环模式TCR 的位1- 2则需要定义为回环的类型。1:普通模式。 2 LAS该位必须设为0,网卡只支持双16 位的DMA 模式则上电为1. 1 BOS在字中高位字节在前I
41、NTEL 为0 反之为1。 0 WTS字传输选择。0:字节长度的DMA 传输。1:字长度的DMA传输。对单片机而言,选择8位数据宽度。 21PAR0PAR5 (MAC 地址寄存器) 记录本机以太网的MAC 地址。接收时依靠此地址过滤不是本机的数据包。 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 11 页,共 19 页 - - - - - - - - - 1222CURR(当前页寄存器) 存放着接收包的第一页的地址,由网卡自动控制。 23MAR0 MAR7 (组播地址寄存器) 提供
42、给组播地址的过滤位。 为了接收所有的组播帧, 可以将组播地址寄存器中的所有位置 1。 3.2.3RTL8019 的 RAM BUFFER介绍前面说过, RTL8019有64页RAM BUFFER 用来作为发送和接收数据包的缓存。要收发数据,就需要单片机对其进行管理。从原理上讲,RAM BUFFER 是一个双口 RAM ,也就是说单片机可以往RAM 中读写数据,网卡控制器也可以自动往里面读写数据。 前面所提到的“远程 DMA 地址”就是单片机往 RAM BUFFER中读写数据用到的地址。 “本地 DMA 地址”是指网卡控制器自动读写RAM BUFFER用到的地址。所以, “远程”和“本地”的概念
43、仅仅为了区分是主机( 单片机)还是网卡控制器操作RAM BUFFER 。单片机远程读 /写操作:将读/写RAM BUFFER 中的数据的起始地址 Addr写到远程起始地址寄存器RSAR1、RSAR0(RSAR1=Addr 8;RSAR0=Addr&0 xFF),将要读取的数据长度len写到远程自动增加计数寄存器RBCR1、RBCR0(RBCR=len 8;RBCR0=len&0 xFF), 然后在CR 寄存器中设置读/ 写,就能通过远程DMA 数据读写寄存器( reg10)来读写RAM BUFFER 。读数据就是将数据一个接一个从reg10取出, 写数据就是将数据一个一个写入reg10, 网络
44、控制器会将这个数据写入RAM BUFFER相应的数据。我们可以这样分配RAM BUFFER :发送缓存使用第40H 页到 45H 页共1536(6x256)个字节,这样可以容纳最长的一个以太网数据帧。发送数据的时候,先通过“远程写”将数据写到40H 页开始的 RAM BUFFER 中,然后将发送的开始页( 0 x40)写到发送开始页寄存器TPSR 中,要发送的字节写入TBCR1 、TBCR0 中,最后将 CR寄存器 RD2RD0 置为 011,启动发送包。图 33 RTL8019 的 RAM BUFFER 分配图接收缓存使用余下的所有页(46H页到7FH页) 。如上图。于是将PSTART=0
45、x46,PSTOP0 x80。接收缓存区其实是一个循环FIFO 队列。 CURR为写入页指针,受网卡控制,每收到一页数据CURR自动加 1。当CURRPSTOP(0 x80)时自动指向 PSTART(0 x46) 。BNRY 为读出页指针,由主机(单片机)程序控制。单片机每读完一页数据后将BNRY加1,一个数据包若占用 5页,则读名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 12 页,共 19 页 - - - - - - - - - 13完后将 BNRY加5,同样,BNRY到PST
46、OP 后翻转到 PSTART。当CURR追上BNRY或CURR=0 x7F&BNRY=0 x46 时说明接收缓冲区已经满了, 网卡会停止接收数据包。 3.2.4RTL8019 的初始化以下几节主要通过程序讲解RTL 8019的使用。在介绍程序之前,假定寄存器按照如下规则定义的。 可以看出, 是按照寄存器手册命名的, 其含义见前面介绍。#define CR reg00 #define PS1 0 x80 #define PS0 0 x40 #define RD2 0 x20 #define RD1 0 x10 #define RD0 0 x08 #define TXP 0 x04 #define
47、 STA 0 x02 #define STP 0 x01 #define RDMA_REG reg10 #define RESET_REG reg18 /* 页 0 读/写寄存器 */ #define BNRY reg03 #define ISR reg07 #define RST 0 x80 #define RDC 0 x40 #define CNT 0 x20 #define OVW 0 x10 #define TXE 0 x08 #define RXE 0 x04 #define PTX 0 x02 #define PRX 0 x01 /* 页 0 只读寄存器 */ #define CL
48、DA0 reg01 #define CLDA1 reg02 #define TSR reg04 #define NCR reg05 #define FIFO reg06 #define CRDA0 reg08 #define CRDA1 reg09 #define _8019ID0 reg0a #define _8019ID1 reg0b #define RSR reg0c #define CNTR0 reg0d 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 13 页,共 19 页
49、 - - - - - - - - - 14#define CNTR1 reg0e #define CNTR2 reg0f /* 页 0 只写寄存器 */ #define PSTART reg01 #define PSTOP reg02 #define TPSR reg04 #define TBCR0 reg05 #define TBCR1 reg06 #define RSAR0 reg08 #define RSAR1 reg09 #define RBCR0 reg0a #define RBCR1 reg0b #define RCR reg0c #define MON 0 x20 #define
50、 PRO 0 x10 #define AM 0 x08 #define AB 0 x04 #define AR 0 x02 #define SEP 0 x01 #define TCR reg0d #define OFST 0 x10 #define ATD 0 x08 #define LB1 0 x04 #define LB0 0 x02 #define CRC 0 x01 #define DCR reg0e #define FT1 0 x40 #define FT0 0 x20 #define ARM 0 x10 #define LS 0 x08 #define LAS 0 x04 #def