This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] DP83867E:RGMII 连接问题-超过 ARP 重试计数、Tx 缓冲器未就绪

Guru**** 2939240 points
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/819511/dp83867e-rgmii-connection-issues---arp-retry-count-exceeded-tx-buffer-not-ready

器件型号:DP83867E

你好。 我们将推出基于 NXP LS1046A 的定制板。 我们有的
4个 TI DP83867。 其中2个使用 SGMII、以1Gb 和的方式进行连接
它们工作正常(U-Boot 中至少可以使用简单的 ping / DHCP)。
另外2个使用 RGMII、连接方式为100Mb (4根导线)。

U-Boot ti.c 驱动程序用于 PHY:
source.codeaurora.org/.../ti.c

在 ping 测试期间、RGMII 接口在(首次执行时)发生故障
时间):

```μ A
=> ping 192.168.10.1
使用 FM1@DTSEC3器件

超过 ARP 重试计数;重新开始
Ping 失败;主机192.168.10.1不活动
```μ A

和 AT (对于连续执行):

```μ A
=> ping 192.168.10.1
使用 FM1@DTSEC3器件
FM1@DTSEC3:TX 错误、Txbd->STATUS = 0x8800
FM1@DTSEC3:TX 缓冲区未就绪、Txbd->STATUS = 0x8800
FM1@DTSEC3:TX 缓冲区未就绪、Txbd->STATUS = 0x8800
FM1@DTSEC3:TX 缓冲区未就绪、Txbd->STATUS = 0x8800

超过 ARP 重试计数;重新开始
Ping 失败;主机192.168.10.1不活动
```μ A

MDIO 与芯片的通信完美无瑕。 RGMII 模式和 PHY
验证地址。

出于测试目的、我们准备了隔离式网络。 我们具有支持100Mb 的功能
连接伙伴在另一端连接 我们能够将数据包转储到另一个上
但我们还无法通过 RGMII 接口发送单个数据包。

我们已经在 PHY 和的 MII 上尝试了远端反向回送
从链路伙伴发送的数据包被接收回。

我怀疑问题出在 MAC-PHY RGMII 接口上。
我们尝试了各种 TX_DELAY 值、但没有成功。

我们已检查 RGMII 模式是否已启用:

*自举_STS1 (0x0E)寄存器:

```μ A
=> MII 写入0 000d 001f
=> MII 写入0 000e 006E
=> MII 写入0 000d 401F
=> MII 读取0 000e
0000
```μ A

- RGMII 绑定到启用(位12为0)
- SGMII 绑定到禁用(位11为0)
-地址为0x0 (位0:1)

* PHYCR (0x10)寄存器

```μ A
MII 写入0 000d 001f
MII 写入0 000e 0010
MII 写入0 000d 401F
MII 读数0 000e
4040.
```μ A

- SGMII 被禁用(位11为0)

* RGMIICTL (0x32)寄存器

```μ A
MII 写入0 000d 001f
MII 写入0 000e 0032
MII 写入0 000d 401F
MII 读数0 000e
00D3
```μ A
- RGMII 被启用(位7为1)

* 0x6f 寄存器转储:

=> MII 写入0 000d 001f
=> MII 写入0 000e 006F
=> MII 写入0 000d 401F
=> MII 读取0 e
0000

标准寄存器:

* 0x00 - 0x1f 寄存器转储:

