77范文网 - 专业文章范例文档资料分享平台

RTL8019AS使用 - 图文(2)

来源:网络收集 时间:2019-04-15 下载这篇文档 手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:或QQ: 处理(尽可能给您提供完整文档),感谢您的支持与谅解。点击这里给我发消息

当然也可以写成更加简单的几句: temp=reg00&0x3f;

pagenumber=pagenumber<<6; reg00=temp|pagenumber; 但这样对读者来说不好理解。

从执行的速度来说,上面的代码也不是最快的。但作者主要讲述原理,而不是探讨最快的实现。 --RD2,RD1,RD0这3个位代表要执行的功能。 =001 读网卡内存 =010 写网卡内存 =011 发送网卡数据包

=1** 完成或结束DMA的读写操作

---TXP这个位写入1时发送数据包,发完自动清零 ---STA,STP这两个位用来启动命令或停止命令 =10 启动命令 =01 停止命令

下面介绍网卡的初始化子程序: void ne2000init()

{ reg00=0x21; //选择页0的寄存器,网卡停止运行,因为还没有初始化。 reg01=0x4c; //寄存器Pstart reg02=0x80; //Pstop reg03=0x4c; //BNRY reg04=0x45; //TPSR reg0c=0xcc; //RCR reg0d=0xe0; //TCR

reg0e=0xc8; //DCR 数据配置寄存器 8位数据dma reg0f=0x00; //IMR disable all interrupt page(1); //选择页1的寄存器 reg07=0x4d; //CURR reg08=0x00; //MAR0 reg09=0x41; //MAR1 reg0a=0x00; //MAR2 reg0b=0x80; //MAR3 reg0c=0x00; //MAR4 reg0d=0x00; //MAR5 reg0e=0x00; //MAR6 reg0f=0x00; //MAR7

reg00=0x22;//选择页0寄存器,网卡执行命令。 }

PSTART 接收缓冲区的起始页的地址。

PSTOP 接收缓冲区的结束页地址。(该页不用于接收) BNRY 指向最后一个已经读取的页(读指针) CURR 当前的接收结束页地址。(写指针)

--网卡含有16K字节的RAM,地址为0x4000-0x7fff(指的是网卡上的存储地址,而不是ISA总线的地址,是网卡工作用的存储器),每256 个字节称为一页,共有64页。页的地址就是地址的高8位,页

6

地址为0x40--0x7f 。这16k的ram的一部分用来存放接收的数据包,一部分用来存储待发送的数据包。当然也可以给用户使用。(例如把网卡设置成使用8K的ram,另外8K 的ram就可以用来给单片机作为存储器,但我没有这样做,原因是操作网卡上的ram比较复杂)

---在我的程序中使用0x40-0x4B为网卡的发送缓冲区,共12页,刚好可以存储2个最大的以太网包。使用0x4c-0x7f为网卡的接收缓冲区,共52页。因此PSTART=0x4c,PSTOP =0x80(0x80为停止页,就是直到0x7f,是接收缓冲区,不包括0x80);刚开始,网卡没有接收到任何数据包,所以,BNRY设置为指向第一个接收缓冲区的页0x4c) 这四个寄存器用于接收的设置。

--CURR是网卡写内存的指针。它指向当前正在写的页的下一页。那么初始化它就应该指向0x4c+1=0x4d 。网卡写完接收缓冲区一页,就将这个页地址加一,CURR =CURR+1。这是网卡自动加的。当加到最后的空页(这里是0x80,PSTOP)时,将CURR置为接收缓冲区的第一页(这里是0x4c, PSTART),也是网卡自动完成的。当CURR=BNRY时,表示缓冲区全部被存满,数据没有被用户读走,这时网卡将停止往内存写数据,新收到的数据包将被丢弃不要,而不覆盖旧的数据。此时实际上出现了内存溢出。

---而BNRR要由用户来操作。用户从网卡读走一页数据,要将BNRY加一,然后再写到BNRY寄存器。 当BNRY加到最后的空页(0x80,PSTOP)时,同样要将BNRY变成第一个接收页(PSTART,0x4c)BNRY=0x4c;

---CURR和BNRY主要用来控制缓冲区的存取过程,保证能顺次写入和读出)。

当CURR =BNRY+1(或当BNRY=0x7f ,CURR=0x4c)时,网卡的接收缓冲区里没有数据,表示没有收到数据包。用户通过这个判 断知道没有包可以读。当上述条件不成立时,表示接收到新的数据包。然后用户应该读取数据包,直到上述条件成立时,表示所以数据包已经读完,此时停止读取数据包。 --TPSR 为发送页的起始页地址。初始化为指向第一个发送缓冲区的页,0x40。

--RCR 接收配置寄存器,设置为使用接收缓冲区,仅接收自己的地址的数据包(以及广播地址数据包)和多点播送地址包,小于64字节的包丢弃(这是协议的规定,设置成接收是用于网络分析),校验错的数据包不接收。

--TCR 发送配置寄存器,启用crc自动生成和自动校验,工作在正常模式。

--DCR 数据配置寄存器,设置为使用FIFO缓存,普通模式,8位数据传输模式,字节顺序为高位字节在前,低位字节在后(符合我们的习惯)(如果用16位的单片机,设置成16位的数据总线操作会更快,但80c52是8位总线的单片机)

--IMR 中断屏蔽寄存器,设置成0x00,屏蔽所有的中断。设置成0xff将允许中断)

--MAR0--MAR8是设置多点播送的参数,这点我也不是很清楚,我从电脑读出来是什么数,我也将这8个寄存器设置成这几个数. 由于我们不使用多点播送,所以不要紧,只要保证网卡能正常工作就可以了。

--PAGE2的寄存器是只读的,所以不可以设置,不用设置,PAGE3的寄存器不是NE2000兼容的,所以也不用设置。

7

RTL8019AS--读取网卡的网卡地址

分类:RTL8019AS

完成上面的过程之后,网卡还不能正确的接收数据包,因为我们还没有对网卡的物理地址(网卡地址,48位的地址)进行设置。网卡还不知道它应该什么地址的数据包。要对网卡的物理地址进行设置,就必须知道网卡的物理地址是多少。 读取网卡的物理地址的子程序:

union u {uint word; struct{uchar high;uchar low;}bytes;}; //我定义的数据结构,为两个字节的结构 //,可以按照uint(unsigned int)来读取,也可以按照高低字节high和low来读取。 union u mynodeid[3];//存储网卡的物理地址 union u protocal; //临时变量 void readmynodeid() {uchar data i,temp; page(0);

reg09=0;//寄存器RSAR1 dma read highaddress=0 reg08=0;//RSAR0 dma read lowaddress=0; reg0b=0; //RBCR1 read count high reg0a=12;//RBCR0 count low reg00=0x0a;//dma read and start for (i=0;i<6;i++)

