開發(fā)指南單片機(jī)RTL上網(wǎng)編程指南_第1頁
開發(fā)指南單片機(jī)RTL上網(wǎng)編程指南_第2頁
開發(fā)指南單片機(jī)RTL上網(wǎng)編程指南_第3頁
開發(fā)指南單片機(jī)RTL上網(wǎng)編程指南_第4頁
開發(fā)指南單片機(jī)RTL上網(wǎng)編程指南_第5頁
已閱讀5頁,還剩73頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、RTL8019編程指南(未完待續(xù))緒言單片機(jī)如何控制以太網(wǎng)網(wǎng)卡進(jìn)行傳輸數(shù)據(jù),如何加載TCP/IP協(xié)議連接到互聯(lián)網(wǎng),這些都是一些令人感興趣的問題。可以說以太網(wǎng)和TCP/IP協(xié)議已經(jīng)成為使用最廣泛的協(xié)議,而其它總線協(xié)議如RS485、RS232,CAN,LANWORKS,都只是一些局部系統(tǒng)的總線。圍繞以太網(wǎng)而制造的集線器,交換機(jī)已進(jìn)入大小公司,企業(yè),家庭。我現(xiàn)在在眾達(dá)天網(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)卡還在

2、研究之中。曾經(jīng)用單片機(jī)(89C52)控制和驅(qū)動10M的NE2000兼容型以太網(wǎng)卡與電腦主機(jī)傳輸數(shù)據(jù)?,F(xiàn)在將我的一些研究成果寫成一系列的文單,提供給大家。也許有一天研究了100M的網(wǎng)卡之后,可以讓單片機(jī)驅(qū)動它,那是可能的事,只不過接口可能會復(fù)雜一些。我所寫的驅(qū)動程序并不是標(biāo)準(zhǔn)的,因?yàn)槲覜]有學(xué)過UNIX,無法使用UNIX提供的原代碼。如果能使用UNIX的原代碼,那將是很好的事。我也正在接觸UNIX和VC+,DDK等方面的內(nèi)容,希望有一天能夠重寫我現(xiàn)在所寫的驅(qū)動程序。我知道有很多人在了解單片機(jī)與以太網(wǎng)方面的東西,在BBS上也發(fā)現(xiàn)了很多這方面的內(nèi)容,有些人的研究甚至比我還深入,我也希望能跟這些人交流交

3、流,如果對我的文章感興趣 ,當(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é)議格式。因此對我們來說只需要了解其中的一種就夠了,特別是對單片機(jī)來說,不可能支持太多的協(xié)議格式。以太

4、網(wǎng)的物理傳輸幀:(僅介紹第二種格式)PRSDDASATYPEDATAPADFCS56位8位48位48位16位不超過1500字節(jié)可選32位PR:同步位,用于收發(fā)雙方的時鐘同步,同時也指明了傳輸?shù)乃俾剩?0M和100M的時鐘頻率不一樣,所以100M網(wǎng)卡可以兼容10M網(wǎng)卡),是56位的二進(jìn)制數(shù)SD: 分隔位,表示下面跟著的是真正的數(shù)據(jù),而不是同步時鐘,為8位的10101011,跟同步位不同的是最后2位是11而不是10.DA:目的地址,以太網(wǎng)的地址為48位(6個字節(jié))二進(jìn)制地址,表明該幀傳輸給哪個網(wǎng)卡.如果為FFFFFFFFFFFF,則是廣播地址,廣播地址的數(shù)據(jù)可以被任何網(wǎng)卡接收到.SA:源地址,48

5、位,表明該幀的數(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é)。因?yàn)橐蕴W(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é)

6、的數(shù)據(jù),當(dāng)數(shù)據(jù)段的數(shù)據(jù)不足46字節(jié)時,后面補(bǔ)000000.(當(dāng)然也可以補(bǔ)其它值)-FCS:32位數(shù)據(jù)校驗(yàn)位.為32位的CRC校驗(yàn),該校驗(yàn)由網(wǎng)卡自動計算,自動生成,自動校驗(yàn),自動在數(shù)據(jù)段后面填入.對于數(shù)據(jù)的校驗(yàn)算法,我們無需了解.-事實(shí)上,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ù),一

