RT-Thread论坛
直播中

fanB

9年用户 1546经验值
擅长:20615
私信 关注
[问答]

STM32H743以太网驱动移植异常怎么解决?

单片机STM32H743II
PHY:LAN8720
开发环境:Keil
移植以太网驱动时,遇到异常。
使用的drv_eth.c drv_eth.h的版本信息如下图所示,

编译运行之后,显示的异常如下图所示,

使用ifconfig,打印信息如下图所示,

麻烦给看下这种异常该如何排查,谢谢。


回帖(2)

刘超

2025-9-10 17:39:12
环境:keil mdk
版本: rt-thread-4.1.1
开发板:stm32h743-atk-apollo
Cube配置ETH GPIO引脚的时候,速度需要改为 Very High
举报

李桂英

2025-9-12 18:20:44

针对您的STM32H743 + LAN8720以太网驱动移植异常问题,以下是系统的排查解决方案:




关键问题分析


根据提供的截图信息(异常显示ETH初始化失败、ifconfig无连接状态),核心问题可能集中在:



  1. PHY通信失败(MDIO通信异常)

  2. 时钟配置错误

  3. 内存对齐或DMA问题

  4. 硬件连接故障




排查步骤及解决方案


1. 检查PHY通信(MDIO接口)




  • 确认PHY地址



    • LAN8720的PHY地址由LED_CFG/RXD引脚决定,默认0x000x01

    • drv_eth.c中检查宏定义:
      #define PHY_ADDRESS    0x00 // 或0x01

    • 用调试器读取PHY寄存器(例如ID寄存器0x02)验证:
      uint32_t id;
      HAL_ETH_ReadPHYRegister(&heth, PHY_ADDRESS, PHY_IDR, &id);
      // LAN8720的ID应为0x0007C0F1




  • 排查MDIO/MDC引脚



    • 确认硬件连接:

      • MDIO: PG11 (RMII) 或 PA2 (MII)

      • MDC: PC1 (RMII) 或 PC2 (MII)


    • 检查CubeMX配置:
      // stm32h7xx_hal_conf.h中使能ETH
      #define HAL_ETH_MODULE_ENABLED




2. 验证时钟配置




  • RMII参考时钟(50MHz)



    • LAN8720需要25MHz晶振输入(引脚XI),输出50MHz REF_CLK到STM32。

    • 检查引脚连接:

      • REF_CLK: PA1(RMII模式)


    • STM32侧时钟树配置:
      // System Clock配置
      RCC_PeriphCLKInitTypeDef p;
      p.PeriphClockSelection = RCC_PERIPHCLK_ETH;
      p.EthClockSelection = RCC_ETH1PTPCLKSOURCE_PLL2; // 使用PLL2
      HAL_RCCEx_PeriphCLKConfig(&p);




  • HSE配置



    • 确保晶振频率正确(25MHz):
      // stm32h7xx_hal_conf.h
      #define HSE_VALUE 25000000




3. 检查内存管理(DMA描述符)




  • 内存区域对齐



    • STM32H743要求描述符位于DMA可访问区域(如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];

    • 链接脚本(.sct)中添加:
      LR_IROM1 0x08000000 0x00200000 { ; Flash
      ...
      }
      RW_IRAM2 0x30040000 0x0000C000 { ; SRAM4
      .ANY (+RW +ZI)
      .ANY(.RxDecripSection)
      .ANY(.TxDecripSection)
      .ANY(.RxArraySection)
      }




  • 清除内存初始化



    • 在初始化ETH前清除缓存:
      memset(&RxDescTab, 0, sizeof(RxDescTab));
      memset(&TxDescTab, 0, sizeof(TxDescTab));




4. 硬件及引脚检查



  • 关键引脚连接
     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控制复位)

  • 复位电路

    • 初始化时需复位PHY:
      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稳定



5. 调试寄存器状态



  • 读取ETH寄存器

    • 使用调试器查看ETH->DMASRETH->MACSR寄存器:

      • ETH_DMASR_EB=1 → DMA错误

      • ETH_MACSR_MMCT=0 → 无MAC中断


    • 检查PHY状态寄存器:
      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%的移植问题可定位解决。若仍异常,建议:



  1. 使用逻辑分析仪捕获MDIO/MDC信号。

  2. 确认开发板硬件参考设计(如Nucleo-H743ZI官方设计)。

  3. 提供更详细日志(如PHY寄存器值、ETH寄存器dump)。



最终确保:时钟正确 → PHY响应 → 描述符对齐 → 中断触发,以太网即可正常工作。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分