zoukankan      html  css  js  c++  java
  • [FPGA][Nios][DP83848] 網路開發筆記-軟體篇(1)

    開發DP83848網路晶片終於有了一些成果。

    開發軟體驅動程式時,有遇到些疑問跟問題,或許可以提供給寫網路驅動程式的人一些答案,避免跟我繞了一大圈。

    Q1. DP83848網路怎麼work的?

    Q2. RMII的格式是甚麼? 線上傳輸時會得到甚麼?

    Q3. CRC碼的順序是怎麼放的?

     

    以上是我在開發時遇到的疑問跟問題,下面我來慢慢講解。

    Q1. DP83848網路怎麼work的?

    Ans: 我是用網路買到的DP83848開發板,並用其開發。可參考我其他篇文章。

    我是網路新手只是很單純想要用FPGA+NIOS 2來做資料傳輸,所以第一步就是先做SNI的傳輸,將PHY內的暫存器值讀回來。

    本來以為讀回來後要根據PHY暫存器內容,來送資料HOST端做Handshake連線,後來我搞錯了。

    其實只要把DP83848板子連上電,並把網路線接上去後,DP83848 Phy就會自動溝通連線,此時socket接頭的橘燈(表示連線成功)會亮起來,綠燈(有資料再傳)就會一閃一閃。

    Note:

          此時我是用 Notebook <-> (DP83848+FPGA版) 中間不要經由router或AP。如果 notebook 跟 FPGA板都是接router或AP,則用wireshake會抓不到FPGA送出來的封包,因為Router會擋掉。

    這時會遇到個問題,如果接上線後沒有亮橘跟綠燈,表示自動溝通連接出問題。 我是用loopback頭,接一下FPGA socket就自動連線正常,不知道其他人是不是也是這樣。

    一定要確定橘燈亮跟綠燈閃,才可以正常傳輸。

    Q2. RMII的格式是甚麼? 線上傳輸時會得到甚麼?

    網路封包格式如下

    Ethernet II 封包(Frame)
     
    Preamble(7)
    SFD(1)
    DA(6)
    SA(6)
    Ether type(2)
    Payload
    PAD
    FCS(4)

    在DP83848這個Phy很特別,他不會幫你處理網路封包,他只會幫你把資料轉成網路訊號傳送出去,跟電腦使用網路時不太一樣。

    以往在電腦端傳資料時只要呼叫 網路send函數,把你要傳的資料丟進send函數就可以傳送出來了。其實中間很多步驟都被省略了。例如下面的ARP測試資料。

    u8 my_ARP_data[60] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
                          0x00, 0x01, 0x08, 0x06, 0x00, 0x01, 0x08, 0x00, 0x06, 0x04,
                          0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xc0, 0xa8,
                          0x02, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc0, 0xa8,
                          0x02, 0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
                          0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
    

    要想從DP83848 phy上傳my_ARP_data資料到網路端,不是那麼容易。底下我就一一來破解這個流程。

           第一步:  建立一 空白 buf 並放入Preamble 跟 SFD 資料

          底下程式碼為加入preamble跟SFD到eth_buf內

    1 u8 eth_buf[2048];
    2 u8 peramble_string[8]={0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0xd5};
    3  
    4 s32 i,j;
    5 /* 附加Preamble string*/
    6 for(i=0; i< 8; i++){
    7     eth_buf[i] = peramble_string[i];  /* i是eth_buf的寫入到第幾筆資料counter */
    8 }

        第二步將ARP資料包進到buffer內

      將60筆Byte資料加在SFD之後。

    1     /* 附加要傳送的資料串 */
    2     for(j=0; j < 60; i++, j++){
    3         eth_buf[i] = my_ARP_data[j];
    4     }

    Q3. CRC碼的順序是怎麼放的? 答案在下面.   

       第三步計算CRC

    Crc32_ComputeBuf()函數是我網路找到的一種計算CRC32的方法。他只會計算除了Preamble、SFD、FCS外的所有資料CRC。
    其中算完的CRC為0x0f3be75c,則傳送順序 0f 3b e7 5c。
    1     /* 附加check sum*/
    2     outCrc32 = 0;
    3     outCrc32 = Crc32_ComputeBuf( outCrc32, &my_ARP_data[0], 60);
    4     printf("check sum=0x%x.
    ", outCrc32);
    5     for(j=3; j >=0; i++, j--){ /* if checksum is 0x0f3be75c,傳送順序 0f 3b e7 5c*/
    6         eth_buf[i] = (outCrc32 >> j*8)&0xff;
    7     }

    第四步 呼叫傳送程式

         my_dp83848_write()是我寫的副程式,會把eth_buf內的資料傳送到DP83848的TXD上。
    1     my_dp83848_write(dev_sp, eth_buf, (8+60+4), 0);

    以下是用wireshark抓到的封包資料。

     

                                                                                                                       Fig.1 ARP 實際訊號

     在Fig.1中, wireshark抓進來時就會自動把peramble、SFD、CRC32等資料給省略掉。直接秀出抓到的ARP封包60筆資料。

     下一篇會秀接收端資料。

  • 相关阅读:
    jQuery ajax传多个参数
    PHP 上传图片和安全处理
    PHP CI框架email类发送邮件
    2016-4-7
    jquery 轮播图
    CI控制器的继承问题
    2016-4-1
    2016-3-31 总结
    php内置函数call_user_func()
    discuz-目录
  • 原文地址:https://www.cnblogs.com/lishyhan/p/9826674.html
Copyright © 2011-2022 走看看