如标题,在使用stm32cubemx生成stm32h743的lwip例程时,会出现概率性的dhcp不成功,并报告"netif is not up, old style port?"。或者协商出来的速率只有10M的情况。
通过网上查阅,并没有找到有参考的资料。后面比对开发板的代码,发现加上如下代码后可以正常运行,并且协商的速率正常,达到100M。
即在low_level_init函数中,LAN8742初始化后,获取协商速率前,增加如下代码,主动让PHY去协商速率, 即恢复正常功能。
/* USER CODE END PHY_PRE_CONFIG */
/* Set PHY IO functions */
LAN8742_RegisterBusIO(&LAN8742, &LAN8742_IOCtx);
/* Initialize the LAN8742 ETH PHY */
LAN8742_Init(&LAN8742);
/*让LAN8742去协商速度,然后等待协商完成*/
uint32_t cnt = 0;
LAN8742_StartAutoNego(&LAN8742);
while (LAN8742_GetLinkState(&LAN8742) <= LAN8742_STATUS_LINK_DOWN)
{
osDelay(10);
if (cnt++ >= 500)
{
break;
}
}
/*后面都是生成的代码*/
if (hal_eth_init_status == HAL_OK)
{
PHYLinkState = LAN8742_GetLinkState(&LAN8742);
printf("link status = %d\r\n",PHYLinkState);
/* Get link state */
if(PHYLinkState <= LAN8742_STATUS_LINK_DOWN)
{
netif_set_link_down(netif);
netif_set_down(netif);
}
else
{
switch (PHYLinkState)
{
case LAN8742_STATUS_100MBITS_FULLDUPLEX:
duplex = ETH_FULLDUPLEX_MODE;
speed = ETH_SPEED_100M;
break;
case LAN8742_STATUS_100MBITS_HALFDUPLEX:
duplex = ETH_HALFDUPLEX_MODE;
speed = ETH_SPEED_100M;
break;
case LAN8742_STATUS_10MBITS_FULLDUPLEX:
duplex = ETH_FULLDUPLEX_MODE;
speed = ETH_SPEED_10M;
break;
case LAN8742_STATUS_10MBITS_HALFDUPLEX:
duplex = ETH_HALFDUPLEX_MODE;
speed = ETH_SPEED_10M;
break;
default:
duplex = ETH_FULLDUPLEX_MODE;
speed = ETH_SPEED_100M;
break;
}
特此记录,希望有所帮助