[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.\n", 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筆資料。

下一篇會秀接收端資料。

原文地址:https://www.cnblogs.com/lishyhan/p/9826674.html

时间: 2024-10-14 00:55:47

[FPGA][Nios][DP83848] 網路開發筆記-軟體篇(1)的相关文章

[FPGA] DP83848網路晶片開發心得(1)

最近想要用FPGA來存取網路,於是想到之前買的一個DP88848晶片的網路版子,剛好拿出來研究研究. 查了一下規格它是使用RMII的傳輸介面可以達到10M/100M的速度,應該很夠用了吧. 那第一步就是先研究一下這電路要怎麼接?剛好有在網路找到其電路圖? 買了 一個洞洞板,接到DE0-Nano的GPIO_0,腳位如下: pin discrption GPIO_0[10]: MDC    GPIO_0[11]: MDIO GPIO_0[12]: CRS     GPIO_0[13]: OSCIN

實戰案例 - 微信開發重點摘要之用戶唯一識別碼與網頁存取授權碼 (2)

在取得用戶同意授權碼之後,就可以接著拿 openid 和 access token. openid 筆者稱之為用戶唯一識別碼,access code 則是網頁存取授權碼.從騰訊的公眾平台開發文件可以知道,openid 是跟著用戶走的,每個用戶都有自己的識別碼,這個識別碼也是開發者在寫程式的過程中,區分微信用戶的途徑:而 access code 則有類似鑰匙的作用,有了這個和 openid 就能獲取用戶資訊,要取得用戶識別碼和網頁存取授權碼,最關鍵的地方在這個網址: https://api.wei

安裝 Rails 開發環境

安裝 Rails 開發環境 Give someone a program, you frustrate them for a day; teach them how to program, you frustrate them for a lifetime. - David Leinweber https://ihower.tw/rails4/installation.html 在這一章中,我們將介紹如何安裝Ruby on Rails的開發環境.開發Rails的環境需要: Ruby 1.9.3以

FPGA學習筆記(貳)--- 流水燈

平臺:FPGA黑金开发板 AX301 開發環境:Quartus Prime Version 17.0.0 Build 595 04/25/2017 Standard Edition 引脚配置:鼠標托拉 Node Name 項到引脚圖即可 注意事項新建工程:Set Up Top-Level Entity 名字要對應 注意事項引脚復用:Assignments-->Device-->Device and Pin Options...-->Dual-Purpose pins-->nCEO

老男孩老師課程學習筆記----linux目錄特點

linux 目錄的特點 1./根是所有目錄的頂點 2.目錄結構像一顆倒掛的樹 3.目錄和磁盤分區默認是沒有關聯的 4./根下不同的目錄可能會對應不同的分區和磁盤 5.所有的目錄都是按照一定的類別有規律的組織和命名的 linux裡設備如果不掛載是看不到入口的,類似沒有窗戶沒門的監獄 如果希望設備被訪問,就必須給這個設備一個入口 這個入口就叫作掛載點,掛載點的表現實質是一個目錄 mount 光驅也是一種設備 ---> cdrom mount /dev/cdrom /mnt / 第一塊盤 系統程序 /

開發Android, 從Eclipse官網下載Eclipse開始,從無到有安裝一遍

自從Android Studio 1.0問世, 想要用Eclipse 來開發Android, 卻因為Android的官網Android Developer(http://developer.android.com/sdk/index.html)已不提供Eclipse ADT Bundle(又稱作Eclipse ADT整合包)的下載, 所以要在Eclipse開發Android:你可以:(1)更新ADT plugin. 這種更新及安裝步驟有詳述在另一篇博文: http://9659784.blog.

馬達控制、機器視覺及工業乙太網路交換器係工廠自動化不可或缺的三大環節

隨著亞洲人力雇用成本攀升,加上北美大力推行製造業回流政策,全球主要3C產品製造工廠以機器取代人工的需求已日益殷切,激勵歐美.日本和台灣工業設備大廠加緊研發機器手臂.機器人與產線自動化設備,因而帶動龐大的馬達控制.機器視覺和工業乙太網路解決方案導入需求. SoC FPGA整合可編程邏輯和多核CPU.DSP或軟核(Soft-core)MCU,兼具高速邏輯運算.即時控制與平行處理優點,可支援快速傅立葉轉換(FFT)等高階演算法,並縮減大量資料乘加運算的功耗.此外,其透過FPGA的軟體可編程特性,更有助

Delphi APP 開發入門(八)SQLite資料庫

Delphi APP 開發入門(八)SQLite資料庫 分享: Share on facebookShare on twitterShare on google_plusone_share 閲讀次數:5279 發表時間:2014/06/25 tags: 行動開發 教學 App Delphi XE6 Android iOS SQLite Delphi APP 開發入門(七)通知與雲端推播 << 前情 在撰寫APP程式時,如果遇到資料間無關聯性且資料量不多時,會以像xml檔案去儲存,但一旦遇到關聯

Delphi APP 開發入門(七)通知與雲端推播

Delphi APP 開發入門(七)通知與雲端推播 分享: Share on facebookShare on twitterShare on google_plusone_share 閲讀次數:5131 發表時間:2014/06/18 tags: 行動開發 教學 App Delphi XE6 Android iOS Delphi APP 開發入門(六)Object Pascal 語法初探 << 前情 今天教大家使用的是通知(Notification)功能,在Delphi XE6很貼心的也將通