【开发指南】51单片机+RTL8019上网编程指南.doc
《【开发指南】51单片机+RTL8019上网编程指南.doc》由会员分享,可在线阅读,更多相关《【开发指南】51单片机+RTL8019上网编程指南.doc(88页珍藏版)》请在三一办公上搜索。
1、RTL8019编程指南(未完待续)1. 绪言单片机如何控制以太网网卡进行传输数据,如何加载TCP/IP协议连接到互联网,这些都是一些令人感兴趣的问题。可以说以太网和TCP/IP协议已经成为使用最广泛的协议,而其它总线协议如RS485、RS232,CAN,LANWORKS,都只是一些局部系统的总线。围绕以太网而制造的集线器,交换机已进入大小公司,企业,家庭。我现在在众达天网公司,由于公司是搞电脑防火墙的,所以对网络的接触也越来越多,我研究的主要是网络的底层,并掌握了很多网络分析工具如(SNIFFER),对以太网和TCP/IP协议的研究就更加深入了。我比较熟悉的网卡是10M的网卡,100M的以太网
2、卡还在研究之中。曾经用单片机(89C52)控制和驱动10M的NE2000兼容型以太网卡与电脑主机传输数据。现在将我的一些研究成果写成一系列的文单,提供给大家。也许有一天研究了100M的网卡之后,可以让单片机驱动它,那是可能的事,只不过接口可能会复杂一些。我所写的驱动程序并不是标准的,因为我没有学过UNIX,无法使用UNIX提供的原代码。如果能使用UNIX的原代码,那将是很好的事。我也正在接触UNIX和VC+,DDK等方面的内容,希望有一天能够重写我现在所写的驱动程序。我知道有很多人在了解单片机与以太网方面的东西,在BBS上也发现了很多这方面的内容,有些人的研究甚至比我还深入,我也希望能跟这些人
3、交流交流,如果对我的文章感兴趣 ,当然可以给我发电子邮件啦。在接下来的文章将介绍以太网协议,网卡驱动,IP协议,ICMP协议,ARP协议,TCP协议等 。-为帮助读者开发该tcp/ip的应用,本站制作了以太网开发板,可以购买。2. 以太网协议-以太网协议(用于10MBPS的以太网,作者以下所说的以太网均指10M以太网,而不是100M,1000M的以太网)以太网协议有两种,一种是IEEE802.2/IEEE802.3,还有一种是以太网的封装格式。现代的操作系统均能同时支持这两种类型的协议格式。因此对我们来说只需要了解其中的一种就够了,特别是对单片机来说,不可能支持太多的协议格式。以太网的物理传输
4、帧:(仅介绍第二种格式)PRSDDASATYPEDATAPADFCS56位8位48位48位16位不超过1500字节可选32位PR:同步位,用于收发双方的时钟同步,同时也指明了传输的速率(10M和100M的时钟频率不一样,所以100M网卡可以兼容10M网卡),是56位的二进制数101010101010.SD: 分隔位,表示下面跟着的是真正的数据,而不是同步时钟,为8位的10101011,跟同步位不同的是最后2位是11而不是10.DA:目的地址,以太网的地址为48位(6个字节)二进制地址,表明该帧传输给哪个网卡.如果为FFFFFFFFFFFF,则是广播地址,广播地址的数据可以被任何网卡接收到.SA
5、:源地址,48位,表明该帧的数据是哪个网卡发的,即发送端的网卡地址,同样是6个字节.-TYPE:类型字段,表明该帧的数据是什么类型的数据,不同的协议的类型字段不同。如:0800H 表示数据为IP包,0806H 表示数据为ARP包,814CH是SNMP包,8137H为IPX/SPX包,(小于0600H的值是用于IEEE802的,表示数据包的长度。)-DATA:数据段 ,该段数据不能超过1500字节。因为以太网规定整个传输包的最大长度不能超过1514字节。(14字节为DA,SA,TYPE)-PAD:填充位。由于以太网帧传输的数据包最小不能小于60字节, 除去(DA,SA,TYPE 14字节),还必
6、须传输46字节的数据,当数据段的数据不足46字节时,后面补000000.(当然也可以补其它值)-FCS:32位数据校验位.为32位的CRC校验,该校验由网卡自动计算,自动生成,自动校验,自动在数据段后面填入.对于数据的校验算法,我们无需了解.-事实上,PR,SD,PAD,FCS这几个数据段我们不用理它 ,它是由网卡自动产生的,我们要理的是DA,SA,TYPE,DATA四个段的内容.-所有数据位的传输由低位开始(但传输的位流是用曼彻斯特编码的) -以太网的冲突退避算法就不介绍了,它是由硬件自动执行的.DA+SA+TYPE+DATA+PAD最小为60字节,最大为1514字节.-以太网卡可以接收三种
7、地址的数据,一个是广播地位,一个是多播地址(我们用不上),一个是它自已的地址.但网卡也可以设置为接收任何数据包(用于网络分析和监控).-任何两个网卡的物理地址都是不一样的,是世界上唯一的,网卡地址由专门机构分配.不同厂家使用不同地址段,同一厂家的任何两个网卡的地址也是唯一的.根据网卡的地址段(网卡地址的前三个字节),可以知道网卡的生产厂家.有些网卡的地址也可以由用户去设定,但一般不需要. 3. 网卡上电复位-当你买到一个新的RTL8019AS网卡,你要先将该网卡设置为以下的配置:操作方式Operating Mode:跳线方式Jumperless(不是即插即用Plug and Play)端口I/
8、O base:0240-25FH中断Interrupt: 2/9(我的程序没有用到网卡中断,所以也可以不用设置)你要将这个网卡插到你的电脑里,用这个网卡带的设置程序RSET8019.exe将这个卡按照上面的配置设置好。(最好在纯DOS方式下设置) . 在介绍网卡驱动程序之前,先介绍一下RTL8019AS的基本情况:3.1. 输入输出地址:共32个,地址偏移量为00H-1FH,(对应于240H25FH,240H的地址偏移量为0,241H的地址偏移量为1,。25FH的地址偏移量为1FH)。其中00H0FH共16个地址,为寄存器地址。10H17H共8个地址,为DMA地址。18H1FH共8个地址,为复
9、位端口。对于8位的操作方式,上面的地址中只有18个是有用的:00H0FH共16个寄存器地址。10H DMA地址 (10H17H的8个地址是一样的,都可以用来做DMA端口,只要用其中的一个就可以了)1FH 复位地址。(18H到1FH共8个地址都是复位地址,每个地址的功能都是一样的,只要其中的一个就可以了,但实际上只有18H,1AH,1CH,1EH这几个复位端口是有效的,其他不要使用,有些兼容卡不支持19H,1BH,1DH等奇数地址的复位)3.2. 跟复位有关的引脚:RSTDRV连接到ISA总线的RSTDRV的引脚上。RSTDRV同时也是ISA总线的复位信号。RSTDRV为高电平有效,至少需要 8
10、00ns的宽度。给该引脚施加一个1us以上的高电平就可以复位。施加一个高电平之后,然后施加一个低电平。RSTDRV从高电平到低电平之后要等多久,单片机才可以对网卡进行操作?复位的过程将执行一些操作,比如将93c46读入,将内部寄存器初始化等。这些至少需要2毫秒的时间。我们推荐大家等待更久的时间之后才对网卡操作,比如100毫秒之后才对它操作,以确保完全复位。对RSTDRV可以接单片机的一个引脚进行对网卡的复位。但也可以直接将RSTDRV跟单片机的RESET引脚并联,单片机复位的时候,网卡也复位,以减少一个单片机的引脚的使用。这种情况下,为了保证能够完全复位,可以使用下面介绍的热复位代码。 3.3
11、. 跟复位有关的寄存器:18H1FH共8个地址,为复位端口。对该端口偶数地址的读,或者写入任何数,都引起网卡的复位。3.4. 跟复位有关的标志位: 其中的第7位RST跟复位有关。网卡执行正确的复位之后该位为1。在linux或windows的驱动程序中,一般在复位之后检查该标志位以确认是否正确复位,特别是在即插即用的检测过程中。对于我们用单片机控制网卡来说,我们可以不检查该标志位,因为如果复位不正常的情况通常是网卡坏了。3.5. 寄存器:00H0FH共16个地址是寄存器地址。寄存器分成4页PAGE0-PAGE3,但NE2000兼容的寄存器只有3页(Page0-Page2),(第四页是RTL801
12、9AS自己定义的,我们不用去管这些寄存器,因为你对第四页的寄存器的操作仅对这个网卡是有效的,如果你换成其他Ne2000兼容的网卡,例如DM9008,DP8390等,你的程序将无法正常运行。 为了保证驱动程序对所有Ne2000的网卡有效,不要去操作第四页的寄存器)由于寄存器较多,我将在用到该寄存器的时候才对该寄存器介绍。3.6. 对网卡进行复位:这是网卡驱动程序的需要做的第一个内容,由于我们将网卡设置为跳线模式,而不是即插即用的模式,RTL8019AS.PDF中介绍的PLUG and PLAY的一些过程,我们不需要做,因为单片机的资源有限,能够减少的操作,都尽量减少。程序从main()开始执行:
13、#include /*my.h 为作者所用的头文件,包含所有89c52寄存器的大写和小写的定义,和一些常用的子函数,一些宏的定义*/main()delaymsecond(10);/延时大约1秒,保证电源稳定和网卡自身的上电完成。netcardreset();/复位网卡的子程序 。下面介绍网卡的复位子程序:#define reg1f XBYTE0xdf00 /网卡的复位端口的地址,对应于网卡的地址25FH。#define uint unsigned int /uint 代表unsigned int ,作者一般使用缩写uint#define uchar unsigned char /uchar 代
14、表unsigned char,我比较懒,不愿意多写sbit reset=p34; /单片机的p3.4脚连接到网卡的RSTDRV复位引脚void netcardreset()uint data i;uchar data temp;reset=1; /使网卡的RSTDRV引脚变成高电平,网卡是高电平复位的。for(i=0;i250;i+);/延时程序,至少需要reset=0; /使网卡的RSTDRV引脚变成低电平,网卡上电复位完毕for(i=0;i250;i+);temp=reg1f;/读网卡的复位端口reg1f=temp; /写网卡的复位端口for(i=0;i250;i+); 上面所讲的实际上是
15、网卡复位的两种情况,reset=1;reset=0相当于冷复位temp=reg1f;reg1f=temp相当于热复位对网卡的复位端口的读或写将复位网卡,网卡内部将执行复位过程。读写是随意的,写入任意的数都将复位网卡。 实际上只要使用冷复位就可以了,热复位程序可以不要。热复位主要在电脑里有用,冷复位就像电脑的冷启动,热复位相当于电脑的热启动。作者的复位网卡的过程是简化了的,一个电脑里的复位过程是比较复杂的,如果你有网卡驱动的UNIX,LINUX程序的源代码,它的代码将会做一些判断和检查,检查网卡是否存在,和是否工作正常,和是否存在地址和中断冲突 。但在我们的这个系统里可以省去这些,我们认为网卡的
16、地址和I/O是没有冲突和正常工作的。当然如果读者愿意,也可以写一些检查代码。4. 网卡初始化- 完成复位之后,你要对网卡的工作参数进行设置.以使网卡开始工作.先介绍一个子函数4.1. void page(uchar pagenumber)#define reg00 XBYTE0xc000 /对应于地址240H 为命令寄存器CR地址void page(uchar pagenumber) uchar data temp; temp=reg00;/command register temp=temp&0x3f;pagenumber=pagenumber 6; temp=temp | pagenumb
17、er;reg00=temp;错误修正:(2001年11月10日) :以上程序有问题,在中断驱动或发送数据包不作等待时,因为发送数据包的命令是让TXP置位,如果在发送数据包的过程中,使用该函数,就会不断地向外发送数据包.原因是TXP置位之后,只能是发完数据包的时候,由网卡内部将TXP位清0,命令不能使TXP清0,对该位写入0没有作用.读取时要屏蔽该位,上面的程序修正如下,请用户使用下面的程序:void page(uchar pagenumber)uchar data temp;temp=reg00;temp=temp&0x3B; /注意不是0x3F ,TXP位在平时一定要置为0.pagenumb
18、er=pagenumber6temp=temp|pagenumber;reg00=temp;从实验当中也发现,只要再置位TXP位就可以重发该数据包(重发数据包时,不需要设置TPSTART,TBCR0,TBCR1).作用是选择指定的页,网卡共有4页寄存器,Ne2000兼容的有3页。第四页可以不用。 4.2. reg00命令寄存器:CR,command register,地址偏移量00H,为一个字节位76543210名字PS1PS0RD2RD1RD0TXPSTASTPl PS1和PS0这两个位用来选择寄存器页,PS1 PS0=00时选择寄存器页0,=01时选择寄存器页1, =10时选择寄存器页2,
19、=11时选择寄存器页3.上面的程序的参数为pagenumber,用来指定第几页。temp=reg00 ;/读入命令寄存器的值。temp=temp&0x3b;/将高2位,即PS1,PS0清0pagenumber=pagenumber6;/将低2位移至高端temp=temp|pagenumber, /写入高2位reg00=temp; /设置第几页当然也可以写成更加简单的几句:temp=reg00&0x3B;pagenumber=pagenumber6;reg00=temp|pagenumber; 但这样对读者来说不好理解。从执行的速度来说,上面的代码也不是最快的。但作者主要讲述原理,而不是探讨最快
20、的实现。l RD2,RD1,RD0这3个位代表要执行的功能。001 读网卡内存010 写网卡内存011 发送网卡数据包1* 完成或结束DMA的读写操作l TXP这个位写入1时发送数据包,发完自动清零l STA,STP这两个位用来启动命令或停止命令10 启动命令01 停止命令4.3. 下面介绍网卡的初始化子程序:void ne2000init() reg00=0x21; /选择页0的寄存器,网卡停止运行,因为还没有初始化。reg01=0x4c; /寄存器Pstartreg02=0x80; /Pstopreg03=0x4c; /BNRYreg04=0x45; /TPSRreg0c=0xcc; /R
21、CRreg0d=0xe0; /TCRreg0e=0xc8; /DCR 数据配置寄存器 8位数据dma reg0f=0x00; /IMR disable all interrupt page(1); /选择页1的寄存器reg07=0x4d; /CURRreg08=0x00; /MAR0reg09=0x41; /MAR1reg0a=0x00; /MAR2reg0b=0x80; /MAR3reg0c=0x00; /MAR4reg0d=0x00; /MAR5reg0e=0x00; /MAR6reg0f=0x00; /MAR7reg00=0x22;/选择页0寄存器,网卡执行命令。 PSTART 接收缓冲
22、区的起始页的地址。PSTOP 接收缓冲区的结束页地址。(该页不用于接收)BNRY 指向最后一个已经读取的页(读指针)CURR 当前的接收结束页地址。(写指针)网卡含有16K字节的RAM,地址为0x4000-0x7fff(指的是网卡上的存储地址,而不是ISA总线的地址,是网卡工作用的存储器),每256个字节称为一页,共有64页。页的地址就是地址的高8位,页地址为0x40-0x7f 。这16k的ram的一部分用来存放接收的数据包,一部分用来存储待发送的数据包。当然也可以给用户使用。(例如把网卡设置成使用8K的ram,另外8K的ram就可以用来给单片机作为存储器,但我没有这样做,原因是操作网卡上的r
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 开发指南 开发 指南 51 单片机 RTL8019 上网 编程
链接地址:https://www.31ppt.com/p-2392575.html