7、個是廣播地位,一個是多播地址(我們用不上),一個是它自已的地址.但網(wǎng)卡也可以設(shè)置為接收任何數(shù)據(jù)包(用于網(wǎng)絡(luò)分析和監(jiān)控).-任何兩個網(wǎng)卡的物理地址都是不一樣的,是世界上唯一的,網(wǎng)卡地址由專門機(jī)構(gòu)分配.不同廠家使用不同地址段,同一廠家的任何兩個網(wǎng)卡的地址也是唯一的.根據(jù)網(wǎng)卡的地址段(網(wǎng)卡地址的前三個字節(jié)),可以知道網(wǎng)卡的生產(chǎn)廠家.有些網(wǎng)卡的地址也可以由用戶去設(shè)定,但一般不需要. 網(wǎng)卡上電復(fù)位-當(dāng)你買到一個新的RTL8019AS網(wǎng)卡,你要先將該網(wǎng)卡設(shè)置為以下的配置:操作方式Operating Mode:跳線方式Jumperless(不是即插即用Plug and Play)端口I/O base:024

8、0-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位的操作方式,上

9、面的地址中只有18個是有用的:00H0FH共16個寄存器地址。10H DMA地址 (10H17H的8個地址是一樣的,都可以用來做DMA端口,只要用其中的一個就可以了)1FH 復(fù)位地址。(18H到1FH共8個地址都是復(fù)位地址,每個地址的功能都是一樣的,只要其中的一個就可以了,但實(shí)際上只有18H,1AH,1CH,1EH這幾個復(fù)位端口是有效的,其他不要使用,有些兼容卡不支持19H,1BH,1DH等奇數(shù)地址的復(fù)位)跟復(fù)位有關(guān)的引腳:RSTDRV連接到ISA總線的RSTDRV的引腳上。RSTDRV同時也是ISA總線的復(fù)位信號。RSTDRV為高電平有效,至少需要 800ns的寬度。給該引腳施加一個1us以

10、上的高電平就可以復(fù)位。施加一個高電平之后,然后施加一個低電平。RSTDRV從高電平到低電平之后要等多久,單片機(jī)才可以對網(wǎng)卡進(jìn)行操作?復(fù)位的過程將執(zhí)行一些操作,比如將93c46讀入,將內(nèi)部寄存器初始化等。這些至少需要2毫秒的時間。我們推薦大家等待更久的時間之后才對網(wǎng)卡操作,比如100毫秒之后才對它操作,以確保完全復(fù)位。對RSTDRV可以接單片機(jī)的一個引腳進(jìn)行對網(wǎng)卡的復(fù)位。但也可以直接將RSTDRV跟單片機(jī)的RESET引腳并聯(lián),單片機(jī)復(fù)位的時候,網(wǎng)卡也復(fù)位,以減少一個單片機(jī)的引腳的使用。這種情況下,為了保證能夠完全復(fù)位,可以使用下面介紹的熱復(fù)位代碼。 跟復(fù)位有關(guān)的寄存器:18H1FH共8個地址,為

11、復(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ù)位,特別是在即插即用的檢測過程中。對于我們用單片機(jī)控制網(wǎng)卡來說,我們可以不檢查該標(biāo)志位,因?yàn)槿绻麖?fù)位不正常的情況通常是網(wǎng)卡壞了。寄存器:00H0FH共16個地址是寄存器地址。寄存器分成4頁P(yáng)AGE0-PAGE3,但NE2000兼容的寄存器只有3頁(Page0-Page2),(第四頁是RTL8019AS自己定義的,我們不用去管這些寄存器,因?yàn)槟銓Φ谒捻摰募拇嫫鞯牟僮?/p>

12、僅對這個網(wǎng)卡是有效的,如果你換成其他Ne2000兼容的網(wǎng)卡,例如DM9008,DP8390等,你的程序?qū)o法正常運(yùn)行。 為了保證驅(qū)動程序?qū)λ蠳e2000的網(wǎng)卡有效,不要去操作第四頁的寄存器)由于寄存器較多,我將在用到該寄存器的時候才對該寄存器介紹。對網(wǎng)卡進(jìn)行復(fù)位:這是網(wǎng)卡驅(qū)動程序的需要做的第一個內(nèi)容,由于我們將網(wǎng)卡設(shè)置為跳線模式,而不是即插即用的模式,RTL8019AS.PDF中介紹的PLUG and PLAY的一些過程,我們不需要做,因?yàn)閱纹瑱C(jī)的資源有限,能夠減少的操作,都盡量減少。程序從main()開始執(zhí)行:#include <my.h> /*my.h 為作者所用的頭文件,包

13、含所有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,我比較懶,不愿意多寫sb

14、it reset=p34; /單片機(jī)的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;i<250;i+);/延時程序,至少需要reset=0; /使網(wǎng)卡的RSTDRV引腳變成低電平,網(wǎng)卡上電復(fù)位完畢f(xié)or(i=0;i<250;i+);temp=reg1f;/讀網(wǎng)卡的復(fù)位端口reg1f=temp; /寫網(wǎng)卡的復(fù)位端口for(i=0;i<250;i+); 上面所講的實(shí)際上是網(wǎng)卡復(fù)位的兩種情況,reset

