1. 项目概述:当RP2040遇上以太网
如果你手头有一块Raspberry Pi Pico或者任何基于RP2040芯片的开发板,并且正在为它寻找一个稳定、可靠的以太网连接方案,那么W5100S-EVB-Pico这块板子很可能就是你一直在找的答案。它不是一个简单的模块,而是一个将树莓派官方RP2040核心板与成熟的W5100S以太网控制器集成在一起的完整评估板。简单来说,它让原本只有USB和GPIO的Pico,瞬间拥有了接入有线局域网、甚至直接访问互联网的能力。
我最初接触这块板子,是因为一个需要稳定网络通信的工业数据采集项目。Wi-Fi虽然方便,但在电磁环境复杂、对通信延迟和丢包率有严格要求的场景下,有线以太网的可靠性是无可替代的。而Arduino生态以其丰富的库和易用性,大大降低了嵌入式网络开发的入门门槛。W5100S-EVB-Pico恰好站在了这两个需求的交叉点上:它提供了RP2040强大的双核处理能力和灵活的I/O,又通过W5100S这颗久经考验的芯片赋予了其以太网功能,并且能完美融入Arduino IDE的开发环境。
对于开发者而言,这意味着你可以用编写Arduino Uno程序类似的熟悉感,去开发一个具备网络功能的、性能更强的嵌入式设备。无论是想搭建一个简单的Web服务器来远程控制设备,还是创建一个MQTT客户端将传感器数据上报到云平台,亦或是实现一个Modbus TCP网关,这块板子都能提供一个坚实的硬件基础。接下来的内容,我将结合自己的实际使用经验,从硬件解析、环境搭建、核心编程到实战应用,为你完整梳理如何玩转这块W5100S-EVB-Pico。
2. 硬件深度解析:W5100S-EVB-Pico的构成与设计逻辑
拿到W5100S-EVB-Pico,第一感觉是它比普通的Pico“丰满”了不少。它的设计非常直观,我们可以把它拆解为三个核心部分来理解:RP2040主控、W5100S网络芯片以及二者的连接桥梁。
2.1 RP2040:强劲的“大脑”
板子中央那颗熟悉的芯片就是RP2040,树莓派基金会设计的微控制器。它拥有双核Arm Cortex-M0+处理器,运行频率最高可达133MHz,264KB的SRAM和2MB的板载Flash(在W5100S-EVB-Pico上通常外挂了更大容量的Flash)。双核特性对于网络应用尤其有价值,你可以让一个核心专心处理网络协议栈的数据收发和解包,另一个核心则负责执行主要的应用程序逻辑,比如传感器读取、逻辑控制等,有效避免了网络IO阻塞主任务。
除了性能,RP2040最大的优势在于其极其灵活和丰富的GPIO。这些GPIO在W5100S-EVB-Pico上被充分利用,一部分用于与W5100S通信,另一部分则通过排针引出,供用户扩展使用。这意味着在实现网络功能的同时,你依然可以连接大量的传感器、显示屏或执行器,项目的可扩展性非常强。
2.2 W5100S:专司网络的“守门员”
W5100S是韩国WIZnet公司的产品,这是一颗硬连线的TCP/IP协议栈芯片。理解“硬连线”这个概念是关键。与ESP32等芯片使用软件实现TCP/IP协议栈不同,W5100S内部有专门的硬件逻辑来处理以太网帧的封装、解析、ARP、IP、ICMP、TCP、UDP等协议。这样做的好处非常明显:
- 极低的CPU占用率:主控芯片(RP2040)几乎不需要为处理网络协议包而耗费算力,它只需要通过SPI接口向W5100S发送或读取数据即可。网络协议的繁重工作全部由W5100S独立完成。
- 极高的稳定性和确定性:硬件处理避免了软件协议栈可能因任务调度、内存分配带来的延迟和不确定性,在网络流量大或主控CPU负载高时,网络通信依然能保持稳定。
- 简化开发:开发者无需关心复杂的网络协议细节,只需操作几个Socket(套接字)即可,编程模型类似于桌面电脑上的BSD Socket,非常直观。
W5100S芯片本身集成了以太网PHY和MAC,支持10/100Mbps速率,并内置了16KB的收发缓冲区。它支持最多8个独立的硬件Socket,可以同时作为TCP服务器、TCP客户端、UDP服务器或UDP客户端运行,足以应对大多数嵌入式网络应用场景。
2.3 二者的连接:SPI通信与板载设计
RP2040与W5100S之间通过高速SPI(Serial Peripheral Interface)总线进行通信。在W5100S-EVB-Pico上,这个连接是通过板载的电路直接完成的,用户无需自己飞线。通常,W5100S的片选(CS)、中断(INT)等信号也连接到了RP2040的特定GPIO上。
这种集成设计带来了巨大的便利:
- 免去接线烦恼:你不需要像使用单独的W5500模块那样,去连接MOSI, MISO, SCK, CS, INT, RST等至少6根线,还要担心电平转换和电源问题。
- 电路优化:板载的RJ45以太网接口、网络变压器、电源滤波电路都经过设计,保证了网络信号的完整性和稳定性。
- 即插即用:只需要一根Micro USB线为板子供电和编程,一根网线连接到路由器,硬件环境就搭建完毕了。
此外,板子保留了Pico的所有GPIO排针,并且将用于连接W5100S的SPI引脚也引出了(通常标记为WIZ_CS,WIZ_INT等),这为高级用户提供了灵活性,比如你想用软件重置W5100S,或者连接其他SPI设备时,这些引脚都是可用的。
注意:虽然板载集成简化了使用,但在编程时,你依然需要知道W5100S连接到了RP2040的哪几个GPIO引脚,因为相关的Arduino库需要这些信息进行初始化。通常,这些定义在板支持包(BSP)或示例代码中已经预设好。
3. 开发环境搭建与核心库剖析
要让W5100S-EVB-Pico在Arduino IDE里跑起来,需要完成两步:安装RP2040的板支持包,以及安装W5100S的驱动库。这个过程比想象中要简单,但有些细节不注意就容易踩坑。
3.1 安装Arduino IDE与RP2040支持
首先,确保你使用的是较新版本的Arduino IDE(1.8.x或2.x均可)。打开IDE,进入“文件”->“首选项”,在“附加开发板管理器网址”中,添加树莓派的Pico板支持包地址:https://github.com/earlephilhower/arduino-pico/releases/download/global/package_rp2040_index.json这是目前社区维护最活跃、功能最完整的RP2040 Arduino核心包,由Earle F. Philhower维护。
添加后,打开“工具”->“开发板”->“开发板管理器”,搜索“Raspberry Pi Pico”。你应该能找到“Raspberry Pi Pico/RP2040 by Earle F. Philhower”这个包,选择最新版本进行安装。安装完成后,在开发板列表里就能看到“Raspberry Pi Pico”等一系列选项。
关键一步:选择正确的开发板型号。在“工具”->“开发板”菜单中,你需要滚动找到并选择“Raspberry Pi Pico (W5100S-EVB-Pico)”。这个特定的选项包含了针对这块评估板的引脚映射和默认设置。如果选成了普通的“Raspberry Pi Pico”,代码可能无法正确控制W5100S芯片。
3.2 安装与理解Ethernet库
W5100S在Arduino生态中的驱动,通常通过Ethernet库来实现。幸运的是,针对RP2040的Arduino核心包已经集成了一个经过适配的Ethernet库。你可以在“工具”->“管理库...”中搜索“Ethernet”来确认,但通常无需额外安装。
这个Ethernet库是项目的核心,它封装了与W5100S芯片通信的所有底层细节,提供了高级的、类似标准BSD Socket的API。我们需要理解几个关键类:
EthernetClass: 全局对象Ethernet,用于初始化网络模块、设置MAC地址、获取IP地址(DHCP或静态)等。EthernetServer: 用于创建TCP服务器。你指定一个端口号,它就能监听来自客户端的连接。EthernetClient: 用于作为TCP客户端去连接远程服务器,或者用于处理服务器接受到的客户端连接。EthernetUDP: 用于处理UDP协议的收发。
库的初始化流程通常是固定的:
#include <SPI.h> #include <Ethernet.h> // 设置MAC地址,这在局域网内必须是唯一的 byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; // 如果你想使用静态IP,取消下面几行的注释并配置 // IPAddress ip(192, 168, 1, 177); // IPAddress gateway(192, 168, 1, 1); // IPAddress subnet(255, 255, 255, 0); void setup() { Serial.begin(115200); // 等待串口连接,对于某些没有自动重置的板子很有用 while (!Serial); // 使用DHCP自动获取IP(推荐在大多数家庭/办公室网络中使用) if (Ethernet.begin(mac) == 0) { Serial.println("Failed to configure Ethernet using DHCP"); // 如果DHCP失败,可以尝试使用静态IP // Ethernet.begin(mac, ip, gateway, subnet); // 或者检查硬件连接 while (1); } // 打印获取到的IP地址 Serial.print("My IP address: "); Serial.println(Ethernet.localIP()); }这段代码是网络功能的起点。Ethernet.begin(mac)会尝试通过DHCP获取IP地址。成功返回非零值后,Ethernet.localIP()就能打印出设备在局域网中的地址。
实操心得:在办公室或实验室网络,DHCP通常很可靠。但在某些工业网络或需要固定地址进行端口映射的场景,使用静态IP会更稳定。如果DHCP失败,首先检查网线是否已连接且路由器DHCP服务正常,这是最常见的问题。
4. 实战应用一:构建一个异步Web服务器
一个简单的Web服务器是验证网络功能和学习HTTP协议的好方法。但我们要做的不是一个阻塞式的、一次只能处理一个请求的服务器,而是一个能够异步处理、不影响主循环的服务器。这得益于W5100S的硬件多Socket支持和RP2040的双核能力(虽然本例暂未用到双核,但为未来扩展留出空间)。
4.1 服务器核心代码结构
我们将创建一个在80端口监听的服务器,当接收到HTTP GET请求时,返回一个简单的HTML页面,显示一些系统状态(比如模拟输入值)。
#include <SPI.h> #include <Ethernet.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; EthernetServer server(80); // 在80端口创建服务器 String httpRequest = ""; // 用于存储客户端请求 void setup() { Serial.begin(115200); while (!Serial); if (Ethernet.begin(mac) == 0) { Serial.println("DHCP Failed!"); while (1); } Serial.print("Server at: "); Serial.println(Ethernet.localIP()); server.begin(); // 启动服务器 } void loop() { // 监听是否有新的客户端连接 EthernetClient client = server.available(); if (client) { Serial.println("New client connected."); httpRequest = ""; // 清空请求字符串 // 读取客户端发送的请求 while (client.connected()) { if (client.available()) { char c = client.read(); httpRequest += c; // 如果收到连续的回车换行符,说明请求头结束 if (httpRequest.endsWith("\r\n\r\n")) { break; } } } // 打印原始请求(调试用) Serial.println(httpRequest); // 发送HTTP响应头 client.println("HTTP/1.1 200 OK"); client.println("Content-Type: text/html"); client.println("Connection: close"); client.println(); // 空行分隔头部和主体 // 发送HTML页面主体 client.println("<!DOCTYPE HTML>"); client.println("<html>"); client.println("<head><title>W5100S-EVB-Pico Server</title></head>"); client.println("<body>"); client.println("<h1>Hello from W5100S-EVB-Pico!</h1>"); client.print("<p>Analog Input A0: "); client.print(analogRead(A0)); client.println("</p>"); client.println("<p>Refresh the page to update.</p>"); client.println("</body>"); client.println("</html>"); // 给客户端一点时间接收数据,然后关闭连接 delay(10); client.stop(); Serial.println("Client disconnected."); } // 主循环可以在这里做其他事情,比如读取传感器 // 网络服务不会阻塞这里 }将代码上传到板子后,打开串口监视器,你会看到获取到的IP地址。在同一局域网内的电脑浏览器中输入这个IP地址,就能看到显示的网页和A0引脚的模拟值。
4.2 代码逻辑拆解与优化点
- 非阻塞监听:
server.available()是非阻塞的,它会立即返回一个已连接的客户端对象,如果没有客户端则返回一个假值。这保证了loop()函数能快速循环,不耽误其他任务。 - 请求解析:我们简单地读取字符直到遇到
\r\n\r\n(HTTP请求头的结束标志)。这是一个最基础的解析,仅用于演示。复杂的服务器需要解析请求行(如GET /path HTTP/1.1)和请求头。 - 响应格式:HTTP响应必须严格按照格式:状态行、响应头、空行、响应体。我们发送了一个简单的HTML页面作为响应体。
- 连接管理:响应发送完毕后,调用
client.stop()关闭连接。这是必要的,因为W5100S的硬件Socket资源是有限的(8个),不及时关闭会导致资源耗尽。
优化方向:
- 多客户端处理:上述代码一次只能处理一个客户端。要处理并发,需要用一个数组来维护多个
EthernetClient对象,并定期检查每个客户端的连接和数据状态。 - 请求路由:可以解析
httpRequest字符串,判断请求的路径(如GET /led/on),从而执行不同的操作(控制GPIO)。 - 使用更高效的字符串处理:在内存有限的嵌入式系统中,频繁的
String拼接可能导致内存碎片。对于复杂的响应,可以考虑使用client.print()直接分段输出,或使用预定义的HTML模板。
5. 实战应用二:实现MQTT客户端上报数据
将传感器数据上报到云平台是物联网项目的常见需求,MQTT协议因其轻量、高效而成为首选。我们将把W5100S-EVB-Pico配置为一个MQTT客户端,连接到公共的MQTT代理服务器,并定期发布消息。
5.1 安装PubSubClient库
Arduino IDE自带的库中没有MQTT客户端。我们需要安装一个第三方库。最常用的是PubSubClient。在“工具”->“管理库...”中搜索“PubSubClient”,选择由Nick O‘Leary开发的版本进行安装。
5.2 MQTT客户端代码实现
这里我们连接到Eclipse Mosquitto提供的公共测试服务器test.mosquitto.org。
#include <SPI.h> #include <Ethernet.h> #include <PubSubClient.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; IPAddress server(85, 119, 83, 194); // test.mosquitto.org 的IP // 回调函数,当收到订阅主题的消息时触发 void callback(char* topic, byte* payload, unsigned int length) { Serial.print("Message arrived ["); Serial.print(topic); Serial.print("] "); for (unsigned int i = 0; i < length; i++) { Serial.print((char)payload[i]); } Serial.println(); } EthernetClient ethClient; PubSubClient mqttClient(ethClient); // 将EthernetClient传递给PubSubClient long lastPublishTime = 0; const long publishInterval = 5000; // 每5秒发布一次 int messageCount = 0; void reconnect() { // 循环直到重新连接成功 while (!mqttClient.connected()) { Serial.print("Attempting MQTT connection..."); // 尝试连接,客户端ID需要唯一 if (mqttClient.connect("W5100SClient-12345")) { Serial.println("connected"); // 连接成功后,可以订阅主题 mqttClient.subscribe("pico/incoming"); } else { Serial.print("failed, rc="); Serial.print(mqttClient.state()); Serial.println(" try again in 5 seconds"); delay(5000); } } } void setup() { Serial.begin(115200); while (!Serial); if (Ethernet.begin(mac) == 0) { Serial.println("DHCP Failed!"); while (1); } Serial.print("IP: "); Serial.println(Ethernet.localIP()); mqttClient.setServer(server, 1883); // 设置MQTT服务器和端口 mqttClient.setCallback(callback); // 设置消息到达回调函数 } void loop() { // 维持以太网连接(DHCP租约更新等) Ethernet.maintain(); // 维持MQTT连接 if (!mqttClient.connected()) { reconnect(); } mqttClient.loop(); // 必须定期调用,以处理接收到的消息和保持心跳 // 定期发布消息 long now = millis(); if (now - lastPublishTime > publishInterval) { lastPublishTime = now; messageCount++; // 构建要发布的消息 char msg[50]; int sensorValue = analogRead(A0); snprintf(msg, 50, "Count: %d, Sensor: %d", messageCount, sensorValue); // 发布到主题 "pico/data" if (mqttClient.publish("pico/data", msg)) { Serial.print("Message published: "); Serial.println(msg); } else { Serial.println("Publish failed!"); } } }5.3 关键机制与排错指南
- 连接复用:
PubSubClient库需要一个网络客户端对象作为参数。我们传递了EthernetClient ethClient。这意味着MQTT连接是建立在以太网TCP连接之上的,库内部会管理这个TCP连接。 - 回调函数:
setCallback用于设置当收到订阅主题的消息时的处理函数。这对于实现双向通信(设备既能上报也能接收指令)至关重要。 mqttClient.loop():这个函数必须被频繁调用。它负责检查网络数据、处理接收到的MQTT报文、以及发送心跳包(PINGREQ)以保持连接活跃。如果长时间不调用,代理服务器会认为客户端已断开。Ethernet.maintain():对于DHCP客户端,这个函数用于维护租约,在需要时续租IP地址。虽然调用频率不用很高,但在长时间运行的程序中定期调用是良好的习惯。
常见问题排查:
- 连接失败(状态码 -2):通常是网络不通。检查网线、路由器,并确保
Ethernet.begin()成功。 - 连接失败(状态码 -4):MQTT连接被拒绝。检查客户端ID是否唯一,或者公共测试服务器是否暂时不可用(可以尝试其他公共broker,如
broker.hivemq.com)。 - 发布成功但收不到:使用一个桌面MQTT客户端(如MQTTX、Mosquitto_sub)订阅
pico/data主题,确认消息是否真的被代理转发。同时检查发布和订阅的主题名是否完全一致(包括大小写)。 - 运行一段时间后断开:确保
loop()函数被持续调用。检查代码中是否有长时间的delay()阻塞了loop()的执行。可以考虑使用非阻塞定时器(如millis()对比)来替代delay()。
6. 性能调优与高级应用场景
当基础功能跑通后,我们往往会追求更稳定、更高效的应用。W5100S-EVB-Pico的潜力远不止于简单的示例。
6.1 网络稳定性与内存管理
嵌入式设备的长期稳定运行,离不开对资源的精细管理。
Socket资源管理:W5100S只有8个硬件Socket。每个EthernetClient或EthernetServer连接都会占用一个。务必在连接不再需要时及时调用.stop()释放Socket。对于服务器,在处理完一个客户端后应立即关闭连接,以服务下一个等待的客户端。
连接保活与重连:在网络不稳定的环境中,TCP连接可能意外中断。一个健壮的程序需要实现重连逻辑。对于MQTT客户端,PubSubClient库的reconnect()函数是一个范例。对于自定义的TCP客户端,你需要在loop()中检查连接状态(如client.connected()),并在断开后尝试重新连接,同时加入指数退避等策略避免频繁重连刷爆日志。
内存使用:RP2040虽然有264KB SRAM,但在处理大量网络数据(如HTTP请求体、MQTT消息)时仍需注意。避免在栈上分配大数组,谨慎使用String类(容易产生内存碎片),对于已知大小的数据,使用全局或静态数组。可以定期使用Serial.println(freeMemory());(需要额外函数获取空闲内存)来监控内存使用情况。
6.2 利用RP2040双核处理网络密集型任务
这是W5100S-EVB-Pico相比单核Arduino的巨大优势。你可以将网络数据包的接收、解析和响应等耗时操作放在一个核心(例如Core1),而将传感器采集、控制逻辑、用户交互等放在另一个核心(Core0)。
Arduino-Pico核心包支持使用setup1()和loop1()函数来定义第二个核心的代码。例如:
// Core0 (默认) 负责主逻辑和传感器 void setup() { /* 初始化传感器等 */ } void loop() { /* 读取传感器,更新全局变量 */ } // Core1 专责网络服务 void setup1() { // 初始化网络和服务器 Ethernet.begin(mac); server.begin(); } void loop1() { // 专心地、非阻塞地处理客户端连接和请求 EthernetClient client = server.available(); if (client) { // 处理HTTP请求,这个过程可能比较耗时 handleClient(client); } // 这里可以不加delay,让这个核心全力处理网络 }通过这种分工,即使处理一个复杂的HTTP请求需要几十毫秒,也不会影响到Core0上传感器数据的实时采集,系统的响应性和整体吞吐量得到显著提升。
6.3 进阶应用场景构想
- Modbus TCP网关:工业领域广泛使用Modbus协议。你可以利用W5100S-EVB-Pico实现Modbus TCP从站。在TCP层接收Modbus TCP请求帧,解析后通过UART(RS485转换器)与下位的PLC、仪表等Modbus RTU设备通信,再将响应封装回Modbus TCP帧发送给上位机。RP2040的双核和多个UART接口非常适合此任务。
- 网络授时客户端(NTP):设备需要准确的时间戳。实现一个NTP客户端,定期从NTP服务器获取时间,并同步到RTC模块或系统时钟中。
- OTA(空中下载)升级服务器:设备作为一个小型文件服务器,托管固件升级文件。管理员可以通过网页上传新的固件(.uf2文件),设备接收到文件后,将其写入到Flash的特定区域,然后重启进入Bootloader模式完成升级。这需要仔细设计Flash分区和Bootloader交互逻辑。
- 与Wi-Fi共存:虽然板载以太网,但RP2040的GPIO是开放的。你可以通过连接ESP-01s这类Wi-Fi模块到UART,让设备同时具备有线和无线网络能力,实现网络冗余或灵活部署。
7. 常见问题与深度排错
即使按照步骤操作,也难免会遇到问题。下面是一些我实际踩过的坑和解决方法。
7.1 编译与上传问题
- 编译错误:找不到
Ethernet.h:这通常是因为没有正确选择开发板型号。请确保在“工具”->“开发板”中选择了“Raspberry Pi Pico (W5100S-EVB-Pico)”,而不是普通的Pico。这个特定的板型配置会包含正确的库路径和引脚定义。 - 上传失败,提示“等待上传端口超时”:首先,确保在点击“上传”按钮前,按住板子上的“BOOTSEL”按钮不放,然后插入USB线,待电脑识别出名为“RPI-RP2”的U盘盘符后再松开按钮,最后点击上传。如果还不行,尝试换一条质量好的USB数据线,并关闭可能占用串口的其他软件(如串口监视器、其他IDE)。
7.2 网络连接与通信问题
- DHCP始终失败,Ethernet.begin() 返回 0:
- 硬件检查:这是最常见的原因。确认网线已插紧,且另一头连接的路由器或交换机指示灯正常闪烁。尝试更换一根网线。
- 网络环境:确认你的网络支持DHCP并且有可用的IP地址。可以尝试将电脑设置为自动获取IP,看能否成功,以排除网络问题。
- MAC地址冲突:确保你代码中的MAC地址在局域网内是唯一的。如果有多块相同的板子,需要修改MAC地址的最后一位。
- 静态IP测试:作为排查步骤,可以尝试在代码中配置一个与路由器网段相同的静态IP(如192.168.1.xxx),网关和子网掩码也正确设置,然后使用
Ethernet.begin(mac, ip, gateway, subnet)。如果静态IP能通,则问题出在DHCP协商环节。
- 可以Ping通IP,但无法访问Web服务器:
- 防火墙:检查电脑的防火墙是否阻止了对设备IP端口80的访问。可以暂时关闭防火墙测试。
- 端口占用:确保你的服务器代码确实在80端口监听。有些网络会屏蔽80等常用端口,可以尝试改用8080等其他端口。
- 代码逻辑:在服务器代码中,在
client.connected()循环里添加更详细的串口打印,确保代码确实执行到了发送HTTP响应的部分。检查HTTP响应格式是否正确,特别是头部和主体之间必须有空行。
- MQTT连接不稳定,经常断开:
loop()调用频率:确保mqttClient.loop()在loop()函数中不被任何长时间的delay()阻塞。如果主程序有耗时任务,考虑将其拆分为非阻塞状态机。- 心跳间隔:
PubSubClient库默认心跳间隔是15秒。如果网络延迟大或代理服务器要求不同,可以在connect()函数中设置:mqttClient.connect("clientId", 0, 1, 0, 0, 0, 0, 30000),最后一个参数keepalive设置为30秒。 - 公共服务器压力:免费的公共MQTT代理服务器(如test.mosquitto.org)可能不稳定或连接数受限。对于重要测试,可以考虑在本地搭建一个Mosquitto服务器。
7.3 性能与稳定性问题
- 同时处理多个客户端时响应变慢或崩溃:这很可能是Socket资源耗尽或内存不足。确保每个客户端处理完毕后都调用了
.stop()。检查代码中是否妥善管理了EthernetClient对象数组,避免内存泄漏。对于复杂的HTTP请求处理,优化字符串操作,避免在堆上频繁分配和释放内存。 - 长时间运行后网络无响应:除了检查内存泄漏,还要注意看门狗定时器。RP2040的Arduino核心默认可能启用了看门狗。如果你的
loop()函数中有长时间阻塞的操作(如等待某个传感器响应),可能导致看门狗复位。需要在阻塞操作中定期调用watchdog_update()来喂狗,或者调整看门狗超时时间。
通过以上这些步骤和注意事项,你应该能够充分发挥W5100S-EVB-Pico的潜力,构建出稳定、高效的嵌入式网络应用。从简单的数据透传到复杂的多协议网关,这块板子提供了一个兼具性能、可靠性和开发便利性的优秀平台。