当W5500的MAC地址读写正常,但无法通过DHCP获取IP(IP和子网掩码为0)时,可能的原因及解决方案如下:
// 设置模式寄存器(MR)的第7位为1,启用DHCP
uint8_t mr = W5500_ReadReg(MR); // 读取当前模式寄存器
mr |= (1 << 7); // 设置DHCP使能位(MR7)
W5500_WriteReg(MR, mr); // 写回寄存器MR寄存器确认值是否为0x80。PHYCFGR):uint8_t phycfgr = W5500_ReadReg(PHYCFGR);PHYCFGR的值为0x70(连接正常且全双工)或0x30(半双工)。LINK标志位(bit0)是否置1(表示物理层已连接)。解决方法:
uint8_t dhcp_status;
uint32_t timeout = 10000; // 10秒超时
uint32_t start_time = GetTickCount();while ((GetTickCount() - start_time) < timeout) {
dhcp_status = W5500_ReadReg(DHCP_STATUS_REG); // DHCP状态寄存器地址
if (dhcp_status == DHCP_ASSIGNED) break; // 成功获取IP
delay(100); // 延时100ms
}
if (dhcp_status != DHCP_ASSIGNED) {
// 处理失败:重新尝试或切换静态IP
}
- **注意**:`DHCP_STATUS_REG`需根据W5500文档确定(通常查Sn_IR或通用寄存器)。解决方法:
// 设置IMR寄存器使能DHCP中断
W5500_WriteReg(IR, 0x80); // 清除DHCP中断标志(写1清除)
W5500_WriteReg(IMR, 0x80); // 使能DHCP中断// 发生中断时检查IR寄存器
uint8_t ir = W5500_ReadReg(IR);
if (ir & 0x80) { // 检测到DHCP中断
uint8_t status = W5500_ReadReg(DHCP_STATUS_REG);
// 根据状态处理成功/失败
}
// 执行软件复位(持续时间至少5μs)
W5500_WriteReg(MR, 0x80); // 正常模式 + DHCP使能
delay(10); // 等待初始化完成关键寄存器检查:
// 网关地址寄存器(GAR)
uint8_t gar[4];
W5500_ReadBuff(GAR, gar, 4); // 正常时应为0.0.0.0(DHCP模式)
// 子网掩码寄存器(SUBR)
uint8_t subr[4];
W5500_ReadBuff(SUBR, subr, 4); uint8_t static_ip[4] = {192, 168, 1, 100};
W5500_WriteBuff(SIPR, static_ip, 4); // 写入静态IPPHYCFGR确保连接正常。MR寄存器的DHCP使能位。通过以上步骤,大部分DHCP失败问题可被定位并解决。如仍无效,需排查SPI时序干扰或更换硬件模块测试。
举报
更多回帖