?? 00000026.htm
字號(hào):
<?xml version="1.0" encoding="gb2312"?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=gb2312"/><title>單片機(jī)與TCP/IP網(wǎng)絡(luò) (八) jacobw </title></head><body><center><h1>BBS 水木清華站∶精華區(qū)</h1></center><a name="top"></a>發(fā)信人: turbolinux (hoho~神啊,救救我吧...), 信區(qū): Embedded <br />標(biāo) 題: 單片機(jī)與TCP/IP網(wǎng)絡(luò) (八) <br />發(fā)信站: BBS 水木清華站 (Fri Jul 13 00:35:57 2001) <br /> <br /> 單片機(jī)與TCP/IP網(wǎng)絡(luò) <br />--版主 老古 <a href="http://www.laogu.com">http://www.laogu.com</a> <br /> <br />(八)網(wǎng)卡初始化 <br /> <br /> <br />------------------------------------------------------------------------ <br />-------- <br /> <br />---- 完成復(fù)位之后,你要對(duì)網(wǎng)卡的工作參數(shù)進(jìn)行設(shè)置.以使網(wǎng)卡開始工作. <br />先介紹一個(gè)子函數(shù) <br />#define reg00 XBYTE[0xc000] //對(duì)應(yīng)于地址240H 為命令寄存器CR地址 <br /> <br />void page(uchar pagenumber) <br />{ uchar data temp; <br />temp=reg00;//command register <br />temp=temp&0x3f; <br />pagenumber=pagenumber <<6; <br />temp=temp | pagenumber; <br />reg00=temp; <br />} <br />作用是選擇指定的頁,網(wǎng)卡共有4頁寄存器,Ne2000兼容的有3頁。第四頁可以不用 <br />。 <br /> <br />reg00命令寄存器:CR,command register,地址偏移量00H,為一個(gè)字節(jié) <br /> <br />位 7 6 5 4 3 2 1 0 <br />名字 PS1 PS0 RD2 RD1 RD0 TXP STA STP <br /> <br /> <br />PS1和PS0這兩個(gè)位用來選擇寄存器頁,PS1 PS0=00時(shí)選擇寄存器頁0,=01時(shí)選擇寄存 <br />器頁1, =10時(shí)選擇寄存器頁2,=11時(shí)選擇寄存器頁3. <br />上面的程序的參數(shù)為pagenumber,用來指定第幾頁。 <br />temp=reg00 ;//讀入命令寄存器的值。 <br />temp=temp&0x3f;//將高2位,即PS1,PS0清0 <br />pagenumber=pagenumber<<6;//將低2位移至高端 <br />temp=temp|pagenumber, //寫入高2位 <br />reg00=temp; //設(shè)置第幾頁 <br /> <br />當(dāng)然也可以寫成更加簡單的幾句: <br />temp=reg00&0x3f; <br />pagenumber=pagenumber<<6; <br />reg00=temp|pagenumber; <br /> <br />但這樣對(duì)讀者來說不好理解。 <br />從執(zhí)行的速度來說,上面的代碼也不是最快的。但作者主要講述原理,而不是探討 <br />最快的實(shí)現(xiàn)。 <br />--RD2,RD1,RD0這3個(gè)位代表要執(zhí)行的功能。 <br />=001 讀網(wǎng)卡內(nèi)存 <br />=010 寫網(wǎng)卡內(nèi)存 <br />=011 發(fā)送網(wǎng)卡數(shù)據(jù)包 <br />=1** 完成或結(jié)束DMA的讀寫操作 <br />---TXP這個(gè)位寫入1時(shí)發(fā)送數(shù)據(jù)包,發(fā)完自動(dòng)清零 <br />---STA,STP這兩個(gè)位用來啟動(dòng)命令或停止命令 <br />=10 啟動(dòng)命令 <br />=01 停止命令 <br /> <br />下面介紹網(wǎng)卡的初始化子程序: <br />void ne2000init() <br />{ reg00=0x22; //選擇頁0的寄存器,執(zhí)行命令 <br />reg01=0x4c; //寄存器Pstart <br />reg02=0x80; //Pstop <br />reg03=0x4c; //BNRY <br />reg04=0x45; //TPSR <br />reg0c=0xcc; //RCR <br />reg0d=0xe0; //TCR <br />reg0e=0xc8; //DCR 數(shù)據(jù)配置寄存器 8位數(shù)據(jù)dma <br />reg0f=0x00; //IMR disable all interrupt <br />page(1); //選擇頁1的寄存器 <br />reg07=0x4d; //CURR <br />reg08=0x00; //MAR0 <br />reg09=0x41; //MAR1 <br />reg0a=0x00; //MAR2 <br />reg0b=0x80; //MAR3 <br />reg0c=0x00; //MAR4 <br />reg0d=0x00; //MAR5 <br />reg0e=0x00; //MAR6 <br />reg0f=0x00; //MAR7 <br />} <br /> <br />PSTART 接收緩沖區(qū)的起始頁的地址。 <br />PSTOP 接收緩沖區(qū)的結(jié)束頁地址。(該頁不用于接收) <br />BNRY 指向最后一個(gè)已經(jīng)讀取的頁(讀指針) <br />CURR 當(dāng)前的接收結(jié)束頁地址。(寫指針) <br /> <br />--網(wǎng)卡含有16K字節(jié)的RAM,地址為0x4000-0x7fff(指的是網(wǎng)卡上的存儲(chǔ)地址,而 <br />不是ISA總線的地址,是網(wǎng)卡工作用的存儲(chǔ)器),每256個(gè)字節(jié)稱為一頁,共有64頁 <br />。頁的地址就是地址的高8位,頁地址為0x40--0x7f 。這16k的ram的一部分用來存 <br />放接收的數(shù)據(jù)包,一部分用來存儲(chǔ)待發(fā)送的數(shù)據(jù)包。當(dāng)然也可以給用戶使用。(例 <br />如把網(wǎng)卡設(shè)置成使用8K的ram,另外8K的ram就可以用來給單片機(jī)作為存儲(chǔ)器,但我 <br />沒有這樣做,原因是操作網(wǎng)卡上的ram比較復(fù)雜) <br />---在我的程序中使用0x40-0x4B為網(wǎng)卡的發(fā)送緩沖區(qū),共12頁,剛好可以存儲(chǔ) <br />2個(gè)最大的以太網(wǎng)包。使用0x4c-0x7f為網(wǎng)卡的接收緩沖區(qū),共52頁。因此 <br />PSTART=0x4c,PSTOP=0x80(0x80為停止頁,就是直到0x7f,是接收緩沖區(qū),不包括 <br />0x80) 剛開始,網(wǎng)卡沒有接收到任何數(shù)據(jù)包,所以,BNRY設(shè)置為指向第一個(gè)接收 <br />緩沖區(qū)的頁0x4c) <br />這四個(gè)寄存器用于接收的設(shè)置。 <br />--CURR是網(wǎng)卡寫內(nèi)存的指針。它指向當(dāng)前正在寫的頁的下一頁。那么初始化它就 <br />應(yīng)該指向0x4c+1=0x4d 。網(wǎng)卡寫完接收緩沖區(qū)一頁,就將這個(gè)頁地址加一, <br />CURR=CURR+1。這是網(wǎng)卡自動(dòng)加的。當(dāng)加到最后的空頁(這里是0x80,PSTOP)時(shí), <br />將CURR置為接收緩沖區(qū)的第一頁(這里是0x4c,PSTART),也是網(wǎng)卡自動(dòng)完成的。 <br />當(dāng)CURR=BNRY時(shí),表示緩沖區(qū)全部被存滿,數(shù)據(jù)沒有被用戶讀走,這時(shí)網(wǎng)卡將停止 <br />往內(nèi)存寫數(shù)據(jù),新收到的數(shù)據(jù)包將被丟棄不要,而不覆蓋舊的數(shù)據(jù)。此時(shí)實(shí)際上出 <br />現(xiàn)了內(nèi)存溢出。 <br />---而BNRR要由用戶來操作。用戶從網(wǎng)卡讀走一頁數(shù)據(jù),要將BNRY加一,然后再 <br />寫到BNRY寄存器。 當(dāng)BNRY加到最后的空頁(0x80,PSTOP)時(shí),同樣要將BNRY變成 <br />第一個(gè)接收頁(PSTART,0x4c)BNRY=0x4c; <br />---CURR和BNRY主要用來控制緩沖區(qū)的存取過程,保證能順次寫入和讀出)。 <br />當(dāng)CURR=BNRY+1(或當(dāng)BNRY=0x7f ,CURR=0x4c)時(shí),網(wǎng)卡的接收緩沖區(qū)里沒有數(shù)據(jù) <br />,表示沒有收到數(shù)據(jù)包。 用戶通過這個(gè)判斷知道沒有包可以讀。當(dāng)上述條件不成 <br />立時(shí),表示接收到新的數(shù)據(jù)包。然后用戶應(yīng)該讀取數(shù)據(jù)包,直到上述條件成立時(shí), <br />表示所以數(shù)據(jù)包已經(jīng)讀完,此時(shí)停止讀取數(shù)據(jù)包。 <br />--TPSR 為發(fā)送頁的起始頁地址。初始化為指向第一個(gè)發(fā)送緩沖區(qū)的頁,0x40。 <br /> <br />--RCR 接收配置寄存器,設(shè)置為使用接收緩沖區(qū),僅接收自己的地址的數(shù)據(jù)包( <br />以及廣播地址數(shù)據(jù)包)和多點(diǎn)播送地址包,小于64字節(jié)的包丟棄(這是協(xié)議的規(guī)定 <br />,設(shè)置成接收是用于網(wǎng)絡(luò)分析),校驗(yàn)錯(cuò)的數(shù)據(jù)包不接收。 <br />--TCR 發(fā)送配置寄存器,啟用crc自動(dòng)生成和自動(dòng)校驗(yàn),工作在正常模式。 <br />--DCR 數(shù)據(jù)配置寄存器,設(shè)置為使用FIFO緩存,普通模式,8位數(shù)據(jù)傳輸模式, <br />字節(jié)順序?yàn)楦呶蛔止?jié)在前,低位字節(jié)在后(符合我們的習(xí)慣)(如果用16位的單片 <br />機(jī),設(shè)置成16位的數(shù)據(jù)總線操作會(huì)更快,但80c52是8位總線的單片機(jī)) <br />--IMR 中斷屏蔽寄存器,設(shè)置成0x00,屏蔽所有的中斷。設(shè)置成0xff將允許中斷 <br />) <br />--MAR0--MAR8是設(shè)置多點(diǎn)播送的參數(shù),這點(diǎn)我也不是很清楚,我從電腦讀出來 <br />是什么數(shù),我也將這8個(gè)寄存器設(shè)置成這幾個(gè)數(shù). 由于我們不使用多點(diǎn)播送,所以 <br />不要緊,只要保證網(wǎng)卡能正常工作就可以了。 <br />--PAGE2的寄存器是只讀的,所以不可以設(shè)置,不用設(shè)置,PAGE3的寄存器不是 <br />NE2000兼容的,所以也不用設(shè)置。 <br /> <br />(未完) <br /> <br /> <br />-- <br /> <br />※ 來源:·BBS 水木清華站 smth.org·[FROM: 166.111.174.125] <br /><a href="00000025.htm">上一篇</a><a href="javascript:history.go(-1)">返回上一頁</a><a href="index.htm">回到目錄</a><a href="#top">回到頁首</a><a href="00000027.htm">下一篇</a></h1></center><center><h1>BBS 水木清華站∶精華區(qū)</h1></center></body></html>
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -