<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 單片機驅動DM9000網(wǎng)卡芯片

          單片機驅動DM9000網(wǎng)卡芯片

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

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

          本文引用地址:http://www.ex-cimer.com/article/201611/320954.htm

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

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

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

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

          void main(void)

          {

          unsigned int i;

          unsigned char c;

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

          DM9000_init();//初始化網(wǎng)卡

          print_regs();

          }

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

          圖4 顯示寄存器值

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

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

          的十進制數(shù)。

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

          void main(void)

          {

          unsigned int i;

          unsigned char c;

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

          DM9000_init();//初始化網(wǎng)卡

          sendpacket(60);

          while(1);//等待中斷

          }

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

          {

          unsigned int i;

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

          int_again :

          if(i == 0)

          {

          return;

          }

          else

          {

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

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

          }

          i = receivepacket(Buffer);

          if(i != 0)

          {

          goto int_again;

          }

          }

          編譯調(diào)試,運行結果如下:

          圖5 接收數(shù)據(jù)包中的數(shù)據(jù)

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

          這里就不保密了,呵呵。

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

          檢查寄存器的值是否正確??梢詫M9000中的寄存器打印出來,查看到底是哪里的問題。如果打印出的

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

          次查找原因。

          三、ARP協(xié)議的實現(xiàn)

          1、ARP協(xié)議原理簡述

          ARP協(xié)議(Address Resolution Protocol 地址解析協(xié)議),在局域網(wǎng)中,網(wǎng)絡中實際傳輸?shù)氖?ldquo;

          幀”,幀里面有目標主機的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地

          址。

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

          圖6 用于以太網(wǎng)的ARP請求或應答分組格式

          注意,以太網(wǎng)的傳輸存儲是“大端格式”,即先發(fā)送高字節(jié)后發(fā)送低字節(jié)。例如,兩個字節(jié)的數(shù)據(jù)

          ,先發(fā)送高8位后發(fā)送低8位。所以接收數(shù)據(jù)的時候要注意存儲順序。

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

          “以太網(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請求,這里是需要目標機填充的。


          上一頁 1 2 下一頁

          評論


          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();