{ temp=reg10;//读取一个字节

if (i % 2==0)

{protocal.bytes.high=temp;}

else {protocal.bytes.low=temp;mynodeid[i/2].word=protocal.word;} temp=reg10;//读取一个重复的字节,这个字节被丢弃 } }

-- 网卡除了16k(地址0x4000-0x7FFFF)的接收发送存储RAM之外,还有别的RAM,还有一块大小为256字节的RAM,地址为0x0000 -0x00FF,这部分RAM是eeprom 93C46的影像存储(不完全一样),存储的内容的一部分跟93C46存储的是一样的。网卡在上电的时候将93C46的一部分内容读到这256字节的RAM里。 存储是WORD类型,其中地址:

0x0000-0x000b共12个字节是网卡的物理地址。(网卡的物理地址是6个字节的,为什么要用12字节?因为这12字节是重复存储的。例如网卡物理地址0x52544CC118CF,存储在0x0000-0x000b里是这样的:

525254544C4CC1C11818CFCF

我们可以看到单和双的地址存储的是一样的。0x000b后面的地址存储的是生产厂商的代码和产品标识代码,也是单双地址重复存储,这里就不说了。

这个程序又用到4个新的寄存器:RSAR1 RSAR0 RBCR1 RBCR0 这4个寄存器是专门用于读取网卡上面的ram的。

8

RSAR1 网卡上的RAM的起始地址高8位 RSAR0 网卡上的RAM的起始地址低8位

--程序中的reg09,reg08都设成0,所以是从网卡上的0x0000地址开始读。 RBCR1 要读取的字节数的计数(高8位) RBCR0 要读取的字节数的计数(低8位)

--程序中的reg0b=0,reg0a=12,所以要读取12个字节。 reg00=0x0a 的意思是进行DMA的内存读取操作。

--结果将网卡地址存储在mynodeid[3](共6个字节)里。

RTL8019AS--设置网卡地址

分类:RTL8019AS

以下程序是设置网卡的地址,只有符合这个地址的数据包才接收.

void writemynodeid() { page(1);

reg01=mynodeid[0].bytes.high; //PAR0 reg02=mynodeid[0].bytes.low; //PAR1 reg03=mynodeid[1].bytes.high; //PAR2 reg04=mynodeid[1].bytes.low; //PAR3 reg05=mynodeid[2].bytes.high; //PAR4 reg06=mynodeid[2].bytes.low; //PAR5 }

又用到几个新的寄存器,是页1的几个寄存器: PAR0,PAR1, PAR2, PAR3,PAR4,PAR5

这几个寄存器是网卡的工作时候用的地址,只有符合这个地址的数据包才接收,这个地址是可以设置为其他的值,不一定设置为网卡的物理地址,为了不跟别的网卡地址冲突,最好设置为网卡的地址,(如果用户需要设置为其他的值,也是可以的).

9

RTL8019AS--RTL8019AS的跳线方式

分类:RTL8019AS

rtl8019as有3种工作方式:

第一种为跳线方式,网卡的i/o和中断由跳线决定

第二种为即插即用方式,由软件进行自动配置plug and play

第三种为免跳线方式,网卡的i/o和中断由外接的93c46里的内容决定。

我们买到的网卡一般只支持第2和第3种。在嵌入式应用的 场合,如果可以不使用93c46的话,可以降低成本,同时又减少连线。那么我们如何使用第1种方式跳线方式呢?网卡使用哪种方式由rtl8019as的第65脚JP决定。我们来看引脚图:

第65 脚jp是输入引脚,当65脚为低电平时,8019工作在第2种或第3种方式,具体由93c46里的内容决定。我们买到的 rtl8019as网卡一般第65脚为悬空的,rtl8019as悬空时,引脚的输入状态为低电平(其他引脚也是这样,悬空的输入脚的电平为低电平,里面有一个100k的下拉电阻),网卡工作在第2,3种工作方式,需要使用93c46 芯片。如果我们把65脚接高电平(vcc),那么网卡的i/o和中断就不是用93c46的内容决定,这时不需要使用93c46,可以不接93c46。那么这时候的i/o和中断irq是多少呢?这时需要用到

64,65,78,79,80,81,82,84,85等引脚。

64脚aui,该引脚决定使用aui还是bnc接口。我们用的网卡的接口一般是bnc的,很少用aui。bnc接口方式支持8线双绞或同轴电缆。高电平时使用aui接口,悬空为低电平,使用bnc接口。我们将该引脚悬空即可。

65脚jp 为高电平时(接到vcc或通过一个10k的电阻上拉)使用跳线方式,这时芯片的i/o地址由以下几个引脚85,84,82,81(IOS3..IOS0)决定:

芯片的中断线由以下引脚80,79,78(IRQS2..IRQS0)决定:

10

百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库RTL8019AS使用 - 图文(2)在线全文阅读。

RTL8019AS使用 - 图文(2).doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印 下载失败或者文档不完整,请联系客服人员解决!
本文链接:https://www.77cn.com.cn/wenku/zonghe/596681.html(转载请注明文章来源)
Copyright © 2008-2022 免费范文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ: 邮箱:tiandhx2@hotmail.com
苏ICP备16052595号-18
× 注册会员免费下载(下载后可以自由复制和排版)
注册会员下载
全站内容免费自由复制
注册会员下载
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: