單片機與TCPIP[老古].doc_第1頁
單片機與TCPIP[老古].doc_第2頁
單片機與TCPIP[老古].doc_第3頁
單片機與TCPIP[老古].doc_第4頁
單片機與TCPIP[老古].doc_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

單片機與TCP/IP網(wǎng)絡(luò) 第 42 頁 共 42 頁單片機與TCP/IP網(wǎng)絡(luò)-版主 老古(一)緒言 單片機如何控制以太網(wǎng)網(wǎng)卡進行傳輸數(shù)據(jù),如何加載TCP/IP協(xié)議連接到互聯(lián)網(wǎng),這些都是一些令人感興趣的問題??梢哉f以太網(wǎng)和TCP/IP協(xié)議已經(jīng)成為使用最廣泛的協(xié)議,而其它總線協(xié)議如RS485、RS232,CAN,LANWORKS,都只是一些局部系統(tǒng)的總線。圍繞以太網(wǎng)而制造的集線器,交換機已進入大小公司,企業(yè),家庭。我現(xiàn)在在眾達天網(wǎng)公司,由于公司是搞電腦防火墻的,所以對網(wǎng)絡(luò)的接觸也越來越多,我研究的主要是網(wǎng)絡(luò)的底層,并掌握了很多網(wǎng)絡(luò)分析工具如(SNIFFER),對以太網(wǎng)和TCP/IP協(xié)議的研究就更加深入了。我比較熟悉的網(wǎng)卡是10M的網(wǎng)卡,100M的以太網(wǎng)卡還在研究之中。曾經(jīng)用單片機(89C52)控制和驅(qū)動10M的NE2000兼容型以太網(wǎng)卡與電腦主機傳輸數(shù)據(jù)?,F(xiàn)在將我的一些研究成果寫成一系列的文單,提供給大家。也許有一天研究了100M的網(wǎng)卡之后,可以讓單片機驅(qū)動它,那是可能的事,只不過接口可能會復(fù)雜一些。我所寫的驅(qū)動程序并不是標(biāo)準(zhǔn)的,因為我沒有學(xué)過UNIX,無法使用UNIX提供的原代碼。如果能使用UNIX的原代碼,那將是很好的事。我也正在接觸UNIX和VC+,DDK等方面的內(nèi)容,希望有一天能夠重寫我現(xiàn)在所寫的驅(qū)動程序。我知道有很多人在了解單片機與以太網(wǎng)方面的東西,在BBS上也發(fā)現(xiàn)了很多這方面的內(nèi)容,有些人的研究甚至比我還深入,我也希望能跟這些人交流交流,如果對我的文章感興趣 ,當(dāng)然可以給我發(fā)電子郵件啦。在接下來的文章將介紹以太網(wǎng)協(xié)議,網(wǎng)卡驅(qū)動,IP協(xié)議,ICMP協(xié)議,ARP協(xié)議,TCP協(xié)議等 。-為幫助讀者開發(fā)該tcp/ip的應(yīng)用,本站制作了以太網(wǎng)開發(fā)板,可以購買。(二)以太網(wǎng)協(xié)議-以太網(wǎng)協(xié)議(用于10MBPS的以太網(wǎng),作者以下所說的以太網(wǎng)均指10M以太網(wǎng),而不是100M,1000M的以太網(wǎng))以太網(wǎng)協(xié)議有兩種,一種是IEEE802.2/IEEE802.3,還有一種是以太網(wǎng)的封裝格式?,F(xiàn)代的操作系統(tǒng)均能同時支持這兩種類型的協(xié)議格式。因此對我們來說只需要了解其中的一種就夠了,特別是對單片機來說,不可能支持太多的協(xié)議格式。以太網(wǎng)的物理傳輸幀:(僅介紹第二種格式)PRSDDASATYPEDATAPADFCS56位8位48位48位16位不超過1500字節(jié)可選32位PR:同步位,用于收發(fā)雙方的時鐘同步,同時也指明了傳輸?shù)乃俾剩?0M和100M的時鐘頻率不一樣,所以100M網(wǎng)卡可以兼容10M網(wǎng)卡),是56位的二進制數(shù)101010101010.SD: 分隔位,表示下面跟著的是真正的數(shù)據(jù),而不是同步時鐘,為8位的10101011,跟同步位不同的是最后2位是11而不是10.DA:目的地址,以太網(wǎng)的地址為48位(6個字節(jié))二進制地址,表明該幀傳輸給哪個網(wǎng)卡.如果為FFFFFFFFFFFF,則是廣播地址,廣播地址的數(shù)據(jù)可以被任何網(wǎng)卡接收到.SA:源地址,48位,表明該幀的數(shù)據(jù)是哪個網(wǎng)卡發(fā)的,即發(fā)送端的網(wǎng)卡地址,同樣是6個字節(jié).-TYPE:類型字段,表明該幀的數(shù)據(jù)是什么類型的數(shù)據(jù),不同的協(xié)議的類型字段不同。如:0800H 表示數(shù)據(jù)為IP包,0806H 表示數(shù)據(jù)為ARP包,814CH是SNMP包,8137H為IPX/SPX包,(小于0600H的值是用于IEEE802的,表示數(shù)據(jù)包的長度。)-DATA:數(shù)據(jù)段 ,該段數(shù)據(jù)不能超過1500字節(jié)。因為以太網(wǎng)規(guī)定整個傳輸包的最大長度不能超過1514字節(jié)。(14字節(jié)為DA,SA,TYPE)-PAD:填充位。由于以太網(wǎng)幀傳輸?shù)臄?shù)據(jù)包最小不能小于60字節(jié), 除去(DA,SA,TYPE 14字節(jié)),還必須傳輸46字節(jié)的數(shù)據(jù),當(dāng)數(shù)據(jù)段的數(shù)據(jù)不足46字節(jié)時,后面補000000.(當(dāng)然也可以補其它值)-FCS:32位數(shù)據(jù)校驗位.為32位的CRC校驗,該校驗由網(wǎng)卡自動計算,自動生成,自動校驗,自動在數(shù)據(jù)段后面填入.對于數(shù)據(jù)的校驗算法,我們無需了解.-事實上,PR,SD,PAD,FCS這幾個數(shù)據(jù)段我們不用理它 ,它是由網(wǎng)卡自動產(chǎn)生的,我們要理的是DA,SA,TYPE,DATA四個段的內(nèi)容.-所有數(shù)據(jù)位的傳輸由低位開始(但傳輸?shù)奈涣魇怯寐鼜厮固鼐幋a的) -以太網(wǎng)的沖突退避算法就不介紹了,它是由硬件自動執(zhí)行的.DA+SA+TYPE+DATA+PAD最小為60字節(jié),最大為1514字節(jié).-以太網(wǎng)卡可以接收三種地址的數(shù)據(jù),一個是廣播地位,一個是多播地址(我們用不上),一個是它自已的地址.但網(wǎng)卡也可以設(shè)置為接收任何數(shù)據(jù)包(用于網(wǎng)絡(luò)分析和監(jiān)控).-任何兩個網(wǎng)卡的物理地址都是不一樣的,是世界上唯一的,網(wǎng)卡地址由專門機構(gòu)分配.不同廠家使用不同地址段,同一廠家的任何兩個網(wǎng)卡的地址也是唯一的.根據(jù)網(wǎng)卡的地址段(網(wǎng)卡地址的前三個字節(jié)),可以知道網(wǎng)卡的生產(chǎn)廠家.有些網(wǎng)卡的地址也可以由用戶去設(shè)定,但一般不需要. ISA ISA=Industry Standard Architecture (isa總線)Pin Name Description 引腳 名稱 含義A1 /I/O CH CK I/O channel check; active low=parity error A2 D7 Data bit 7 A3 D6 Data bit 6 A4 D5 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 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 bit 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 /SMEMW 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 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 MHz, 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 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) 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 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單片機與網(wǎng)卡接口電路圖電路是由作者自己設(shè)計的,可能不是很標(biāo)準(zhǔn),也可能不是理想的,但是它可以實現(xiàn)。網(wǎng)卡是ne2000兼容型的網(wǎng)卡。作者所用的網(wǎng)卡是TP-LINK的TE-2008,接口為ISA接口,網(wǎng)卡的主芯片是RTL8019AS.此款網(wǎng)卡在電腦城可以買到。價錢不超過50元。如果買不到,也可以使用別的ne2000的兼容網(wǎng)卡,例如芯片Davicom的DM9008,NSI的DP8390,MXIC的MX98905,還有華邦的,dlink的。這些芯片的資料可以在本站的硬件程序下載區(qū)下載。但推薦使用RTL8019AS。為閱讀以下的內(nèi)容,請在本站下載RTL8019AS的芯片資料。這是縮小的圖,點擊這里放大。放大的圖可能還不是很清楚,要看更為清楚的圖,點擊這里下載SCH電路圖。(可以用PROTEL 98或PROTEL 99打開。如果你沒有protel98,可以在本站下載protel98安裝程序(要下載幾個小時)。_電路用到的主要芯片有MAX232(串口的電平轉(zhuǎn)換),24c02(IIC總線的eeprom),373(8位鎖存),62256(32K的RAM).其中的24C02也可以不要,可以通過存取網(wǎng)卡上的93C46來實現(xiàn),但我沒有這樣做。62256為外部32K的Ram,也可以不用,可以用網(wǎng)卡上的RAM來代替,但是網(wǎng)卡上的Ram的存取比較復(fù)雜,速度會比加62256慢。為了編程的方便,和實現(xiàn)快的傳輸速度,以及為完成更為復(fù)雜的應(yīng)用,推薦使用62256,用77E58單片機和外加62256,可以實現(xiàn)500KBPS以上的傳輸速度。電路圖上方的兩大塊為ISA槽,網(wǎng)卡是插在這ISA槽上的。本站還有一個一體化的電路圖,是將RTL8019AS也做到板上的,來自http:/8052.lphard.cz ,這個網(wǎng)站還有現(xiàn)成的程序,是用asm寫的,用到的I/O 300H.作者以下文章的描述全部基于自己的電路圖,而不是來自8052.lphard.cz的電路圖,請不要混在一起。作者的全部程序用C51編寫,而不是匯編,為了方便大家移植和擴充。(五)接口電路圖詳解(1)-89c52單片機部分ISA接口的A,B部分.這是RTL8019網(wǎng)卡ISA的前半部分A1-A31(1.31),B1-B31(32.62)共62個引腳.DATA0-DATA7是網(wǎng)卡的8位數(shù)據(jù)總線,接單片機的P0口.RESDRV(33腳)(RESET)接單片機的T0(P3.4),單片機用P3.4來復(fù)位網(wǎng)卡。IRQ9接單片機的INT0(P3.2),IRQ9是網(wǎng)卡的中斷9,接到單片機的中斷0上。(但我的程序沒有使用中斷操作,我是用查詢操作的)IOR,IOW接到單片機的p3.6,p3.7(/WR,/RD)GND是地,VCC為5V的電源。 A0-A19為網(wǎng)卡的地址線,共20根,我們用到網(wǎng)卡的地址為十六進制的0240H-025FH, 轉(zhuǎn)換為二進制為地址線A19A18A17A16A15A14A13A12A11A10A9A8A7A6A5A4A3A2A1A0240H00000000001001000000.000000000010010XXXXX25FH00000000001001011111我們看到從地址240H到25FH,地址線的A19-A5是固定的000000000010010,因此A10-A19接地,A7-A8接地,ADDR8-ADDR15對應(yīng)地址線的A0-A6.(實際上A5也可以接地,這樣可以減少一個單片機的引腳。這是作者在設(shè)計電路時沒有注意到,同時A9也可以接VCC)。A0-A6(ADDR8-ADDR15)接單片機的P2口。因此當(dāng)P2口為地址線A6,A9(ADDR15)A5(ADDR13)A4(ADDR12)A3(ADDR11)A2(ADDR10A1(ADDR9)A0(ADDR8)10XXXXXP2口P2.7P2.5P2.4P2.3P2.2P2.1P2.010XXXXX當(dāng)P2口為二進制 1X0XXXXX時 將選中網(wǎng)卡的I/O地址空間。在程序里,我使用110XXXXX來選中網(wǎng)卡的地址。地址映射: 單片機(P2口)也就是DPH網(wǎng)卡(I/O)11000000 (0C0H)240H110XXXXX2XXH11011111 (0DFH)25FH我在程序里定義了 reg00-reg1f 來對應(yīng)240H25FH端口。#define reg00 XBYTE0xc000 /* 240H*/#define reg01 XBYTE0xc100 /* 241H*/#define reg02 XBYTE0xc200#define reg03 XBYTE0xc300.#define reg1f XBYTE0xDF00 /* 25FH*/ISA接口的C,D部分 這是網(wǎng)卡的接口的后半部分,ISA槽的擴展部分。只用到GND,VCC,IOCS16.其中的IOCS16是16位I/O的選擇腳。當(dāng)網(wǎng)卡上電復(fù)位的時候,這個腳為網(wǎng)卡的輸入腳,如果這個腳為低電平,網(wǎng)卡將選擇8位模式,如果這個腳為高電平,網(wǎng)卡將選擇16位的模式。我用了個電阻R10下拉,因此在復(fù)位時,這個腳為低電平,網(wǎng)卡選擇8位模式。網(wǎng)卡可以兼容8位和16位操作。由于89c52是8位的數(shù)據(jù)總線,因此要用網(wǎng)卡的8位總線模式(每次讀入或?qū)懭?個字節(jié))。如果你是用80c196或dsp等16位總線的芯片的話,你可以使用16位的操作模式,這樣有更快的傳輸速度(每次讀入或?qū)懭?個字節(jié))。(16位總線時,這個下拉電阻去掉,不用接,同時網(wǎng)卡的DATA8-DATA15要接到你的CPU的數(shù)據(jù)815上。DMA操作為16位)六)接口電路圖詳解(2)-89c52單片機部分外部存儲器62256和373。-這是外部存儲器62256(32K字節(jié)的RAM),62256的DATA0-DATA7接單片機的P0口。/OE接單片機的/RD/WE接單片機的/WR/CE接單片機的P2.7A0-A14接單片機的P2.0-P2.6-373的DATA0-DATA7接單片機的P0口/OE接地LE接單片機的ALE。因此外部存儲器62256占用單片機的外部數(shù)據(jù)地址空間0000H-7FFFH,共32K字節(jié)。我們使用外部RAM的目的是提高單片機的數(shù)據(jù)傳輸速度,和復(fù)雜的TCP/IP的處理。由于以太網(wǎng)的包最大可以有1500多字節(jié),89c52單片機是無法存儲這么大的包的,只有放到外部的RAM里。同時這外部的RAM也用作串行口的輸入輸出緩沖。以使單片機可以高速的吞吐數(shù)據(jù)。(用網(wǎng)卡上的RAM來代替62256會影響速度)MAX232,24c02 24C02是IIC總線的eeprom,可以用來存儲用戶的一些設(shè)置,比如IP地址,網(wǎng)關(guān)等。SCL接單片機的T1(P3.5)SDA接單片機的INT1(P3.3)MAX232為串口電平轉(zhuǎn)換電路。CPUTXD接單片機的TXDCPURXD接單片機的RXDPCRXD和PCTXD是RS232電平,為標(biāo)準(zhǔn)串口電平。數(shù)據(jù)可以從串口輸入到單片機,單片機再把數(shù)據(jù)送到網(wǎng)卡傳出去。晶振可以用11.0592Mhz,也可以用22.1184Mhz,或更高的頻率。(七)網(wǎng)卡上電復(fù)位-當(dāng)你買到一個新的RTL8019AS網(wǎng)卡,你要先將該網(wǎng)卡設(shè)置為以下的配置:操作方式Operating Mode:跳線方式Jumperless(不是即插即用Plug and Play)端口I/O base:0240-25FH中斷Interrupt: 2/9(我的程序沒有用到網(wǎng)卡中斷,所以也可以不用設(shè)置)你要將這個網(wǎng)卡插到你的電腦里,用這個網(wǎng)卡帶的設(shè)置程序RSET8019.exe將這個卡按照上面的配置設(shè)置好。(最好在純DOS方式下設(shè)置) . 在介紹網(wǎng)卡驅(qū)動程序之前,先介紹一下RTL8019AS的基本情況:輸入輸出地址:共32個,地址偏移量為00H-1FH,(對應(yīng)于240H25FH,240H的地址偏移量為0,241H的地址偏移量為1,。25FH的地址偏移量為1FH)。其中00H0FH共16個地址,為寄存器地址。10H17H共8個地址,為DMA地址。18H1FH共8個地址,為復(fù)位端口。對于8位的操作方式,上面的地址中只有18個是有用的:00H0FH共16個寄存器地址。10H DMA地址 (10H17H的8個地址是一樣的,都可以用來做DMA端口,只要用其中的一個就可以了)1FH 復(fù)位地址。(18H到1FH共8個地址都是復(fù)位地址,每個地址的功能都是一樣的,只要其中的一個就可以了,但實際上只有18H,1AH,1CH,1EH這幾個復(fù)位端口是有效的,其他不要使用,有些兼容卡不支持19H,1BH,1DH等奇數(shù)地址的復(fù)位)跟復(fù)位有關(guān)的引腳:RSTDRV連接到ISA總線的RSTDRV的引腳上。RSTDRV同時也是ISA總線的復(fù)位信號。RSTDRV為高電平有效,至少需要 800ns的寬度。給該引腳施加一個1us以上的高電平就可以復(fù)位。施加一個高電平之后,然后施加一個低電平。RSTDRV從高電平到低電平之后要等多久,單片機才可以對網(wǎng)卡進行操作?復(fù)位的過程將執(zhí)行一些操作,比如將93c46讀入,將內(nèi)部寄存器初始化等。這些至少需要2毫秒的時間。我們推薦大家等待更久的時間之后才對網(wǎng)卡操作,比如100毫秒之后才對它操作,以確保完全復(fù)位。對RSTDRV可以接單片機的一個引腳進行對網(wǎng)卡的復(fù)位。但也可以直接將RSTDRV跟單片機的RESET引腳并聯(lián),單片機復(fù)位的時候,網(wǎng)卡也復(fù)位,以減少一個單片機的引腳的使用。這種情況下,為了保證能夠完全復(fù)位,可以使用下面介紹的熱復(fù)位代碼。 跟復(fù)位有關(guān)的寄存器:18H1FH共8個地址,為復(fù)位端口。對該端口偶數(shù)地址的讀,或者寫入任何數(shù),都引起網(wǎng)卡的復(fù)位。跟復(fù)位有關(guān)的標(biāo)志位: 其中的第7位RST跟復(fù)位有關(guān)。網(wǎng)卡執(zhí)行正確的復(fù)位之后該位為1。在linux或windows的驅(qū)動程序中,一般在復(fù)位之后檢查該標(biāo)志位以確認(rèn)是否正確復(fù)位,特別是在即插即用的檢測過程中。對于我們用單片機控制網(wǎng)卡來說,我們可以不檢查該標(biāo)志位,因為如果復(fù)位不正常的情況通常是網(wǎng)卡壞了。寄存器:00H0FH共16個地址是寄存器地址。寄存器分成4頁PAGE0-PAGE3,但NE2000兼容的寄存器只有3頁(Page0-Page2),(第四頁是RTL8019AS自己定義的,我們不用去管這些寄存器,因為你對第四頁的寄存器的操作僅對這個網(wǎng)卡是有效的,如果你換成其他Ne2000兼容的網(wǎng)卡,例如DM9008,DP8390等,你的程序?qū)o法正常運行。 為了保證驅(qū)動程序?qū)λ蠳e2000的網(wǎng)卡有效,不要去操作第四頁的寄存器)由于寄存器較多,我將在用到該寄存器的時候才對該寄存器介紹。對網(wǎng)卡進行復(fù)位:這是網(wǎng)卡驅(qū)動程序的需要做的第一個內(nèi)容,由于我們將網(wǎng)卡設(shè)置為跳線模式,而不是即插即用的模式,RTL8019AS.PDF中介紹的PLUG and PLAY的一些過程,我們不需要做,因為單片機的資源有限,能夠減少的操作,都盡量減少。程序從main()開始執(zhí)行:#include /*my.h 為作者所用的頭文件,包含所有89c52寄存器的大寫和小寫的定義,和一些常用的子函數(shù),一些宏的定義*/main()delaymsecond(10);/延時大約1秒,保證電源穩(wěn)定和網(wǎng)卡自身的上電完成。netcardreset();/復(fù)位網(wǎng)卡的子程序 。下面介紹網(wǎng)卡的復(fù)位子程序:#define reg1f XBYTE0xdf00 /網(wǎng)卡的復(fù)位端口的地址,對應(yīng)于網(wǎng)卡的地址25FH。#define uint unsigned int /uint 代表unsigned int ,作者一般使用縮寫uint#define uchar unsigned char /uchar 代表unsigned char,我比較懶,不愿意多寫sbit reset=p34; /單片機的p3.4腳連接到網(wǎng)卡的RSTDRV復(fù)位引腳void netcardreset()uint data i;uchar data temp;reset=1; /使網(wǎng)卡的RSTDRV引腳變成高電平,網(wǎng)卡是高電平復(fù)位的。for(i=0;i250;i+);/延時程序,至少需要reset=0; /使網(wǎng)卡的RSTDRV引腳變成低電平,網(wǎng)卡上電復(fù)位完畢f(xié)or(i=0;i250;i+);temp=reg1f;/讀網(wǎng)卡的復(fù)位端口reg1f=temp; /寫網(wǎng)卡的復(fù)位端口for(i=0;i250;i+); 上面所講的實際上是網(wǎng)卡復(fù)位的兩種情況,reset=1;reset=0相當(dāng)于冷復(fù)位temp=reg1f;reg1f=temp相當(dāng)于熱復(fù)位對網(wǎng)卡的復(fù)位端口的讀或?qū)憣?fù)位網(wǎng)卡,網(wǎng)卡內(nèi)部將執(zhí)行復(fù)位過程。讀寫是隨意的,寫入任意的數(shù)都將復(fù)位網(wǎng)卡。 實際上只要使用冷復(fù)位就可以了,熱復(fù)位程序可以不要。熱復(fù)位主要在電腦里有用,冷復(fù)位就像電腦的冷啟動,熱復(fù)位相當(dāng)于電腦的熱啟動。作者的復(fù)位網(wǎng)卡的過程是簡化了的,一個電腦里的復(fù)位過程是比較復(fù)雜的,如果你有網(wǎng)卡驅(qū)動的UNIX,LINUX程序的源代碼,它的代碼將會做一些判斷和檢查,檢查網(wǎng)卡是否存在,和是否工作正常,和是否存在地址和中斷沖突 。但在我們的這個系統(tǒng)里可以省去這些,我們認(rèn)為網(wǎng)卡的地址和I/O是沒有沖突和正常工作的。當(dāng)然如果讀者愿意,也可以寫一些檢查代碼。(八)網(wǎng)卡初始化- 完成復(fù)位之后,你要對網(wǎng)卡的工作參數(shù)進行設(shè)置.以使網(wǎng)卡開始工作.先介紹一個子函數(shù)#define reg00 XBYTE0xc000 /對應(yīng)于地址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日) :以上程序有問題,在中斷驅(qū)動或發(fā)送數(shù)據(jù)包不作等待時,因為發(fā)送數(shù)據(jù)包的命令是讓TXP置位,如果在發(fā)送數(shù)據(jù)包的過程中,使用該函數(shù),就會不斷地向外發(fā)送數(shù)據(jù)包.原因是TXP置位之后,只能是發(fā)完數(shù)據(jù)包的時候,由網(wǎng)卡內(nèi)部將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;從實驗當(dāng)中也發(fā)現(xiàn),只要再置位TXP位就可以重發(fā)該數(shù)據(jù)包(重發(fā)數(shù)據(jù)包時,不需要設(shè)置TPSTART,TBCR0,TBCR1). 作用是選擇指定的頁,網(wǎng)卡共有4頁寄存器,Ne2000兼容的有3頁。第四頁可以不用。 reg00命令寄存器:CR,command register,地址偏移量00H,為一個字節(jié)位76543210名字PS1PS0RD2RD1RD0TXPSTASTPPS1和PS0這兩個位用來選擇寄存器頁,PS1 PS0=00時選擇寄存器頁0,=01時選擇寄存器頁1, =10時選擇寄存器頁2,=11時選擇寄存器頁3.上面的程序的參數(shù)為pagenumber,用來指定第幾頁。temp=reg00 ;/讀入命令寄存器的值。temp=temp&0x3f;/將高2位,即PS1,PS0清0pagenumber=pagenumber6;/將低2位移至高端temp=temp|pagenumber, /寫入高2位reg00=temp; /設(shè)置第幾頁當(dāng)然也可以寫成更加簡單的幾句:temp=reg00&0x3f;pagenumber=pagenumber6;reg00=temp|pagenumber; 但這樣對讀者來說不好理解。從執(zhí)行的速度來說,上面的代碼也不是最快的。但作者主要講述原理,而不是探討最快的實現(xiàn)。RD2,RD1,RD0這3個位代表要執(zhí)行的功能。001 讀網(wǎng)卡內(nèi)存010 寫網(wǎng)卡內(nèi)存011 發(fā)送網(wǎng)卡數(shù)據(jù)包1* 完成或結(jié)束DMA的讀寫操作TXP這個位寫入1時發(fā)送數(shù)據(jù)包,發(fā)完自動清零STA,STP這兩個位用來啟動命令或停止命令10 啟動命令01 停止命令下面介紹網(wǎng)卡的初始化子程序:void ne2000init() reg00=0x21; /選擇頁0的寄存器,網(wǎng)卡停止運行,因為還沒有初始化。reg01=0x4c; /寄存器Pstartreg02=0x80; /Pstopreg03=0x4c; /BNRYreg04=0x45; /TPSRreg0c=0xcc; /RCRreg0d=0xe0; /TCRreg0e=0xc8; /DCR 數(shù)據(jù)配置寄存器 8位數(shù)據(jù)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寄存器,網(wǎng)卡執(zhí)行命令。 PSTART 接收緩沖區(qū)的起始頁的地址。PSTOP 接收緩沖區(qū)的結(jié)束頁地址。(該頁不用于接收)BNRY 指向最后一個已經(jīng)讀取的頁(讀指針)CURR 當(dāng)前的接收結(jié)束頁地址。(寫指針)網(wǎng)卡含有16K字節(jié)的RAM,地址為0x4000-0x7fff(指的是網(wǎng)卡上的存儲地址,而不是ISA總線的地址,是網(wǎng)卡工作用的存儲器),每256個字節(jié)稱為一頁,共有64頁。頁的地址就是地址的高8位,頁地址為0x40-0x7f 。這16k的ram的一部分用來存放接收的數(shù)據(jù)包,一部分用來存儲待發(fā)送的數(shù)據(jù)包。當(dāng)然也可以給用戶使用。(例如把網(wǎng)卡設(shè)置成使用8K的ram,另外8K的ram就可以用來給單片機作為存儲器,但我沒有這樣做,原因是操作網(wǎng)卡上的ram比較復(fù)雜)在我的程序中使用0x40-0x4B為網(wǎng)卡的發(fā)送緩沖區(qū),共12頁,剛好可以存儲2個最大的以太網(wǎng)包。使用0x4c0x7f為網(wǎng)卡的接收緩沖區(qū),共52頁。因此PSTART=0x4c,PSTOP=0x80(0x80為停止頁,就是直到0x7f,是接收緩沖區(qū),不包括0x80) 剛開始,網(wǎng)卡沒有接收到任何數(shù)據(jù)包,所以,BNRY設(shè)置為指向第一個接收緩沖區(qū)的頁0x4c) 這四個寄存器用于接收的設(shè)置。CURR是網(wǎng)卡寫內(nèi)存的指針。它指向當(dāng)前正在寫的頁的下一頁。那么初始化它就應(yīng)該指向0x4c10x4d 。網(wǎng)卡寫完接收緩沖區(qū)一頁,就將這個頁地址加一,CURRCURR1。這是網(wǎng)卡自動加的。當(dāng)加到最后的空頁(這里是0x80,PSTOP)時,將CURR置為接收緩沖區(qū)的第一頁(這里是0x4c,PSTART),也是網(wǎng)卡自動完成的。當(dāng)CURRBNRY時,表示緩沖區(qū)全部被存滿,數(shù)據(jù)沒有被用戶讀走,這時網(wǎng)卡將停止往內(nèi)存寫數(shù)據(jù),新收到的數(shù)據(jù)包將被丟棄不要,而不覆蓋舊的數(shù)據(jù)。此時實際上出現(xiàn)了內(nèi)存溢出。而BNRR要由用戶來操作。用戶從網(wǎng)卡讀走一頁數(shù)據(jù),要將BNRY加一,然后再寫到BNRY寄存器。 當(dāng)BNRY加到最后的空頁(0x80,PSTOP)時,同樣要將BNRY變成第一個接收頁(PSTART,0x4c)BNRY=0x4c;CURR和BNRY主要用來控制緩沖區(qū)的存取過程,保證能順次寫入和讀出)。當(dāng)CURR=BNRY+1(或當(dāng)BNRY0x7f ,CURR=0x4c)時,網(wǎng)卡的接收緩沖區(qū)里沒有數(shù)據(jù),表示沒有收到數(shù)據(jù)包。 用戶通過這個判斷知道沒有包可以讀。當(dāng)上述條件不成立時,表示接收到新的數(shù)據(jù)包。然后用戶應(yīng)該讀取數(shù)據(jù)包,直到上述條件成立時,表示所以數(shù)據(jù)包已經(jīng)讀完,此時停止讀取數(shù)據(jù)包。TPSR 為發(fā)送頁的起始頁地址。初始化為指向第一個發(fā)送緩沖區(qū)的頁,0x40。RCR 接收配置寄存器,設(shè)置為使用接收緩沖區(qū),僅接收自己的地址的數(shù)據(jù)包(以及廣播地址數(shù)據(jù)包)和多點播送地址包,小于64字節(jié)的包丟棄(這是協(xié)議的規(guī)定,設(shè)置成接收是用于網(wǎng)絡(luò)分析),校驗錯的數(shù)據(jù)包不接收。TCR 發(fā)送配置寄存器,啟用crc自動生成和自動校驗,工作在正常模式。DCR 數(shù)據(jù)配置寄存器,設(shè)置為使用FIFO緩存,普通模式,8位數(shù)據(jù)傳輸模式,字節(jié)順序為高位字節(jié)在前,低位字節(jié)在后(符合我們的習(xí)慣)(如果用16位的單片機,設(shè)置成16位的數(shù)據(jù)總線操作會更快,但80c52是8位總線的單片機)IMR 中斷屏蔽寄存器,設(shè)置成0x00,屏蔽所有的中斷。設(shè)置成0xff將允許中斷)MAR0MAR8是設(shè)置多點播送的參數(shù),這點我也不是很清楚,我從電腦讀出來是什么數(shù),我也將這8個寄存器設(shè)置成這幾個數(shù). 由于我們不使用多點播送,所以不要緊,只要保證網(wǎng)卡能正常工作就可以了。PAGE2的寄存器是只讀的,所以不可以設(shè)置,不用設(shè)置,PAGE3的寄存器不是NE2000兼容的,所以也不用設(shè)置。 (九)讀取網(wǎng)卡的網(wǎng)卡地址- 完成上面的過程之后,網(wǎng)卡還不能正確的接收數(shù)據(jù)包,因為我們還沒有對網(wǎng)卡的物理地址(網(wǎng)卡地址,48位的地址)進行設(shè)置。網(wǎng)卡還不知道它應(yīng)該什么地址的數(shù)據(jù)包。要對網(wǎng)卡的物理地址進行設(shè)置,就必須知道網(wǎng)卡的物理地址是多少。讀取網(wǎng)卡的物理地址的子程序:union u uint word; structuchar high;uchar low;bytes; /我定義的數(shù)據(jù)結(jié)構(gòu),為兩個字節(jié)的結(jié)構(gòu) /,可以按照uint(unsigned int)來讀取,也可以按照高低字節(jié)high和low來讀取。 union u mynodeid3;/存儲網(wǎng)卡的物理地址union u protocal; /臨時變量void readmynodeid() uchar data i,temp;page(0);reg09=0;/寄存器RSAR1 dma read highaddress=0 reg08=0;/RSAR0 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;/讀取一個字節(jié)if (i % 2=0)protocal.bytes.high=temp;else protocal.bytes.low=temp;mynodeidi/2.word=protocal.word;temp=reg10;/讀取一個重復(fù)的字節(jié),這個字節(jié)被丟棄-網(wǎng)卡除了16k(地址0x40000x7FFFF)的接收發(fā)送存儲RAM之外,還有別的RAM,還有一塊大小為256字節(jié)的RAM,地址為0x00000x00FF,這部分RAM是eeprom 93C46的影像存儲(不完全一樣),存儲的內(nèi)容的一部分跟93C46存儲的是一樣的。 網(wǎng)卡在上電的時候?qū)?3C46的一部分內(nèi)容讀到這256字節(jié)的RAM里。存儲是WORD類型,其中地址:0x0000-0x000b共12個字節(jié)是網(wǎng)卡的物理地址。(網(wǎng)卡的物理地址是6個字節(jié)的,為什么要用12字節(jié)?因為這12字節(jié)是重復(fù)存儲的。例如網(wǎng)卡物理地址0x52544CC118CF,存儲在0x0000-0x000b里是這樣的:525254544C4CC1C11818CFCF我們可以看到單和雙的地址存儲的是一樣的。0x000b后面的地址存儲的是生產(chǎn)廠商的代碼和產(chǎn)品標(biāo)識代碼,也是單雙地址重復(fù)存儲,這里就不說了。 這個程序又用到4個新的寄存器:RSAR1 RSAR0 RBCR1 RBCR0這4個寄存器是專門用于讀取網(wǎng)卡上面的ram的。RSAR1 網(wǎng)卡上的RAM的起始地址高8位RSAR0 網(wǎng)卡上的RAM的起始地址低8位程序中的reg09,reg08都設(shè)成0,所以是從網(wǎng)卡上的0x0000地址開始讀。RBCR1 要讀取的字節(jié)數(shù)的計數(shù)(高8位)RBCR0 要讀取的字節(jié)數(shù)的計數(shù)(低8位)程序中的reg0b0,reg0a=12,所以要讀取12個字節(jié)。 reg00=0x0a 的意思是進行DMA的內(nèi)存讀取操作。結(jié)果將網(wǎng)卡地址存儲在mynodeid3(共6個字節(jié))里。 (十)設(shè)置網(wǎng)卡地址- 很久沒有寫網(wǎng)卡的文章了,很多網(wǎng)友很關(guān)心其他方面的內(nèi)容,也只好寫下去.以下程序是設(shè)置網(wǎng)卡的地址,只有符合這個地址的數(shù)據(jù)包才接收.void writemynodeid() page(1);reg01=mynodeid0.bytes.high; /PAR0reg02=mynodeid0.bytes.low; /PAR1reg03=mynodeid1.bytes.high; /PAR2reg04=mynodeid1.bytes.low; /PAR3reg05=mynodeid2.bytes.high; /PAR4reg06=mynodeid2.bytes.low; /PAR5又用到幾個新的寄存器,是頁1的幾個寄存器:PAR0,PAR1, PAR2, PAR3,PAR4,PAR5這幾個寄存器是網(wǎng)卡的工作時候用的地址,只有符合這個地址的數(shù)據(jù)包才接收,這個地址是可以設(shè)置為其他的值,不一定設(shè)置為網(wǎng)卡的物理地址,為了不跟別的網(wǎng)卡地址沖突,最好設(shè)置為網(wǎng)卡的地址,(如果用戶需要設(shè)置為其他的值,也是可以的).(十二)RTL8019AS的跳線方式rtl8019as有3種工作方式:第一種為跳線方式,網(wǎng)卡的i/o和中斷由跳線決定第二種為即插即用方式,由軟件進行自動配置plug and play第三種為免跳線方式,網(wǎng)卡的i/o和中斷由外接的93c46里的內(nèi)容決定。我們買到的網(wǎng)卡一般只支持第2和第3種。在嵌入式應(yīng)用的 場合,如果可以不使用93c46的話,可以降低成本,同時又減少連線。那么我們?nèi)绾问褂玫?種方式跳線方式呢?網(wǎng)卡使用哪種方式由rtl8019as的第65腳JP決定。我們來看引腳圖:第65腳jp是輸入引腳,當(dāng)65腳為低電平時,8019工作在第2種或第3種方式,具體由93c46里的內(nèi)容決定。我們買到的 rtl8019as網(wǎng)卡一般第65腳為懸空的,rtl8019as懸空時,引腳的 輸入狀態(tài)為低電平(其他引腳也是這樣,懸空的輸入腳的電平為低電平,里面有一個100k的下拉電阻),網(wǎng)卡工作在第2,3種工作方式,需要使用93c46芯片。如果我們把65腳接高電平(vcc),那么網(wǎng)卡的i/o和中斷就不是用93c46的內(nèi)容決定,這時不需要使用93c46,可以不接93c46。那么這時候的i/o和中斷irq是多少呢?這時需要用到64,65,78,79,80,81,82,84,85等引腳。64腳aui,該引腳決定使用aui還是bnc接口。我們用的網(wǎng)卡的接口一般是bnc的,很少用aui。bnc接口方式支持8線雙絞或同軸電纜。高電平時使用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)決定:在嵌入式領(lǐng)域一般都不用該brom。brom是boot rom的縮寫。在電腦里用來做無盤工作站時候用到,可以從網(wǎng)卡進行引導(dǎo),而不是從a盤,c盤等引導(dǎo)系統(tǒng)。網(wǎng)絡(luò)接口類型由74,77(PL0,PL1)引腳決定:我們使用第一種自動檢測就可以了。會自動檢測接口類型然后進行工作。自動檢測是用同軸還是雙絞線。作為一個例子來自http:/8052.lphard.cz的電路圖,該電路圖沒有使用中斷方式工作,使用跳線方式,所以沒有接93c46,I/

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論