```μ A
=> MII 读数0-1f
ADDR=00 RE=00 DATA=1140
ADDR=00 reg =01 DATA=796D
ADDR=00 REG=02 DATA=2000
ADDR=00 reg =03数据=A231
ADDR=00 reg =04数据=01E1
ADDR=00 reg =05 DATA=C1E1
ADDR=00 reg =06数据=006F
Addr=00 reg =07 data=2001
ADDR=00 reg =08数据=6801
ADDR=00 reg =09数据=0200
ADDR=00 REG=0A 数据=0C00
ADDR=00 REG=0b DATA=0000
ADDR=00 reg =0c 数据=0000
ADDR=00 reg =0d 数据=0000
ADDR=00 REG=0e DATA=0000
ADDR=00 REG=0f DATA=3000
ADDR=00 reg =10数据=4040
ADDR=00 reg =11数据=7C02
ADDR=00 reg =12数据=0000
ADDR=00 reg =13数据=9C40
ADDR=00 reg =14数据=29C7
ADDR=00 reg =15数据=0000
ADDR=00 reg =16数据=0000
ADDR=00 reg =17数据=0040
ADDR=00 reg =18数据=6150
ADDR=00 reg =19数据=4444
ADDR=00 reg =1a 数据=0002
ADDR=00 reg =1b DATA=0000
ADDR=00 reg =1c 数据=0000
ADDR=00 reg =1D 数据=0000
ADDR=00 reg =1e data=0002
ADDR=00 reg =1f DATA=0000
```μ A

通过寄存器0x11、我们可以验证自动协商速度是否为100Mb。
在寄存器0x0/0x1中、我们可以看到自动协商已启用、并且
链路已建立。 链路 LED 也处于活动状态。

欢迎提供有关如何解决此问题的任何其他提示。

谢谢

随附的是 RGMII 接口之一的原理图中的相关页面:


  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 、Maciej、

    根据您提供的信息、DP83867配置为 RGMII 模式、TX 和 RX 方向上的时钟偏斜均为2ns。 根据 NXP LS1046A 是否具有内部延迟、它可能是 PHY 和 MAC 之间 RGMII 接口的双延迟。

    您可以使用 RGMII 延迟控制寄存器(RGMIIDCTL)地址0x0086来查看 PHY 延迟是否有用。

    然而,我有点困惑,时间长达100米,因此即使有额外的延迟,它也应该起作用。 您能否还从 PHY 探测 RGMII RX 引脚以确保其发送预期的 RGMII 信号(RX_CLK、RX_DV、RX_D[3:0]。

    此致、

    Hung Nguyen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    NXP LS1046A 在 RGMII 上似乎没有内部延迟。 在参考板(LS1046ARDB)上、它们使用 Realtek 芯片作为 RGMII、并在 PHY 中启用2ns TX 内部延迟(我在 RX 延迟上找不到任何内容-至少驱动程序未启用该延迟)。

    我们已经使用了 RGMIIDCTL。 现在、我们要稍微多播放一点、但示波器连接到 RX_CLK 和 RX_D[3]行
    来测量延迟、如 http://www.ti.com/lit/an/snla243/snla243.pdf 中所示


    在当前状态下、当使用带环回的内部数据包发生器(在 TI PHY 中)时、我们将在 RX_[3]线路上获取 CLK 信号和数据。
    当通过以太网电缆从外部器件发送数据包时、我们将获得 CLK 信号、但不会在 RX_[3]线路上获取任何数据。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    你好。

    更多测试结果:

    接收:
    当我们对电路板执行 ping 操作时、信号仅出现在 RX_CLK 上。 RX_D3上没有任何内容(我们目前只能将探针连接到此引脚)。 延迟更改没有帮助。
    2.当我们在 PHY 中使用 PRBS 发生器和内部数字回路时、信号出现在 tje RX_D3上。
    3.延迟:
     *禁用 DP83867上的延迟时、RX_CLK 信号在 RX_D3之前提前2ns (偏斜被添加到 RX_D3中)。



     *当 DP83867上的延迟启用并设置为2ns 时、RX_D3和 RC_CLK 之间会出现任何时钟偏差。


     
    *当 DP83867上的延迟被启用并设置为4ns 时、RX_D3信号在 RX_CLK 之前提前2ns (偏差被添加到 RX_CLK 中)。


    发送:
    尝试从定制板 ping 时、TX_D3上没有信号。


    但我认为、我们的主要问题是、当从外部器件接收数据包时、数据线路上没有任何内容。
    使用内部数据包发生器时、D3线上有数据在流动。 当从外部设备发送数据包时、
    时钟出现在 RX_CLK 线路上、但 RX_D3线路始终为低电平。

    从 RJ-45到 MII 以及返回 RJ-45的数据路径已使用 远端回送进行了验证、如 http://www.ti.com/lit/an/snla246a/snla246a.pdf 中所述

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 、Maciej、

    当器件以100M 的速度链接时、RX_CLK 应始终输出25MHz 时钟信号。

    当使用内部数据包发生器时、数据为 PRBS。 因此、它应该具有全部3条数据线切换。

    当从外部器件发送数据时、根据传入数据包的内容、RX_D3可能为低电平。 例如、发送5555数据时、位3和位1始终为0。 但是、您仍然应该看到 RX_D3至少针对4字节 CRC 字段进行切换。

    您能否确认 RX_D[2:0]和 RX_CTRL 是正确的 RGMII 信号?

    10M 和1G 速度的行为是否相同?

    此致、

    Hung Nguyen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这是否意味着在建立链路时 RX_CLK 应该一直运行?
    连接状态位被置位。 但是、RX_CLK 仅在我们从外部器件传输某些数据时运行。
    当没有发送数据时、RX_CLK 始终为低电平。

    我们在探测 RX_D[2:0]引脚时遇到一些困难。 我们将尝试进行安排。

    我认为1Gb 模式不可用、因为只有2个以太网对路由到连接器。
    剩余的2个暴露在测试点上。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    RX_CTRL 引脚上的自举是什么?

    您能否读取寄存器0x31?

    此致、

    Hung Nguyen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    RX_CTRL 上没有自举。 所有使用的绑带都可在随附的原理图上看到。
    我将於明日上午提供登记册的读数。
    感谢您的反馈。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!  

    数据表第8.5.1节中有一条注意事项、尤其是对于 RX_CTRL、您需要遵循以下说明:

     "自举模式1和2不适用于 RX_CTRL。 必须将 RX_CTRL 自举配置为自举模式3或自举模式4。 如果 RX_CTRL 引脚不能绑定到模式3或模式4、则配置寄存器4 (地址0x0031)的位[7]必须清零。"

    此致、

    Hung Nguyen

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您提供此提示。

    0x31的值为0x10B0。 因此 RX_CTRL 上没有自举、保留位(第7位)未被取消置位。
    我已启用 ti,c U-Boot 驱动程序中的 quirk 来取消设置此位、现在0x31寄存器内容为0x1030。
    这种变化导致 RX_CLK 始终开启(稳定25MHz)。 以前、它仅在有时运行
    传入数据流。

    我还发现 TI 驱动程序存在一些问题。 扩展寄存器集时、需要使用的寄存器
    在驱动程序代码中、它始终具有0xFFFF。 我可以通过更改以下内容来解决此问题:

    在函数调用中将"phydev->addr、val"更改为"mdio_DEVAD_none"。 

    可能这种上游提交也修复了以下问题: github.com/.../4c29dc1863e4f739ec2f496352935fd37c123553

    这个问题导致了扩展寄存器读取的驱动程序代码始终为0xFFFF。 这篇文章不起作用
    正确的方式。 因此、在扩展寄存器配置空间中的驱动程序内完成的所有配置都将被忽略
    使用了默认值。

    驱动程序代码: https://source.codeaurora.org/external/qoriq/qoriq-components/u-boot/tree/drivers/net/phy/ti.c?h=integration#n134


    从 U-Boot shell ping 时、我能够捕获 TX_Dx 线路上的一些流量(另一侧的 tcpdump 仍然不显示接收到的任何数据包)。
    今天、我能够在其中一条 RX_D 线路上捕获一些数据、如下所示:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好 、Maciej、

    我没有听到你的声音。 我假设您能够解决您的问题。 我将继续并关闭该线程。

    如果您需要进一步的支持、请打开一个新的主题。

    此致、

    Hung Nguyen