DP83822HF: PHY配置RMII模式无50MHz波形输出

Part Number: DP83822HF

使用STM32H735+DP83822HF,基于LwIP实现UDP通信,将PHY作为RMII Master模式。希望能帮忙分析是硬件有故障还是软件存在bug。

  1. 硬件电路设计中,PHY的引脚26(RX_DV)悬空,导致上电默认strap为MII模式,因此选择软件修改寄存器并数字重启,以强制为RMII Master模式。但是GPIO3监测不到任何时钟信号输出。具体操作如下:
    (1)针对0x0017:
        /* 强制配置为 RMII Master 模式 */
        reg_val &= ~(1 << 9);      // 清除 RGMII 使能位(bit9),防止冲突
        reg_val |=  (1 << 5);      // 置位 RMII 使能位(bit5)
        reg_val &= ~(1 << 7);      // 时钟选择25M:0 = 25MHzRMII Master,1 = 50MHzRMII Slave
    (2)针对0x001F:修改bit14 = 1,启动数字重启并等待重启完成。
  2. 过程中发现:插上网线ETH才有概率初始化成功。不插网线则ETH无法初始化成功。软件实现流程为(1)硬件重启PHY;(2)配置ETH并初始化;(3)PHY初始化、强制RMIIMaster并数字重启;(4)检查链路状态...
  3. 硬件电路如图所示:DP83822scheme.png
  4.  
  • 已经收到了您的案例,调查需要些时间,感谢您的耐心等待。

  • 您好,

    当以太网线连接时,你能确认是否有链路吗(读取寄存器 0x1[2])?这是为了确认 PHY 的 MDI 部分是否正常。

    寄存器 0x17 可用于确认 RMII 设置。位 9 和 7 应该都是 '0',位 5 应该是 '1'。RX_DV 应该处于mode 3(5.76k PU 和 2.49k PD)。

    链接帖子讨论了类似问题请参考。

    DP83822HF: DP83822HFRHBR with STM32H7 MCU using RMII - Interface forum - Interface - TI E2E support forums

  • 您好,

    1.以太网连接时,是有链路的,目前MDIO应该是正常的,我会在最下面贴出寄存器读取结果,希望帮助确认。

    2.查看链接问题后,由于RX_DV没有处于strap mode 3. 我仍然希望修改Reg 0x17来配置RMII Master模式。

     (1)以下为PHY初始化并配置RMII Master后重启,读取结果:

    Reg addr value
    DP83822_BMCR 0x00 0x3100
    DP83822_BMSR 0x01 0x7849
    DP83822_PHYI1R 0x02 0x2000
    DP83822_PHYI2R 0x03 0xa240
    DP83822_ANAR 0x04 0x01e1
    DP83822_ANLPAR 0x05 0x0000
    DP83822_ANER 0x06 0x0004
    DP83822_ANNPTR 0x07 0x2001
    DP83822_ANLNPTR 0x08 0x0000
    DP83822_CR1 0x09 0x0020
    DP83822_CR2 0x0a 0x0100
    DP83822_CR3 0x0b 0x1000
    DP83822_REGCR 0x0d 0x0000
    DP83822_ADDAR 0x0e 0x0000
    DP83822_FLDS 0x0f 0x0000
    DP83822_PHYSTS 0x10 0x0012
    DP83822_PHYSCR 0x11 0x0108
    DP83822_MISR1 0x12 0x6400
    DP83822_MISR2 0x13 0x2800
    DP83822_FCSCR 0x14 0x0000
    DP83822_RECR 0x15 0x0000
    DP83822_BISCR 0x16 0x0100
    DP83822_RCSR 0x17 0x0061
    DP83822_LEDCR 0x18 0x0400
    DP83822_PHYCR 0x19 0x8021
    DP83822_10BTSCR 0x1a 0x0000
    DP83822_BICSR1 0x1b 0x007d
    DP83822_BICSR2 0x1c 0x05ee
    DP83822_CDCR 0x1e 0x0102
    DP83822_PHYRCR 0x1f 0x0000

    (2)以下为link up后读取结果:

    DP83822_BMCR 0x00 0x3100
    DP83822_BMSR 0x01 0x786d
    DP83822_PHYI1R 0x02 0x2000
    DP83822_PHYI2R 0x03 0xa240
    DP83822_ANAR 0x04 0x01e1
    DP83822_ANLPAR 0x05 0xcde1
    DP83822_ANER 0x06 0x000f
    DP83822_ANNPTR 0x07 0x2001
    DP83822_ANLNPTR 0x08 0x439f
    DP83822_CR1 0x09 0x0020
    DP83822_CR2 0x0a 0x0100
    DP83822_CR3 0x0b 0x1000
    DP83822_REGCR 0x0d 0x0000
    DP83822_ADDAR 0x0e 0x0000
    DP83822_FLDS 0x0f 0x0000
    DP83822_PHYSTS 0x10 0x4015
    DP83822_PHYSCR 0x11 0x0108
    DP83822_MISR1 0x12 0x6400
    DP83822_MISR2 0x13 0x2800
    DP83822_FCSCR 0x14 0x0000
    DP83822_RECR 0x15 0x0000
    DP83822_BISCR 0x16 0x0100
    DP83822_RCSR 0x17 0x0061
    DP83822_LEDCR 0x18 0x0400
    DP83822_PHYCR 0x19 0x8c21
    DP83822_10BTSCR 0x1a 0x0000
    DP83822_BICSR1 0x1b 0x007d
    DP83822_BICSR2 0x1c 0x05ee
    DP83822_CDCR 0x1e 0x0102
    DP83822_PHYRCR 0x1f 0x0000
  • 您好,

        寄存器配置在链接前看起来是正确的。我预计在对寄存器 0x17 进行重新配置时,RX_CLK 会出现。

       请您提供在无链接情况下该引脚的示波器截图:A)默认配置(请提供原始值),B)重新配置后的情况。

  • 您好Alice,

    1.附图按照顺序分别为在不连接网线时:25M晶振波形(正常)、默认配置时波形输出(0)、重新配置RMII后时钟波形输出(0);

    2.另外,不连接网线情况下。我的ETH初始化总是失败的,ETH初始化需要PHY的时钟吗?我需要暂时忽略这个现象吗?

    网线未连接情况下: 配置前 配置后
    [DP83822] 0x00 0x3100 0x3100
    [DP83822] 0x01 0x7849 0x7849
    [DP83822] 0x02 0x2000 0x2000
    [DP83822] 0x03 0xa240 0xa240
    [DP83822] 0x04 0x01e1 0x01e1
    [DP83822] 0x05 0x0000 0x0000
    [DP83822] 0x06 0x0004 0x0004
    [DP83822] 0x07 0x2001 0x2001
    [DP83822] 0x08 0x0000 0x0000
    [DP83822] 0x09 0x0020 0x0020
    [DP83822] 0x0a 0x0100 0x0100
    [DP83822] 0x0b 0x1000 0x1000
    [DP83822] 0x0d 0x0000 0x0000
    [DP83822] 0x0e 0x0000 0x0000
    [DP83822] 0x0f 0x0000 0x0000
    [DP83822] 0x10 0x4002 0x4002
    [DP83822] 0x11 0x0108 0x0108
    [DP83822] 0x12 0x0000 0x0000
    [DP83822] 0x13 0x0800 0x0800
    [DP83822] 0x14 0x0000 0x0000
    [DP83822] 0x15 0x0000 0x0000
    [DP83822] 0x16 0x0100 0x0100
    [DP83822] 0x17 0x0041 0x0061
    [DP83822] 0x18 0x0400 0x0400
    [DP83822] 0x19 0x8021 0x8021
    [DP83822] 0x1a 0x0000 0x0000
    [DP83822] 0x1b 0x007d 0x007d
    [DP83822] 0x1c 0x05ee 0x05ee
    [DP83822] 0x1e 0x0102 0x0102
    [DP83822] 0x1f 0x0000 0x0000

  • Alice您好,

    我进一步排查时发现手册中要求这4个电阻为49.9欧连接至AVD。但是我提供的电路图中却是49.9K。请问这里是错误的吗?与我现在的问题有关吗?

  • 您好,

    设置MAC接口时,应该与插拔电缆无关。当你的初始化失败时,这意味着什么?这句话如何转化为观察到的硬件表现?

    我确实看到在插入电缆后,链路仍然是断开的,但这是Reg 0x1中的一个锁存低位,并且需要重新读取。

    我进一步排查时发现手册中要求这4个电阻为49.9欧连接至AVD。但是我提供的电路图中却是49.9K。

         请先改成49.9欧姆,再反馈测试结果。

  • Alice您好,

    1.我的ETH初始化失败,是MCU的以太网外设接口。但是现在的现象我始终无法解释:

    两种情况下(1)不插网线;(2)插了网线,但是PHY硬件重启后等待时间小于3~4秒;都会导致ETH_Init 函数中,进行Software reset时,等待超时。

    具体硬件上表象为:DMAMR寄存器the SWR bit置1后,无法自动清零。

    我猜测很可能是因为外部的MII/RMII时钟不存在?还需要确认两者间的关系。

      /* Ethernet Software reset */
      /* Set the SWR bit: resets all MAC subsystem internal registers and logic */
      /* After reset all the registers holds their respective reset values */
      SET_BIT(heth->Instance->DMAMR, ETH_DMAMR_SWR);

      /* Get tick */
      tickstart = HAL_GetTick();

      /* Wait for software reset */
      while (READ_BIT(heth->Instance->DMAMR, ETH_DMAMR_SWR) > 0U)
      {
        if (((HAL_GetTick() - tickstart) > ETH_SWRESET_TIMEOUT))
        { // 等待Ethernet Software reset时,超时, the SWR bit 被置1后,无法自动清零
          /* Set Error Code */
          heth->ErrorCode = HAL_ETH_ERROR_TIMEOUT;
          /* Set State as Error */
          heth->gState = HAL_ETH_STATE_ERROR;
          /* Return Error */
          return HAL_ERROR;
        }
      }
    2.插入电缆后,Reg 0x1会由0x7849变为0x786d,似乎说明链路是正常的呢?
    3.我会和硬件的同事进行沟通,修改电阻后继续进行测试,后续再将测试情况告诉您。
  • 您好,

    硬件工程师已经把这4个电阻全部更换过了,但是我测试的结果与更换之前没有任何区别,包括配置RMII前/后的寄存器读取结果,也与之前完全一致。

    仍然不理解为什么没有时钟输出,顺便,您能帮忙过目一下我创建提问时附图硬件原理图是否合理吗?有无其他硬件电路错误?

    期待您的回复!感谢

  • 您好,时钟问题已经解决了。

    因为软件改寄存器GPIO3不会自动输出50M,需要配置0x0462=0x4300。

    但是网络依然ping不通,我将创建新的问题进行描述。

    感谢您的支持。