单片机如何控制以太网网卡进行传输数据.docx
- 文档编号:4568686
- 上传时间:2022-12-06
- 格式:DOCX
- 页数:24
- 大小:40.82KB
单片机如何控制以太网网卡进行传输数据.docx
《单片机如何控制以太网网卡进行传输数据.docx》由会员分享,可在线阅读,更多相关《单片机如何控制以太网网卡进行传输数据.docx(24页珍藏版)》请在冰豆网上搜索。
单片机如何控制以太网网卡进行传输数据
单片机如何控制以太网网卡进行传输数据-图文
(一)绪言
——单片机如何控制以太网网卡进行传输数据,如何加载TCP/IP协议连接到互联网,这些都是一些令人感兴趣的问题。
——可以说以太网和TCP/IP协议已经成为使用最广泛的协议,而其它总线协议如RS485、RS232,CAN,LANWORKS,都只是一些局部系统的总线。
——围绕以太网而制造的集线器,交换机已进入大小公司,企业,家庭。
我现在在众达天网公司,由于公司是搞电脑防火墙的,所以对网络的接触也越来越多,我研究的主要是网络的底层,并掌握了很多网络分析工具如(SNIFFER),对以太网和TCP/IP协议的研究就更加深入了。
——我比较熟悉的网卡是10M的网卡,100M的以太网卡还在研究之中。
曾经用单片机(89C52)控制和驱动10M的NE2000兼容型以太网卡与电脑主机传输数据。
——现在将我的一些研究成果写成一系列的文单,提供给大家。
也许有一天研究了100M的网卡之后,可以让单片机驱动它,那是可能的事,只不过接口可能会复杂一些。
——我所写的驱动程序并不是标准的,因为我没有学过UNIX,无法使用UNIX提供的原代码。
如果能使用UNIX的原代码,那将是很好的事。
我也正在接触UNIX和VC++,DDK等方面的内容,希望有一天能够重写我现在所写的驱动程序。
——我知道有很多人在了解单片机与以太网方面的东西,在BBS上也发现了很多这方面的内容,有些人的研究甚至比我还深入,我也希望能跟这些人交流交流,如果对我的文章感兴趣,当然可以给我发电子邮件啦。
——在接下来的文章将介绍以太网协议,网卡驱动,IP协议,ICMP协议,ARP协议,TCP协议等。
----为帮助读者开发该tcp/ip的应用,本站制作了以太网开发板,可以购买。
(二)以太网协议
——--以太网协议(用于10MBPS的以太网,作者以下所说的以太网均指10M以太网,而不是100M,1000M的以太网)
——以太网协议有两种,一种是IEEE802.2/IEEE802.3,还有一种是以太网的封装格式。
——现代的操作系统均能同时支持这两种类型的协议格式。
因此对我们来说只需要了解其中的一种就够了,特别是对单片机来说,不可能支持太多的协议格式。
——以太网的物理传输帧:
(仅介绍第二种格式)
PR56位SDDASATYPEDATAPADFCS32位8位48位48位16位不超过1500字节可选——PR:
同步位,用于收发双方的时钟同步,同时也指明了传输的速率(10M和100M的时钟频率不一样,所以100M网卡可以兼容10M网卡),是56位的二进制数101010101010.....
——SD:
分隔位,表示下面跟着的是真正的数据,而不是同步时钟,为8位的10101011,跟同步位不同的是最后2位是11而不是10.
——DA:
目的地址,以太网的地址为48位(6个字节)二进制地址,表明该帧传输给哪个网卡.如果为FFFFFFFFFFFF,则是广播地址,广播地址的数据可以被任何网卡接收到.
——SA:
源地址,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,TYPE14字节),还必须传输46字节的数据,当数据段的数据不足46字节时,后面补000000.....(当然也可以补其它值)----FCS:
32位数据校验位.为32位的CRC校验,该校验由网卡自动计算,自动生成,自动校验,自动在数据段后面填入.对于数据的校验算法,我们无需了解.
----事实上,PR,SD,PAD,FCS这几个数据段我们不用理它,它是由网卡自动产生的,我们要理的是DA,SA,TYPE,DATA四个段的内容.
----所有数据位的传输由低位开始(但传输的位流是用曼彻斯特编码的)----以太网的冲突退避算法就不介绍了,它是由硬件自动执行的.DA+SA+TYPE+DATA+PAD最小为60字节,最大为1514字节.
----以太网卡可以接收三种地址的数据,一个是广播地位,一个是多播地址(我们用不上),一个是它自已的地址.但网卡也可以设置为接收任何数据包(用于网络分析和监控).
----任何两个网卡的物理地址都是不一样的,是世界上唯一的,网卡地址由专门机构分配.不同厂家使用不同地址段,同一厂家的任何两个网卡的地址也是唯一的.根据网卡的地址段(网卡地址的前三个字节),可以知道网卡的生产厂家.有些网卡的地址也可以由用户去设定,但一般不需要.(三)ISA总线接口定义
ISAISA=IndustryStandardArchitecture(isa总线)
PinNameDescription引脚名称含义
A1/I/OCHCKI/Ochannelcheck;activelow=parityerrorA2D7Databit7A3D6Databit6A4D5Databit5A5D4Databit4A6D3Databit3A7D2Databit2A8D1Databit1A9D0Databit0
A10I/OCHRDYI/OChannelready,pulledlowtolengthenmemorycyclesA11AENAddressenable;activehighwhenDMAcontrolsbusA12A19Addressbit19A13A18Addressbit18A14A17Addressbit17A15A16Addressbit16A16A15Addressbit15A17A14Addressbit14A18A13Addressbit13A19A12Addressbit12A20A11Addressbit11A21A10Addressbit10A22A9Addressbit9A23A8Addressbit8A24A7Addressbit7A25A6Addressbit6A26A5Addressbit5A27A4Addressbit4A28A3Addressbit3A29A2Addressbit2A30A1Addressbit1A31A0Addressbit0B1GNDGround
B2RESETActivehightoresetorinitializesystemlogicB3+5V+5VDC
B4IRQ2InterruptRequest2B5-5VDC-5VDCB6DRQ2DMARequest2B7-12VDC-12VDCB8/NOWSNoWaitStateB9+12VDC+12VDCB10GNDGround
B11/SMEMWSystemMemoryWriteB12/SMEMRSystemMemoryReadB13/IOWI/OWrite
B14/IORI/ORead
B15/DACK3DMAAcknowledge3B16DRQ3DMARequest3B17/DACK1DMAAcknowledge1B18DRQ1DMARequest1B19/REFRESHRefresh
B20CLOCKSystemClock(67ns,8-8.33MHz,50%dutycycle)B21IRQ7InterruptRequest7B22IRQ6InterruptRequest6B23IRQ5InterruptRequest5B24IRQ4InterruptRequest4B25IRQ3InterruptRequest3B26/DACK2DMAAcknowledge2
B27T/CTerminalcount;pulseshighwhenDMAterm.countreachedB28ALEAddressLatchEnableB29+5V+5VDC
B30OSCHigh-speedClock(70ns,14.31818MHz,50%dutycycle)B31GNDGround
C1SBHESystembushighenable(dataavailableonSD8-15)C2LA23Addressbit23C3LA22Addressbit22C4LA21Addressbit21C5LA20Addressbit20C6LA18Addressbit19C7LA17Addressbit18C8LA16Addressbit17
C9/MEMRMemoryRead(Activeonallmemoryreadcycles)C10/MEMWMemoryWrite(Activeonallmemorywritecycles)C11SD08Databit8C12SD09Databit9C13SD10Databit10C14SD11Databit11C15SD12Databit12C16SD13Databit13C17SD14Databit14C18SD15Databit15
D1/MEMCS16Memory16-bitchipselect(1wait,16-bitmemorycycle)D2/IOCS16I/O16-bitchipselect(1wait,16-bitI/Ocycle)D3IRQ10InterruptRequest10D4IRQ11InterruptRequest11D5IRQ12InterruptRequest12D6IRQ15InterruptRequest15D7IRQ14InterruptRequest14D8/DACK0DMAAcknowledge0
D9DRQ0DMARequest0D10/DACK5DMAAcknowledge5D11DRQ5DMARequest5D12/DACK6DMAAcknowledge6D13DRQ6DMARequest6D14/DACK7DMAAcknowledge7D15DRQ7DMARequest7D16+5V
D17/MASTERUsedwithDRQtogaincontrolofsystem
D18GNDGroundNote:
DirectionisMotherboardrelativeISA-Cards.(五)接口电路图详解
(1)----89c52单片机部分
——ISA接口的A,B部分.
这是RTL8019网卡ISA的前半部分A1--A31(1...31),B1--B31(32...62)共62个引脚.DATA0--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的电源。
地址A19A18A17A16A15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A0线240H00000000001001000000...000000000010010XXXXX25FH00000000001001011111A0--A19为网卡的地址线,共20根,我们用到网卡的地址为十六进制的0240H---025FH,转换为二进制为我们看到从地址240H到25FH,地址线的A19---A5是固定的000000000010010,因此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)A0(ADDR8)1P2.710P2.50XP2.4XXP2.3XXP2.2XXP2.1XXP2.0X因此当P2口为
当P2口为二进制1X0XXXXX时将选中网卡的I/O地址空间。
在程序里,我使用110XXXXX来选中网卡的地址。
地址映射:
单片机(P2口)也就是DPH11000000(0C0H)110XXXXX11011111(0DFH)我在程序里定义了reg00--reg1f来对应240H--25FH端口。
#definereg00XBYTE[0xc000]/*240H*/#definereg01XBYTE[0xc100]/*241H*/#definereg02XBYTE[0xc200]#definereg03XBYTE[0xc300]...
#definereg1fXBYTE[0xDF00]/*25FH*/---ISA接口的C,D部分
网卡(I/O)240H2XXH25FH
这是网卡的接口的后半部分,ISA槽的扩展部分。
只用到GND,VCC,IOCS16.其中的IOCS16是16位I/O的选择脚。
当网卡上电复位的时候,这个脚为网卡的输入脚,如果这个脚为低电平,网卡将选择8位模式,如果这个脚为高电平,网卡将选择16位的模式。
我用了个电阻R10下拉,因此在复位时,这个脚为低电平,网卡选择8位模式。
--网卡可以兼容8位和16位操作。
由于89c52是8位的数据总线,因此要用网卡的8位总线模式(每次读入或写入1个字节)。
如果你是用80c196或dsp等16位总线的芯片的话,你可以使用16位的操作模式,这样有更快的传输速度(每次读入或写入2个字节)。
(16位总线时,这个下拉电阻去掉,不用接,同时网卡的DATA8--DATA15要接到你的CPU的数据8--15上。
DMA操作为16位)(六)接口电路图详解
(2)----89c52单片机部分
——外部存储器62256和373。
--这是外部存储器62256(32K字节的RAM),62256的DATA0--DATA7接单片机的P0口。
/OE接单片机的/RD/WE接单片机的/WR/CE接单片机的P2.7
A0--A14接单片机的P2.0-P2.6
----373的
DATA0--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(P3.5)SDA接单片机的INT1(P3.3)
---MAX232为串口电平转换电路。
CPUTXD接单片机的TXDCPURXD接单片机的RXD
PCRXD和PCTXD是RS-232电平,为标准串口电平。
数据可以从串口输入到单片机,单片机再把数据送到网卡传出去。
晶振可以用11.0592Mhz,也可以用22.1184Mhz,或更高的频率。
(七)网卡上电复位
----当你买到一个新的RTL8019AS网卡,你要先将该网卡设置为以下的配置:
操作方式OperatingMode:
跳线方式Jumperless(不是即插即用PlugandPlay)端口I/Obase:
0240-25FH
中断Interrupt:
2/9(我的程序没有用到网卡中断,所以也可以不用设置)
你要将这个网卡插到你的电脑里,用这个网卡带的设置程序RSET8019.exe将这个卡按照上面的配置设置好。
(最好在纯DOS方式下设置).
--在介绍网卡驱动程序之前,先介绍一下RTL8019AS的基本情况:
输入输出地址:
共32个,地址偏移量为00H--1FH,(对应于240H--25FH,240H的地址偏移量为0,241H的地址偏移量为1,。
。
。
25FH的地址偏移量为1FH)。
其中00H--0FH共16个地址,为寄存器地址。
10H--17H共8个地址,为DMA地址。
18H--1FH共8个地址,为复位端口。
对于8位的操作方式,上面的地址中只有18个是有用的:
00H--0FH共16个寄存器地址。
10HDMA地址(10H--17H的8个地址是一样的,都可以用来做DMA端口,只要用其中的一个就可以了)1FH复位地址。
(18H到1FH共8个地址都是复位地址,每个地址的功能都是一样的,只要其中的一个就可以了,但实际上只有18H,1AH,1CH,1EH这几个复位端口是有效的,其他不要使用,有些兼容卡不支持19H,1BH,1DH等奇数地址的复位)
跟复位有关的引脚:
RSTDRV连接到ISA总线的RSTDRV的引脚上。
RSTDRV同时也是ISA总线的复位信号。
RSTDRV为高电平有效,至少需要800ns的宽度。
给该引脚施加一个1us以上的高电平就可以复位。
施加一个高电平之后,然后施加一个低电平。
RSTDRV从高电平到低电平之后要等多久,单片机才可以对网卡进行操作?
复位的过程将执行一些操作,比如将93c46读入,将内部寄存器初始化等。
这些至少需要2毫秒的时间。
我们推荐大家等待更久的时间之后才对网卡操作,比如100毫秒之后才对它操作,以确保完全复位。
对RSTDRV可以接单片机的一个引脚进行对网卡的复位。
但也可以直接将RSTDRV跟单片机的RESET引脚并联,单片机复位的时候,网卡也复位,以减少一个单片机的引脚的使用。
这种情况下,为了保证能够完全复位,可以使用下面介绍的热复位代码。
跟复位有关的寄存器:
18H--1FH共8个地址,为复位端口。
对该端口偶数地址的读,或者写入任何数,都引起网卡的复位。
跟复位有关的标志位:
其中的第7位RST跟复位有关。
网卡执行正确的复位之后该位为1。
在linux或windows的驱动程序中,一般在复位之后检查该标志位以确认是否正确复位,特别是在即插即用的检测过程中。
对于我们用单片机控制网卡来说,我们可以不检查该标志位,因为如果复位不正常的情况通常是网卡坏了。
寄存器:
00H--0FH共16个地址是寄存器地址。
寄存器分成4页PAGE0--PAGE3,但NE2000兼容的寄存器只有3页(Page0-Page2),(第四页是RTL8019AS自己定义的,我们不用去管这些寄存器,因为你对第四页的寄存器的操作仅对这个网卡是有效的,如果你换成其他Ne2000兼容的网卡,例如DM9008,DP8390等,你的程序将无法正常运行。
为了保证驱动程序对所有Ne2000的网卡有效,不要去操作第四页的寄存器)由于寄存器较多,我将在用到该寄存器的时候才对该寄存器介绍。
---对网卡进行复位:
这是网卡驱动程序的需要做的第一个内容,由于我们将网卡设置为跳线模式,而不是即插即用的模式,RTL8019AS.PDF中介绍的PLUGandPLAY的一些过程,我们不需要做,因为单片机的资源有限,能够减少的操作,都尽量减少。
程序从main()开始执行:
#include/*my.h为作者所用的头文件,包含所有89c52寄存器的大写和小写的定义,和一些常用的子函数,一些宏的定义*/main(){
delaymsecond(10);//延时大约1秒,保证电源稳定和网卡自身的上电完成。
netcardreset();//复位网卡的子程序。
。
。
。
}
下面介绍网卡的复位子程序:
#definereg1fXBYTE[0xdf00]//网卡的复位端口的地址,对应于网卡的地址25FH。
#defineuintunsignedint//uint代表unsignedint,作者一般使用缩写uint#defineucharunsignedchar//uchar代表unsignedchar,我比较懒,不愿意多写sbitreset=p3^4;//单片机的p3.4脚连接到网卡的RSTDRV复位引脚voidnetcardreset(){uintdatai;uchardatatemp;
reset=1;//使网卡的RSTDRV引脚变成高电平,网卡是高电平复位的。
for(i=0;i
reset=0;//使网卡的RSTDRV引脚变成低电平,网卡上电复位完毕for(i=0;i
temp=reg1f;//读网卡的复位端口reg1f=temp;//写网卡的复位端口for(i=0;i
上面所讲的实际上是网卡复位的两种情况,reset=1;reset=0相当于冷复位temp=reg1f;reg1f=temp相当于热复位
对网卡的复位端口的读或写将复位网卡,网卡内部将执行复位过程。
读写是随意的,写入任意的数都将复位网卡。
实际上只要使用冷复位就可以了,热复位程序可以不要。
热复位主要在电脑里有用,冷复位就像电脑的冷启动,热复位相当于电脑的热启动。
--作者的复位网卡的过程是简化了的,一个电脑里的复位过程是比较复杂的,如果你有网卡驱动的UNIX,LINUX程序的源代码,它的代码将会做一些判断和检查,检查网卡是否存在,和是否工作正常,和是否存在地址和中断冲突。
但在我们的这个系统里可以省去这些,我们认为网卡
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 如何 控制 以太网 网卡 进行 传输 数据