開發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