ESP32搭配W5500以太网模块无法打印IP地址求助
问题描述
尝试通过Web客户端控制LED亮灭,需获取设备IP,但串口监视器未打印IP,仅输出启动信息:
rst:0x8 (TG1WDT_SYS_RESET),boot:0x12 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:1
load:0x3fff0030,len:1344
load:0x40078000,len:13964
load:0x40080400,len:3600
entry 0x400805f0
etts Jul 29 2019 12:21:46
硬件配置:ESP-WROOM-32 + W5500以太网模块,接线如下:
- SCLK接gpio18
- SCS接gpio5
- MOSI接gpio23
- MISO接gpio19
- INT接EN
- RST接gpio26
使用的代码如下:
#include <SPI.h> #include <Ethernet.h> int led = 4; // MAC address should be unique for each device on the network byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; EthernetServer server(80); String readString; void setup() { // Start serial communication for debugging Serial.begin(115200); pinMode(led, OUTPUT); // Attempt to configure Ethernet using DHCP Ethernet.begin(mac); server.begin(); Serial.print("Server is at "); Serial.println(Ethernet.localIP()); } void loop() { // Your main code goes here EthernetClient client = server.available(); if (client) { while (client.connected()) { if (client.available()) { char c = client.read(); Serial.print(c); if (readString.length() < 100) { readString += c; } if (c == '\n') { Serial.print(readString); client.println("<HTTP/1.1 200 OK>"); client.println("<Connection-Type: text/html>"); client.println("<Connection: close>"); client.println(); client.println("<!DOCTYPE html>"); client.println("<html>"); client.println("<head>"); client.println("<title>Webserver</title>"); client.println("</head>"); client.println("<body>"); client.println("<a ref=\"/?button1on\"><button>LED ON</button></a>"); client.println("<a ref=\"/?button2off\"><button>LED OFF</button></a>"); client.println("<body style=background-color:powderblue>"); delay(1); client.stop(); if (readString.indexOf("?buttton1on") > 0) { digitalWrite(led, HIGH); } if (readString.indexOf("?buttton2off") > 0) { digitalWrite(led, LOW); } readString = ""; } } } } }
问题分析与解决建议
一、接线问题排查
- INT引脚错误:W5500的INT是中断输出引脚,应接ESP32的普通GPIO(如gpio2),而非EN引脚。EN是ESP32的使能引脚,接INT会打乱ESP32的启动逻辑,导致通信异常。
- RST引脚优化:W5500的RST引脚需低电平复位,建议给该引脚接一个3.3V上拉电阻,再通过gpio26控制;同时在初始化SPI前,先拉低RST引脚100ms再释放,确保模块复位完成。
二、代码逻辑修正
- 添加DHCP失败处理:当前代码未检查DHCP是否成功,若获取IP失败,
Ethernet.localIP()会返回0.0.0.0,且可能跳过打印逻辑。修改初始化代码:unsigned long startMillis = millis(); // 最多等待10秒尝试DHCP while (Ethernet.begin(mac) == 0 && millis() - startMillis < 10000) { Serial.println("DHCP配置失败,重试中..."); delay(1000); } // 若DHCP失败,切换为静态IP if (Ethernet.localIP() == IPAddress(0,0,0,0)) { Serial.println("DHCP失败,使用静态IP"); Ethernet.begin(mac, IPAddress(192,168,1,100)); } Serial.print("Server is at "); Serial.println(Ethernet.localIP()); - 修复HTML与字符串匹配错误:
- 链接标签的
ref改为href,否则点击按钮无法触发正确请求; - 重复的
<body>标签合并,改为<body style="background-color:powderblue">; - 字符串匹配中的
?buttton1on和?buttton2off多写了一个t,修正为?button1on和?button2off,否则LED控制逻辑无法触发。
- 链接标签的
三、硬件与驱动兼容性调整
- SPI总线配置:ESP32的gpio18/19/23是HSPI默认引脚,确保无其他外设占用;同时降低SPI时钟速率,初始化时指定5MHz避免通信不稳定,示例:
Ethernet.begin(mac, IPAddress(0,0,0,0), IPAddress(0,0,0,0), IPAddress(0,0,0,0), IPAddress(0,0,0,0), SPI, 5000000, 5); - 供电检查:W5500需要稳定的3.3V供电,若ESP32自带3.3V引脚电流不足,需单独给模块供电,避免因供电不足导致模块无法正常工作。
内容的提问来源于stack exchange,提问作者BUGzee
相关产品推荐
相关产品推荐

