?? 00000027.htm
字號:
<?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>單片機與TCP/IP網絡 (九) jacobw </title></head><body><center><h1>BBS 水木清華站∶精華區</h1></center><a name="top"></a>發信人: turbolinux (hoho~神啊,救救我吧...), 信區: Embedded <br />標 題: 單片機與TCP/IP網絡 (九) <br />發信站: BBS 水木清華站 (Fri Jul 13 00:36:41 2001) <br /> <br /> <br /> <br /> 單片機與TCP/IP網絡 <br />--版主 老古 <a href="http://www.laogu.com">http://www.laogu.com</a> <br /> <br />(九)讀取網卡的網卡地址 <br /> <br /> <br />------------------------------------------------------------------------ <br />-------- <br /> <br />---- 完成上面的過程之后,網卡還不能正確的接收數據包,因為我們還沒有對網 <br />卡的物理地址(網卡地址,48位的地址)進行設置。網卡還不知道它應該什么地址 <br />的數據包。要對網卡的物理地址進行設置,就必須知道網卡的物理地址是多少。 <br />讀取網卡的物理地址的子程序: <br />union u {uint word; struct{uchar high;uchar low;}bytes;}; //我定義的數據 <br />結構,為兩個字節的結構 //,可以按照uint(unsigned int)來讀取,也可以按照 <br />高低字節high和low來讀取。 <br /> <br />union u mynodeid[3];//存儲網卡的物理地址 <br />union u protocal; //臨時變量 <br />void readmynodeid() <br />{uchar data i,temp; <br />page(0); <br />reg09=0;//寄存器RSAR1 dma read highaddress=0 <br />reg08=0;//RSAR0 dma read lowaddress=0; <br />reg0b=0; //RBCR1 read count high <br />reg0a=12;//RBCR0 count low <br />reg00=0x0a;//dma read and start <br />for (i=0;i<6;i++) <br />{ temp=reg10;//讀取一個字節 <br /> <br /> <br />if (i % 2==0) <br />{protocal.bytes.high=temp;} <br />else {protocal.bytes.low=temp;mynodeid[i/2].word=protocal.word;} <br /> <br />temp=reg10;//讀取一個重復的字節,這個字節被丟棄 <br /> <br />} <br />} <br /> <br />--網卡除了16k(地址0x4000-0x7FFFF)的接收發送存儲RAM之外,還有別的RAM, <br />還有一塊大小為256字節的RAM,地址為0x0000-0x00FF,這部分RAM是eeprom <br />93C46的影像存儲(不完全一樣),存儲的內容的一部分跟93C46存儲的是一樣的。 <br /> 網卡在上電的時候將93C46的一部分內容讀到這256字節的RAM里。 <br />存儲是WORD類型,其中地址: <br />0x0000-0x000b共12個字節是網卡的物理地址。(網卡的物理地址是6個字節的,為 <br />什么要用12字節?因為這12字節是重復存儲的。例如網卡物理地址 <br />0x52544CC118CF,存儲在0x0000-0x000b里是這樣的: <br /> <br />525254544C4CC1C11818CFCF <br />我們可以看到單和雙的地址存儲的是一樣的。0x000b后面的地址存儲的是生產廠商 <br />的代碼和產品標識代碼,也是單雙地址重復存儲,這里就不說了。 <br /> <br />這個程序又用到4個新的寄存器:RSAR1 RSAR0 RBCR1 RBCR0 <br />這4個寄存器是專門用于讀取網卡上面的ram的。 <br />RSAR1 網卡上的RAM的起始地址高8位 <br />RSAR0 網卡上的RAM的起始地址低8位 <br />--程序中的reg09,reg08都設成0,所以是從網卡上的0x0000地址開始讀。 <br />RBCR1 要讀取的字節數的計數(高8位) <br />RBCR0 要讀取的字節數的計數(低8位) <br />--程序中的reg0b=0,reg0a=12,所以要讀取12個字節。 <br />reg00=0x0a 的意思是進行DMA的內存讀取操作。 <br /> <br />--結果將網卡地址存儲在mynodeid[3](共6個字節)里。 <br />} <br /> <br /> <br /> <br />(未完) <br /> <br /> <br />-- <br /> <br />※ 來源:·BBS 水木清華站 smth.org·[FROM: 166.111.174.125] <br /><a href="00000026.htm">上一篇</a><a href="javascript:history.go(-1)">返回上一頁</a><a href="index.htm">回到目錄</a><a href="#top">回到頁首</a><a href="00000028.htm">下一篇</a></h1></center><center><h1>BBS 水木清華站∶精華區</h1></center></body></html>
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -