二.網卡上電覆位

----當你買到一個新的RTL8019AS網卡,你要先將該網卡設置爲以下的配置:

操作方式Operating Mode:跳線方式Jumperless(不是即插即用Plug and Play)
端口I/O base: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個寄存器地址。
10H DMA地址 (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中介紹的PLUG and PLAY的一些過程,我們不需要做,因爲單片機的資源有限,能夠減少的操作,都儘量減少。

程序從main()開始執行:

#include <my.h> /*my.h 爲作者所用的頭文件,包含所有89c52寄存器的大寫和小寫的定義,
和一些常用的子函數,一些宏的定義*/
main()

{

delaymsecond(10);//延時大約1秒,保證電源穩定和網卡自身的上電完成。
netcardreset();//復位網卡的子程序

。。。。

}
下面介紹網卡的復位子程序:
#define reg1f XBYTE[0xdf00] //網卡的復位端口的地址,對應於網卡的地址25FH。
#define uint unsigned int //uint 代表unsigned int ,作者一般使用縮寫uint
#define uchar unsigned char //uchar 代表unsigned char,我比較懶,不願意多寫
sbit reset=p3^4; //單片機的p3.4腳連接到網卡的RSTDRV復位引腳

void netcardreset()
{uint data i;
uchar data temp;
reset=1; //使網卡的RSTDRV引腳變成高電平,網卡是高電平復位的。
for(i=0;i<250;i++);//延時程序,至少需要
reset=0; //使網卡的RSTDRV引腳變成低電平,網卡上電覆位完畢
for(i=0;i<250;i++);
temp=reg1f;//讀網卡的復位端口
reg1f=temp; //寫網卡的復位端口
for(i=0;i<250;i++);


}
上面所講的實際上是網卡復位的兩種情況,
reset=1;reset=0相當於冷復位
temp=reg1f;reg1f=temp相當於熱復位
對網卡的復位端口的讀或寫將復位網卡,網卡內部將執行復位過程。讀寫是隨意的,寫入任意的數都將復位網卡。
實際上只要使用冷復位就可以了,熱復位程序可以不要。熱復位主要在電腦裏有用,冷復位就像電腦的冷啓動,熱復位相當於電腦的熱啓動。

--作者的復位網卡的過程是簡化了的,一個電腦裏的復位過程是比較複雜的,如果你有網卡驅動的UNIX,LINUX程序的源代碼,它的代碼將會做一些判斷和檢查,檢查網卡是否存在,和是否工作正常,和是否存在地址和中斷衝突 。但在我們的這個系統裏可以省去這些,我們認爲網卡的地址和I/O是沒有衝突和正常工作的。當然如果讀者願意,也可以寫一些檢查代碼。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章