单片机如何控制以太网网卡进行传输数据

上传人:x**** 文档编号:62563514 上传时间:2022-03-15 格式:DOC 页数:74 大小:5.74MB
收藏 版权申诉 举报 下载
单片机如何控制以太网网卡进行传输数据_第1页
第1页 / 共74页
单片机如何控制以太网网卡进行传输数据_第2页
第2页 / 共74页
单片机如何控制以太网网卡进行传输数据_第3页
第3页 / 共74页
资源描述:

《单片机如何控制以太网网卡进行传输数据》由会员分享,可在线阅读,更多相关《单片机如何控制以太网网卡进行传输数据(74页珍藏版)》请在装配图网上搜索。

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协议等 。-以太网协议(用于10MBPS的以太网,作者以下所说的以太网均指10M以太网,而不是100M,1000M的以太网)以太网协议有两种,一种是IEEE802.2/IEEE802.3,还有一种是以太网的封装格式。现代的操作系统均能同时支持这两种类型的协议格式。因此对我们来说只需要了解其中的一种就够了,特别是对单片机来说,不可能支持太多的协议格式。以太网的物理传输帧:(仅介绍第二种格式)PRSDDASATYPEDATAPADFCS56位8位48位48位16位不超过1500字节可选32位P

4、R:同步位,用于收发双方的时钟同步,同时也指明了传输的速率(10M和100M的时钟频率不一样,所以100M网卡可以兼容10M网卡),是56位的二进制数0.SD: 分隔位,表示下面跟着的是真正的数据,而不是同步时钟,为8位的10101011,跟同步位不同的是最后2位是11而不是10.DA:目的地址,以太网的地址为48位(6个字节)二进制地址,表明该帧传输给哪个网卡.如果为FFFFFFFFFFFF,则是广播地址,广播地址的数据可以被任何网卡接收到.SA:源地址,48位,表明该帧的数据是哪个网卡发的,即发送端的网卡地址,同样是6个字节.-TYPE:类型字段,表明该帧的数据是什么类型的数据,不同的协议

5、的类型字段不同。如:0800H 表示数据为IP包,0806H 表示数据为ARP包,814CH是SNMP包,8137H为IPX/SPX包,(小于0600H的值是用于IEEE802的,表示数据包的长度。)-DATA:数据段 ,该段数据不能超过1500字节。因为以太网规定整个传输包的最大长度不能超过1514字节。(14字节为DA,SA,TYPE)-PAD:填充位。由于以太网帧传输的数据包最小不能小于60字节, 除去(DA,SA,TYPE 14字节),还必须传输46字节的数据,当数据段的数据不足46字节时,后面补000000.(当然也可以补其它值)-FCS:32位数据校验位.为32位的CRC校验,该校

6、验由网卡自动计算,自动生成,自动校验,自动在数据段后面填入.对于数据的校验算法,我们无需了解.-事实上,PR,SD,PAD,FCS这几个数据段我们不用理它 ,它是由网卡自动产生的,我们要理的是DA,SA,TYPE,DATA四个段的容.-所有数据位的传输由低位开始(但传输的位流是用曼彻斯特编码的) -以太网的冲突退避算法就不介绍了,它是由硬件自动执行的.DA+SA+TYPE+DATA+PAD最小为60字节,最大为1514字节.-以太网卡可以接收三种地址的数据,一个是广播地位,一个是多播地址(我们用不上),一个是它自已的地址.但网卡也可以设置为接收任何数据包(用于网络分析和监控).-任何两个网卡的

7、物理地址都是不一样的,是世界上唯一的,网卡地址由专门机构分配.不同厂家使用不同地址段,同一厂家的任何两个网卡的地址也是唯一 的.根据网卡的地址段(网卡地址的前三个字节),可以知道网卡的生产厂家.有些网卡的地址也可以由用户去设定,但一般不需要. (三)ISA总线接口定义ISA ISA=Industry Standard Architecture (isa总线)Pin Name Description 引脚名称含义A1/I/O CH CKI/O channel check; active low=parity error A2 D7 Data bit 7 A3 D6 Data bit 6 A4 D

8、5 Data bit 5 A5 D4 Data bit 4 A6 D3 Data bit 3 A7 D2 Data bit 2 A8 D1 Data bit 1 A9 D0 Data bit 0 A10 I/O CH RDY I/O Channel ready, pulled low to lengthen memory cycles A11 AEN Address enable; active high when DMA controls bus A12 A19 Address bit 19 A13 A18 Address bit 18 A14 A17 Address bit 17 A15

9、A16 Address bit 16 A16 A15 Address bit 15 A17 A14 Address bit 14 A18 A13 Address bit 13 A19 A12 Address bit 12 A20 A11 Address bit 11 A21 A10 Address bit 10 A22 A9 Address bit 9 A23 A8 Address bit 8 A24 A7 Address bit 7 A25 A6 Address bit 6 A26 A5 Address bit 5 A27 A4 Address bit 4 A28 A3 Address bi

10、t 3 A29 A2 Address bit 2 A30 A1 Address bit 1 A31 A0 Address bit 0 B1 GND Ground B2 RESET Active high to reset or initialize system logic B3 +5V +5 VDC B4 IRQ2 Interrupt Request 2 B5 -5VDC -5 VDC B6 DRQ2 DMA Request 2 B7 -12VDC -12 VDC B8 /NOWS No WaitState B9 +12VDC +12 VDC B10 GND Ground B11 /SMEM

11、W System Memory Write B12 /SMEMR System Memory Read B13 /IOW I/O Write B14 /IOR I/O Read B15 /DACK3 DMA Acknowledge 3 B16 DRQ3 DMA Request 3 B17 /DACK1 DMA Acknowledge 1 B18 DRQ1 DMA Request 1 B19 /REFRESH Refresh B20 CLOCK System Clock (67 ns, 8-8.33 MHz, 50% duty cycle) B21 IRQ7 Interrupt Request

12、7 B22 IRQ6 Interrupt Request 6 B23 IRQ5 Interrupt Request 5 B24 IRQ4 Interrupt Request 4 B25 IRQ3 Interrupt Request 3 B26 /DACK2 DMA Acknowledge 2 B27 T/C Terminal count; pulses high when DMA term. count reached B28 ALE Address Latch Enable B29 +5V +5 VDC B30 OSC High-speed Clock (70 ns, 14.31818 MH

13、z, 50% duty cycle) B31 GND Ground C1 SBHE System bus high enable (data available on SD8-15) C2 LA23 Address bit 23 C3 LA22 Address bit 22 C4 LA21 Address bit 21 C5 LA20 Address bit 20 C6 LA18 Address bit 19 C7 LA17 Address bit 18 C8 LA16 Address bit 17 C9 /MEMR Memory Read (Active on all memory read

14、 cycles) C10 /MEMW Memory Write (Active on all memory write cycles) C11 SD08 Data bit 8 C12 SD09 Data bit 9 C13 SD10 Data bit 10 C14 SD11 Data bit 11 C15 SD12 Data bit 12 C16 SD13 Data bit 13 C17 SD14 Data bit 14 C18 SD15 Data bit 15 D1 /MEMCS16 Memory 16-bit chip select (1 wait, 16-bit memory cycle

15、) D2 /IOCS16 I/O 16-bit chip select (1 wait, 16-bit I/O cycle) D3 IRQ10 Interrupt Request 10 D4 IRQ11 Interrupt Request 11 D5 IRQ12 Interrupt Request 12 D6 IRQ15 Interrupt Request 15 D7 IRQ14 Interrupt Request 14 D8 /DACK0 DMA Acknowledge 0 D9 DRQ0 DMA Request 0 D10 /DACK5 DMA Acknowledge 5 D11 DRQ5

16、 DMA Request 5 D12 /DACK6 DMA Acknowledge 6 D13 DRQ6 DMA Request 6 D14 /DACK7 DMA Acknowledge 7 D15 DRQ7 DMA Request 7 D16 +5 V D17 /MASTER Used with DRQ to gain control of system D18 GND Ground Note: Direction is Motherboard relative ISA-Cards. (四)89C52单片机与网卡接口电路图电路是由作者自己设计的,可能不是很标准,也可能不是理想的,但是它可以实

