ST意法半导体
直播中

vinww特烦恼

9年用户 1220经验值
擅长:存储技术
私信 关注
[问答]

使用stm32F407连接PHY进行以太网通讯,一插网线就会进入错误中断,为什么?

使用STM32F407连接PHY芯片进行以太网通讯,一插网线就会进入错误中断。
/**  * @brief  Ethernet DMA transfer error callback  * @param  handlerEth: ETH handler  * @retval None  */void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *handlerEth){  net_test[2]++;  if((HAL_ETH_GetDMAError(handlerEth) & ETH_DMASR_RBUS) == ETH_DMASR_RBUS)  {设备上电插入网线,这个错误中断进入好几十次上百次,然后就网络工作正常,然后再拔掉网线,再插上,又进入这个中断,有时产生这个错误后,以太网就会彻底没法接收数据,接收中断回调都不进入了,发送正常的。我抓包发现一查网线,电脑又很多数据包会发给单片机,等一会就不发了,不知道是不是这个原因。想请教一下,这个错误回调怎么处理才能避免这个情况。

回帖(1)

lotusp

2025-6-20 17:41:04

根据您的描述,当STM32F407连接PHY芯片后,插入网线时会频繁触发以太网错误中断(ETH_DMASR_RBUS),但之后网络能恢复正常工作。以下是可能的原因及解决方案:




主要原因分析




  1. 接收缓冲区不足 (RBUS 错误)



    • ETH_DMASR_RBUS 表示DMA的接收缓冲区不可用。当以太网数据包到达但DMA没有空闲的接收描述符时触发此错误。

    • 在设备启动或网线插入瞬间,大量数据包(如LLDP、ARP等广播包)涌入,若缓冲区准备不足,会触发此错误。




  2. PHY芯片初始化时机不当



    • PHY芯片的自动协商过程(约2-3秒)可能导致初始链路状态不稳定。

    • 在PHY完成协商前,STM32过早初始化ETH外设会导致丢包/错误。




  3. 描述符链表配置问题



    • 接收描述符链表(RX descriptor)未正确初始化或数量不足(ETH_RXBUFNB 设置过小)。

    • 描述符指向的缓冲区地址未对齐(需4字节对齐)。




  4. 硬件问题



    • 复位电路不稳定(PHY或STM32复位时序异常)。

    • 时钟配置错误(ETH时钟、PHY晶振)。






解决方案


1. 增加接收缓冲区数量


   // 修改接收描述符数量(默认建议8-12)
   #define ETH_RXBUFNB 16


  • HAL_ETH_Init() 后重新初始化描述符:
     HAL_ETH_Stop(&heth);
    MX_ETH_RXBUF_Config(); // 重新配置接收缓冲区
    HAL_ETH_Start(&heth);


2. 延迟ETH初始化




  • 检测PHY链路状态后再启用ETH:


     void ETH_Start_After_PHY_Ready(void) {
         uint32_t phyReg;
         do {
             HAL_ETH_ReadPHYRegister(&heth, PHY_BSR, &phyReg); // 读取PHY状态寄存器
         } while ((phyReg & PHY_LINKED_STATUS) == 0); // 等待链路建立

         HAL_ETH_Start(&heth); // 链路就绪后启动ETH
    }



3. 优化描述符配置



  • 确保缓冲区地址对齐:
     __ALIGNED(4) uint8_t Rx_Buff[ETH_RXBUFNB][ETH_RX_BUF_SIZE];

  • 初始化描述符链表时启用循环模式:
     HAL_ETH_DMARxDescListInit(&heth, DMARxDscrTab, Rx_Buff, ETH_RXBUFNB, rxConfig);


4. 错误中断中自动恢复


在错误回调中重置DMA接收队列:


   void HAL_ETH_ErrorCallback(ETH_HandleTypeDef *heth) {
       if ((heth->DMAError & ETH_DMASR_RBUS) != 0) {
           // 复位DMA接收状态
           CLEAR_BIT(heth->Instance->DMAIER, ETH_DMAIER_RBUIE);
           SET_BIT(heth->Instance->DMASR, ETH_DMASR_RBUS);
           HAL_ETH_Stop(heth);
           HAL_ETH_Start(heth);
       }
   }

5. 检查硬件设计



  • 复位电路:确保PHY复位引脚在STM32初始化前保持低电平 > 1ms。

  • 时钟配置

    • 检查PHY晶振是否起振。

    • 确认ETH时钟源配置(如HSE频率需匹配PHY)。


  • 信号质量

    • 使用示波器检查RMII_TXD/RXD有无噪声。

    • 缩短PHY与STM32的走线长度(< 10cm)。





其他建议



  • 启用PHY自动协商中断:通过PHY的INTR引脚通知STM32链路状态变化,避免轮询。

  • 优化PHY寄存器配置:关闭不必要的广播包(如LLDP)以减少初始负载:
    HAL_ETH_WritePHYRegister(&heth, PHY_BCR, PHY_AUTONEGOTIATION | PHY_LOOPBACK_OFF | PHY_BROADCAST_FILTER);


通过上述调整,可解决插入网线时的RBUS错误中断问题。如果仍未解决,建议:



  1. 用逻辑分析仪捕获RMII接口信号;

  2. 检查PHY芯片的寄存器状态(如LAN8720的PHYID1/PHYID2);

  3. 确认STM32的ETH时钟配置(SYSCFG->PMC寄存器)。



:STM32的ETH驱动需配合PHY芯片型号(如LAN8742/LAN8720)调整配置,部分PHY需要额外软件复位(如LAN8742的BCR.15位)。


举报

更多回帖

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