單片機驅動DM9000網(wǎng)卡芯片
DM9000_init(),sendpacket()和receivepacket(),保存并命名為dm9000.c。既然我們要進行調(diào)試,當
然要有結果輸出,根據(jù)自己的處理器的情況寫一個串口程序,這些函數(shù)是學某個單片機的基礎,這里不
做詳細介紹,用到是時候會在函數(shù)里注釋一下。
void main(void)
{
}
圖4 顯示寄存器值
看NSR寄存器的bit[6]是否為“1”,該位表示是否連接成功。本例中NSR的值為40H,括號里的數(shù)為對應
的十進制數(shù)。
void main(void)
{
}
void int_issue(void) //中斷處理函數(shù),需要根據(jù)自己的處理器進行設置
{
int_again :
}
圖5 接收數(shù)據(jù)包中的數(shù)據(jù)
這里就不保密了,呵呵。
檢查寄存器的值是否正確??梢詫M9000中的寄存器打印出來,查看到底是哪里的問題。如果打印出的
值很混亂,在確保串口程序無誤的前提下,查看硬件連接,以及寄存器讀寫時序是否正確,重復調(diào)試幾
次查找原因。
幀”,幀里面有目標主機的MAC地址。在以太網(wǎng)中,一個注意要和另一個主機進行直接通信,必須要知
道目標主機的MAC地址。這個MAC地址就是標識我們的網(wǎng)卡芯片唯一性的地址。但這個目標MAC地址是如
何獲得的呢?這就用到了我們這里講到的地址解析協(xié)議。所有“地址解析”,就是主機在發(fā)送幀前將目
標IP地址轉換成MAC地址的過程。ARP協(xié)議的基本功能就是通過目標設備的IP地址,查詢目標設備的MAC
地址,以保證通信的順利進行。所以在第一次通信前,我們知道目標機的IP地址,想要獲知目標機的
MAC地址,就要發(fā)送ARP報文(即ARP數(shù)據(jù)包)。它的傳輸過程簡單的說就是:我知道目標機的IP地址,
那么我就向網(wǎng)絡中所有的機器發(fā)送一個ARP請求,請求中有目標機的IP地址,請求的意思是目標機要是
收到了此請求,就把你的MAC地址告訴我。如果目標機不存在,那么此請求自然不會有人回應。若目標
機接收到了此請求,它就會發(fā)送一個ARP應答,這個應答是明確發(fā)給請求者的,應答中有MAC地址。我接
到了這個應答,我就知道了目標機的MAC地址,就可以進行以后的通信了。因為每次通信都要用到MAC地
址。
圖6 用于以太網(wǎng)的ARP請求或應答分組格式
,先發(fā)送高8位后發(fā)送低8位。所以接收數(shù)據(jù)的時候要注意存儲順序。
“以太網(wǎng)目的地址”字段:若是發(fā)送ARP請求,應填寫廣播類型的MAC地址FF-FF-FF-FF-FF-FF,意思是
讓網(wǎng)絡上的所有機器接收到;
“幀類型”字段:填寫08-06表示次報文是ARP協(xié)議;
“硬件類型”字段:填寫00-01表示以太網(wǎng)地址,即MAC地址;
“協(xié)議類型”字段:填寫08-00表示IP,即通過IP地址查詢MAC地址;
“硬件地址長度”字段:MAC地址長度為6(以字節(jié)為單位);
“協(xié)議地址長度”字段:IP地址長度為4(以字節(jié)為單位);
“操作類型”字段:ARP數(shù)據(jù)包類型,0表示ARP請求,1表示ARP應答;
“目的以太網(wǎng)地址”字段:若是發(fā)送ARP請求,這里是需要目標機填充的。
評論