17、现。网卡是ne2000兼容型的网卡。作者所用的网卡是TP-LINK的TE-2008,接口为ISA接口,网卡的主芯片是RTL8019AS.此款网卡在电脑城可以买到。价钱不超过50元。如果买不到,也可以使用别的ne2000的兼容网卡,例如芯片Davicom的DM9008,NSI的DP8390,MXIC的MX98905,还有华邦的,dlink的。这些芯片的资料可以在本站的硬件程序下载区下载。但推荐使用RTL8019AS。为阅读以下的容,请在本站下载RTL8019AS的芯片资料。这是缩小的图,点击这里放大。放大的图可能还不是很清楚,要看更为清楚的图,点击这里下载SCH电路图。(可以用PROTEL 98

18、或PROTEL 99打开。如果你没有protel98,可以在本站下载protel98安装程序(要下载几个小时)。_电路用到的主要芯片有MAX232(串口的电平转换),24c02(IIC总线的 eeprom),373(8位锁存),62256(32K的RAM).其中的24C02也可以不要,可以通过存取网卡上的93C46来实现,但我没有这样 做。62256为外部32K的Ram,也可以不用,可以用网卡上的RAM来代替,但是网卡上的Ram的存取比较复杂,速度会比加62256慢。为了编程的 方便,和实现快的传输速度,以与为完成更为复杂的应用,推荐使用62256,用77E58单片机和外加62256,可以实现

19、500KBPS以上的传输速 度。电路图上方的两大块为ISA槽,网卡是插在这ISA槽上的。本站还有一个一体化的电路图,是将RTL8019AS也做到板上的,来自8052.lphard.cz ,这个还有现成的程序,是用asm写的,用到的I/O 300H.作者以下文章的描述全部基于自己的电路图,而不是来自8052.lphard.cz的电路图,请不要混在一起。作者的全部程序用C51编写,而不是汇编,为了方便大家移植和扩充。(五)接口电路图详解(1)-89c52单片机部分ISA接口的A,B部分.这是RTL8019网卡ISA的前半部分A1-A31(1.31),B1-B31(32.62)共62个引脚.DATA

20、0-DATA7是网卡的8位数据总线,接单片机的P0口.RESDRV(33脚)(RESET)接单片机的T0(P3.4),单片机用P3.4来复位网卡。IRQ9接单片机的INT0(P3.2),IRQ9是网卡的中断9,接到单片机的中断0上。(但我的程序没有使用中断操作,我是用查询操作的)IOR,IOW接到单片机的p3.6,p3.7(/WR,/RD)GND是地,VCC为5V的电源。 A0-A19为网卡的地址线,共20根,我们用到网卡的地址为十六进制的0240H-025FH, 转换为二进制为地址线A19A18A17A16A15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A0240H0

21、0000000001001000000.000000000010010XXXXX25FH00000000001001011111我们看到从地址240H到25FH,地址线的A19-A5是固定的 0010,因此A10-A19接地,A7-A8接地,ADDR8-ADDR15对应地址线的A0-A6.(实际上A5也可以 接地,这样可以减少一个单片机的引脚。这是作者在设计电路时没有注意到,同时A9也可以接VCC)。A0-A6(ADDR8-ADDR15)接单片机的P2口。因此当P2口为地址线A6,A9(ADDR15)A5(ADDR13)A4(ADDR12)A3(ADDR11)A2(ADDR10A1(ADDR9

22、)A0(ADDR8)10XXXXXP2口P2.7P2.5P2.4P2.3P2.2P2.1P2.010XXXXX当P2口为二进制 1X0XXXXX时 将选中网卡的I/O地址空间。在程序里,我使用110XXXXX来选中网卡的地址。地址映射: 单片机(P2口)也就是DPH网卡(I/O)11000000 (0C0H)240H110XXXXX2XXH11011111 (0DFH)25FH我在程序里定义了 reg00-reg1f 来对应240H25FH端口。#define reg00 XBYTE0xc000 /* 240H*/#define reg01 XBYTE0xc100 /* 241H*/#defi

23、ne reg02 XBYTE0xc200#define reg03 XBYTE0xc300.#define reg1f XBYTE0xDF00 /* 25FH*/ISA接口的C,D部分 这 是网卡的接口的后半部分,ISA槽的扩展部分。只用到GND,VCC,IOCS16.其中的IOCS16是16位I/O的选择脚。当网卡上电复位的时候, 这个脚为网卡的输入脚,如果这个脚为低电平,网卡将选择8位模式,如果这个脚为高电平,网卡将选择16位的模式。我用了个电阻R10下拉,因此在复位时, 这个脚为低电平,网卡选择8位模式。网卡可以兼容8位和16位操作。由于89c52是8位的 数据总线,因此要用网卡的8位总

24、线模式(每次读入或写入1个字节)。如果你是用80c196或dsp等16位总线的芯片的话,你可以使用16位的操作模 式,这样有更快的传输速度(每次读入或写入2个字节)。(16位总线时,这个下拉电阻去掉,不用接,同时网卡的DATA8-DATA15要接到你的 CPU的数据815上。DMA操作为16位)(六)接口电路图详解(2)-89c52单片机部分外部存储器62256和373。-这是外部存储器62256(32K字节的RAM),62256的DATA0-DATA7接单片机的P0口。/OE接单片机的/RD/WE接单片机的/WR/CE接单片机的P2.7A0-A14接单片机的P2.0-P2.6-373的DAT

25、A0-DATA7接单片机的P0口/OE接地LE接单片机的ALE。因此外部存储器62256占用单片机的外部数据地址空间0000H-7FFFH,共32K字节。我们使用外部RAM的目的是提高单片机的数据传输速度,和复杂的TCP/IP的处理。由于以太网的包最大可以有1500多字节,89c52单片机是无法存 储这么大的包的,只有放到外部的RAM里。同时这外部的RAM也用作串行口的输入输出缓冲。以使单片机可以高速的吞吐数据。(用网卡上的RAM来代替 62256会影响速度)MAX232,24c02 24C02是IIC总线的eeprom,可以用来存储用户的一些设置,比如IP地址,网关等。SCL接单片机的T1(

26、P3.5)SDA接单片机的INT1(P3.3)MAX232为串口电平转换电路。CPUTXD接单片机的TXDCPURXD接单片机的RXDPCRXD和PCTXD是RS232电平,为标准串口电平。数据可以从串口输入到单片机,单片机再把数据送到网卡传出去。晶振可以用11.0592Mhz,也可以用22.1184Mhz,或更高的频率。 (七)网卡上电复位-当你买到一个新的RTL8019AS网卡,你要先将该网卡设置为以下的配置:操作方式Operating Mode:跳线方式Jumperless(不是即插即用Plug and Play)端口I/O base:0240-25FH中断Interrupt: 2/9(

27、我的程序没有用到网卡中断,所以也可以不用设置)你要将这个网卡插到你的电脑里,用这个网卡带的设置程序RSET8019.exe将这个卡按照上面的配置设置好。(最好在纯DOS方式下设置) . 在介绍网卡驱动程序之前,先介绍一下RTL8019AS的基本情况:输入输出地址:共32个,地址偏移量为00H-1FH,(对应于240H25FH,240H的地址偏移量为0,241H的地址偏移量为1,。25FH的地址偏移量为1FH)。其中00H0FH共16个地址,为寄存器地址。10H17H共8个地址,为DMA地址。18H1FH共8个地址,为复位端口。对于8位的操作方式,上面的地址中只有18个是有用的:00H0FH共1

28、6个寄存器地址。10H DMA地址 (10H17H的8个地址是一样的,都可以用来做DMA端口,只要用其中的一个就可以了)1FH 复位地址。(18H到1FH共8个地址都是复位地址,每个地址的功能都是一样的,只要其中的一个就可以了,但实际上只有18H,1AH,1CH,1EH这 几个复位端口是有效的,其他不要使用,有些兼容卡不支持19H,1BH,1DH等奇数地址的复位)跟复位有关的引脚:RSTDRV连接到ISA总线的RSTDRV的引脚上。RSTDRV同时也是ISA总线的复位信号。RSTDRV为高电平有效,至少需要 800ns的宽度。给该引脚施加一个1us以上的高电平就可以复位。施加一个高电平之后,然

29、后施加一个低电平。RSTDRV从高电平到低电平之后要等多久,单片机才可以对网卡进行操作?复位的过程将执行一些操作,比如将93c46读入,将部寄存器初始化等。这些至少需要2毫秒的时间。我们推荐大家等待更久的时间之后才对网卡操作,比如100毫秒之后才对它操作,以确保完全复位。对RSTDRV可以接单片机的一个引脚进行对网卡的复位。但也可以直接将RSTDRV跟单片机的RESET引脚并联,单片机复位的时候,网卡也复位,以减 少一个单片机的引脚的使用。这种情况下,为了保证能够完全复位,可以使用下面介绍的热复位代码。 跟复位有关的寄存器:18H1FH共8个地址,为复位端口。对该端口偶数地址的读,或者写入任何

30、数,都引起网卡的复位。跟复位有关的标志位: 其中的第7位RST跟复位有关。网卡执行正确的复位之后该位为1。在linux或windows的驱动程序中,一般在复位之后检查该标志位以确认是否正确复位,特别是在即插即用的检测过 程中。对于我们用单片机控制网卡来说,我们可以不检查该标志位,因为如果复位不正常的情况通常是网卡坏了。寄存器:00H0FH共16个地址是寄存器地址。寄存器分成4 页PAGE0-PAGE3,但NE2000兼容的寄存器只有3页(Page0-Page2),(第四页是RTL8019AS自己定义的,我们不用去管这 些寄存器,因为你对第四页的寄存器的操作仅对这个网卡是有效的,如果你换成其他N

31、e2000兼容的网卡,例如DM9008,DP8390等,你的程序将无 常运行。 为了保证驱动程序对所有Ne2000的网卡有效,不要去操作第四页的寄存器)由于寄存器较多,我将在用到该寄存器的时候才对该寄存器介绍。对网卡进行复位:这是网卡驱动程序的需要做的第一个容,由于我们将网卡设置为跳线模式,而不是即插即用的模式,RTL8019AS.PDF中介绍的PLUG and PLAY的一些过程,我们不需要做,因为单片机的资源有限,能够减少的操作,都尽量减少。程序从main()开始执行:#include /*my.h 为作者所用的头文件,包含所有89c52寄存器的大写和小写的定义,和一些常用的子函数,一些宏

32、的定义*/main()delaymsecond(10);/延时大约1秒,保证电源稳定和网卡自身的上电完成。netcardreset();/复位网卡的子程序 。下面介绍网卡的复位子程序:#define reg1f XBYTE0xdf00 /网卡的复位端口的地址,对应于网卡的地址25FH。#define uint unsigned int /uint 代表unsigned int ,作者一般使用缩写uint#define uchar unsigned char /uchar 代表unsigned char,我比较懒,不愿意多写sbit reset=p34; /单片机的p3.4脚连接到网卡的RSTD

33、RV复位引脚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+); 上面所讲的实际上是网卡复位的两种情况,reset=1;reset=0相当于冷复位temp=reg1f;reg1f=temp相当于热复位对网卡

34、的复位端口的读或写将复位网卡,网卡部将执行复位过程。读写是随意的,写入任意的数都将复位网卡。 实际上只要使用冷复位就可以了,热复位程序可以不要。热复位主要在电脑里有用,冷复位就像电脑的冷启动,热复位相当于电脑的热启动。作者的复位网卡的过程是简化了的,一个电脑里的复位过程是比较复杂的,如果你有网卡驱动的UNIX,LINUX程序的源代码,它的代码将会做一些判断和检查,检查网卡是否存在,和是否工作正常,和是否存在地址和中断冲突 。但在我们的这个系统里可以省去这些,我们认为网卡的地址和I/O是没有冲突和正常工作的。当然如果读者愿意,也可以写一些检查代码。(八)网卡初始化- 完成复位之后,你要对网卡的工

35、作参数进行设置.以使网卡开始工作.先介绍一个子函数#define reg00 XBYTE0xc000 /对应于地址240H 为命令寄存器CR地址void page(uchar pagenumber) uchar data temp; temp=reg00;/command register temp=temp&0x3f;pagenumber=pagenumber 6; temp=temp | pagenumber;reg00=temp;错误修正:(2001年11月10日) :以上程序有问题,在中断驱动或发送数据包不作等待时,因为发送数据包的命令是让TXP置位,如果在发送数据包的过程中,使用该函

36、数,就会不断地向外发送 数据包.原因是TXP置位之后,只能是发完数据包的时候,由网卡部将TXP位清0,命令不能使TXP清0,对该位写入0没有作用.读取时要屏蔽该位,上 面的程序修正如下,请用户使用下面的程序:void page(uchar pagenumber)uchar data temp;temp=reg00;temp=temp&0x3B; /注意不是0x3F ,TXP位在平时一定要置为0.pagenumber=pagenumber6temp=temp|pagenumber;reg00=temp;从实验当中也发现,只要再置位TXP位就可以重发该数据包(重发数据包时,不需要设置TPSTART

37、,TBCR0,TBCR1). 作用是选择指定的页,网卡共有4页寄存器,Ne2000兼容的有3页。第四页可以不用。 reg00命令寄存器:CR,command register,地址偏移量00H,为一个字节位76543210名字PS1PS0RD2RD1RD0TXPSTASTPPS1和PS0这两个位用来选择寄存器页,PS1 PS0=00时选择寄存器页0,=01时选择寄存器页1, =10时选择寄存器页2,=11时选择寄存器页3.上面的程序的参数为pagenumber,用来指定第几页。temp=reg00 ;/读入命令寄存器的值。temp=temp&0x3f;/将高2位,即PS1,PS0清0pagen

38、umber=pagenumber6;/将低2位移至高端temp=temp|pagenumber, /写入高2位reg00=temp; /设置第几页当然也可以写成更加简单的几句:temp=reg00&0x3f;pagenumber=pagenumber6;reg00=temp|pagenumber; 但这样对读者来说不好理解。从执行的速度来说,上面的代码也不是最快的。但作者主要讲述原理,而不是探讨最快的实现。RD2,RD1,RD0这3个位代表要执行的功能。001 读网卡存010 写网卡存011 发送网卡数据包1* 完成或结束DMA的读写操作TXP这个位写入1时发送数据包,发完自动清零STA,ST

39、P这两个位用来启动命令或停止命令10 启动命令01 停止命令下面介绍网卡的初始化子程序:void ne2000init() reg00=0x21; /选择页0的寄存器,网卡停止运行,因为还没有初始化。reg01=0x4c; /寄存器Pstartreg02=0x80; /Pstopreg03=0x4c; /BNRYreg04=0x45; /TPSRreg0c=0xcc; /RCRreg0d=0xe0; /TCRreg0e=0xc8; /DCR 数据配置寄存器 8位数据dma reg0f=0x00; /IMR disable all interrupt page(1); /选择页1的寄存器reg0

40、7=0x4d; /CURRreg08=0x00; /MAR0reg09=0x41; /MAR1reg0a=0x00; /MAR2reg0b=0x80; /MAR3reg0c=0x00; /MAR4reg0d=0x00; /MAR5reg0e=0x00; /MAR6reg0f=0x00; /MAR7reg00=0x22;/选择页0寄存器,网卡执行命令。 PSTART 接收缓冲区的起始页的地址。PSTOP 接收缓冲区的结束页地址。(该页不用于接收)BNRY 指向最后一个已经读取的页(读指针)CURR 当前的接收结束页地址。(写指针)网卡含有16K字节的RAM,地址为0x4000-0x7fff(指的

41、是网卡上的存储地址,而不是ISA总线的地址,是网卡工作用的存储器),每256个字节称为一页,共有64页。页的地址就是地址的高8位,页地址为0x40-0x7f 。这16k的ram的一部分用来存放接收的数据包,一部分用来存储待发送的数据包。当然也可以给用户使用。(例如把网卡设置成使用8K的ram,另外8K的ram就可以用来给单片机作为存储器,但我没有这样做,原因是操作网卡上的ram比较复杂)在我的程序中使用0x40-0x4B为网卡的发送缓冲区,共12页,刚好可以存储2个最大的以太网包。使用0x4c0x7f为网卡的接收缓冲区, 共52页。因此PSTART=0x4c,PSTOP=0x80(0x80为停

42、止页,就是直到0x7f,是接收缓冲区,不包括0x80) 刚开始,网卡没有接收到任何数据包,所以,BNRY设置为指向第一个接收缓冲区的页0x4c) 这四个寄存器用于接收的设置。CURR是网卡写存的指针。它指向当前正在写的页的下一页。那么初始化它就应该指向0x4c10x4d 。网卡写完接收缓冲区一页,就将这个页地址加一,CURRCURR1。这是网卡自动加的。当加到最后的空页(这里是0x80,PSTOP)时,将CURR置为接收缓冲区的第一页(这里是 0x4c,PSTART),也是网卡自动完成的。当CURRBNRY时,表示缓冲区全部被存满,数据没有被用户读走,这时网卡将停止往存写数据,新收 到的数据包

43、将被丢弃不要,而不覆盖旧的数据。此时实际上出现了存溢出。而BNRR要由用户来操作。用户从网卡读走一页数据,要将BNRY加一,然后再写到BNRY寄存器。 当BNRY加到最后的空页(0x80,PSTOP)时,同样要将BNRY变成第一个接收页(PSTART,0x4c)BNRY=0x4c;CURR和BNRY主要用来控制缓冲区的存取过程,保证能顺次写入和读出)。当CURR=BNRY+1(或当BNRY0x7f ,CURR=0x4c)时,网卡的接收缓冲区里没有数据,表示没有收到数据包。 用户通过这个判断知道没有包可以读。当上述条件不成立时,表示接收到新的数据包。然后用户应该读取数据包,直到上述条件成立时,表

44、示所以数据包已经读完, 此时停止读取数据包。TPSR 为发送页的起始页地址。初始化为指向第一个发送缓冲区的页,0x40。RCR 接收配置寄存器,设置为使用接收缓冲区,仅接收自己的地址的数据包(以与广播地址数据包)和多点播送地址包,小于64字节的包丢弃(这是协议的规定,设置成接收是用于网络分析),校验错的数据包不接收。TCR 发送配置寄存器,启用crc自动生成和自动校验,工作在正常模式。DCR 数据配置寄存器,设置为使用FIFO缓存,普通模式,8位数据传输模式,字节顺序为高位字节在前,低位字节在后(符合我们的习惯)(如果用16位的单片机,设置成16位的数据总线操作会更快,但80c52是8位总线的

45、单片机)IMR 中断屏蔽寄存器,设置成0x00,屏蔽所有的中断。设置成0xff将允许中断)MAR0MAR8是设置多点播送的参数,这点我也不是很清楚,我从电脑读出来是什么数,我也将这8个寄存器设置成这几个数. 由于我们不使用多点播送,所以不要紧,只要保证网卡能正常工作就可以了。PAGE2的寄存器是只读的,所以不可以设置,不用设置,PAGE3的寄存器不是NE2000兼容的,所以也不用设置。 (九)读取网卡的网卡地址- 完成上面的过程之后,网卡还不能正确的接收数据包,因为我们还没有对网卡的物理地址(网卡地址,48位的地址)进行设置。网卡还不知道它应该什么地址的数据包。要对网卡的物理地址进行设置,就必

46、须知道网卡的物理地址是多少。读取网卡的物理地址的子程序:union u uint word; structuchar high;uchar low;bytes; /我定义的数据结构,为两个字节的结构 /,可以按照uint(unsigned int)来读取,也可以按照高低字节high和low来读取。 union u mynodeid3;/存储网卡的物理地址union u protocal; /临时变量void readmynodeid() uchar data i,temp;page(0);reg09=0;/寄存器RSAR1 dma read highaddress=0 reg08=0;/RSA

47、R0 dma read lowaddress=0;reg0b=0; /RBCR1 read count high reg0a=12;/RBCR0 count low reg00=0x0a;/dma read and startfor (i=0;i6;i+) temp=reg10;/读取一个字节if (i % 2=0)protocal.bytes.high=temp;else protocal.bytes.low=temp;mynodeidi/2.word=protocal.word;temp=reg10;/读取一个重复的字节,这个字节被丢弃-网卡除了16k(地址0x40000x7FFFF)的接

48、收发送存储RAM之外,还有别的RAM,还有一块大小为256字节的RAM,地址为0x00000x00FF,这部分RAM是eeprom 93C46的影像存储(不完全一样),存储的容的一部分跟93C46存储的是一样的。 网卡在上电的时候将93C46的一部分容读到这256字节的RAM里。存储是WORD类型,其中地址:0x0000-0x000b共12个字节是网卡的物理地址。(网卡的物理地址是6个字节的,为什么要用12字节?因为这12字节是重复存储的。例如网卡物理地址0x52544CC118CF,存储在0x0000-0x000b里是这样的:525254544C4CC1C11818CFCF我们可以看到单和双

49、的地址存储的是一样的。0x000b后面的地址存储的是生产厂商的代码和产品标识代码,也是单双地址重复存储,这里就不说了。 这个程序又用到4个新的寄存器:RSAR1 RSAR0 RBCR1 RBCR0这4个寄存器是专门用于读取网卡上面的ram的。RSAR1 网卡上的RAM的起始地址高8位RSAR0 网卡上的RAM的起始地址低8位程序中的reg09,reg08都设成0,所以是从网卡上的0x0000地址开始读。RBCR1 要读取的字节数的计数(高8位)RBCR0 要读取的字节数的计数(低8位)程序中的reg0b0,reg0a=12,所以要读取12个字节。 reg00=0x0a 的意思是进行DMA的存读

50、取操作。结果将网卡地址存储在mynodeid3(共6个字节)里。 (十)设置网卡地址- 很久没有写网卡的文章了,很多网友很关心其他方面的容,也只好写下去.以下程序是设置网卡的地址,只有符合这个地址的数据包才接收.void writemynodeid() page(1);reg01=mynodeid0.bytes.high; /PAR0reg02=mynodeid0.bytes.low; /PAR1reg03=mynodeid1.bytes.high; /PAR2reg04=mynodeid1.bytes.low; /PAR3reg05=mynodeid2.bytes.high; /PAR4re

51、g06=mynodeid2.bytes.low; /PAR5又用到几个新的寄存器,是页1的几个寄存器:PAR0,PAR1, PAR2, PAR3,PAR4,PAR5这几个寄存器是网卡的工作时候用的地址,只有符合这个地址的数据包才接收,这个地址是可以设置为其他的值,不一定设置为网卡的物理地址,为了不跟别的网卡地址冲突,最好设置为网卡的地址,(如果用户需要设置为其他的值,也是可以的).(十一)RTL8019AS网卡的电路图有些人想做成一体化的电路板,我在这里提供一下RTL8019AS网卡的电路图。电路图为双端口的网卡(含utp和bnc接口)。有该原理图,就可以自己制造isa接口的网卡。 (十二)R

52、TL8019AS的跳线方式rtl8019as有3种工作方式:第一种为跳线方式,网卡的i/o和中断由跳线决定第二种为即插即用方式,由软件进行自动配置plug and play第三种为免跳线方式,网卡的i/o和中断由外接的93c46里的容决定。我们买到的网卡一般只支持第2和第3种。在嵌入式应用的 场合,如果可以不使用93c46的话,可以降低成本,同时又减少连线。那么我们如何使用第1种方式跳线方式呢?网卡使用哪种方式由rtl8019as的第65脚JP决定。我们来看引脚图:第65脚jp是输入引脚,当65脚为低电平时,8019工作在第2种或第3种方式,具体由 93c46里的容决定。我们买到的 rtl80

53、19as网卡一般第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线双绞或同轴电缆

54、。高电平时使用aui接口,悬空为低电平,使用bnc接口。我们将该引脚悬空即可。65脚jp 为高电平时(接到vcc或通过一个10k的电阻上拉)使用跳线方式,这时芯片的i/o地址由以下几个引脚85,84,82,81(IOS3.IOS0)决定:芯片的中断线由以下引脚80,79,78(IRQS2.IRQS0)决定:芯片的brom地址由以下引脚72,71,69,68,67(BS4.BS0)决定:在嵌入式领域一般都不用该brom。brom是boot rom的缩写。在电脑里用来做无盘工作站时候用到,可以从网卡进行引导,而不是从a盘,c盘等引导系统。网络接口类型由74,77(PL0,PL1)引脚决定:我们使用

55、第一种自动检测就可以了。会自动检测接口类型然后进行工作。自动检测是用同轴还是双绞线。作为一个例子来自8052.lphard.cz的电路图,该电路图没有使用中断方式工作,使用跳线方式,所以没有接93c46,I/O地址用的是300H,网络接口为bnc(双绞线),没有使用brom),他使用at89c8252单片机运行在14.74兆赫,支持 协议,24c512用来存储网页,FC22为耦合隔离变压器模块:(十三)网卡地址和多点播送(组播)与广播以太网的地址为48位,由ieee统一分配给网卡制造商,每个网卡的地址都必须是全球唯一的。共6个字节的长度,以下是按我们通常的顺序(不是按ieee的顺序,ieee的

56、顺序为在一个字节中,低位在前,高位在后)字节543210位47。4039。3231。2423。1615。87。0例子080009A04AB1我们需要注意的是以太网地址的第40位是组播地址的标志位(第一个字节的最低位)(如果以ieee的顺序为第47位为组播地址,第一个字节的高位):第41位是本地管理地址,该位为1表示自行分配的地址,非ieee分配的地址,(类似于ip地址的网地址),自行保证任一地址不同即可,用于自建的封闭的网络)位47。42414039。2423。0制造厂商标识本地管理地址组播标志位制造厂商标识系列号共6个字节,其中前面3个字节(除了第40位,41位),组成制造厂商的标识,每个制