15、=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)卡。 實(shí)際上只要使用冷復(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是沒有沖突和正常工

16、作的。當(dāng)然如果讀者愿意,也可以寫一些檢查代碼。網(wǎng)卡初始化- 完成復(fù)位之后,你要對網(wǎng)卡的工作參數(shù)進(jìn)行設(shè)置.以使網(wǎng)卡開始工作.先介紹一個子函數(shù)void page(uchar pagenumber)#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=te

17、mp;錯誤修正:(2001年11月10日) :以上程序有問題,在中斷驅(qū)動或發(fā)送數(shù)據(jù)包不作等待時,因?yàn)榘l(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=page

18、number<<6temp=temp|pagenumber;reg00=temp;從實(shí)驗(yàn)當(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名字PS1PS0RD2RD1RD0TXPSTASTP         l PS1和PS0這兩個位用來選

19、擇寄存器頁,PS1 PS0=00時選擇寄存器頁0,=01時選擇寄存器頁1, =10時選擇寄存器頁2,=11時選擇寄存器頁3.上面的程序的參數(shù)為pagenumber,用來指定第幾頁。temp=reg00 ;/讀入命令寄存器的值。temp=temp&0x3b;/將高2位,即PS1,PS0清0pagenumber=pagenumber<<6;/將低2位移至高端temp=temp|pagenumber, /寫入高2位reg00=temp; /設(shè)置第幾頁當(dāng)然也可以寫成更加簡單的幾句:temp=reg00&0x3B;pagenumber=pagenumber<<6;

20、reg00=temp|pagenumber; 但這樣對讀者來說不好理解。從執(zhí)行的速度來說,上面的代碼也不是最快的。但作者主要講述原理,而不是探討最快的實(shí)現(xiàn)。l RD2,RD1,RD0這3個位代表要執(zhí)行的功能。001 讀網(wǎng)卡內(nèi)存010 寫網(wǎng)卡內(nèi)存011 發(fā)送網(wǎng)卡數(shù)據(jù)包1* 完成或結(jié)束DMA的讀寫操作l TXP這個位寫入1時發(fā)送數(shù)據(jù)包,發(fā)完自動清零l STA,STP這兩個位用來啟動命令或停止命令10 啟動命令01 停止命令下面介紹網(wǎng)卡的初始化子程序:void ne2000init() reg00=0x21; /選擇頁0的寄存器,網(wǎng)卡停止運(yùn)行,因?yàn)檫€沒有初始化。reg01=0x4c; /寄存器Pst

21、artreg02=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; /MAR5reg0

22、e=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)

23、然也可以給用戶使用。(例如把網(wǎng)卡設(shè)置成使用8K的ram,另外8K的ram就可以用來給單片機(jī)作為存儲器,但我沒有這樣做,原因是操作網(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)前正在寫的頁的下一頁。那么初始

24、化它就應(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ù)。此時實(shí)際上出現(xiàn)了內(nèi)存溢出。而BNRR要由用戶來操作。用戶從網(wǎng)卡讀走一頁數(shù)據(jù),要將BNRY加一,然后再寫到BNRY寄存器。 當(dāng)BNRY加到最后的空頁(0x80,PSTOP)時,同樣要將BNRY變成第一個接收頁(

25、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ù)包)和多點(diǎn)播送地址包,小于64字

26、節(jié)的包丟棄(這是協(xié)議的規(guī)定,設(shè)置成接收是用于網(wǎng)絡(luò)分析),校驗(yàn)錯的數(shù)據(jù)包不接收。TCR 發(fā)送配置寄存器,啟用crc自動生成和自動校驗(yàn),工作在正常模式。DCR 數(shù)據(jù)配置寄存器,設(shè)置為使用FIFO緩存,普通模式,8位數(shù)據(jù)傳輸模式,字節(jié)順序?yàn)楦呶蛔止?jié)在前,低位字節(jié)在后(符合我們的習(xí)慣)(如果用16位的單片機(jī),設(shè)置成16位的數(shù)據(jù)總線操作會更快,但80c52是8位總線的單片機(jī))IMR 中斷屏蔽寄存器,設(shè)置成0x00,屏蔽所有的中斷。設(shè)置成0xff將允許中斷)MAR0MAR8是設(shè)置多點(diǎn)播送的參數(shù),這點(diǎn)我也不是很清楚,我從電腦讀出來是什么數(shù),我也將這8個寄存器設(shè)置成這幾個數(shù). 由于我們不使用多點(diǎn)播送,所以不要

