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

RTL8019AS使用 - 图文(7)

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

单片机的总线要比网卡的DMA总线慢很多.网卡的DMA总线大概在10Mhz,而单片机的总线大概1Mhz.所以在Remote DMA的过程中不需要特别的等待时序. 但是如果使用较快的CPU,比如DSP,ARM等,可能要考虑时序问题.也就是说IOCHRDY(ISA总线的一个信号,RTL8019AS),或者TRDY(PCI总线的信号 RTL8029AS) ,是需要考虑连到CPU上,或者做一定的处理. 那么对于不快也不慢的AVR单片机来说,要不要接IOCHRDY?估计是要的.因为我不提供avr的上网方案,所以也没有做太多的研究.对于77E58来说可以不接IOCHRDY,因为77E58可以内部设置外部ram的存取的速度. DMA有8位和16位两种.网卡支持这两种DMA,一般我们使用8位的DMA,8位的DMA的接线比较少,同时适合单片机处理.电脑里一般使用16位DMA. 有人问到在电脑里如何使用8位的DMA的问题.有些卡自动检测总线上的IOCS16B来选择总线,比如RTL8019as,我试过RTL8019as使用8位DMA在电脑里是失败的.如果真的要在电脑里使用8位的DMA,要把该引脚IOCS16B断开(可以割断),而不连到ISA总线上,这样这些网卡会自动的进行8位的操作(地址译码为10位). 对于使用DM9008芯片的网卡,16位DMA传输是由SLOT引脚决定的。我试过把DM9008的IOCS16B 引脚与ISA槽断开(通过贴“透明胶”的方法),配套的设置程序检查时死机。如果想DM9008 使用8位DMA操作,应该把SLOT引脚割断,而不是IOCS16B。 在DSP里可以使用16位的DMA. 因为不同的单片机(CPU),代码可能不同,我在下面将用几种表示法来论述: 假设用到的I/O地址为0xC000,读出到temp变量或写temp到寄存器,temp为8位变量: 通用的 temp=read_register(address) 读寄存器函数 RTL8019 C程序(mcs51) RTL8019 汇编的程序(mcs51) MOV DPTR,#address temp=reg00; MOVX A,@DPTR MOV temp,A MOV temp,A reg00=temp; MOV DPTR,#address MOVX @DPTR,A 注: #define reg00 XBYTE[0xc000] 注:address equ 0C000H write_register(address,temp) 写寄存器函数 通用的表达式: void write_register(unsigned char address,unsigned char value)或 void write_register(unsigned int address,unsigned char value) unsigned char read_register(unsigned char address)或 unsigned char read_register(unsigned int address) 上面的表达式中,根据你的地址或寻址方法而选择unsigned int address或unsigned char address. 上表给出了用c语言或汇编语言或其他语言的表达的等价的程序. 下面给出用51单片机的c语言程序: #define reg00 XBYTE[0xc000] //reg00- 10为isa网卡接口的寄存器地址240-250; #define reg01 XBYTE[0xc100] #define reg02 XBYTE[0xc200] #define reg03 XBYTE[0xc300] #define reg04 XBYTE[0xc400]

31

#define reg05 XBYTE[0xc500] #define reg06 XBYTE[0xc600] #define reg07 XBYTE[0xc700] #define reg08 XBYTE[0xc800] #define reg09 XBYTE[0xc900] #define reg0a XBYTE[0xca00] #define reg0b XBYTE[0xcb00] #define reg0c XBYTE[0xcc00] #define reg0d XBYTE[0xcd00] #define reg0e XBYTE[0xce00] #define reg0f XBYTE[0xcf00] #define reg10 XBYTE[0xd000]

xdata unsigned char buffer[1536];//缓冲区,放在外部ram. unsigned int count;//需要读或写的字节数 unsigned int i;

//DCR=0xc8;要配置DCR为8位的dma

void write_dma(unsigned int address,unsigned int count)//写网卡的ram {//address为要写入到网卡里的ram的起始地址,count为要连续写入的字节数 page(0);

