你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
patch1582 提问时间:2026-8-27 16:05 / 未解决

我用 STM32CubeMX 生成了工程,板子上的以太网通信在网线预先插好的情况下可以正常工作。

但存在一个问题:只有在开机时网线已经接好,以太网才能正常工作。如果板子上电时没有插网线,以太网就无法正常工作,即便之后再插上网线也始终无法恢复。

为了解决这个问题,我在 LWIP 初始化完成后添加了如下函数:

netif_set_link_callback(&gnetif, ethernetif_update_config);

其中ethernetif_update_config函数是 CubeMX 自动生成的,作用是重启以太网自动协商。

void

ethernetif_update_config(

struct

netif *netif)

{

__IO uint32_t tickstart = 0;

uint32_t regvalue = 0;

if

(netif_is_link_up(netif))

{

/ Restart the auto-negotiation /

if

(heth.Init.AutoNegotiation != ETH_AUTONEGOTIATION_DISABLE)

{

/ Enable Auto-Negotiation /

HAL_ETH_WritePHYRegister(&heth, PHY_BCR, PHY_AUTONEGOTIATION);

/ Get tick /

tickstart = HAL_GetTick();

/ Wait until the auto-negotiation will be completed /

do

{

HAL_ETH_ReadPHYRegister(&heth, PHY_BSR, ®value);

/ Check for the Timeout ( 1s ) /

if

((HAL_GetTick() - tickstart ) > 1000)

{

/ In case of timeout /

goto

error;

}

}

while

(((regvalue & PHY_AUTONEGO_COMPLETE) != PHY_AUTONEGO_COMPLETE));

/ Read the result of the auto-negotiation /

HAL_ETH_ReadPHYRegister(&heth, PHY_SR, ®value);

/ Configure the MAC with the Duplex Mode fixed by the auto-negotiation process /

if

((regvalue & PHY_DUPLEX_STATUS) != (uint32_t)RESET)

{

/ Set Ethernet duplex mode to Full-duplex following the auto-negotiation /

heth.Init.DuplexMode = ETH_MODE_FULLDUPLEX;

}

else

{

/ Set Ethernet duplex mode to Half-duplex following the auto-negotiation /

heth.Init.DuplexMode = ETH_MODE_HALFDUPLEX;

}

/ Configure the MAC with the speed fixed by the auto-negotiation process /

if

(regvalue & PHY_SPEED_STATUS)

{

/ Set Ethernet speed to 10M following the auto-negotiation /

heth.Init.Speed = ETH_SPEED_10M;

}

else

{

/ Set Ethernet speed to 100M following the auto-negotiation /

heth.Init.Speed = ETH_SPEED_100M;

}

}

else

/ AutoNegotiation Disable /

{

error :

/ Check parameters /

assert_param(IS_ETH_SPEED(heth.Init.Speed));

assert_param(IS_ETH_DUPLEX_MODE(heth.Init.DuplexMode));

/ Set MAC Speed and Duplex Mode to PHY /

HAL_ETH_WritePHYRegister(&heth, PHY_BCR, ((uint16_t)(heth.Init.DuplexMode >> 3) |

(uint16_t)(heth.Init.Speed >> 1)));

}

/ ETHERNET MAC Re-Configuration /

HAL_ETH_ConfigMAC(&heth, (ETH_MACInitTypeDef *) NULL);

/ Restart MAC interface /

HAL_ETH_Start(&heth);

}

else

{

/ Stop MAC interface /

HAL_ETH_Stop(&heth);

}

ethernetif_notify_conn_changed(netif);

}

我在插上网线后通过调用netif_set_link_up(&gnetif)手动触发该回调函数时,以太网依旧无法正常工作。有没有人知道在这种场景下该如何让以太网正常运行?

收藏 评论0 发布时间:2026-8-27 16:05

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版