利用ZYNQ SOC快速打开算法验证通路(2)——数据传输最简方案:网络调试助手+W5500协议栈芯片

在上一篇该系列博文中讲解了MATLAB待处理数据写入.bin二进制数据文件的过程,接下来需要将数据通过以太网发送到ZYNQ验证平台。之前了解过Xilinx公司面向DSP开发的System Generator可以通过硬件协仿真的方式,进行算法板级验证。一个是本人不熟悉这种方式,再一个缺乏通用性,也无法在系统层面进行硬件验证。当然方案有很多,熟悉上位机的朋友完全可以自己写个软件完成数据传输和算法结果对比等功能。

  这里选择最简单的方案:在上位机通过网络调试助手将数据打包并发送至以太网端口,ZYNQ端利用W5500硬件协议栈芯片解析数据。有人可能会说用ZYNQ这么高端的设备还使用外接协议栈芯片连接以太网真是浪费,这里就算是开个头吧,只能说根据能力和现有条件选择传输方案。如果数据量较大的场合,可考虑用LWIP开源协议栈或直接利用verilogHDL编写UDP/IP协议和MAC控制器的方式实现1000Mbps速率传输。

  本文主要总结内容包括:TCP协议基础 网络调试助手应用事项,以及W5500的驱动移植。为了保证数据正确性,选用TCP这一可靠传输协议。以下介绍两个比较浅显易懂的博文,供没有网络和TCP协议基础的朋友参考。(见参考链接1 2)

  有了以上基础知识,我们就可以正确配置网络参数了。查看W5500驱动中网络参数配置部分代码:
void Load_Net_Parameters(void) {
//加载端口0的工作模式,TCP客户端模式
S0_Mode = TCP_CLIENT; //UDP_MODE

Gateway_IP[0] = 192; //加载设备网关参数
Gateway_IP[1] = 168;
Gateway_IP[2] = 90;
Gateway_IP[3] = 1;

Sub_Mask[0] = 255; //加载设备子网掩码
Sub_Mask[1] = 255;
Sub_Mask[2] = 255;
Sub_Mask[3] = 0;

Phy_Addr[0] = 0x0c; //加载设备物理地址(mac)
Phy_Addr[1] = 0x29;
Phy_Addr[2] = 0xab;
Phy_Addr[3] = 0x7c;
Phy_Addr[4] = 0x00;
Phy_Addr[5] = 0x01;

IP_Addr[0] = 192; //加载本设备(FPGA端)IP地址
IP_Addr[1] = 168;
IP_Addr[2] = 90;
IP_Addr[3] = 199;
//加载设备端口0(socket 0)的端口号5000
S0_Port[0] = 0x13; //十六进制 1388转换成十进制为5000
S0_Port[1] = 0x88;

//设定的是客户端模式
if(S0_Mode == TCP_CLIENT)
{
//加载端口0的目的(如调试用的pc机)IP地址
S0_DIP[0] = 192;
S0_DIP[1] = 168;
S0_DIP[2] = 90;
S0_DIP[3] = 188;

//加载端口0的目的(如调试用的pc机)端口号6000
S0_DPort[0] = 0x17;
S0_DPort[1] = 0x70;
}

//设定的是UDP模式,初始化给一个目的IP和端口号。
if(S0_Mode == UDP_MODE)
{
//加载端口0的目的(如调试用的pc机)IP地址
UDP_DIPR[0] = 192;
UDP_DIPR[1] = 168;
UDP_DIPR[2] = 90;
UDP_DIPR[3] = 188;
//加载端口0的目的(如调试用的pc机)端口号6000
UDP_DPORT[0] = 0x17;
UDP_DPORT[1] = 0x70;
}
}

此处将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

原文链接: https://www.cnblogs.com/moluoqishi/p/9244640.html

推荐阅读