在上一篇該系列博文中講解了MATLAB待處理數據寫入.bin二進制數據文件的過程,接下來需要將數據通過以太網發送到ZYNQ驗證平台。之前了解過Xilinx公司面向DSP開發的System Generator可以通過硬件協仿真的方式,進行算法板級驗證。一個是本人不熟悉這種方式,再一個缺乏通用性,也無法在系統層面進行硬件驗證。當然方案有很多,熟悉上位機的朋友完全可以自己寫個軟件完成數據傳輸和算法結果對比等功能。
這里選擇最簡單的方案:在上位機通過網絡調試助手將數據打包並發送至以太網端口,ZYNQ端利用W5500硬件協議棧芯片解析數據。有人可能會說用ZYNQ這么高端的設備還使用外接協議棧芯片連接以太網真是浪費,這里就算是開個頭吧,只能說根據能力和現有條件選擇傳輸方案。如果數據量較大的場合,可考慮用LWIP開源協議棧或直接利用verilogHDL編寫UDP/IP協議和MAC控制器的方式實現1000Mbps速率傳輸。
本文主要總結內容包括:TCP協議基礎 網絡調試助手應用事項,以及W5500的驅動移植。為了保證數據正確性,選用TCP這一可靠傳輸協議。以下介紹兩個比較淺顯易懂的博文,供沒有網絡和TCP協議基礎的朋友參考。(見參考鏈接1 2)
有了以上基礎知識,我們就可以正確配置網絡參數了。查看W5500驅動中網絡參數配置部分代碼:
1 void Load_Net_Parameters(void) { 2 //加載端口0的工作模式,TCP客戶端模式 3 S0_Mode = TCP_CLIENT; //UDP_MODE 4 5 Gateway_IP[0] = 192; //加載設備網關參數 6 Gateway_IP[1] = 168; 7 Gateway_IP[2] = 90; 8 Gateway_IP[3] = 1; 9 10 Sub_Mask[0] = 255; //加載設備子網掩碼 11 Sub_Mask[1] = 255; 12 Sub_Mask[2] = 255; 13 Sub_Mask[3] = 0; 14 15 Phy_Addr[0] = 0x0c; //加載設備物理地址(mac) 16 Phy_Addr[1] = 0x29; 17 Phy_Addr[2] = 0xab; 18 Phy_Addr[3] = 0x7c; 19 Phy_Addr[4] = 0x00; 20 Phy_Addr[5] = 0x01; 21 22 IP_Addr[0] = 192; //加載本設備(FPGA端)IP地址 23 IP_Addr[1] = 168; 24 IP_Addr[2] = 90; 25 IP_Addr[3] = 199; 26 //加載設備端口0(socket 0)的端口號5000 27 S0_Port[0] = 0x13; //十六進制 1388轉換成十進制為5000 28 S0_Port[1] = 0x88; 29 30 //設定的是客戶端模式 31 if(S0_Mode == TCP_CLIENT) 32 { 33 //加載端口0的目的(如調試用的pc機)IP地址 34 S0_DIP[0] = 192; 35 S0_DIP[1] = 168; 36 S0_DIP[2] = 90; 37 S0_DIP[3] = 188; 38 39 //加載端口0的目的(如調試用的pc機)端口號6000 40 S0_DPort[0] = 0x17; 41 S0_DPort[1] = 0x70; 42 } 43 44 //設定的是UDP模式,初始化給一個目的IP和端口號。 45 if(S0_Mode == UDP_MODE) 46 { 47 //加載端口0的目的(如調試用的pc機)IP地址 48 UDP_DIPR[0] = 192; 49 UDP_DIPR[1] = 168; 50 UDP_DIPR[2] = 90; 51 UDP_DIPR[3] = 188; 52 //加載端口0的目的(如調試用的pc機)端口號6000 53 UDP_DPORT[0] = 0x17; 54 UDP_DPORT[1] = 0x70; 55 } 56 }
此處將PC端作為TCP協議中服務器,ZYNQ驗證平台視為客戶端,即為“呼叫端”。由代碼看出PC端IP地址為192.168.90.188,子網掩碼應設為:255.255.255.0,這樣ZYNQ與PC端在一個子網內,可直接通過網線連接。 端口號為6000。驅動中包含W5500 SPI用戶接口時序部分代碼,可簡單修改調用本人的博文《ZYNQ EMIO使用及可重用封裝》中的EMIO接口函數(見參考鏈接3)。
根據上面參數配置好PC端的IP地址 子網掩碼后,我們來看下網絡調試助手的“坑”。
基本使用沒什么可說的,網上教程很多。關鍵是畫紅框的部分。這里的發送周期要盡量設置大些,因為整個數據文件會被切割成多個數據包,每個包的發送和允許重傳時間由總的發送周期分配得到。如果文件較大,發送周期又設置的較小,會導致后半部分被丟棄(所設置時間只夠傳輸文件的前半部分)。RX方向接收數據時選擇接收轉向文件,注意兩點:1 接收文件的擴展名同樣要為.bin 2 不要選擇十六進制顯示,否則接收數據會變成字符串(可能是軟件bug)。
W5500的C語言驅動基於網上流傳的STM32版本代碼。其中應用API為Process_Socket_Data中的發送和接收函數:Write_SOCK_Data_Buffer Read_SOCK_Data_Buffer。兩者內部控制讀寫指針偏移以及調用SPI接口函數完成數據傳輸,此處不進行詳述,關於W5500的C語言驅動可看教程視頻(見參考鏈接4)。最后附上環回數據的demo效果:
對於網絡傳輸部分的總結就到這里,后邊可能會考慮利用LWIP完成高速傳輸。數據傳到ZYNQ了,下一步當然是先緩存起來,再發送到PL端驗證算法模塊,這樣做的好處是可以模擬實時數據流,比如驗證通信算法和視頻處理算法時尤為適用。華麗分割線
---------------------------------------------------------------------------------------------------------------------------------------------------------
參考鏈接:
1 五分鍾讀懂TCP 協議——TCP協議簡介 - CSDN博客
https://blog.csdn.net/ningdaxing1994/article/details/73076795
2 計算機網絡: IP地址,子網掩碼,網段表示法,默認網關,DNS服務器詳解 - 互聯網隱者 - 博客園
https://www.cnblogs.com/iceJava/p/5372033.html
3《ZYNQ EMIO使用及可重用封裝》 - 沒落騎士 - 博客園
https://www.cnblogs.com/moluoqishi/p/9198772.html
4 STM32F103+W5500 全硬件以太網開發板視頻教程 (1)- TCP服務器(靜態)_土豆視頻
http://new-play.tudou.com/v/XMzQyODk0NjAzNg==.html?from=s1.8-1-1.2