27、緊,只要保證網(wǎng)卡能正常工作就可以了。PAGE2的寄存器是只讀的,所以不可以設(shè)置,不用設(shè)置PAGE3的寄存器不是NE2000兼容的,所以也不用設(shè)置。 讀取網(wǎng)卡的網(wǎng)卡地址- 完成上面的過程之后,網(wǎng)卡還不能正確的接收數(shù)據(jù)包,因?yàn)槲覀冞€沒有對網(wǎng)卡的物理地址(網(wǎng)卡地址,48位的地址)進(jìn)行設(shè)置。網(wǎng)卡還不知道它應(yīng)該什么地址的數(shù)據(jù)包。要對網(wǎng)卡的物理地址進(jìn)行設(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)

28、來讀取,也可以按照高低字節(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;i&

29、lt;6;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é)被丟棄256字節(jié)的RAM-網(wǎng)卡除了16k(地址0x40000x7FFFF)的接收發(fā)送存儲RAM之外,還有別的RAM,還有一塊大小為256字節(jié)的RAM,地址為0x00000x00FF,這部分RAM是eeprom 93C46的影像存儲(不完全一樣),存儲的內(nèi)容的一部分跟93C46存儲的是一樣的。 網(wǎng)卡在

30、上電的時候?qū)?3C46的一部分內(nèi)容讀到這256字節(jié)的RAM里。存儲是WORD類型,其中地址:0x0000-0x000b共12個字節(jié)是網(wǎng)卡的物理地址。(網(wǎng)卡的物理地址是6個字節(jié)的,為什么要用12字節(jié)?因?yàn)檫@12字節(jié)是重復(fù)存儲的。例如網(wǎng)卡物理地址0x52544CC118CF,存儲在0x0000-0x000b里是這樣的:525254544C4CC1C11818CFCF我們可以看到單和雙的地址存儲的是一樣的。0x000b后面的地址存儲的是生產(chǎn)廠商的代碼和產(chǎn)品標(biāo)識代碼,也是單雙地址重復(fù)存儲,這里就不說了。 這個程序又用到4個新的寄存器:RSAR1 RSAR0 RBCR1 RBCR0這4個寄存器是專門用于

31、讀取網(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 的意思是進(jìn)行DMA的內(nèi)存讀取操作。結(jié)果將網(wǎng)卡地址存儲在mynodeid3(共6個字節(jié))里。 設(shè)置網(wǎng)卡地址以下程序是設(shè)置網(wǎng)卡的地址,只有符合這個地址的數(shù)據(jù)包才接收.void writemynodeid() page(1);reg01=mynod

32、eid0.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)卡的物理地址,

33、為了不跟別的網(wǎng)卡地址沖突,最好設(shè)置為網(wǎng)卡的地址,(如果用戶需要設(shè)置為其他的值,也是可以的).RTL8019AS的跳線方式rtl8019as有3種工作方式:第一種為跳線方式,網(wǎng)卡的i/o和中斷由跳線決定第二種為即插即用方式,由軟件進(jìn)行自動配置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腳為

34、低電平時,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還是b

35、nc接口。我們用的網(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)卡進(jìn)行引

36、導(dǎo),而不是從a盤,c盤等引導(dǎo)系統(tǒng)。網(wǎng)絡(luò)接口類型由74,77(PL0,PL1)引腳決定:我們使用第一種自動檢測就可以了。會自動檢測接口類型然后進(jìn)行工作。自動檢測是用同軸還是雙絞線。作為一個例子來自的電路圖,該電路圖沒有使用中斷方式工作,使用跳線方式,所以沒有接93c46,I/O地址用的是300H,網(wǎng)絡(luò)接口為bnc(雙絞線),沒有使用brom),他使用at89c8252單片機(jī)運(yùn)行在14.74兆赫,支持http協(xié)議,24c512用來存儲網(wǎng)頁,F(xiàn)C22為耦合隔離變壓器模塊:網(wǎng)卡地址和多點(diǎn)播送(組播)及廣播以太網(wǎng)的地址為48位由ieee統(tǒng)一分配給網(wǎng)卡制造商,每個網(wǎng)卡的地址都必須是全球唯一的。共6個字節(jié)的