reg09=address>>8;//address high reg08=address&0xff;//address low reg0b=count>>8; //write count high reg0a=count&0xff;//write count low reg00=0x12 ;//dma write for(i=0;i

reg10=buffer[i]; }

reg0b=0; // count high 中止DMA操作 reg0a=0;// count low

reg00=0x22;//abort/complete dma page 0 }

执行的结果是将buffer数组的内容被写入到网卡的起始ram地址address的一段ram里. 程序当中的最后3句: reg0b=0; // count high reg0a=0;// count low

reg00=0x22;//abort/complete dma page 0

可以不要,但推荐使用,以便发生错误的时候能够正确的退出DMA传输,3句是中止DMA的代码.在电脑里死机是很\正常\的,而在单片机里\死机\是大事,所以要考虑更多,一旦时序配合有问题,DMA就可能发生错误,提供发生错误时的恢复是有必要的.

void read_dma(unsigned int address,unsigned int count)//读网卡ram {//address为网卡里的ram的起始地址,count为要连续读取的字节数 page(0);

32

reg09=address>>8;//address high reg08=address&0xff;//address low reg0b=count>>8; //write count high reg0a=count&0xff;//write count low reg00=0x0a ;//dma read for(i=0;i

buffer[i]=reg10; }

reg0b=0; // count high 中止DMA操作 reg0a=0;// count low

reg00=0x22;//abort/complete dma page 0 }

执行的结果是将网卡里的起始地址为address的共count个字节读入到buffer[i]里.

如果是使用模拟i/o,程序如下:

unsigned char read_register(unsigned char address) {//读寄存器

unsigned char temp; ea=0;//关闭中断是推荐的 p2=address;

p0=0xff; //这句不能省略 read=0; temp=p0;

read=1;//read为单片机的读引脚 ea=1; return(temp); }

void write_register(unsigned char address,unsigned char value) {

//写寄存器 ea=0; p2=address; p0=value;

write=0;//write为单片机的写引脚 write=1;

p0=0xff; //这句也是需要的. ea=1; }

那么我给出的read_dma,write_dma里的函数的i/o替换成模拟i/o的函数就可以了,举例如下: 将

#define reg10 0xd0

reg10=buffer[i] ;替换为write_register(reg10,buffer[i]); buffer[i]=reg10 ;替换为buffer[i]=read_register(reg10);

33

其他reg0a,reg0b等也是做类似的替换.

建议不要使用模拟i/o,因为速度慢,同时也不可靠.模拟i/o中一般要关闭中断. 因为如果不关闭中断,会引起被中断,使读或写寄存器的时间变得很长.尽管DMA有优先级,但是如果read或write线一直处于低电平的时候,能否被 Local DMA中断,我是持有疑问的. 网卡有8字节的FIFO,假设在单片机读写网卡ram的同时,网卡收到一个数据包,那么FIFO最多可以存储64个bit就必须启动Local DMA写网卡ram,网卡的速率为10,000,000bit/秒,64个bit的时间为6.4微秒. 单片机读写一个字节的网卡ram的时间最好不要超过6.4微秒.所以关闭中断以尽快执行i/o操作.虽然资料上没有说是否可以超过6.4微秒.有兴趣的可以做实验看是否一个很慢的read,write会不会影响网卡收数据包.

有时候我们不要相信资料.比如有些单片机书对MOVX指令的时序图就有误.RTL8019AS关于溢出时网卡不会覆盖以前接收的数据包的论述也是有误的. \尽信书不如无书\实践是检验真理的唯一标准\就像资料说DM9008说支持8位DMA一样,我以前在电脑里试过,怎么也不行,用单片机的时候就可以.网卡并不是为单片机设计的,有些在电脑里不会出现的问题在单片机里可能碰到.

如果采用16位的dma(有些客户用dsp,或者在电脑里驱动,16位的dma要求有16条数据线的CPU,不能用在51单片机),那么也给出大家参考: //DCR=0xC9;//配置成16位dma.

unsigned int buffer[768];//注意用int的数组

void write_dma(unsigned int address,unsigned int count)//写网卡的ram {//address为要写入到网卡里的ram的起始地址,count为要连续写入的字节数 page(0);

reg09=address>>8;//address high reg08=address&0xff;//address low reg0b=count>>8; //write count high reg0a=count&0xff;//write count low reg00=0x12 ;//dma write count=(count+1) /2; for(i=0;i

reg10=buffer[i]; }

reg0b=0; // count high 中止DMA操作 reg0a=0;// count low

reg00=0x22;//abort/complete dma page 0 }

void read_dma(unsigned int address,unsigned int count)//读网卡ram {//address为网卡里的ram的起始地址,count为要连续读取的字节数 page(0);

reg09=address>>8;//address high reg08=address&0xff;//address low reg0b=count>>8; //write count high reg0a=count&0xff;//write count low reg00=0x0a ;//dma read count=(count+1) /2; for(i=0;i

34

{

buffer[i]=reg10; }

reg0b=0; // count high 中止DMA操作 reg0a=0;// count low

reg00=0x22;//abort/complete dma page 0 }

上面的count=(ount+1) /2,为什么要加一,是因为读取字节数为单数的时候就要.

51单片机RTL8019AS网卡驱动程序

我的SNMP网管板使用了RTL8019AS 10M ISA网卡芯片接入以太网。选它的好处是:NE2000兼容,软件移植性好;接口简单不用转换芯片如PCI-ISA桥;价格便宜2.1$/片(我的购入价为22元RMB/片);带宽充裕(针对51);较长一段时间内不会停产。8019有3种配置模式:跳线方式、即插即用P&P方式、串行Flash 配置方式。为了节省成本,我去掉了9346而使用X5045作为闪盘存储MAC地址和其他可配置信息。P&P模式用在PC机中,这里用不上。只剩下跳线配置模式可用,它的电路设计参考REALTEK提供的DEMO板图纸。一天时间就可以完成,相对来说硬件设计比较简单。

与这部分硬件相对应的软件是网卡驱动。所谓驱动程序是指一组子程序,它们屏蔽了底层硬件处理细节,同时向上层软件提供硬件无关接口。驱动程序可以写成子程序嵌入到应用程序里(如DOS下的I/O端口操作和ISR),也可以放在动态链接库里,用到的时候再动态调入以便节省内存。在WIN98中,为了使 V86、WIN16、WIN32三种模式的应用程序共存,提出了虚拟机的概念,在CPU的配合下,系统工作在保护模式,OS接管了I/O、中断、内存访问,应用程序不能直接访问硬件。这样提高了系统可靠性和兼容性,也带来了软件编程复杂的问题。任何网卡驱动都要按VXD或WDM模式编写,对于硬件一侧要处理虚拟机操作、总线协议(如ISA、PCI)、即插即用、电源管理;上层软件一侧要实现NDIS规范。因此在WIN98下实现网卡驱动是一件相当复杂的事情。

我这里说的驱动程序特指实模式下的一组硬件芯片驱动子程序。从程序员的角度看,8019工作流程非常简单,驱动程序将要发送的数据包按指定格式写入芯片并启动发送命令,8019会自动把数据包转换成物理帧格式在物理信道上传输。反之,8019收到物理信号后将其还原成数据,按指定格式存放在芯片RAM中以便主机程序取用。简言之就是8019完成数据包和电信号之间的相互转换:数据包<===>电信号。以太网协议由芯片硬件自动完成,对程序员透明。驱动程序有3种功能:芯片初始化、收包、发包。 以太网协议不止一种,我用的是802.3。它的帧结构如图1所示。物理信道上的收发操作均使用这个帧格式。其中,前导序列、帧起始位、CRC校验由硬件自动添加/删除,与上层软件无关。值得注意的是,收到的数据包格式并不是802.3帧的真子集,而是如图2所示。明显地,8019自动添加了“接收状态、下一页指针、以太网帧长度(以字节为单位)”三个数据成员(共4字节)。这些数据成员的引入方便了驱动程序的设计,体现了软硬件互相配合协同工作的设计思路。当然,发送数据包的格式是802.3帧的真子集,如图3所示。

35

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

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