[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抓到的封包資料。

 [FPGA][Nios][DP83848] 網路開發筆記-軟體篇(1)

                                                                                                                   Fig.1 ARP 實際訊號

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

 下一篇會秀接收端資料。

[FPGA][Nios][DP83848] 網路開發筆記-軟體篇(1)

上一篇:Android studio 不能创建Activity等文件


下一篇:WPF实现左右移动(晃动)动画效果