移植STM32F407igt6 +LWIP
rtthread版本4.1.1
RMII LAN8720A
lwip版本:2.1.2
问题描述:
移植lwip后,stm32板子用网线直连其他设备ping不通,但是接交换机再接其他设备就能ping通,我搭载了一个modbus_tcp程序,此时运行也正常。
按照board.h的注释说明移植lwip过程中,stm32f4xx_hal_conf.h会出现报错:

可以发现这三个宏定义的没有值,我将stm32f4xx_hal_conf_bak.h的#define PHY_SR PHY_SPEED_STATUS PHY_DUPLEX_STATUS的值复制到stm32f4xx_hal_conf.h文件中,

此时程序编译通过,另外附上HAL_ETH_MspInit和phy_reset
void HAL_ETH_MspInit(ETH_HandleTypeDef* ethHandle)
{
GPIO_InitTypeDef GPIO_InitStruct = {0};
if(ethHandle->Instance==ETH)
{
/* USER CODE BEGIN ETH_MspInit 0 */
/* USER CODE END ETH_MspInit 0 */
/* ETH clock enable */
__HAL_RCC_ETH_CLK_ENABLE();
__HAL_RCC_GPIOC_CLK_ENABLE();
__HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_GPIOG_CLK_ENABLE();
/**ETH GPIO Configuration
PC1 ------> ETH_MDC
PA1 ------> ETH_REF_CLK
PA2 ------> ETH_MDIO
PA7 ------> ETH_CRS_DV
PC4 ------> ETH_RXD0
PC5 ------> ETH_RXD1
PG11 ------> ETH_TX_EN
PG13 ------> ETH_TXD0
PG14 ------> ETH_TXD1
*/
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_13|GPIO_PIN_14;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF11_ETH;
HAL_GPIO_Init(GPIOG, &GPIO_InitStruct);
/* USER CODE BEGIN ETH_MspInit 1 */
/* USER CODE END ETH_MspInit 1 */
}
}
#define PHY_RESET_IO GET_PIN(I, 8)
void phy_reset(void)
{
rt_pin_mode(PHY_RESET_IO, PIN_MODE_OUTPUT);
rt_pin_write(PHY_RESET_IO, PIN_HIGH);
rt_thread_mdelay(50);
rt_pin_write(PHY_RESET_IO, PIN_LOW);
rt_thread_mdelay(50);
rt_pin_write(PHY_RESET_IO, PIN_HIGH);
}
板子使用的是正点原子的电机开发板,在使用他们的lwip例程时,无论是直接连设备还是接交换机再连设备都是能正常ping通的,所以应该不是硬件问题。
烦请大佬相助,感激不尽!
不是,如果是这个原因的话使用正点原子的例程也不能ping通才对
我刚刚使用了交叉网线尝试裸连设备,也是一样不能ping通,后面将设备换成鲁班猫2板子,就能够ping通。再换成飞凌的3588板子,又ping不通了。
那只能分步骤去去查了。
1.ETH控制器有没有识别到PHY芯片,
2.PHY的设置是否正常。就是全双工,半双工,速度那一大堆。
3.在观察通信链路的数据有没有读取到ETH里面,这个好像也是DMA读取。
ETH通信框架这边我没有研究太深,我调试的时候也相对顺利。排查出了一些简单的故障后,就可以了。建议一步步的打断点调试。看看每个中断是否都正常触发了。