1. 以太网硬件调试的完整闭环
搞硬件的人都知道,从原理图到实际能Ping通的板子,中间要经历九九八十一难。我最近刚完成一个基于LAN8720A的以太网通信项目,整个过程就像打怪升级,今天就把这些实战经验分享给大家。
先说说这个项目的硬件构成。主控板用的是STM32F407,通过RMII接口连接LAN8720A物理层芯片,再接到HR915310A网口插座。听起来很简单对吧?但实际调试时,光是让网口的绿灯亮起来就花了我三天时间。这里有个重要经验:硬件调试一定要有系统性思维,从电源、时钟、复位这些基础信号开始查,逐步推进到协议栈初始化。
注意:在焊接完板子后,建议先用万用表测量所有关键网络的通断,特别是那些细间距的RMII信号线。我就遇到过因为PCB过孔不通导致CLK信号丢失的情况。
2. 原理图设计的那些坑
2.1 物理层芯片的选型陷阱
LAN8720A算是性价比很高的PHY芯片,但它的引脚排列有个坑——不同封装的引脚定义可能完全不一样。我最初用的是LQFP48封装,后来换成了更小的QFN32,结果发现两个封装的电源引脚位置完全不同。建议在画原理图时,一定要把芯片数据手册的引脚定义图打印出来,用荧光笔标出所有电源和地引脚。
这里分享一个检查清单:
- VDDIO(1.8V/2.5V/3.3V)是否与主控电平匹配
- 所有电源引脚是否都接了去耦电容(我习惯用0.1μF+10μF组合)
- 复位电路的上拉电阻和滤波电容是否合理
- 晶振电路是否按照手册推荐值设计(25MHz晶振配22pF负载电容)
2.2 网口插座的封装灾难
说到封装错误,RJ45插座绝对是重灾区。我这次用的HR915310A是直插式封装,和常见的卧式HR911105A引脚完全不对应。更坑的是,不同厂家的同类型插座引脚定义也可能不同。强烈建议在PCB投板前,用3D视图把插座和连接器都装配起来检查。
这是我踩过的一个具体坑:
- HR911105A的引脚1是TD1+,而HR915310A的引脚1是LED_A
- 两个插座的LED引脚极性相反(一个共阳一个共阴)
- 变压器中心抽头的接法也不同(有的要接3.3V,有的要接滤波电路)
3. 硬件调试实战记录
3.1 电源与复位电路调试
先用示波器检查LAN8720A的各个电源引脚:
# 测量命令示例(使用带记录功能的示波器) :MEASure:SOURce CH1 :MEASure:VPP? :MEASure:RISE?发现3.3V电源上有100mV的纹波,超出芯片要求的50mV范围。解决方法是在电源入口处增加一个π型滤波器(10μF+10Ω+10μF)。复位电路更是个大坑,STM32的IO驱动能力不足导致复位信号只有0.8V,解决方法有两种:
- 改用开漏输出加上拉电阻
- 增加一级三极管驱动(我最终选了这个方案)
3.2 RMII信号完整性验证
RMII接口的调试需要一台支持100Mbps的示波器。关键检查点:
- TX_CLK要有稳定的25MHz方波(占空比45%~55%)
- TXD[1:0]和RXD[1:0]的信号幅度要大于2V
- 用眼图模式检查信号质量(抖动要小于1ns)
如果发现信号畸变,可以尝试:
- 在发送端串联33Ω电阻
- 调整PCB走线长度(RMII要求所有信号线等长,误差±5mm内)
- 检查地平面是否完整(最好用4层板,有独立的地层)
4. 软件层面的协同调试
4.1 寄存器级诊断方法
当LWIP初始化失败时,不要急着改代码,先直接读PHY寄存器:
// 读取PHYID1和PHYID2的示例代码 uint16_t ReadPHYReg(uint8_t reg_addr) { uint32_t temp; temp = (LAN8720_Addr << 11) | (reg_addr << 6) | (0x02 << 4) | 0x01; ETH_WriteMACMIIAR(temp); while(ETH_ReadMACMIIAR() & ETH_MACMIIAR_MB); return ETH_ReadMACMIIDR(); } void CheckPHY() { printf("PHYID1: 0x%04X\r\n", ReadPHYReg(0x02)); printf("PHYID2: 0x%04X\r\n", ReadPHYReg(0x03)); }正常应该读到0x0007和0xC0F1,如果全是0xFFFF说明通信异常。
4.2 LWIP协议栈的配置技巧
在lwipopts.h中这几个参数需要特别注意:
#define MEM_SIZE (16*1024) // 内存池大小 #define PBUF_POOL_SIZE 16 // PBUF缓存数量 #define TCP_MSS 1460 // 最大报文段大小 #define TCP_SND_BUF (4*TCP_MSS) // 发送缓冲区如果经常出现DHCP超时,可以尝试:
- 增加DHCP_TIMEOUT(默认是10秒)
- 检查防火墙是否屏蔽了UDP 67/68端口
- 用Wireshark抓包分析DHCP交互过程
5. 网络连通性终极测试
当一切就绪后,按照这个流程验证:
- 观察RJ45指示灯:绿灯常亮表示100M链路建立,黄灯闪烁表示有数据活动
- 在电脑上arp -a查看是否学习到板卡的MAC地址
- Ping板卡IP(建议先禁用电脑防火墙测试)
- 用iperf测试实际带宽(应该能达到90Mbps以上)
如果Ping不通但链路灯正常,可能是这些问题:
- 板卡和电脑不在同一网段(比如一个192.168.1.x,一个192.168.0.x)
- 子网掩码设置错误(应该都是255.255.255.0)
- 默认网关没有配置(要指向路由器IP)
最后分享一个诊断神器——网络调试助手的使用技巧:
- TCP Server模式下要指定正确的本地端口
- 发送测试数据时建议包含时间戳,方便计算往返延迟
- 长时间测试建议开启KeepAlive功能