新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機驅動DM9000網卡芯片

        單片機驅動DM9000網卡芯片

        作者: 時間:2016-11-24 來源:網絡 收藏
        4、驗證初始化中的各個函數。

        下面我們來看一下,上面所寫的初始化函數是否可用。以上我們寫好了三個函數,分別為

        本文引用地址:http://www.104case.com/article/201611/320954.htm

        DM9000_init(),sendpacket()和receivepacket(),保存并命名為dm9000.c。既然我們要進行調試,當

        然要有結果輸出,根據自己的處理器的情況寫一個串口程序,這些函數是學某個單片機的基礎,這里不

        做詳細介紹,用到是時候會在函數里注釋一下。

        接下來我們來寫個主函數,新建C文件,命名為mian.c,填寫如下函數:

        void main(void)

        {

        unsigned int i;

        unsigned char c;

        uart0_init();//初始化串口,調試時用到

        DM9000_init();//初始化網卡

        print_regs();

        }

        函數寫好,保存文件,連接硬件,連接網線到電腦上或局域網上,運行結果如下圖所示:

        圖4 顯示寄存器值

        這里首先檢查,各個控制寄存器是否是自己寫進去的值,在檢查狀態寄存器是否正確,其中主要要

        看NSR寄存器的bit[6]是否為“1”,該位表示是否連接成功。本例中NSR的值為40H,括號里的數為對應

        的十進制數。

        下面我們將主函數改進一下,增加個中斷接收函數,查看是否能接收到數據。

        void main(void)

        {

        unsigned int i;

        unsigned char c;

        uart0_init();//初始化串口,調試時用到

        DM9000_init();//初始化網卡

        sendpacket(60);

        while(1);//等待中斷

        }

        void int_issue(void) //中斷處理函數,需要根據自己的處理器進行設置

        {

        unsigned int i;

        i = receivepacket(Buffer);//將數據讀取到Buffer中。

        int_again :

        if(i == 0)

        {

        return;

        }

        else

        {

        print_buffer();//將接收到的所有數據打印出來

        while(1);//停止在這里等待觀察,注意:實際應用中是不允許停止在中斷中的。

        }

        i = receivepacket(Buffer);

        if(i != 0)

        {

        goto int_again;

        }

        }

        編譯調試,運行結果如下:

        圖5 接收數據包中的數據

        這是一個ARP應答包,包含了我電腦上的MAC地址和局域網內的IP地址。反正我也不是啥重要人物,

        這里就不保密了,呵呵。

        如果一些順利,到這里對DM9000網卡芯片的初始化工作就完成了。如果出現問題,首先要

        檢查寄存器的值是否正確。可以將DM9000中的寄存器打印出來,查看到底是哪里的問題。如果打印出的

        值很混亂,在確保串口程序無誤的前提下,查看硬件連接,以及寄存器讀寫時序是否正確,重復調試幾

        次查找原因。

        三、ARP協議的實現

        1、ARP協議原理簡述

        ARP協議(Address Resolution Protocol 地址解析協議),在局域網中,網絡中實際傳輸的是“

        幀”,幀里面有目標主機的MAC地址。在以太網中,一個注意要和另一個主機進行直接通信,必須要知

        道目標主機的MAC地址。這個MAC地址就是標識我們的網卡芯片唯一性的地址。但這個目標MAC地址是如

        何獲得的呢?這就用到了我們這里講到的地址解析協議。所有“地址解析”,就是主機在發送幀前將目

        標IP地址轉換成MAC地址的過程。ARP協議的基本功能就是通過目標設備的IP地址,查詢目標設備的MAC

        地址,以保證通信的順利進行。所以在第一次通信前,我們知道目標機的IP地址,想要獲知目標機的

        MAC地址,就要發送ARP報文(即ARP數據包)。它的傳輸過程簡單的說就是:我知道目標機的IP地址,

        那么我就向網絡中所有的機器發送一個ARP請求,請求中有目標機的IP地址,請求的意思是目標機要是

        收到了此請求,就把你的MAC地址告訴我。如果目標機不存在,那么此請求自然不會有人回應。若目標

        機接收到了此請求,它就會發送一個ARP應答,這個應答是明確發給請求者的,應答中有MAC地址。我接

        到了這個應答,我就知道了目標機的MAC地址,就可以進行以后的通信了。因為每次通信都要用到MAC地

        址。

        ARP報文被封裝在以太網幀頭部中傳輸,如圖為ARP請求報文的頭部格式。

        圖6 用于以太網的ARP請求或應答分組格式

        注意,以太網的傳輸存儲是“大端格式”,即先發送高字節后發送低字節。例如,兩個字節的數據

        ,先發送高8位后發送低8位。所以接收數據的時候要注意存儲順序。

        整個報文分成兩部分,以太網首部和ARP請求/應答。下面挑重點講述。

        “以太網目的地址”字段:若是發送ARP請求,應填寫廣播類型的MAC地址FF-FF-FF-FF-FF-FF,意思是

        讓網絡上的所有機器接收到;

        “幀類型”字段:填寫08-06表示次報文是ARP協議;

        “硬件類型”字段:填寫00-01表示以太網地址,即MAC地址;

        “協議類型”字段:填寫08-00表示IP,即通過IP地址查詢MAC地址;

        “硬件地址長度”字段:MAC地址長度為6(以字節為單位);

        “協議地址長度”字段:IP地址長度為4(以字節為單位);

        “操作類型”字段:ARP數據包類型,0表示ARP請求,1表示ARP應答;

        “目的以太網地址”字段:若是發送ARP請求,這里是需要目標機填充的。


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 九江县| 乳山市| 永州市| 石屏县| 吉首市| 宜昌市| 衢州市| 府谷县| 徐水县| 霍山县| 翁源县| 绿春县| 山西省| 万安县| 德江县| 永善县| 比如县| 文昌市| 凌云县| 德兴市| 东港市| 凌源市| 涿鹿县| 房产| 蒲城县| 江津市| 宿松县| 南岸区| 中江县| 鸡泽县| 金川县| 双鸭山市| SHOW| 屏山县| 灵山县| 陆河县| 延寿县| 东兰县| 临西县| 盖州市| 高密市|