37、長度字節(jié)543210位47。4039。3231。2423。1615。87。0例子080009A04AB1我們需要注意的是以太網(wǎng)地址的第32位是組播地址的標(biāo)志位:位47。333231。2423。0 制造廠商標(biāo)識組播標(biāo)志位制造廠商標(biāo)識系列號     共6個字節(jié),其中前面3個字節(jié)(除了第32位),組成制造廠商的標(biāo)識,每個制造廠商的前3個字節(jié)是不同的,如果兩個網(wǎng)卡的前面3個字節(jié)是一樣的,那么這個卡是同一個公司制造的。同時通過該3個字節(jié)就可以反過來知道這個卡是哪個廠制造的。后面3個字節(jié)為系列號,由制造廠商給自己生產(chǎn)的網(wǎng)卡分配一個號碼,不同網(wǎng)卡的

38、號碼必須不同, 網(wǎng)卡地址的制造廠商的3個字節(jié)的標(biāo)識中,例如上面的08:00:09 ,080009 是惠普公司的標(biāo)識,表示這個卡是惠普公司制造的。3個字節(jié)的第一個字節(jié),必須為偶數(shù),上面的08是一個偶數(shù),是因?yàn)榈?2位,就是第一個字節(jié)的最低位是組播標(biāo)識,必須為0。以下X0:XX:XX:XX:XX:XXX2:XX:XX:XX:XX:XXX4:XX:XX:XX:XX:XX X6:XX: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為合法的以太網(wǎng)網(wǎng)卡地址。上面的X代表0F中的任一個。如果你不

39、是購買網(wǎng)卡,而是自己購買芯片制造,那么地址怎么辦?可以自己使用一個還沒有被ieee分配的廠商編號就可以了。就算是使用已經(jīng)分配的廠商編號也沒有不可,只要你能保證在你使用的局域網(wǎng)內(nèi),任何兩個網(wǎng)卡的地址不一樣就可以了。地址 FF:FF:FF:FF:FF:FF 為廣播地址只能用在目的地址段,不能作為源地址段。目的地址為廣播地址的數(shù)據(jù)包,可以被一個局域網(wǎng)內(nèi)的所有網(wǎng)卡接收到。地址X1: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:

40、XX:XX XF:XX:XX:XX:XX:XX 為組播地址,只能作為目的地址,不能作為源地址。組播地址可以被支持該組播地址的一組網(wǎng)卡接收到。組播地址主要用在視頻廣播,遠(yuǎn)程喚醒(通過發(fā)一個特殊的數(shù)據(jù)包使網(wǎng)卡產(chǎn)生一個中斷信號,啟動電腦),游戲(多個人在局域網(wǎng)里聯(lián)機(jī)打游戲)里等。以下是一些具體的組播地址:地址 范圍01:00:5E:00:00:00-01:00:5E:7F:FF:FF 用于ip地址的組播其他組播地址跟tcp/ip無關(guān),不做介紹。網(wǎng)卡可以接收以下3種地址的數(shù)據(jù)包:第一種 目的地址跟自己的網(wǎng)卡地址是一樣的數(shù)據(jù)包第二種 目的地址為FF:FF:FF:FF:FF:FF廣播地址的數(shù)據(jù)包第三種 目

41、的地址為跟自己的組播地址范圍相同的數(shù)據(jù)包那么在以太網(wǎng)的應(yīng)用當(dāng)中,如果你希望你的數(shù)據(jù)包只發(fā)給一個網(wǎng)卡,目的地址用對方的網(wǎng)卡地址如果你想把數(shù)據(jù)包發(fā)給所有的網(wǎng)卡,目的地址用廣播地址如果你想把數(shù)據(jù)包發(fā)給一組網(wǎng)卡,目的地址用組播地址。rtl8019跟網(wǎng)卡地址有關(guān)的寄存器: 物理地址寄存器,位于page1,共6個字節(jié),這就是網(wǎng)卡的地址,復(fù)位之后該6個寄存器的值是不定的。要由用戶將網(wǎng)卡地址寫入到該6個寄存器中,以后網(wǎng)卡接收到的數(shù)據(jù)包,會將數(shù)據(jù)包的目的地址跟這6個寄存器的值進(jìn)行比較,結(jié)果相同的數(shù)據(jù)包被接收下來。上電復(fù)位時從93c46讀入的網(wǎng)卡地址不會自動寫入到這里,而是放在rtl8019as的內(nèi)存地址0000

42、H,0002H,0004H,0006H,0008H,000AH,0000CH里。你的程序要從這6個內(nèi)存地址里讀出網(wǎng)卡地址,寫入到PAR0-5 共6個寄存器地址里。如果你的系統(tǒng)沒有使用93c46來存儲該網(wǎng)卡地址,那么要由你的軟件自行產(chǎn)生或分配一個網(wǎng)卡地址,寫入到6個寄存器里(比如你可以把網(wǎng)卡地址存儲在單片機(jī)的flash rom里,存儲在24c02的eeprom里等)。跟組播地址有關(guān)的寄存器:為8個寄存器,提供對組播地址的過濾。跟crc的邏輯有關(guān)。我對于該8個寄存器跟組播地址的關(guān)系不是很清楚,也沒有找到相關(guān)的資料。將該8個寄存器全部寫入0FFH,可以接收所有的組播地址地數(shù)據(jù)包。全部寫入0,將不接收

43、任何組播地址的數(shù)據(jù)包。在windows 98操作系統(tǒng)里,操作系統(tǒng)寫入到這8個寄存器的值為:MAR0 :00HMAR1 :41HMAR2 :00HMAR3 :80HMAR4 :00HMAR5 :00HMAR6 :00HMAR7 :00H寫入的這8個值跟具體的組播地址是什么關(guān)系?我也不知道。lphard的方案是寫入8個0xff 。那么在嵌入式應(yīng)用中應(yīng)該如何處理?建議為全部寫入0xff。如果不想支持組播,可以不用理這8個寄存器,或全部寫入0。 跟網(wǎng)卡地址有關(guān)的標(biāo)志位:   其中的第3位ATD,0為正常操作,1為由組播地址控制(用作流控)。我們把這個位設(shè)置為0。我們不需要使用流控,

44、因?yàn)榱骺氐臉?biāo)準(zhǔn)不被所有的網(wǎng)卡支持,有些網(wǎng)卡支持,有些不支持。其中的PRO,AM,AB跟地址有關(guān):PRO為1時,將接收所有的數(shù)據(jù)包,不管任何地址, 統(tǒng)統(tǒng)收下來。通常用在一些網(wǎng)橋,或一些用來監(jiān)視網(wǎng)絡(luò)的電腦里。sniffer軟件就是利用這個特性,將以太網(wǎng)上所有數(shù)據(jù)包都收下來進(jìn)行分析,以統(tǒng)計以太網(wǎng)里的數(shù)據(jù)傳輸率,沖突,出錯情況,網(wǎng)卡地址情況,ip數(shù)據(jù)包等情況。PRO為0時,接收跟自己的地址一樣的數(shù)據(jù)包,其他目的地址的被丟棄(不包括廣播和組播包)。我們設(shè)置為0就可以了。AM1時,接收組播地址的數(shù)據(jù)包,AM=0時,不接收組播地址的數(shù)據(jù)包。 將該位根據(jù)你的情況設(shè)置為1或0,推薦設(shè)置為1。AB1時,接收廣播地

45、址的數(shù)據(jù)包,AB0時,不接收廣播地址FF:FF:FF:FF:FF:FF的數(shù)據(jù)包。該位要設(shè)置為1,才能實(shí)現(xiàn)tcp/ip協(xié)議。PHY跟地址有關(guān):為接收的情況報告。參考:IP組播地址轉(zhuǎn)換為以太網(wǎng)組播地址組播地址大家知道,IP地址空間被劃分為A、B、C三類。第四類即D類地址被保留用做組播地址。在第四版的IP協(xié)議(IPv4)中,從到間的所有IP地址都屬于D類地址。組播地址中最重要的是第24位到27位間的這四位,對應(yīng)到十進(jìn)制是224到239,其它28位保留用做組播的組標(biāo)識,如下圖所示:          &

46、#160;               圖1 組播地址示意圖    IPv4的組播地址在網(wǎng)絡(luò)層要轉(zhuǎn)換成網(wǎng)絡(luò)物理地址。對一個單播的網(wǎng)絡(luò)地址,通過ARP協(xié)議可以獲取與IP地址對應(yīng)的物理地址。但在組播方式下ARP協(xié)議無法完成類似功能,必須得用其它的方法獲取物理地址。在下面列出的RFC文檔中提出了完成這個轉(zhuǎn)換過程的方法:    RFC1112:Multicast IPv4 t

47、o Ethernet physical address correspondence     RFC1390:Correspondence to FDDI     RFC1469:Correspondence to Token-Ring networks    在最大的以太網(wǎng)地址范圍內(nèi),轉(zhuǎn)換過程是這樣的:將以太網(wǎng)地址的前24位最固定為01:00:5E,這幾位是重要的標(biāo)志位。緊接著的一位固定為0,其它23位用IPv4組播地址中的低23位來填充。該轉(zhuǎn)換過程如下圖所示: 

48、                                         圖2 地址轉(zhuǎn)換示意圖    例如,組播地址為其以太網(wǎng)物理地址為01:

