本篇总结
在 W6300 上实现 PHY 模式的运行时切换,支持 100M 全双工、10M 半双工和掉电模式,掉电模式可降低功耗。
🔑 MH2457、QSPI、UART调试、硬件TOE引擎、PHY
硬件平台 :本例程基于 W6300-EVB-M4 开发板运行。
采购推荐 :点击前往 WIZnet 官方淘宝店铺 选购 W6300-EVB-M4 开发板
本示例演示如何在 W6300 芯片上配置 PHY 工作模式,包括 100Mbps 全双工、10Mbps 半双工以及掉电模式。通过 PHYCR0/PHYCR1 寄存器切换链路速率与功耗状态,满足不同应用场景下的网络通信需求。
前置工具准备
开始本例程前,请确认以下工具已安装:
WIZ UartTool V1.0 :串口调试工具:点击下载
PHY 工作模式简介
W6300 的 PHY 工作模式通过 PHYCR0 寄存器 的 MODE[2:0] 位域配置,并在 PHY 硬件复位后生效。PHYCR0 / PHYCR1 寄存器受 PHYLCRK 写保护,修改前需要先解锁,修改后需要触发一次 PHY 复位(PHYCR1[RST] = 1)让新配置生效。PHY 模式可配置为 10Mbps 全双工/半双工、100Mbps 全双工/半双工以及自动协商,默认为自动协商模式。
应用上,高速传输场景设为 100Mbps 全双工以获得最佳性能;不使用 TOE 引擎时设为掉电模式,可有效节省功耗。下表列出了所有支持的 PHY 工作模式:
模式 PHYCR0 MODE[2:0] 说明
自动协商 0xx 根据对端接口自动选择最佳速率和模式
100BT全双工 100 数据双向同时传输,效率最高
100BT半双工 101 同一时刻单方向传输
10BT全双工 110 低速场景,双向同时传输
10BT半双工 111 低速低功耗,单方向传输
W6300 的优势
W6300 的 PHY 配置通过 ctlwizchip(CW_SET_PHYCONF, ...) API 统一管理,用户无需直接操作寄存器位。修改 PHY 配置时需要先通过 PHYUNLOCK() 解除 PHYLCRK 写保护,写入后调用 wizphy_reset() 触发 PHY 硬件复位,等待 60.3ms 稳定时间后,配置即可生效,支持运行时动态切换。
硬件连接与拓扑
W6300 的 PHY 工作模式通过 PHYCR0 寄存器 的 MODE[2:0] 位域配置,并在 PHY 硬件复位后生效。PHYCR0 / PHYCR1 寄存器受 PHYLCRK 写保护,修改前需要先解锁,修改后需要触发一次 PHY 复位(PHYCR1[RST] = 1)让新配置生效。PHY 模式可配置为 10Mbps 全双工/半双工、100Mbps 全双工/半双工以及自动协商,默认为自动协商模式。
应用上,高速传输场景设为 100Mbps 全双工以获得最佳性能;不使用 TOE 引擎时设为掉电模式,可有效节省功耗。下表列出了所有支持的 PHY 工作模式:
模式 PHYCR0 MODE[2:0] 说明
自动协商 0xx 根据对端接口自动选择最佳速率和模式
100BT全双工 100 数据双向同时传输,效率最高
100BT半双工 101 同一时刻单方向传输
10BT全双工 110 低速场景,双向同时传输
10BT半双工 111 低速低功耗,单方向传输
W6300 的优势
W6300 的 PHY 配置通过 ctlwizchip(CW_SET_PHYCONF, ...) API 统一管理,用户无需直接操作寄存器位。修改 PHY 配置时需要先通过 PHYUNLOCK() 解除 PHYLCRK 写保护,写入后调用 wizphy_reset() 触发 PHY 硬件复位,等待 60.3ms 稳定时间后,配置即可生效,支持运行时动态切换。
工程结构
工程核心文件如下:
Project/
├── main.c ← 系统入口:串口、GPIO、QSPI 初始化 + user_run()
└── USER/
├── user_main.c ← 网络地址定义 + user_run() 主流程
├── phy_low_power.c ← PHY 模式切换实现(phy_apply_config / phy_enter_power_down / phy_low_power_test)
├── phy_low_power.h
├── wiz_platform.c/h ← 平台适配:debug_usart_init、wizchip_gpio_init、hspi_init
└── wiz_interface.c/h ← W6300 驱动接口:wizchip_initialize、network_init、PHY 检测、软件定时器
通过 ctlwizchip(CW_SET_PHYCONF, &phy_conf) 函数设置 PHY 模式,通过 ctlwizchip(CW_GET_PHYCONF, &get_conf) 回读配置验证。掉电模式通过 ctlwizchip(CW_SET_PHYPOWMODE, ...) 设置。
步骤1:设置为 100Mbps 全双工
文件:USER/phy_low_power.c — phy_apply_config() 负责写入 PHY 配置并触发硬件复位,等待 60.3ms 稳定后回读验证。修改 PHY 配置前需要先通过 PHYUNLOCK() 解除 PHYLCRK 写保护。
static int phy_apply_config(wiz_PhyConf *phy_conf, wiz_PhyConf *get_conf)
{
int8_t ret;
PHYUNLOCK();
ret = ctlwizchip(CW_SET_PHYCONF, phy_conf);
if (ret < 0)
{
PHYLOCK();
return -1;
}
/*
* W6300 applies PHYCR0 mode changes after a PHY hardware reset.
* wizphy_reset() performs the required unlock/write/lock sequence.
* The W6300 register definition specifies 60.3 ms stabilization time.
*/
wizphy_reset();
wiz_user_delay_ms(PHY_RESET_STABLE_MS);
if (ctlwizchip(CW_GET_PHYCONF, get_conf) < 0)
{
return -1;
}
return 0;
}
配置关键:PHY_CONFBY_SW 表示由软件控制 PHY 配置,PHY_MODE_MANUAL 表示用户手动指定速率和双工模式。写入后必须触发一次 PHY 硬件复位,等待 60.3ms 稳定时间,再回读验证。
phy_conf.by = PHY_CONFBY_SW; /* 软件配置 */
phy_conf.mode = PHY_MODE_MANUAL; /* 用户手动配置 */
phy_conf.duplex = PHY_DUPLEX_FULL; /* 全双工 */
phy_conf.speed = PHY_SPEED_100; /* 100Mbps */
printf("setting phy 100M and full-duplex mode\r\n");
if (phy_apply_config(&phy_conf, &get_conf) < 0)
{
printf("setting phy 100M and full-duplex mode: fail\r\n");
return -1;
}
printf("The current Mbtis speed : %d\r\n",
get_conf.speed == PHY_SPEED_100 ? 100 : 10);
printf("The current Duplex Mode : %s\r\n",
get_conf.duplex == PHY_DUPLEX_HALF ? "Half-Duplex" : "Full-Duplex");
100M全双工优势
100Mbps 全双工模式允许数据同时双向传输,理论吞吐量是半双工的两倍,是 W6300 性能最佳的模式,适合高速数据传输场景。
步骤2:设置为 10Mbps 半双工
文件:USER/phy_low_power.c。将 PHY 速度改为 10Mbps(PHY_SPEED_10),双工模式改为半双工(PHY_DUPLEX_HALF),其余配置不变。同样通过 phy_apply_config() 写入并回读验证。
printf("setting phy 10M and half-duplex mode\r\n");
phy_conf.speed = PHY_SPEED_10; /* 10Mbps */
phy_conf.duplex = PHY_DUPLEX_HALF; /* 半双工 */
if (phy_apply_config(&phy_conf, &get_conf) < 0)
{
printf("setting phy 10M and half-duplex mode: fail\r\n");
return -1;
}
printf("The current Mbtis speed : %d\r\n",
get_conf.speed == PHY_SPEED_100 ? 100 : 10);
printf("The current Duplex Mode : %s\r\n",
get_conf.duplex == PHY_DUPLEX_HALF ? "Half-Duplex" : "Full-Duplex");
切换到 10Mbps 半双工后,串口输出 "The current Mbtis speed : 10" 和 "The current Duplex Mode : Half-Duplex"。半双工模式下同一时刻只能单方向传输数据,且需要处理碰撞问题,吞吐量较低。该模式适用于低速场景或与只支持 10Mbps 半双工的对端设备通信。
步骤3:设置为掉电模式
文件:USER/phy_low_power.c — phy_enter_power_down() 将 PHY 设置为掉电模式,停止 TOE 引擎工作以降低功耗。PHYCR1[PWDN] 位受 PHYLCRK 写保护,修改前后需要解锁/加锁。
static int phy_enter_power_down(void)
{
uint8_t power_mode = PHY_POWER_DOWN;
uint8_t get_power_mode = PHY_POWER_NORM;
/* W6300 PHY control registers are write-protected by PHYLCKR. */
PHYUNLOCK();
if (ctlwizchip(CW_SET_PHYPOWMODE, &power_mode) < 0)
{
PHYLOCK();
return -1;
}
PHYLOCK();
if (ctlwizchip(CW_GET_PHYPOWMODE, &get_power_mode) < 0)
{
return -1;
}
return (get_power_mode == PHY_POWER_DOWN) ? 0 : -1;
}
掉电模式下串口输出 "The current phy is : power down mode",随后打印 "PHY is in power down state and cannot be ping reply."。此时 TOE 引擎停止工作,网络通信完全中断,PC 端 ping 设备将 100% 丢包。该模式适用于设备待机或不需要网络功能的场景,可显著降低功耗。
掉电模式注意事项
掉电模式下 TOE 引擎停止工作,无法进行网络通信(ping 不通)
恢复正常工作状态必须重新复位 TOE 引擎,无法通过软件直接恢复
PHYCR1[PWDN] 位受 PHYLCRK 写保护,修改前后需要 PHYUNLOCK()/PHYLOCK()
进入掉电模式后 SYS_CLK 会自动切换到 25MHz,进一步降低功耗
运行验证
烧录例程运行后,首先进行 PHY 链路检测和网络地址信息打印,然后依次设置 PHY 为 100Mbps 全双工、10Mbps 半双工、掉电模式。打开 WIZ UartTool V1.0 ,连接 DEBUG USB 对应 COM 口(115200 / 8N1),预期串口输出如下:
MH2457 W6300 QSPI example start
W6300 Low Power example
PHY link
The current Mbtis speed : 100Mbps
The current Duplex Mode : Full-Duplex
DHCP running
DHCP success!
====================================================================================================
W6300 network configuration : DHCP
MAC : 00:08:DC:12:34:56
IP : 192.168.1.8
Subnet Mask : 255.255.255.0
Gateway : 192.168.1.1
DNS : 192.168.1.1
====================================================================================================
setting phy 100M and full-duplex mode
The current Mbtis speed : 100
The current Duplex Mode : Full-Duplex
setting phy 10M and half-duplex mode
The current Mbtis speed : 10
The current Duplex Mode : Half-Duplex
setting phy low power mode
The current phy is : power down mode
PHY is in power down state and cannot be ping reply.
同时在 PC 端使用 CMD ping 测试设备连通性,各模式测试结果如下:
100Mbps 全双工:0% 丢包
10Mbps 半双工:可能出现丢包
掉电模式:100% 丢包
CMD ping 192.168.1.6 — 100Mbps 全双工(0% 丢包)/ 10Mbps 半双工(25% 丢包)/ 掉电模式(100% 丢包) 常见问题
Q: 为什么修改 PHY 配置前需要 PHYUNLOCK
W6300 的 PHYCR0 / PHYCR1 寄存器受 PHYLCRK(PHY Lock Register)写保护。如果 PHY 处于锁定状态,写入 PHY 控制寄存器不会生效。因此在修改 PHY 模式或掉电模式之前,必须先调用 PHYUNLOCK() 解锁,写入完成后再调用 PHYLOCK() 重新锁定。
Q: 为什么配置后需要 PHY 复位并等待 60.3ms
W6300 的 PHY 模式配置不会立即生效,需要一次 PHY 硬件复位(PHYCR1[RST] = 1)才会应用 PHYCR0[MODE] 的新值。复位后芯片需要一段稳定时间,W6300 数据手册中规定为 60.3ms 。本示例使用 PHY_RESET_STABLE_MS = 61U 留出余量,确保配置稳定。
Q: 掉电模式如何恢复
掉电模式停止 TOE 引擎工作,SYS_CLK 自动切换到 25MHz。要通过软件恢复,需要先 PHYUNLOCK(),调用 ctlwizchip(CW_SET_PHYPOWMODE, PHY_POWER_NORM) 回到正常模式,再触发一次 wizphy_reset() 并等待复位稳定时间。恢复后还需重新初始化 TOE 引擎,网络通信才能正常。
Q: 自动协商模式和手动配置有什么区别
自动协商(PHY_MODE_AUTONEGO):PHY 自动检测对端设备的速率和双工模式,选择双方都支持的最佳配置。更便捷,但可能因兼容性问题协商到较低速率。
手动配置(PHY_MODE_MANUAL):由用户指定速率和双工模式,可确保使用指定模式,但需确保对端支持。
Q: 全双工和半双工对性能有什么影响
全双工允许数据同时双向传输,理论吞吐量是半双工的两倍。半双工同一时刻只能单方向传输,且需要处理碰撞问题。W6300 建议使用全双工模式以获得最佳性能,除非对端设备只支持半双工。
总结
本文基于 W6300 演示了 PHY 工作模式的配置方法:
配置方式 :PHYCR0[MODE] 位域配置速率与双工,PHYCR1[PWDN] 位配置掉电模式,寄存器受 PHYLCRK 写保护
四种速率模式 :100M 全/半双工、10M 全/半双工,以及自动协商
API 函数 :ctlwizchip(CW_SET_PHYCONF) 设置,ctlwizchip(CW_GET_PHYCONF) 回读,ctlwizchip(CW_SET_PHYPOWMODE) 设置掉电模式
配置生效流程 :PHYUNLOCK → CW_SET_PHYCONF → wizphy_reset → 等待 60.3ms → PHYLOCK → 回读验证
功耗优化 :高速场景用 100M 全双工,空闲时设掉电模式
掉电恢复 :需解锁后重新设置 PHYCR1[PWDN] 并复位 TOE 引擎