ST意法半导体
直播中

刘丹

8年用户 1563经验值
私信 关注
[问答]

stm32h743 lan8720 cube配置lwip无法ping通怎么解决?

1、问题简述

使用正点原子阿波罗的开发板,已经配置了lan8720的复位,其他直接安找网络例程中设置,但是无法ping通,能否帮忙解决一下。
while中就放了一个MX_LWIP_Process();,硬件配置如下:
2、mpu配置


3、ETH配置


4、LWIP 设置

4-1、常规部分


4-2、key部分


4-3、芯片设置


回帖(2)

李超

2025-3-3 11:55:57

针对STM32H743 + LAN8720 + LwIP无法Ping通的问题,以下是逐步排查和解决方案:




1. 硬件检查




  • PHY地址确认

    LAN8720的PHY地址由PHYAD0引脚决定(默认接地为0x00或上拉为0x01)。

    检查点:代码中ETH_PHY_ADDRESS宏定义是否与硬件匹配(例如0x000x01)。




  • 时钟源检查  



    • RMII的50MHz REF_CLK必须由外部晶振或STM32的时钟输出(如通过PA8输出50MHz时钟)。  

    • 验证方法:用示波器测量PHY的REF_CLK引脚(第1脚)是否为50MHz稳定信号。




  • 复位电路检查  



    • 确保PHY复位引脚(RST)时序正确,复位时间建议≥1ms。  

    • 检查复位引脚是否成功拉低再拉高(用逻辑分析仪或点灯调试)。






2. STM32CubeMX配置




  • ETH配置  



    • 模式选择:RMII接口模式(非MII)。  

    • PHY配置:  

    • 地址:与硬件一致(如0x00)。  

    • 自动协商(Auto-negotiation)启用。  

    • 速度和双工模式:推荐选择Auto。  

    • DMA描述符:  

    • 接收描述符(Rx Desc)建议≥4,发送描述符(Tx Desc)≥2。  

    • 描述符地址对齐(建议32字节对齐)。




  • LWIP配置  



    • 静态IP设置:确保IP、子网掩码与PC在同一网段(如PC:192.168.1.100,开发板:192.168.1.10)。  

    • 启用ARPLWIP_ARP设为Enable。  

    • 内存池调整:  

    • MEM_SIZE ≥ 1600(默认可能太小)。  

    • PBUF_POOL_SIZE ≥ 16。  

    • 调试输出:启用LWIP_DEBUG并开启ETH相关调试信息。






3. 代码调试




  • PHY寄存器读取

    在初始化后读取PHY的ID和状态寄存器,确认PHY是否被正确识别:  


    uint32_t phy_id = 0;
    HAL_ETH_ReadPHYRegister(&heth, PHY_BSR, &phy_id); // 读取PHY状态寄存器
    printf("PHY ID: 0x%04Xn", phy_id);


    • 正常应返回0x0007(LAN8720的BSR默认值)。




  • 链接状态检测

    轮询PHY的链接状态寄存器(BSR的bit 2):  


    uint32_t phy_status;
    HAL_ETH_ReadPHYRegister(&heth, PHY_BSR, &phy_status);
    if (phy_status & PHY_LINKED_STATUS) {
      printf("PHY Linked!n");
    }



  • MPU配置  



    • ETH使用的内存区域(如描述符、缓冲区)需配置为DeviceNon-Cacheable:  
      MPU_Region_InitTypeDef mpu;
      mpu.Enable = MPU_REGION_ENABLE;
      mpu.BaseAddress = 0x30000000; // ETH DMA描述符地址
      mpu.Size = MPU_REGION_SIZE_64KB;
      mpu.AccessPermission = MPU_REGION_FULL_ACCESS;
      mpu.IsBufferable = MPU_ACCESS_BUFFERABLE;
      mpu.IsCacheable = MPU_ACCESS_NOT_CACHEABLE;
      HAL_MPU_ConfigRegion(&mpu);






4. 常见问题解决




  • 问题1:PHY未响应

    现象HAL_ETH_ReadPHYRegister返回超时。

    解决:检查MDIO(PC2)和MDC(PC1)引脚配置,确认上拉电阻已启用。




  • 问题2:能发送但无法接收

    现象:Wireshark抓包发现开发板发送ARP请求但无响应。

    解决:  



    • 检查接收描述符是否足够(建议增加到8个)。  

    • 确认HAL_ETH_RxCpltCallback被正确调用,并调用ethernetif_input处理数据。




  • 问题3:Ping延迟高或丢包

    解决:增大MEM_SIZEPBUF_POOL_SIZE,优化MX_LWIP_Process()调用频率(建议在主循环中不阻塞)。






5. 验证步骤




  1. 物理层验证  



    • 用示波器检查REF_CLK、TX/RX数据线是否有信号。  

    • 确认PHY的LED指示灯(如连接后常亮/闪烁)。




  2. 网络层验证  



    • 启用LWIP的ping功能,在代码中响应Ping请求。  

    • 使用arp -a查看PC的ARP表是否包含开发板IP。






通过以上步骤,应能定位并解决无法Ping通的问题。如果仍存在问题,建议提供ETH初始化代码片段和PHY寄存器读取结果进一步分析。

举报

简白伊

2025-3-13 15:56:33
cache设置透传后正常了
举报

更多回帖

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