49、00:5E:00:00:05。還有一些特殊的IPv4組播地址:標(biāo)識子網(wǎng)中的所有主機(jī)。同一個子網(wǎng)中具有組播功能的主機(jī)都是這個組的成員。    2:該地址用來標(biāo)識網(wǎng)絡(luò)中每個具有組播功有的路由器。范圍內(nèi)的地址被分配給了低層次的協(xié)議。向這些范圍內(nèi)的地址發(fā)送數(shù)據(jù)包,有組播功能的路由器將不會為其提供路由。間的地址分配用做管理用途。這些地址被分配給局部的每一個組織,但不可以分配到組織外部,組織內(nèi)的路由器不向在組織外的地址提供路由。    除了上面列出的部分組播地址外,還有許多的組播地址。在最新版本的RFC文檔“Assinged

50、Numbers”中有完整的介紹。    下面的表中列出了全部的組播地址空間,同時還列出了相應(yīng)的地址段的常用名稱及其TTL(IP包的存活時間)。在IPv4組播方式下,TTL有雙重意義:正如大家所知的,TTL原本用來控制數(shù)據(jù)包在網(wǎng)絡(luò)中的存活時間,防止由于路由器配置錯誤導(dǎo)致出現(xiàn)數(shù)據(jù)包傳播的死循環(huán);在組播方式下,它還代表了數(shù)據(jù)包的活動范圍,如:數(shù)據(jù)包在網(wǎng)絡(luò)中能夠傳送多遠(yuǎn)?這樣就可以基于數(shù)據(jù)包的分類來定義其傳送范圍。范圍 TTL 地址區(qū)間 描述節(jié)點(diǎn)(Node) 0 只能向本機(jī)發(fā)送的數(shù)據(jù)包,不能向網(wǎng)絡(luò)中的其它接口傳送鏈路(Link) 1 -224.

51、0.0.255 只能在發(fā)送主機(jī)所在的一個子網(wǎng)內(nèi)的傳送,不會通過路由器轉(zhuǎn)發(fā)。部門 32 -55 只在整個組織下的一個部門內(nèi)(Department) 傳送組織 64 -55 在整個組織內(nèi)傳送(Organization)全局(Global)255 -55 沒有限制,可全局范圍內(nèi)傳送組播的工作過程   在局域網(wǎng)內(nèi),主機(jī)的網(wǎng)絡(luò)接口將到目的主機(jī)的數(shù)據(jù)包發(fā)送到高層,這些數(shù)據(jù)包中的目的地址是物理接口地址或廣播地址。 如果主機(jī)已經(jīng)加入

52、到一個組播組中,主機(jī)的網(wǎng)絡(luò)接口就會識別出發(fā)送到該組成員的數(shù)據(jù)包。因此,如果主機(jī)接口的物理地址為80:C0:F6:A0:4A:B1,其加入的組播組為,則發(fā)送給主機(jī)的數(shù)據(jù)包中的目的地址必是下面三種類型之一:接口地址:80:C0:F6:A0:4A:B1廣播地址:FF:FF:FF:FF:FF:FF組播地址:01:00:5E:00:01:0A廣域網(wǎng)中,路由器必須支持組播路由。當(dāng)主機(jī)中運(yùn)行的進(jìn)程加入到某個組播組中時,主機(jī)向子網(wǎng)中的所有組播路由器發(fā)送IGMP(Internet分組管理協(xié)議)報文,告訴路由器凡是發(fā)送到這個組播組的組播報文都必須發(fā)送到本地的子網(wǎng)中,這樣主機(jī)的進(jìn)程就可以接收到報文了。子網(wǎng)中的路由器

53、再通知其它的路由器,這些路由器就知道該將組播報文轉(zhuǎn)發(fā)到哪些子網(wǎng)中去。子網(wǎng)中的路由器也向發(fā)送一個IGMP報文(代表組中的全部主機(jī)),要求組中的主機(jī)提供組的相關(guān)信息。組中的主機(jī)收到這個報文后,都各將計數(shù)器的值設(shè)為隨機(jī)值,當(dāng)計數(shù)器遞減為0時再向路由器發(fā)送應(yīng)答。這樣就防止了組中所有的主機(jī)同時向路由器發(fā)送應(yīng)答,造成網(wǎng)絡(luò)擁塞。主機(jī)向組播地址發(fā)送一個報文做為對路由器的應(yīng)答,組中的其它主機(jī)一旦看到這個應(yīng)答報文,就不再發(fā)送應(yīng)答報文了,因?yàn)榻M中的主機(jī)向路由器提供的都是相同的信息,所以子網(wǎng)路由器只需得到組中一個主機(jī)提供的信息就可以了。如果組中的主機(jī)都退出了,路由器就收不到應(yīng)答,因此路由器認(rèn)為該組目前沒有主機(jī)加入,遂

