TobudOS MicroPython 网络编程:WIZNET5K 类驱动 WIZnet5x00 以太网模块实战指南
【免费下载链接】TobudOSTobudOS 是面向物联网领域开发的实时操作系统早期版本基于腾讯自研的物联网操作系统TencentOS Tiny2020年由腾讯捐赠到开放原子开源基金会进行孵化2023年正式更名为TobudOSTobudOS具有低功耗低资源占用模块化安全可靠等特点可有效提升物联网终端产品开发效率提供精简的 RTOS 内核内核组件可裁剪可配置可快速移植到多种主流 MCU (如 STM32 全系列) 及模组芯片上。而且基于 RTOS 内核提供了丰富的物联网组件内部集成主流物联网协议栈如 CoAP/MQTT/TLS/DTLS/LoRaWAN/NB-IoT 等可助力物联网终端设备及业务快速接入物联网云平台。项目地址https://gitcode.com/openatomfoundation/TobudOS点击查看免费下载导读本文以 TobudOS 仓库中 MicroPython 移植版的network.WIZNET5K类为核心系统讲解如何在 MicroPython 脚本中通过 SPI 总线驱动 WIZnet W5200 / W5500 以太网控制器涵盖硬件接线、构造函数参数、IP 配置、寄存器调试以及底层驱动两种协议栈工作模式的源码级原理。读完本文你将能够在 TobudOS MicroPython 环境中独立完成以太网模块的初始化、静态 IP / DHCP 配置与 socket 网络编程并掌握如何用regs()和config()快速排查链路与寄存器问题。1. 背景MicroPython 中的 WIZNET5K 网络类TobudOS 的 language/micropython 组件是 MicroPython 解释器在 TobudOS RTOS 上的移植网络子系统遵循 MicroPython 标准的network模块体系。network.WIZNET5K正是该体系中面向有线以太网的具体网卡类NIC用于控制基于W5200与W5500芯片的 WIZnet5x00 系列以太网适配器其官方 API 文档位于 network.WIZNET5K.rst并被 network.rst 收录进具体网卡类实现清单。该类在固件中以扩展模块形式实现核心实现文件是 network_wiznet5k.c底层寄存器/协议操作则复用 WIZnet 官方 ioLibrary 的移植代码位于 drivers/wiznet5k芯片寄存器层w5200、w5500 分别对应两种芯片Socket 抽象层socket.c上层协议internet/dhcp/dhcp.c、internet/dns/dns.c。从源码结构看该驱动直接沿用 WIZnet 官方 W5500_EVB ioLibrary 并针对 MicroPython 做了适配drivers/wiznet5k/README.md中注明了其来源与适配声明。2. 编译期配置用MICROPY_PY_NETWORK_WIZNET5K选定芯片固件实际支持 W5200 还是 W5500取决于编译时的配置宏。文档明确说明固件支持的芯片集由编译期选项MICROPY_PY_NETWORK_WIZNET5K决定。该宏的值即芯片型号编号例如在构建脚本 build-stm32-extra.sh 中可以看到为 pyboard 系列构建 network 固件时统一使用MICROPY_PY_NETWORK_WIZNET5K5200CI 脚本 ci.sh 中同样以BOARDPYBV11 MICROPY_PY_NETWORK_WIZNET5K5200的方式编译验证。也就是说默认构建通常面向 W5200若硬件上是 W5500需要将该宏改为5500后重新编译固件。宏值会一路传导到底层驱动配置头文件 wizchip_conf.h#ifndef _WIZCHIP_ #define _WIZCHIP_ 5200 // 5100, 5200, 5500 #endif_WIZCHIP_ 5200时SPI 采用固定长度数据模式FDM_WIZCHIP_ 5500时SPI 采用变长数据模式VDM即 W5500 的地址段 控制字节帧格式这也是 network_wiznet5k.c 中寄存器地址计算分支的依据W5200 / W5500 均支持8 个独立 Socket_WIZCHIP_SOCK_NUM_为 8。从 wizchip_conf.h 可以推断只有 W5100_WIZCHIP_ 5100是 4 个 Socket其余为 8 个。文档虽只列 W5200/W5500但驱动框架本身对 W5100 亦留有兼容分支。3. 硬件接线与构造函数3.1 构造函数签名network.WIZNET5K(spi, pin_cs, pin_rst)三个参数全部由驱动接管并自行初始化无需在调用前手动配置参数类型说明spiSPI 对象WIZnet5x00 所挂接的 SPI 总线对应 MOSI / MISO / SCLK 三根线pin_csPin 对象连接到芯片nSS片选引脚pin_rstPin 对象连接到芯片nRESET复位引脚官方文档给出的最小示例import network nic network.WIZNET5K(pyb.SPI(1), pyb.Pin.board.X5, pyb.Pin.board.X4) print(nic.ifconfig()) # now use socket as usual ...其中pyb.SPI(1)、pyb.Pin.board.X5属于 MicroPython pyboard 的引脚命名方式。文档同时强调完全可以使用其他 SPI 总线以及其他 GPIO 作为 nSS / nRESET即构造函数与具体板卡解耦。3.2 标准接线表要使上述示例工作WIZnet5x00 模块需要按如下方式接线pyboard 引脚示例WIZnet5x00 引脚对应板卡引脚说明MOSIX8SPI 主出从入MISOX7SPI 主入从出SCLKX6SPI 时钟nSSX5片选低有效nRESETX4硬件复位低有效在 TobudOS 对应的 STM32 移植中构造对象时传入手动创建的 SPI 与 Pin 对象即可例如import network from machine import SPI, Pin spi SPI(1, baudrate2000000, polarity0, phase0) nic network.WIZNET5K(spi, Pin(PB12, Pin.OUT), Pin(PB13, Pin.OUT))从实现看默认 SPI 波特率为 2 MHzMICROPY_HW_WIZNET_SPI_BAUDRATE缺省值为2000000见 network_wiznet5k.c。另外如果板级配置中定义了MICROPY_HW_WIZNET_SPI_ID等宏还可以零参数自动初始化nic network.WIZNET5K() # 使用板级预定义的 SPI 与引脚此时驱动会依据MICROPY_HW_WIZNET_SPI_ID / SCK / MISO / MOSI / PIN_CS / PIN_RST以及 LwIP 模式下的PIN_INTN自动创建 SPI 与引脚对象详见 network_wiznet5k.c。4. 方法详解4.1isconnected()物理链路检测nic.isconnected()返回True物理以太网链路已连接网线插好且协商成功返回False链路断开。实现上该方法是三重条件的与运算network_wiznet5k.cwizphy_getphylink() PHY_LINK_ON // PHY 物理链路 UP IS_ACTIVE(self) // 网卡处于激活状态 self-netif.ip_addr.addr ! 0 // 已获得有效 IPLwIP 模式因此它不仅能反映网线状态还能反映网卡是否被active(True)激活以及是否已取得 IP。4.2ifconfig()读写 IP 网络参数nic.ifconfig() # 查询 nic.ifconfig((192.168.0.4, 255.255.255.0, 192.168.0.1, 8.8.8.8)) # 设置无参数调用返回(ip, subnet_mask, gateway, dns)四元组传入四元组则按顺序设置 IP 地址、子网掩码、网关与 DNS。文档给出的设置示例为nic.ifconfig((192.168.0.4, 255.255.255.0, 192.168.0.1, 8.8.8.8))在 WIZnet 自带协议栈模式下MICROPY_PY_LWIP未启用时ifconfig还额外支持 DHCP 参数形式nic.ifconfig(dhcp)此时驱动启动 WIZnet 侧 DHCP 客户端wiznet5k_dhcp_init每个周期最长等待 3 秒重试超过 3 次仍未租到地址会抛出OSError: timeout waiting for DHCP to get IP address。成功租约后回调wiz_dhcp_assign把 IP/网关/掩码/DNS 写回芯片。若采用静态配置驱动会设置NETINFO_STATIC并通过CN_SET_NETINFO下发到芯片network_wiznet5k.c。顺带说明驱动内置的默认静态配置network_wiznet5k.c参数默认值IP192.168.0.18子网掩码255.255.255.0网关192.168.0.1DNS8.8.8.8这些默认值在未调用ifconfig前即生效可作快速连通性测试。4.3regs()寄存器转储nic.regs()该方法用于调试将 WIZnet5x00 的寄存器内容完整打印出来。实现中network_wiznet5k.c会输出Wiz CREG:公共寄存器区地址 0x00 ~ 0x50共 0x50 字节按 16 字节一行十六进制排版每个 Socket 的Wiz SREG[n]:特殊寄存器区前 4 个 Socket各 0x30 字节。寄存器地址在 W5500 下按_W5500_IO_BASE_ | addr8 | sreg_block3计算在 W5200 下则为线性地址偏移。当链路异常或芯片无响应时通过regs()比对模式寄存器MR、PHY 状态寄存器等关键字段可以快速判断 SPI 接线、片选与复位时序是否正确。4.4 源码中额外暴露的方法文档之外的实用接口除了文档列出的三个方法network_wiznet5k.c 中的方法表还注册了以下方法active([flag])启动/关闭网卡。active(True)时会执行完整的芯片复位时序nRESET拉低 1 ms 后拉高等待 160 ms符合芯片数据手册要求、注册 SPI/CS/临界区回调并完成初始化network_wiznet5k.c。构造函数返回的对象默认尚未激活首次使用前需要调用active(True)或在初始化流程中完成激活。status()无参数返回链路状态整数0表示链路断开1表示链路已连接但网卡未激活2表示已激活。config(mac)/config(macb...)查询或设置 6 字节 MAC 地址。初始化时驱动会先读取芯片自带 MACgetSHAR若全为 0则用平台提供的mp_hal_get_mac(MP_HAL_MAC_ETH0, mac)生成并写回芯片network_wiznet5k.c。send_ethernet(buf)仅 LwIP 模式直接发送原始以太网帧供上层协议栈使用。5. 两种协议栈工作模式源码级原理network_wiznet5k.c 的注释明确指出该模块支持两种用法// * Raw ethernet transport with LwIP integrated in micropython - LwIP 集成模式 // * Provided TCP Stack on controller presented as modnetwork - 芯片自带协议栈模式由WIZNET5K_WITH_LWIP_STACK (MICROPY_PY_LWIP)与WIZNET5K_PROVIDED_STACK (!MICROPY_PY_LWIP)两个编译分支决定5.1 LwIP 集成模式MACRAW 模式固件启用MICROPY_PY_LWIP时WIZnet 芯片工作在MACRAW 模式只负责收发原始以太网帧TCP/IP 协议栈由 MicroPython 内置的 LwIP 承担初始化时分配 16 KB 收发缓冲区sn_size[16] {16, 0, ...}以CW_INIT_WIZCHIP完成芯片初始化以Sn_MR_MACRAW打开 Socket 0并开启 MAC 过滤Sn_MR_MFEN只接收发往本机的帧以降低 LwIP 负载network_wiznet5k.c通过netif_add将网卡注册为 LwIP 的netif名称e0netif-mtu 1500上电即启动dhcp_start网卡激活后由 DHCP 自动获取 IP该模式下ifconfig直接委托给mod_network_nic_ifconfig行为与标准 MicroPython 网卡一致network_wiznet5k.c。5.2 WIZnet 自带协议栈模式未启用 LwIP 时TCP/IP 协议完全运行在 WIZnet 芯片内部硬协议栈MicroPython 侧仅做 Socket 映射每个 Socket 分配 2 KB 缓冲区注册 DHCP 回调reg_dhcp_cbfunc后芯片侧即可独立维护 DHCP 状态Socket 打开动作被延迟由于 WIZnet 在创建时就必须知道是客户端还是服务端驱动在socket()调用时只分配 Socket 号真正的socket()硬件调用推迟到bind服务端端口非 0或connect客户端端口为 0时进行network_wiznet5k.c8 个 Socket 用socket_used位图管理全部占用时返回EMFILE所有收发操作send/recv/sendto/recvfrom都会先释放 GILMP_THREAD_GIL_EXIT()再进入芯片读写避免阻塞其它 MicroPython 线程network_wiznet5k.caccept循环轮询getSn_SR等待SOCK_ESTABLISHED并处理 WIZnet 监听 Socket 被“翻转”为连接 Socket 后的重新 bind/listennetwork_wiznet5k.c。两种模式各有利弊LwIP 模式功能完整支持更丰富的 socket 语义适合资源较充裕的 MCU自带协议栈模式把网络负担卸载到芯片主机侧开销更小但从源码注释“Not all micropython modnetwork / socket features are provided”可以推断其 socket 特性覆盖不完整。6. 在 TobudOS 中的运行环境MicroPython 在 TobudOS 中并不是裸机运行而是作为一个 RTOS 任务被创建和调度。参考 micropython_demo.cvoid mp_entry(void *arg) { ... for (;;) { mp_main(); // 进入 MicroPython REPL / 执行脚本 tos_task_delay(100); } } void application_entry(void *arg) { ... tos_task_create(mp_task, micropython, mp_entry, K_NULL, MP_TASK_PRIO, mp_task_stack, MP_TASK_STACK_SIZE, 0); }其中MP_TASK_PRIO为 3任务栈默认 4 KB。这意味着在脚本中调用WIZNET5K(...)、ifconfig(dhcp)等阻塞操作时网络任务会通过mpy_wiznet_yield()内部调用MICROPY_THREAD_YIELD()或mp_handle_pending见 network_wiznet5k.c主动让出 CPU其它 TobudOS 任务仍可正常调度。因此以太网初始化流程与 RTOS 多任务调度是协作关系而非相互阻塞。7. 完整可运行的示例综合文档与源码一个典型的 TobudOS MicroPython 以太网启动流程如下import network from machine import SPI, Pin # 1. 创建驱动对象驱动会接管 CS/RST 引脚初始化 nic network.WIZNET5K(SPI(1, baudrate2000000), Pin(PB12, Pin.OUT), Pin(PB13, Pin.OUT)) # 2. 激活网卡复位芯片、注册回调、初始化、获取 MAC nic.active(True) # 3a. 方式一静态 IP nic.ifconfig((192.168.0.4, 255.255.255.0, 192.168.0.1, 8.8.8.8)) # 3b. 方式二DHCPWIZnet 自带协议栈模式下可用超时抛 OSError # nic.ifconfig(dhcp) # 4. 检查链路与配置 print(connected:, nic.isconnected()) print(ifconfig :, nic.ifconfig()) print(status :, nic.status()) print(mac :, nic.config(mac)) # 5. 之后即可使用标准 socket 编程 import socket addr socket.getaddrinfo(192.168.0.1, 80)[0][-1] s socket.socket() s.connect(addr) s.send(bGET / HTTP/1.0\r\n\r\n) print(s.recv(512)) s.close()注意上述引脚名称仅为示意实际请以所用板卡的引脚定义为准同时确认固件已按第 2 节配置了与硬件一致的MICROPY_PY_NETWORK_WIZNET5K值。8. 常见问题与调试思路现象排查方向isconnected()一直为False检查网线/PHY 协商确认已执行active(True)DHCP 模式下确认已取得 IP初始化后无响应用regs()转储寄存器比对 MR、PHY 寄存器重点检查 SPI 四线MOSI/MISO/SCLK与 nSS 接线、极性相位建议 polarity0, phase0无法获取 IP自带协议栈模式ifconfig(dhcp)抛OSError说明 3 次重试均失败检查网关/网线或改用静态 IPSocket 创建失败8 个 Socket 全部被占用时返回EMFILE确认已关闭不再使用的 socket收发卡顿LwIP 模式下可开启帧跟踪nic.config(trace...)对应源码中TRACE_ETH_TX/RX标志观察收发路径与netif状态最后再次强调两个容易忽略的要点芯片型号5200/5500由编译宏决定必须在构建固件前确认构造对象并不等于网卡已激活active(True)是复位与初始化的真正入口。掌握这两点再配合regs()寄存器转储绝大多数 WIZnet5x00 接入问题都能在 TobudOS MicroPython 环境中快速定位。赞分享【免费下载链接】TobudOSTobudOS 是面向物联网领域开发的实时操作系统早期版本基于腾讯自研的物联网操作系统TencentOS Tiny2020年由腾讯捐赠到开放原子开源基金会进行孵化2023年正式更名为TobudOSTobudOS具有低功耗低资源占用模块化安全可靠等特点可有效提升物联网终端产品开发效率提供精简的 RTOS 内核内核组件可裁剪可配置可快速移植到多种主流 MCU (如 STM32 全系列) 及模组芯片上。而且基于 RTOS 内核提供了丰富的物联网组件内部集成主流物联网协议栈如 CoAP/MQTT/TLS/DTLS/LoRaWAN/NB-IoT 等可助力物联网终端设备及业务快速接入物联网云平台。项目地址https://gitcode.com/openatomfoundation/TobudOS点击查看免费下载相关推荐TobudOS MicroPython 的 CC3K 网络驱动详解用 CC3000 WiFi 模块接入无线网络TobudOS MicroPython 的 CC3K 网络驱动详解用 CC3000 WiFi 模块接入无线网络 本文聚焦 TobudOS 仓库中 MicroPMicroPython 网络编程实战W5500-EVB-Pico 板卡RP2040 WIZnet W5500以太网配置全指南MicroPython 网络编程实战W5500 EVB Pico 板卡RP2040 WIZnet W5500以太网配置全指南 导读 本文以 Micro嵌入式语言运行时编程语言解释器编译器物联网系统编程HsMod深度解析55项炉石传说增强功能实战指南与专业配置HsMod深度解析55项炉石传说增强功能实战指南与专业配置 HsMod作为基于BepInEx框架开发的炉石传说增强插件为玩家提供了从基础游戏体验到高级功能的嵌入式语言运行时编程语言解释器编译器物联网系统编程上一篇Mayo命令行工具完全指南批量转换CAD文件的终极解决方案下一篇解决Mopidy音频延迟3步校准实现音画同步播放创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考