使用W5300 TOE Shield测试W5300网络性能。
转发: W5300 Network Performance Test (wiznet.io)
项目介绍
本文档指导使用内置 W5300 - W5300 TOE Shield 的 WIZnet 以太网产品进行代码优化和网络性能测试的一系列流程。
我将使用 WIZnet 生产的 W5300-TOE-C 作为 W5300 TOE Shield 的示例。
1. 硬件准备
W5300 TOE Shield 是一款能够与 W5300 和 ST 的 Cortex MCU 进行高速总线通信的板。
更多详细信息可以在下面的链接中找到:
W5300 TOE Shield 是一款可以安装在 STM32 Nucleo-144 板上的板。
如果没有 STM32 Nucleo-144 板,则无法执行工作,目前支持 NUCLEO-F207ZG、NUCLEO-F429ZI、NUCLEO-F439ZI、NUCLEO-F722ZE、NUCLEO-F756ZG 和 NUCLEO-F767ZI 板。
由于重叠使用 FMC(灵活内存控制器)数据引脚来控制 W5300 TOE Shield 内置的 W5300 和 STM32 Nucleo-144 板的 ST-LINK 引脚,因此 ST-LINK 引脚发生了变化。
- STLK_RX[STM32F103CBT6_PA3] : PD8 → PC10
- STLK_TX[STM32F103CBT6_PA2] : PD9 → PC11
因此,为了使用STM32 Nucleo-144板的ST-LINK,需要对W5300 TOE Shield和STM32 Nucleo-144板进行少量设置。
① 从 STM32 Nucleo-144 板顶部拆下 SB5 和 SB6。
② 将W5300 TOE Shield 和STM32 Nucleo-144 板结合在一起,用跳线连接W5300 TOE Shield 的PC10、PC11 和STM32 Nucleo-144 板顶部的CN5 TX、RX。
- W5300 TOE Shield : PC10 - STM32 Nucleo-144 board : RX
- W5300 TOE Shield : PC11 - STM32 Nucleo-144 board : TX
我用的是NUCLEO-F429ZI,所以请参考一下, 按照以下步骤控制W5300 TOE Shield、固件上传和运行。
① 将 W5300 TOE Shield 与 STM32 Nucleo-144 板组合。
② 将以太网线连接到 W5300 TOE Shield 以太网端口。
③ 使用 5 针 micro USB 电缆将 STM32 Nucleo-144 板连接到台式机或笔记本电脑。
2. 软件准备
网络性能测试需要使用以下串口终端程序和网络性能测试工具,请从以下链接下载并安装。
我用的是AX2,所以请参考一下。
- Tera Term
- AX1
- AX2
3. 时钟配置
为了发挥 NUCLEO-F429ZI 的最大性能,STM32F429ZI 内置 NUCLEO-F429ZI 的时钟设置为 180MHz,这是最大时钟。
4. 源码优化
为了发挥最大性能,应该进行优化,不要在发送/接收部分执行不必要的例程。
#include <stdint.h>
#include "wizchip_conf.h"
#include "w5x00_bus.h"
(...)
void WIZCHIP_WRITE(uint32_t AddrSel, uint16_t wb)
{
#if 1
_W5300_DATA(AddrSel) = wb;
#else
WIZCHIP_CRITICAL_ENTER();
WIZCHIP.CS._select();
#if ((_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_))
#if (_WIZCHIP_IO_BUS_WIDTH_ == 8)
WIZCHIP.IF.BUS._write_data(AddrSel, (uint8_t)(wb >> 8));
WIZCHIP.IF.BUS._write_data(WIZCHIP_OFFSET_INC(AddrSel, 1), (uint8_t)wb);
#elif (_WIZCHIP_IO_BUS_WIDTH_ == 16)
WIZCHIP.IF.BUS._write_data(AddrSel, wb);
#else
#error "Abnoraml _WIZCHIP_IO_BUS_WIDTH_. Should be 8 or 16"
#endif
#elif ((_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_))
#if (_WIZCHIP_IO_BUS_WIDTH_ == 8)
WIZCHIP.IF.BUS._write_data(IDM_AR, (uint8_t)(AddrSel >> 8));
WIZCHIP.IF.BUS._write_data(WIZCHIP_OFFSET_INC(IDM_AR, 1), (uint8_t)AddrSel);
WIZCHIP.IF.BUS._write_data(IDM_DR, (uint8_t)(wb >> 8));
WIZCHIP.IF.BUS._write_data(WIZCHIP_OFFSET_INC(IDM_DR, 1), (uint8_t)wb);
#elif (_WIZCHIP_IO_BUS_WIDTH_ == 16)
WIZCHIP.IF.BUS._write_data(IDM_AR, (uint16_t)AddrSel);
WIZCHIP.IF.BUS._write_data(IDM_DR, wb);
#else
#error "Abnoraml _WIZCHIP_IO_BUS_WIDTH_. Should be 8 or 16"
#endif
#else
#error "Unknown _WIZCHIP_IO_MODE_ in W5300. !!!"
#endif
WIZCHIP.CS._deselect();
WIZCHIP_CRITICAL_EXIT();
#endif
}
uint16_t WIZCHIP_READ(uint32_t AddrSel)
{
#if 1
return _W5300_DATA(AddrSel);
#else
uint16_t ret;
WIZCHIP_CRITICAL_ENTER();
WIZCHIP.CS._select();
#if ((_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_DIR_))
#if (_WIZCHIP_IO_BUS_WIDTH_ == 8)
ret = (((uint16_t)WIZCHIP.IF.BUS._read_data(AddrSel)) << 8) |
(((uint16_t)WIZCHIP.IF.BUS._read_data(WIZCHIP_OFFSET_INC(AddrSel, 1))) & 0x00FF);
#elif (_WIZCHIP_IO_BUS_WIDTH_ == 16)
ret = WIZCHIP.IF.BUS._read_data(AddrSel);
#else
#error "Abnoraml _WIZCHIP_IO_BUS_WIDTH_. Should be 8 or 16"
#endif
#elif ((_WIZCHIP_IO_MODE_ == _WIZCHIP_IO_MODE_BUS_INDIR_))
#if (_WIZCHIP_IO_BUS_WIDTH_ == 8)
WIZCHIP.IF.BUS._write_data(IDM_AR, (uint8_t)(AddrSel >> 8));
WIZCHIP.IF.BUS._write_data(WIZCHIP_OFFSET_INC(IDM_AR, 1), (uint8_t)AddrSel);
ret = (((uint16_t)WIZCHIP.IF.BUS._read_data(IDM_DR)) << 8) |
(((uint16_t)WIZCHIP.IF.BUS._read_data(WIZCHIP_OFFSET_INC(IDM_DR, 1))) & 0x00FF);
#elif (_WIZCHIP_IO_BUS_WIDTH_ == 16)
WIZCHIP.IF.BUS._write_data(IDM_AR, (uint16_t)AddrSel);
ret = WIZCHIP.IF.BUS._read_data(IDM_DR);
#else
#error "Abnoraml _WIZCHIP_IO_BUS_WIDTH_. Should be 8 or 16"
#endif
#else
#error "Unknown _WIZCHIP_IO_MODE_ in W5300. !!!"
#endif
WIZCHIP.CS._deselect();
WIZCHIP_CRITICAL_EXIT();
return ret;
#endif
}
5. 设置示例
我使用环回示例来测试网络性能。
为了测试网络性能,需要在代码中进行一些小的设置。
① 设置FMC 时序配置。
设置 FMC 时序配置以使用“W5300-TOE-C/Projects/NUCLEO-F429ZI/Core/Src/”目录中 FMC“main.c”的最大速度。
Timing.AddressSetupTime = 1;
Timing.AddressHoldTime = 1;
Timing.DataSetupTime = 6;
Timing.BusTurnAroundDuration = 0;
Timing.CLKDivision = 2;
Timing.DataLatency = 2;
Timing.AccessMode = FMC_ACCESS_MODE_A;
② 选择演示应用程序。
要运行 Loopback 示例,您必须选择“W5300-TOE-C/Examples/”目录中“w5x00_demo.h”中的演示应用程序。
取消注释 APP_LOOPBACK 并注释其余定义的演示应用程序宏。
// ----------------------------------------------------------------------------------------------------
// The application you wish to use should be uncommented
// ----------------------------------------------------------------------------------------------------
//#define APP_DHCP
//#define APP_DNS
//#define APP_HTTP_SERVER
//#define APP_MQTT_PUBLISH
//#define APP_MQTT_SUBSCRIBE
//#define APP_MQTT_PUBLISH_SUBSCRIBE
//#define APP_SNTP
//#define APP_TCP_CLIENT_OVER_SSL
#define APP_LOOPBACK
// ----------------------------------------------------------------------------------------------------
③ 设置网络配置。
在“W5300-TOE-C/Projects/NUCLEO-F429ZI/Core/Src/”目录中的“main.c”中设置网络配置,例如 IP。
wiz_NetInfo net_info =
{
.mac = {0x00, 0x08, 0xDC, 0x12, 0x34, 0x56}, // MAC address
.ip = {192, 168, 11, 2}, // IP address
.sn = {255, 255, 255, 0}, // Subnet Mask
.gw = {192, 168, 11, 1}, // Gateway
.dns = {8, 8, 8, 8}, // DNS server
#ifdef APP_DHCP
.dhcp = NETINFO_DHCP // Dynamic IP
#else
.dhcp = NETINFO_STATIC // Static IP
#endif
};
④ 设置环回配置。
在“W5300-TOE-C/Examples/loopback/”目录中的“w5x00_loopback.c”中设置环回服务器端口号。
#define PORT_LOOPBACK 5000
6. 构建和下载
① 完成 Loopback 示例配置后,在您使用的 IDE 中构建。
② 构建完成后,将固件下载到 STM32 Nucleo-144 板。
7. 网络性能测试
① 使用 Tera Term 连接到 STM32 Nucleo-144 板的串行 COM 端口。
② 重置主板。
③ 如果Loopback示例在STM32 Nucleo-144板上工作正常,可以看到STM32 Nucleo-144板的网络信息,并且Loopback服务器已打开。
④ 运行AX2,并初始化tick。
⑤ 使用 AX2 TCP 客户端连接到开放环回服务器。 连接环回服务器时,需要输入的是步骤5中配置的IP,端口默认为5000。
⑥ 连接后,如果向环回服务器发送数据,则可以看到正在测量的网络性能。
我发现吞吐量约为 60 ~ 62Mbps。
文件