[STM32F7] 未接网线先上电,再接网线也不工作

[复制链接]
103|28
豌豆爹 发表于 2026-9-11 14:12 | 显示全部楼层
调试时可以打开LWIP的调试输出,观察是否有"Interface is down"或类似的提示信息。如果看到ARP请求被拒绝或DHCP无法获取地址,基本可以确认是管理状态没有正确恢复
进入猫次元 发表于 2026-9-11 16:09 | 显示全部楼层
PHY芯片的链路状态检测响应时间在50-300ms不等,建议在回调函数中加入适当的去抖延时,避免网线插拔瞬间的多次状态跳变导致误触发。
麻花油条 发表于 2026-9-11 18:05 | 显示全部楼层
如果添加了管理状态同步代码后仍然无法工作,需要检查FreeRTOS的任务栈大小。LWIP的tcpip_thread任务栈溢出会导致回调函数无法正常执行,建议将栈大小增加到2048字节以上。
classroom 发表于 2026-9-11 20:18 | 显示全部楼层
一个完整的解决方案需要三个步骤:PHY重新协商、管理状态同步、DHCP重新获取。你目前的代码只完成了第一步,缺少后两步,所以网线插入后网络仍然无法正常工
cr315 发表于 2026-9-11 22:40 | 显示全部楼层
修改完成后,建议进行完整的测试:先上电不插网线,等待系统稳定后插入网线,检查是否能ping通;然后拔出网线等待几秒再插入,再次检查网络是否恢复。这样才能确认热插拔功能真正可用。
duo点 发表于 2026-9-11 10:28 | 显示全部楼层
这个问题的根本原因是STM32CubeMX生成的代码在上电初始化时只执行一次PHY自动协商,如果此时网线没插,协商就会失败,之后即使插上网线,程序也不会再自动重新协商。
flycamelaaa 发表于 2026-9-12 12:00 | 显示全部楼层
手动调用netif_set_link_up只是设置了LWIP层面的标志位,并没有真正触发PHY重新协商和MAC重新配置,所以网络依然无法工作。
jcky001 发表于 2026-9-12 13:15 | 显示全部楼层
最直接的解决办法是在主循环中添加PHY链路状态轮询,定期读取PHY_BSR寄存器的Link Status位,检测到网线插入后再执行完整的以太网初始化流程
onlycook 发表于 2026-9-12 14:59 | 显示全部楼层
STM32CubeF4/F7的新版本固件包里有一个ethernet_link_thread线程函数,它会定期检查PHY状态并在链路变化时自动重新配置MAC,可以升级固件包试试。
powerantone 发表于 2026-9-12 15:31 | 显示全部楼层
如果使用FreeRTOS,可以创建一个低优先级任务,每隔500ms读取一次PHY状态寄存器,发现链路从断开变为连接时,调用ethernetif_update_config重新初始化。
probedog 发表于 2026-9-12 17:40 | 显示全部楼层
注意ethernet_link_thread里调用的是HAL_ETH_Start而不是HAL_ETH_Start_IT,这会导致以太网中断没有使能,接收功能无法正常工作,需要手动改成带IT的版本。
solty 发表于 2026-9-12 18:15 | 显示全部楼层
LAN8720这类PHY芯片在上电时如果检测不到链路伙伴,可能会进入低功耗状态,后续插网线不会自动唤醒,必须通过软件写入PHY_BCR寄存器重新启动自动协商。
spicy 发表于 2026-9-12 19:49 | 显示全部楼层
链路检测的轮询周期不要太短,500ms是一个比较合适的值,既能及时响应网线插拔,又不会占用太多CPU资源。
stormwind123 发表于 2026-9-12 20:09 | 显示全部楼层
如果使用DHCP,网线后插的情况下还需要重启DHCP客户端,否则即使链路恢复了,IP地址可能仍然是0.0.0.0,需要在链路回调中调用dhcp_start。
七毛钱 发表于 2026-9-12 21:20 | 显示全部楼层
可以同时使用PHY中断引脚和轮询两种方式,有些PHY芯片支持链路状态变化中断,通过nINT引脚触发MCU外部中断,响应更及时。
今天会画卧蚕吗 发表于 2026-9-12 22:45 | 显示全部楼层
检查PHY的复位时序,有些板子上PHY芯片上电稳定需要较长时间,如果MAC初始化太早,PHY还没准备好,就会导致初始化失败,可以在初始化前加100ms延时。
elephant00 发表于 2026-9-10 15:45 | 显示全部楼层
升级到最新的STM32CubeF7固件包很重要,ST在新版本中修复了ethernet_link_thread的中断使能问题,老版本生成的代码存在这个已知bug。
gejigeji521 发表于 2026-9-10 16:42 | 显示全部楼层
设备先上电、后插网线,网口不自动协商链路,插线后 LINK 灯不亮 / 网络不通;只有先插网线再上电才能正常工作。
ForgottenRealm 发表于 2026-9-11 12:50 | 显示全部楼层
看来你遇到了网线插入后无法自动协商链路的问题。你试过在`ethernetif_update_config`中添加`netif_set_up(netif)`和`netif_set_down(netif)`吗?这个应该能同步管理状态。
DreamWanderer 发表于 2026-9-12 14:10 | 显示全部楼层
这问题,我曾经遇到过。在初始化时加个检测PHY Link Status的轮询逻辑,每隔一段时间就检测一次,发现恢复时再手动调用一次update_config应该能解决问题。记得看清楚你的PHY芯片的Link Status寄存器位置哦。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部
0