全部例程

W6300网络唤醒设备

W6300

更新于 2026年10月12日

本篇总结

在 W6300 上实现网络唤醒(Wake-on-LAN)功能,通过开启 NM_WOL 网络模式并监听 WOL 中断,实现魔术包接收与设备唤醒。

🔑 MH2457、QSPI、UART调试、硬件TOE引擎、WOL、DHCP

硬件平台:本例程基于 W6300-EVB-M4 开发板运行。

采购推荐:点击前往 WIZnet 官方淘宝店铺 选购 W6300-EVB-M4 开发板

本示例演示如何在 W6300 上实现网络唤醒(Wake-on-LAN)功能。该例程用到的其他网络协议(例如 DHCP),请参考相关章节。有关 W6300 的初始化过程,请参考 Network Install 章节,这里不再赘述。

前置工具准备

开始本例程前,请确认以下工具已安装:

WOL 协议简介

WOL 即网络唤醒(Wake-on-LAN),是一种用于通过网络远程唤醒计算机的网络标准协议。它允许通过发送特定的网络数据包(即"魔术包",Magic Packet)来唤醒处于休眠或关机状态的设备。

WOL 的特点:

  • 简单性:魔术包格式非常简单且固定,由 102 个字节组成,前 6 个字节固定为 0xFF,后续是目标设备 MAC 地址重复 16 次
  • 设备待机唤醒:设备在不使用时进入低功耗状态,需要时通过接收魔术包快速恢复正常运行
  • 广播机制:魔术包通常通过 UDP 广播发送,即使设备 IP 未知或存在多台设备,也能通过广播包找到目标设备
  • 安全性高:WOL 基于 MAC 地址识别目标设备,只有当魔术包中的 MAC 与网卡自身 MAC 匹配时,设备才会被唤醒

WOL 应用场景

① 远程唤醒嵌入式设备:工业设备和智能家居设备在待机状态时通过网络唤醒恢复工作;② 智能网关与家庭自动化:通过魔术包唤醒智能家居网关设备实现控制和管理;③ 网络设备批量唤醒:管理员通过 WOL 技术批量唤醒多个设备进行维护和升级。

WOL 协议基本工作流程

  1. 开启 WOL 功能:W6300 首先需要开启 NM_WOL 网络模式,使能 WOL 魔术包接收
  2. 清除 WOL 中断:初始化时先清一次 WOL 中断标志,避免遗留状态误触发
  3. 发送魔术包:当需要唤醒设备时,通过广播发送魔术包
  4. 唤醒操作:如果魔术包中的 MAC 地址与自身匹配,W6300 会置位 IK_WOL 中断,软件检测到中断后即可执行唤醒后的业务逻辑

硬件连接与拓扑

请注意:

测试实例需要 PC 端和 W6300 处于同一网段。

  1. Micro USB 线连接 DEBUG USB 口到 PC(供电 + 调试串口)
  2. 网线连接开发板 RJ45 网口 到路由器 LAN 口
  3. 确保 W6300 与 MH2457 之间的 QSPI 连线正确(CSn、SCK、DATA0~DATA3)
┌─────────────────────────────────┐
│ 路由器(DHCP Server) │
│ 192.168.1.1 │
└────┬──────────────────┬───────────┘
│ │
┌────┴──────┐ ┌────┴──────┐
│ W6300 │ │ PC │
│ WOL 监听 │ │SocketTester│
│ IP: DHCP │ │ 发魔术包 │
└────┬──────┘ └───────────┘
│ QSPI ↑
┌────┴──────┐ DEBUG USB
│ MH2457 │─────→ WIZ UartTool
│ MCU │
└───────────┘
网络拓扑:PC 通过 SocketTester 广播发送魔术包,W6300 监听并触发唤醒,MH2457 通过 QSPI 驱动 W6300

工程结构

工程核心文件如下:

Project/
├── main.c                    ← 系统入口:串口、GPIO、QSPI 初始化 + user_run()
└── USER/
    ├── user_main.c           ← 网络地址定义 + user_run() 主流程
    ├── wol.c                 ← WOL 后端(wol_backend_init / wol_run)
    ├── wol.h
    ├── wiz_platform.c/h      ← 平台适配:debug_usart_init、wizchip_gpio_init、hspi_init
    └── wiz_interface.c/h     ← W6300 驱动接口:wizchip_initialize、network_init、PHY 检测、软件定时器

步骤1:主循环运行 WOL 状态机

文件:USER/user_main.c

static uint16_t local_port = 9000U;

while (1)
{
    wol_run(SOCKET_ID, ethernet_buf, local_port);
}

在 W6300 平台上,WOL 不使用独立的 UDP Socket,而是通过全局的 Network Mode 与 IR 中断实现。为保持与 W5500 例程一致的函数签名,wol_run() 仍然接收 Socket ID、缓存和端口三个参数,但内部会忽略这三个参数。

步骤2:WOL 状态机

文件:USER/wol.c — wol_backend_init() 负责把 W6300 切换到 NM_WOL 网络模式并清一次 WOL 中断;wol_run() 在主循环中被不断调用,检查 IK_WOL 中断是否触发。

static int wol_backend_init(void)
{
    netmode_type mode;

    if (ctlnetwork(CN_GET_NETMODE, &mode) < 0)
    {
        return -1;
    }

    mode = (netmode_type)(mode | NM_WOL);
    if (ctlnetwork(CN_SET_NETMODE, &mode) < 0)
    {
        return -1;
    }

    if (ctlnetwork(CN_GET_NETMODE, &mode) < 0)
    {
        return -1;
    }

    if ((mode & NM_WOL) == 0)
    {
        return -1;
    }

    wizchip_clrinterrupt(IK_WOL);
    return 0;
}

