单片机与TCPIP网络.docx
- 文档编号:23682078
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:31
- 大小:859.97KB
单片机与TCPIP网络.docx
《单片机与TCPIP网络.docx》由会员分享,可在线阅读,更多相关《单片机与TCPIP网络.docx(31页珍藏版)》请在冰豆网上搜索。
单片机与TCPIP网络
单片机与TCP/IP网络
--版主老古
(一)绪言
——单片机如何控制以太网网卡进行传输数据,如何加载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,还有一种是以太网的封装格式。
——现代的操作系统均能同时支持这两种类型的协议格式。
因此对我们来说只需要了解其中的一种就够了,特别是对单片机来说,不可能支持太多的协议格式。
——以太网的物理传输帧:
(仅介绍第二种格式)
PR
SD
DA
SA
TYPE
DATA
PAD
FCS
56位
8位
48位
48位
16位
不超过1500字节
可选
32位
——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=parityerror
A2D7Databit7
A3D6Databit6
A4D5Databit5
A5D4Databit4
A6D3Databit3
A7D2Databit2
A8D1Databit1
A9D0Databit0
A10I/OCHRDYI/OChannelready,pulledlowtolengthenmemorycycles
A11AENAddressenable;activehighwhenDMAcontrolsbus
A12A19Addressbit19
A13A18Addressbit18
A14A17Addressbit17
A15A16Addressbit16
A16A15Addressbit15
A17A14Addressbit14
A18A13Addressbit13
A19A12Addressbit12
A20A11Addressbit11
A21A10Addressbit10
A22A9Addressbit9
A23A8Addressbit8
A24A7Addressbit7
A25A6Addressbit6
A26A5Addressbit5
A27A4Addressbit4
A28A3Addressbit3
A29A2Addressbit2
A30A1Addressbit1
A31A0Addressbit0
B1GNDGround
B2RESETActivehightoresetorinitializesystemlogic
B3+5V+5VDC
B4IRQ2InterruptRequest2
B5-5VDC-5VDC
B6DRQ2DMARequest2
B7-12VDC-12VDC
B8/NOWSNoWaitState
B9+12VDC+12VDC
B10GNDGround
B11/SMEMWSystemMemoryWrite
B12/SMEMRSystemMemoryRead
B13/IOWI/OWrite
B14/IORI/ORead
B15/DACK3DMAAcknowledge3
B16DRQ3DMARequest3
B17/DACK1DMAAcknowledge1
B18DRQ1DMARequest1
B19/REFRESHRefresh
B20CLOCKSystemClock(67ns,8-8.33MHz,50%dutycycle)
B21IRQ7InterruptRequest7
B22IRQ6InterruptRequest6
B23IRQ5InterruptRequest5
B24IRQ4InterruptRequest4
B25IRQ3InterruptRequest3
B26/DACK2DMAAcknowledge2
B27T/CTerminalcount;pulseshighwhenDMAterm.countreached
B28ALEAddressLatchEnable
B29+5V+5VDC
B30OSCHigh-speedClock(70ns,14.31818MHz,50%dutycycle)
B31GNDGround
C1SBHESystembushighenable(dataavailableonSD8-15)
C2LA23Addressbit23
C3LA22Addressbit22
C4LA21Addressbit21
C5LA20Addressbit20
C6LA18Addressbit19
C7LA17Addressbit18
C8LA16Addressbit17
C9/MEMRMemoryRead(Activeonallmemoryreadcycles)
C10/MEMWMemoryWrite(Activeonallmemorywritecycles)
C11SD08Databit8
C12SD09Databit9
C13SD10Databit10
C14SD11Databit11
C15SD12Databit12
C16SD13Databit13
C17SD14Databit14
C18SD15Databit15
D1/MEMCS16Memory16-bitchipselect(1wait,16-bitmemorycycle)
D2/IOCS16I/O16-bitchipselect(1wait,16-bitI/Ocycle)
D3IRQ10InterruptRequest10
D4IRQ11InterruptRequest11
D5IRQ12InterruptRequest12
D6IRQ15InterruptRequest15
D7IRQ14InterruptRequest14
D8/DACK0DMAAcknowledge0
D9DRQ0DMARequest0
D10/DACK5DMAAcknowledge5
D11DRQ5DMARequest5
D12/DACK6DMAAcknowledge6
D13DRQ6DMARequest6
D14/DACK7DMAAcknowledge7
D15DRQ7DMARequest7
D16+5V
D17/MASTERUsedwithDRQtogaincontrolofsystem
D18GNDGroundNote:
DirectionisMotherboardrelativeISA-Cards.
四)89C52单片机与网卡接口电路图
——电路是由作者自己设计的,可能不是很标准,也可能不是理想的,但是它可以实现。
网卡是ne2000兼容型的网卡。
作者所用的网卡是TP-LINK的TE-2008,接口为ISA接口,网卡的主芯片是RTL8019AS.此款网卡在电脑城可以买到。
价钱不超过50元。
如果买不到,也可以使用别的ne2000的兼容网卡,例如芯片Davicom的DM9008,NSI的DP8390,
MXIC的MX98905,还有华邦的,dlink的。
这些芯片的资料可以在本站的硬件程序下载区下载。
但推荐使用RTL8019AS。
为阅读以下的内容,请在本站下载RTL8019AS的芯片资料。
这是缩小的图,点击这里放大。
放大的图可能还不是很清楚,要看更为清楚的图,点击这里下载SCH电路图。
(可以用PROTEL98或PROTEL99打开。
如果你没有protel98,可以在本站下载protel98安装程序(要下载几个小时)。
__电路用到的主要芯片有MAX232(串口的电平转换),24c02(IIC总线的eeprom),373(8位锁存),62256(32K的RAM).其中的24C02也可以不要,可以通过存取网卡上的93C46来实现,但我没有这样做。
62256为外部32K的Ram,也可以不用,可以用网卡上的RAM来代替,但是网卡上的Ram的存取比较复杂,速度会比加62256慢。
为了编程的方便,和实现快的传输速度,以及为完成更为复杂的应用,推荐使用62256,用77E58单片机和外加62256,可以实现500KBPS以上的传输速度。
电路图上方的两大块为ISA槽,网卡是插在这ISA槽上的。
本站还有一个一体化的电路图,是将RTL8019AS也做到板上的,来自http:
//8052.lphard.cz,这个网站还有现成的程序,是用asm写的,用到的I/O300H.
--作者以下文章的描述全部基于自己的电路图,而不是来自8052.lphard.cz的电路图,请不要混在一起。
作者的全部程序用C51编写,而不是汇编,为了方便大家移植和扩充。
(五)接口电路图详解
(1)
----89c52单片机部分
——ISA接口的A,B部分.
地址线
A19
A18
A17
A16
A15
A14
A13
A12
A11
A10
A9
A8
A7
A6
A5
A4
A3
A2
A1
A0
240H
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
0
0
0
0
0
...
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
X
X
X
X
X
25FH
0
0
0
0
0
0
0
0
0
0
1
0
0
1
0
1
1
1
1
1
这是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的电源。
A0--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(ADDR10
A1(ADDR9)
A0(ADDR8)
1
0
X
X
X
X
X
P2口
P2.7
P2.5
P2.4
P2.3
P2.2
P2.1
P2.0
1
0
X
X
X
X
X
当P2口为二进制1X0XXXXX时将选中网卡的I/O地址空间。
在程序里,我使用110XXXXX来选中网卡的地址。
地址映射:
单片机(P2口)也就是DPH
网卡(I/O)
11000000(0C0H)
240H
110XXXXX
2XXH
11011111(0DFH)
25FH
我在程序里定义了reg00--reg1f来对应240H--25FH端口。
#definereg00XBYTE[0xc000]/*240H*/
#definereg01XBYTE[0xc100]/*241H*/
#definereg02XBYTE[0xc200]
#definereg03XBYTE[0xc300]
...
#definereg1fXBYTE[0xDF00]/*25FH*/
---ISA接口的C,D部分
这是网卡的接口的后半部分,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接单片机的TXD
CPURXD接单片机的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的驱动程序中,一般在复位之后检查该标志位以确认是否正确复位,特别是在即插即用的检测过程中。
对于我们用单片机控制网卡来说,我们可以不检查该标志位,因为
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 单片机 TCPIP 网络