举报
针对您的STM32H743 + LAN8720以太网驱动移植异常问题,以下是系统的排查解决方案:
根据提供的截图信息(异常显示ETH初始化失败、ifconfig无连接状态),核心问题可能集中在:
确认PHY地址:
drv_eth.c中检查宏定义:#define PHY_ADDRESS 0x00 // 或0x010x02)验证:uint32_t id;
HAL_ETH_ReadPHYRegister(&heth, PHY_ADDRESS, PHY_IDR, &id);
// LAN8720的ID应为0x0007C0F1排查MDIO/MDC引脚:
PG11 (RMII) 或 PA2 (MII)PC1 (RMII) 或 PC2 (MII)// stm32h7xx_hal_conf.h中使能ETH
#define HAL_ETH_MODULE_ENABLEDRMII参考时钟(50MHz):
PA1(RMII模式)// System Clock配置
RCC_PeriphCLKInitTypeDef p;
p.PeriphClockSelection = RCC_PERIPHCLK_ETH;
p.EthClockSelection = RCC_ETH1PTPCLKSOURCE_PLL2; // 使用PLL2
HAL_RCCEx_PeriphCLKConfig(&p);HSE配置:
// stm32h7xx_hal_conf.h
#define HSE_VALUE 25000000内存区域对齐:
0x30040000 SRAM4)。__attribute__((section(".RxDecripSection"))) ETH_DMADescTypeDef RxDescTab[ETH_RX_DESC_CNT];
__attribute__((section(".TxDecripSection"))) ETH_DMADescTypeDef TxDescTab[ETH_TX_DESC_CNT];
__attribute__((section(".RxArraySection"))) uint8_t Rx_Buff[ETH_RX_DESC_CNT][ETH_MAX_PACKET_SIZE];LR_IROM1 0x08000000 0x00200000 { ; Flash
...
}
RW_IRAM2 0x30040000 0x0000C000 { ; SRAM4
.ANY (+RW +ZI)
.ANY(.RxDecripSection)
.ANY(.TxDecripSection)
.ANY(.RxArraySection)
}清除内存初始化:
memset(&RxDescTab, 0, sizeof(RxDescTab));
memset(&TxDescTab, 0, sizeof(TxDescTab)); LAN8720 STM32H743
TXD0 →→ PG13 (RMII_TXD0)
TXD1 →→ PG14 (RMII_TXD1)
RXD0 →→ PC4 (RMII_RXD0)
RXD1 →→ PC5 (RMII_RXD1)
CRS_DV →→ PA7 (RMII_CRS_DV)
nRST →→ PE11 (GPIO控制复位)HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_RESET);
HAL_Delay(50);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_SET);
HAL_Delay(500); // 等待PHY稳定ETH->DMASR和ETH->MACSR寄存器:ETH_DMASR_EB=1 → DMA错误ETH_MACSR_MMCT=0 → 无MAC中断uint32_t bsr;
HAL_ETH_ReadPHYRegister(&heth, PHY_ADDRESS, PHY_BSR, &bsr);
// 检查PHY_LINKED_STATUS(bit 2)和PHY_AUTONEGO_COMPLETE(bit 5)在drv_eth.c中补充以下关键代码:
// 复位PHY
void ETH_PHY_Reset(void) {
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_RESET);
HAL_Delay(50);
HAL_GPIO_WritePin(GPIOE, GPIO_PIN_11, GPIO_PIN_SET);
HAL_Delay(500);
}
// 检查PHY连接状态
int ETH_PHY_LinkCheck(void) {
uint32_t phyreg;
HAL_ETH_ReadPHYRegister(&heth, PHY_ADDRESS, PHY_BSR, &phyreg);
return (phyreg & PHY_LINKED_STATUS) ? 1 : 0;
}在初始化函数中调用:
ETH_PHY_Reset(); // 复位PHY
while (!ETH_PHY_LinkCheck()) { // 等待连接
HAL_Delay(100);
}| 现象 | 可能原因 | 解决方案 |
|---|---|---|
| ETH初始化失败 (Timeout) | PHY无响应 | 检查MDIO引脚、PHY地址、复位信号 |
| ifconfig无IP地址 | 描述符未对齐 | 修正链接脚本,使用SRAM4 |
| 无LINK灯 | 时钟错误/网线未连接 | 检查REF_CLK波形、更换网线 |
通过上述步骤,90%的移植问题可定位解决。若仍异常,建议:
最终确保:时钟正确 → PHY响应 → 描述符对齐 → 中断触发,以太网即可正常工作。
举报
更多回帖