void wol_run(uint8_t sn, uint8_t *buf, uint16_t local_port)
{
    static uint8_t initialized = 0U;
    intr_kind interrupt_status;

    /* Compatibility-only W5500 parameters; W6300 WOL is global Network Mode/IR. */
    (void)sn;
    (void)buf;
    (void)local_port;

    if (initialized == 0U)
    {
        if (wol_backend_init() < 0)
        {
            return;
        }
        initialized = 1U;
    }

    interrupt_status = wizchip_getinterrupt();
    if ((interrupt_status & IK_WOL) != 0)
    {
        printf("get wake on line\r\n");
        wizchip_clrinterrupt(IK_WOL);
    }
}

关键点:W6300 的 WOL 是全局网络模式功能,不是 Socket 级别的功能。初始化流程为:通过 ctlnetwork(CN_GET_NETMODE, ...) 读取当前网络模式,按位或上 NM_WOL,再写回;然后通过 wizchip_clrinterrupt(IK_WOL) 清一次 WOL 中断,避免遗留状态。主循环中通过 wizchip_getinterrupt() 读取全局中断寄存器,检测 IK_WOL 位是否置位。

魔术包格式

魔术包固定 102 字节:前 6 字节为 FF FF FF FF FF FF,之后是目标 MAC 地址重复 16 次(16 × 6 = 96 字节)。W6300 硬件自动解析魔术包并置位 IK_WOL 中断,无需软件实现解析。

如果你想自定义

  • 唤醒后执行动作 → 在 printf("get wake on line") 后添加业务逻辑代码
  • 关闭 WOL 功能 → 读取当前网络模式后清掉 NM_WOL 位再写回

运行验证

打开 WIZ UartTool V1.0,连接 DEBUG USB 对应 COM 口(115200 / 8N1)。烧录例程运行后,首先进行 PHY 链路检测和 DHCP 获取网络地址,然后 WOL 后端进入 NM_WOL 网络模式并开始监听魔术包。预期串口输出如下:

MH2457 W6300 QSPI example start
W6300 WOL 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
====================================================================================================

然后在 PC 端打开 SocketTester,设置 UDP 模式,目标 IP 为 W6300 的 IP(192.168.1.8),目标端口可任意(魔术包本身以 MAC 匹配为主),发送 HEX 格式的魔术包数据。

发送魔术包注意事项

使用 SocketTester 发送 HEX 格式数据时,需勾选 Enable $# command 选项,在每个数据前面加上 $ 符号,注意不能有空格——空格会被转换为 0x20。若使用其他网络调试助手,直接以 HEX 格式发送即可。

魔术包内容为:FF FF FF FF FF FF + 目标 MAC 地址重复 16 次。W6300 收到魔术包后,串口会打印 get wake on line,表示成功接收到魔术包并触发唤醒事件。

SocketTester 发送 WOL 魔术包 — HEX 格式数据
WIZ UartTool 串口输出 — WOL 唤醒成功,打印 "get wake on line"

常见问题

Q: 魔术包为什么是 102 字节

魔术包 = 6 字节前导(FF FF FF FF FF FF)+ 16 次 MAC 地址重复(16 × 6 = 96 字节)= 102 字节。前导固定为全 FF,用于唤醒网卡;后续 16 次 MAC 重复确保接收方能连续正确识别。

Q: W6300 的 WOL 功能是软件实现还是硬件实现

W6300 的 WOL 功能是硬件实现。通过 ctlnetwork(CN_SET_NETMODE, ...) 设置 NM_WOL 网络模式,硬件自动解析 UDP 报文并判断是否为魔术包,匹配时置位全局中断寄存器的 IK_WOL 位,无需软件解析报文内容。

Q: 为什么使用 SocketTester 发送时需要加 $ 符号

SocketTester 的 $# command 模式会将 $ 后跟的两个字符解释为十六进制字节。勾选 Enable 后,每个字节前加 $ 即可发送任意 HEX 数据。注意字节之间不能有空格,否则空格会被当作 0x20 发送。

Q: 收不到魔术包怎么办

排查步骤:① 确认 PC 和 W6300 处于同一网段;② 确认 SocketTester 中目标 IP 正确;③ 确认勾选了 Enable $# command;④ 检查魔术包内容是否包含 W6300 实际的 MAC 地址(00:08:DC:12:34:56);⑤ 关闭 PC 端防火墙。

Q: WOL 和低功耗模式有什么区别

WOL 是一种网络唤醒机制,设备可通过魔术包从待机/休眠状态恢复到运行状态;低功耗模式是 MCU 的省电模式(如 Sleep/Stop/Standby),减少功耗。W6300 的 WOL 主要针对 TOE 引擎的魔术包识别,与 MCU 的低功耗模式配合使用可实现网络唤醒+低功耗的完整方案。

总结

本文讲解了如何在 W6300 芯片上实现网络唤醒(WOL)功能:

  • WOL 协议:基于 UDP 广播的远程唤醒协议,通过魔术包(102 字节)唤醒休眠或关机设备
  • 魔术包结构:前 6 字节固定为 FF,之后是目标 MAC 地址重复 16 次,硬件自动解析并触发中断
  • 实现流程:ctlnetwork 读取网络模式 → 按位或上 NM_WOL 写回 → wizchip_clrinterrupt 清中断 → 主循环检测 IK_WOL
  • 关键 API:ctlnetwork(CN_SET_NETMODE, ...) 开启 WOL、wizchip_getinterrupt() 读取中断、IK_WOL 判定魔术包
  • 应用价值:远程设备管理、工业设备唤醒、智能家居网关控制、网络设备批量维护

下载本章例程

我们提供完整的工程文件以及配套开发板,方便你随时测试,快速完成产品开发:

开发环境: Keil MDK5

Andy

W5500 技术支持专家