57、造厂商的前3个字节是不同的,如果两个网卡的前面3个字节是一样的, 那么这个卡是同一个公司制造的。同时通过该3个字节就可以反过来知道这个卡是哪个厂制造的。后面3个字节为系列号,由制造厂商给自己生产的网卡分配一个号 码,不同网卡的必须不同, 网卡地址的制造厂商的3个字节的标识中,例如上面的08:00:09 ,080009 是惠普公司的标识,表示这个卡是惠普公司制造的。3个字节的第一个字节,必须为偶数,上面的08是一个偶数,是因为第40位,就是第一个字节的最低位是组 播标识,必须为0。以下X0:XX:XX:XX:XX:XXX2:XX:XX:XX:XX:XXX4:XX:XX:XX:XX:XX X6:X

58、X:XX:XX:XX:XXX8:XX:XX:XX:XX:XXXA:XX:XX:XX:XX:XXXC:XX:XX:XX:XX:XX XE:XX:XX:XX:XX:XX为合法的以太网网卡地址。上面的X代表0F中的任一个。如果你不是购买网卡,而是自己购买 芯片制造,那么地址怎么办?可以自己使用一个还没有被ieee分配的厂商编号就可以了。就算是使用已经分配的厂商编号也没有不可,只要你能保证在你使用的 局域网,任何两个网卡的地址不一样就可以了。地址 FF:FF:FF:FF:FF:FF 为广播地址,只能用在目的地址段,不能作为源地址段。目的地址为广播地址的数据包,可以被一个局域网的所有网卡接收到。地址X1