54、停止到該子網(wǎng)報文的路由。IGMPv2的解決方案是:組中的主機(jī)在退出時向 發(fā)送報文通知組播路由器。以太網(wǎng)組播地址過濾寄存器的計算終于找到關(guān)于RTL8019AS里的 MAR0-MAR7的計算的程序,源程序是80x86的匯編,我把它轉(zhuǎn)換成了在keil c51里的程序,以便可以在51單片機(jī)里使用。 跟組播地址有關(guān)的寄存器:為8個寄存器,提供對組播地址的過濾。跟crc的邏輯有關(guān)。MAR0-7 全部設(shè)置為0xff時,將接收所有的組播數(shù)據(jù)包,將MAR0-7 全部設(shè)置為0x00時,將不接收所有組播地址的數(shù)據(jù)包。在windows98里,該值被設(shè)置為:MAR0=0x00; MAR1=0x41;

55、MAR2=0x00; MAR3=0x80; MAR4=0x00; MAR5=0x00; MAR6=0x00; MAR7=0x00; 用戶在嵌入式的應(yīng)用當(dāng)中,可以設(shè)置為全部0xff,也可以對特定的組播地址(比如你用在網(wǎng)絡(luò)電臺廣播)進(jìn)行計算,生成一個你需要的過濾參數(shù)。建議該過濾的算法不寫在單片機(jī)里,最好是先算好,存儲在單片機(jī)里,用的時候直接調(diào)用,以節(jié)省單片機(jī)的程序空間。 這8個寄存器的值是根據(jù)組播地址數(shù)組的值生成的,提供對組播地址的過濾,過濾掉一些不屬于自己接收組播數(shù)據(jù)包。如何接收8019一個數(shù)據(jù)包我們在上面談到了網(wǎng)卡的ram的結(jié)構(gòu),網(wǎng)卡ram是以256字節(jié)為一頁,是按頁存儲的結(jié)構(gòu),16

56、位的ram的地址的高8位又叫頁碼.網(wǎng)卡的16k的ram地址從0x4000-0x7fff,從頁0x40到頁0x7f,一共有64頁.這64頁被用來接收和發(fā)送數(shù)據(jù)包用.一般把前面的12頁用來存放發(fā)送的數(shù)據(jù)包,后面的52頁用來存放接收的數(shù)據(jù)包.當(dāng)然你也可以配置成前面52頁用來接收,而后面的12頁用來發(fā)送.或者你也可以不使用那么多的緩沖區(qū),比如只用32頁來做為緩沖區(qū),前面的6頁用來發(fā)送,接下來的26頁用來接收,而把空出來的32頁給單片機(jī)使用,用來存儲別的數(shù)據(jù).那么哪些頁被用來做接收緩沖區(qū)由兩個寄存器決定:Pstart(page start register)Pstop(page stop registe

57、r)PSTART,PSTOP是16位ram地址的高8位,也就是頁碼.舉個例子:PSTART=0x4cPSTOP =0x80這時網(wǎng)卡將使用0x4c00-0x7fff的ram來存儲接收到的數(shù)據(jù)包.PSTOP是0x80而不是0x7f,PSTOP的意思是,從該頁開始的頁不能做為 接收緩沖區(qū).而PSTART的意思是從這一頁開始做為接收緩沖區(qū).因此PSTART=0x4c ,PSTOP=0x7f+1=0x80,PSTOP被設(shè)置為(最后一頁的頁碼+1).再如:PSTART=0x40PSTOP=0x60那么網(wǎng)卡使用0x4000-0x5FFF做為接收緩沖區(qū). 而我的程序的設(shè)置是PSTART=0x4c PSTOP=0x80而頁0x40-0x4b共12頁做為發(fā)送數(shù)據(jù)緩沖區(qū),為什么用12頁,是因?yàn)樽畲蟮囊粋€數(shù)據(jù)包是1514字節(jié)+4字節(jié)校驗(yàn).一個最大的數(shù)據(jù)包需要6頁=256*6=1536字節(jié).12頁可以放兩個最大的包.我們把前6頁0x40-0x45稱為發(fā)送緩沖1,接下來的6頁0x46-0x4B稱為發(fā)送緩沖2.這兩個發(fā)送緩沖的作用是:用戶可以將數(shù)據(jù)包放在發(fā)送緩沖1,然后啟動發(fā)送.發(fā)送的過程中,如果用戶還有數(shù)據(jù)包要發(fā),那么這時把要發(fā)的數(shù)據(jù)包放

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論