LAN8720A裸机跑通前提为PHY地址、REF_CLK时钟、RMII引脚三者严丝合缝:PHY地址须硬件电平与软件配置一致;REF_CLK必须为稳定50MHz方波;RMII引脚映射需严格对照原理图,不可依赖CubeMX默认值。

裸机环境下用C++写STM32以太网,LAN8720A能跑通的前提不是语法多炫酷,而是PHY地址、REF_CLK时钟、RMII引脚三者严丝合缝。C++本身不参与底层时序,但HAL库封装和寄存器操作若混用不当,容易在ETH_ReadPHYRegister返回全0或超时——这通常意味着SMI总线根本没连上PHY。
PHY地址配错:硬件电平与软件定义必须一致
LAN8720A的PHY地址只由PIN10(PHYAD0)一个引脚决定:0x00(下拉)或0x01(上拉)。CubeMX里填的PHY Address必须和原理图实际接法完全对应。
- 常见错误:原理图把PIN10悬空或误接VCC,导致地址不确定;量产板因PCB走线容抗引发电平漂移,实测地址变成
0xFF - 调试手段:用逻辑分析仪抓
MDC/MDIO波形,发读寄存器0x00指令,看PHY是否回传有效数据;若始终无响应,先查HAL_ETH_ReadPHYRegister(0x00, 0x00)和HAL_ETH_ReadPHYRegister(0x01, 0x00)哪个能读出非0值 - 代码中硬编码地址要同步更新,比如
ETH_InitTypeDef结构体里的PhyAddress字段,不能只改CubeMX配置而漏掉手动初始化代码
REF_CLK时钟没起来:RMII的50MHz是硬门槛
LAN8720A不带晶振,依赖MCU的ETH_RMII_REF_CLK引脚输出50MHz方波。这个信号不起来,PHY连上电都进不了初始化流程。
- 典型现象:PHY复位后
CRS_DV无跳变,HAL_ETH_GetLinkState()永远返回HAL_ETH_LINK_DOWN - 检查点:确认CubeMX中
ETH外设的Ref Clock Source设为PLL2(F4/F7系列)或PLL3(H7),且PLL2_Q必须为50MHz;GPIOA1(常见引脚)的Alternate Function必须是GPIO_AF11_ETH,不是默认的AF0 - 示波器实测点:直接测
PA1引脚,应有稳定50MHz、峰峰值3.3V的方波;若只有几MHz或噪声大,大概率是PLL配置错误或GPIO速度设成了LOW而非VERY_HIGH
RMII引脚映射错位:CubeMX默认值常与开发板实物冲突
CubeMX生成的ETH引脚配置是通用模板,但LAN8720A模块的实际布线往往和标准不符。比如野火F429板把TXD0/TXD1接到PG13/PG14,而CubeMX默认生成的是PB12/PB13——不手动改,DMA收不到任何包。
- 必须核对的6组信号:
TX_EN(常为PG11)、TXD0/TXD1(PG13/PG14)、RXD0/RXD1(PC4/PC5)、CRS_DV(PA7),缺一不可 - HAL_GPIO_Init调用中,每个引脚的
Alternate必须统一为GPIO_AF11_ETH;若混用GPIO_AF12_ETH(某些H7系列),会静默失败 - 接收异常时优先检查
CRS_DV:它既是接收使能信号,也反映PHY链路状态;若该脚恒高或恒低,说明PHY未同步到MAC,大概率是REF_CLK或PHY地址问题
LWIP裸机调度:没有RTOS时谁来轮询PHY状态
裸机跑LWIP,ethernetif_input()不会自动触发,HAL_ETH_GetLinkState()也不自己刷新。所有PHY状态轮询、帧收发、协议栈处理都得靠主循环或SysTick中断驱动。
- 关键动作:在主循环里定期调用
ethernetif_poll(&gnetif)(LWIP官方推荐),或手动调用HAL_ETH_ReadPHYRegister查0x01寄存器的Link Status位(bit2) - 性能陷阱:每毫秒都读一次PHY寄存器会拖慢主循环;建议链路断开时100ms轮询,连通后降为1s一次;状态变化时再触发
netif_set_link_up()/netif_set_link_down() - 最易忽略的一点:
HAL_ETH_IRQHandler里必须调用HAL_ETH_RxCpltCallback,否则DMA接收完成中断不触发,ethernetif_input()永远等不到新包
真正卡住项目的,从来不是C++语法或LWIP宏定义,而是REF_CLK波形不对、PHYAD0焊盘虚焊、或者CubeMX里勾了RMII却忘了关MII时钟门控。动手前拿万用表量三件事:PHY芯片VDD是否3.3V、REF_CLK引脚是否有50MHz、MDIO在读寄存器时有没有电平翻转——比看一百行初始化代码管用。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