59、:XX:XX:XX:XX:XXX3:XX:XX:XX:XX:XXX5:XX:XX:XX:XX:XX X7:XX:XX:XX:XX:XXX9:XX:XX:XX:XX:XXXB:XX:XX:XX:XX:XXXD:XX:XX:XX:XX:XX XF:XX:XX:XX:XX:XX 为组播地址,只能作为目的地址,不能作为源地址。组播地址可以被支持该组播地址的一组网卡接收到。组播地址主要用在视频广播,远程唤醒(通过发一个特殊的数据包使网卡产生一个中断信号,启动电脑),游戏(多个人在局域网里联机打游戏)里等。以下是一些具体的组播地址:地址 围01:00:5E:00:00:00-01:00:5E:7F:FF:

60、FF 用于ip地址的组播其他组播地址跟tcp/ip无关,不做介绍。网卡可以接收以下3种地址的数据包:第一种 目的地址跟自己的网卡地址是一样的数据包第二种 目的地址为FF:FF:FF:FF:FF:FF广播地址的数据包第三种 目的地址为跟自己的组播地址围一样的数据包那么在以太网的应用当中,如果你希望你的数据包只发给一个网卡,目的地址用对方的网卡地址如果你想把数据包发给所有的网卡,目的地址用广播地址如果你想把数据包发给一组网卡,目的地址用组播地址。rtl8019跟网卡地址有关的寄存器: 物理地址寄存器,位于page1,共6个字节,这就是网卡的地址,复位之后该6个寄存器的值是不定的。要由用户将网卡地址写入到该6个寄存器中,以后网卡接收到的数据包,会将数据包的目的地址跟这6个寄存器的值进行比较,结果一样的数据包被接收下来。上电 复位时从93c46读入的网卡地址不会自

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!