工具/软件:
我无法 通过配置 (strap) 引脚为 10Mbps 和 100Mbps 配置自动协商。 请说明如何为 10Mbps 和 100Mbps RGMII 模式设置自动协商。
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 自举配置。
谢谢
David
您好、David:
1) 我已按照您给出的表格使用 strap 配置引脚为自动协商配置 phy。我需要为 10Mbps 和 100Mbps RGMII 模式配置 strap 配置、因为我在 phy IC 和连接器之间使用 2 线接口。
2) 当我读取 phy 状态寄存器时, 它显示链路已断开。
3) 所以我需要通过 MDIO 设置寄存器。 如果是、请给出配置寄存器以设置自动协商 10Mbps 和 100Mbps RGMII 模式的所有步骤。
谢谢、
Prasad
您好、David:
请检查所附的硬件原理图。 是否需要对 strap 配置进行任何更改、以便在 10Mbps 和 100Mbps RGMII 模式下进行自动协商。
谢谢、
Prasad
Prasad
RX_CTRL 引脚上的 strap 配置控制自动协商启用和禁用。 必须将 RX_CTRL 引脚设置为模式 3 以禁用、并设置模式 4 以启用自动协商。
若要启用自动协商、上拉为 5.76k、下拉为 2.49k。 我注意到在原理图中、您有一个 6.04k 上拉电阻、您能将其更改为 5.76k 吗?
LED_1 在 10/100/1000 和 100/1000 之间选择自动协商广播。 对于 10/100/1000 广播、LED_1 搭接模式为模式 1(开路)。 有关 LED 模式 1 实现、请参阅下面的。 我在您的原理图中注意到 LED 二极管和 470 欧姆电阻器互换了、这需要修复。
再看看集成式变压器和 RJ45、中心抽头短接在一起、然后通过 0.01uF 电容器下拉至地。 我们建议保持连接到 PHY 一侧的每个中心抽头相互隔离、并通过去耦电容器(建议使用 0.1µF) 接)接地、如下所示。
您是否还可以转储扩展寄存器 0x6E 和 0x6F? 这将验证 strap 配置是否正确完成。
谢谢
David
尊敬的 David:
1) 请告诉我如何 将 RX_CTRL 引脚设置为模式 3 以禁用、如何设置模式 4 以启用自动协商。 因为根据您 在该相同配置中建议的 DP83867E 自举配置的共享电子表格、即上拉电阻为 5.76k、下拉电阻为 2.49k。 我已经做过您之前提到的其他更改。
2) 除了由搭接引脚设置的自动协商之外、我还需要为 10Mbps 和 100Mbps RGMII 自动协商设置寄存器。 按软件 (MDIO)。如果是、请建议我需要为其设置哪些寄存器。
谢谢、
Prasad
Prasad
抱歉、我的回答中有一个拼写错误。 必须使用引脚配置 (strap) 来启用/禁用自动协商。
要启用自动协商、请将 RX_CTRL 引脚配置为模式 3 -> 5.76k 上拉电阻和 2.49k 下拉电阻。
要禁用自动协商、请将 RX_CTRL 引脚配置为模式 4 -> 2.49k 上拉和开路下拉。
如果通过 strap 配置选项禁用了自动协商功能、则 MDIO 无法重新启用自动协商功能。
谢谢
David
您好、David:
1) 我正在使用 sja1105Q 交换机 (MAC)、将其设置为 100Mbps RGMII 模式(静态配置)。
2) 现在我已将 DP83867E (PHY) 设置为 启用自动协商、将 RX_CTRL 引脚配置为模式 3 -> 5.76k 上拉和 2.49k 下拉。
我获得的输出为:
PHY_ADDR 0 BMSR (0x0001):0x7949
PHY_ADDR 0 phy STS (0x0011):0x0302
PHY_ADDR 3 BMSR (0x0001):0x7949
PHY_ADDR 3 phy STS (0x0011):0x0302
那么、可能的问题是什么。 请告知我我的自动协商是否已正确完成、或者我需要遵循哪些步骤来解决问题。
谢谢你
Prasad
您好、David:
请检查 2 个端口的所有寄存器值。
PHY_ADDR 0 寄存器 0x0000:0x1140
PHY_ADDR 0 寄存器 0x0001:0x7949
PHY_ADDR 0 寄存器 0x0002:0x2000
PHY_ADDR 0 寄存器 0x0003:0xA231
PHY_ADDR 0 寄存器 0x0004:0x0181
PHY_ADDR 0 寄存器 0x0005:0x0000
PHY_ADDR 0 寄存器 0x0006:0x0064
PHY_ADDR 0 寄存器 0x0007:0x2001
PHY_ADDR 0 寄存器 0x0008:0x0000
PHY_ADDR 0 寄存器 0x0009:0x0300
PHY_ADDR 0 寄存器 0x000A:0x0000
PHY_ADDR 0 寄存器 0x000B:0x0000
PHY_ADDR 0 寄存器 0x000C:0x0000
PHY_ADDR 0 寄存器 0x000D:0x0000
PHY_ADDR 0 寄存器 0x000E:0x0000
PHY_ADDR 0 寄存器 0x000F:0x3000
PHY_ADDR 0 寄存器 0x0010:0x5048
PHY_ADDR 0 寄存器 0x0011:0x0002
PHY_ADDR 0 寄存器 0x0012:0x0000
PHY_ADDR 0 寄存器 0x0013:0x0000
PHY_ADDR 0 寄存器 0x0014:0x29C7
PHY_ADDR 0 寄存器 0x0015:0x0000
PHY_ADDR 0 寄存器 0x0016:0x0000
PHY_ADDR 0 寄存器 0x0017:0x0040
PHY_ADDR 0 寄存器 0x0018:0x6150
PHY_ADDR 0 寄存器 0x0019:0x4404
PHY_ADDR 0 寄存器 0x001A:0x0002
PHY_ADDR 0 寄存器 0x001B:0x0000
PHY_ADDR 0 寄存器 0x001C:0x0000
PHY_ADDR 0 寄存器 0x001d:0x0000
PHY_ADDR 0 寄存器 0x001E:0x0002
PHY_ADDR 0 寄存器 0x001F:0x0000
PHY_ADDR 0 寄存器 0x006E:0x0000
PHY_ADDR 0 寄存器 0x006F:0x3000
PHY_ADDR 3 寄存器 0x0000:0x1140
PHY_ADDR 3 寄存器 0x0001:0x7949
PHY_ADDR 3 寄存器 0x0002:0x2000
PHY_ADDR 3 寄存器 0x0003:0xA231
PHY_ADDR 3 寄存器 0x0004:0x0181
PHY_ADDR 3 寄存器 0x0005:0x0000
PHY_ADDR 3 寄存器 0x0006:0x0064
PHY_ADDR 3 寄存器 0x0007:0x2001
PHY_ADDR 3 寄存器 0x0008:0x0000
PHY_ADDR 3 寄存器 0x0009:0x0300
PHY_ADDR 3 寄存器 0x000A:0x0000
PHY_ADDR 3 寄存器 0x000B:0x0000
PHY_ADDR 3 寄存器 0x000C:0x0000
PHY_ADDR 3 寄存器 0x000D:0x0000
PHY_ADDR 3 寄存器 0x000E:0x0000
PHY_ADDR 3 寄存器 0x000F:0x3000
PHY_ADDR 3 寄存器 0x0010:0x5048
PHY_ADDR 3 寄存器 0x0011:0x0302
PHY_ADDR 3 寄存器 0x0012:0x0000
PHY_ADDR 3 寄存器 0x0013:0x0040
PHY_ADDR 3 寄存器 0x0014:0x29C7
PHY_ADDR 3 寄存器 0x0015:0x0000
PHY_ADDR 3 寄存器 0x0016:0x0000
PHY_ADDR 3 寄存器 0x0017:0x0040
PHY_ADDR 3 寄存器 0x0018:0x6150
PHY_ADDR 3 寄存器 0x0019:0x4404
PHY_ADDR 3 寄存器 0x001A:0x0002
PHY_ADDR 3 寄存器 0x001B:0x0000
PHY_ADDR 3 寄存器 0x001C:0x0000
PHY_ADDR 3 寄存器 0x001d:0x0000
PHY_ADDR 3 寄存器 0x001E:0x0002
PHY_ADDR 3 寄存器 0x001F:0x0000
PHY_ADDR 3 寄存器 0x006E:0x0000
PHY_ADDR 3 寄存器 0x006F:0x3000
此外、我读取了寄存器 0x0031 获取值 0x302 表示不启用端口镜像。
谢谢、
Prasad
尊敬的 J:
正如之前与 David 讨论的、 我在 phy 和连接器之间使用 2 线对通信。 我想通过配置 (strap) 引脚实现 10Mbps 和 100Mbps 的自动协商功能。 根据转储寄存器 值、我是否需要更改硬件配置 (strap) 引脚以实现 100Mbps 和 10Mbps 自动协商。 因为 David 建议我如果配置 (strap) 引脚完成自动协商、那么无需通过 MDIO 配置 phy。
我的问题也是根据数据表、PHY 使用 IEEE 802.3u、交换机 (SJA1105Q) 具有 IEEE 802.3 协议、但支持 10,100,1000Mbps 速度。协议差异是否会导致任何问题。
请帮助我解决这个问题、它现在对我们来说非常重要。
谢谢、
Prasad
您好 Prasad、
此外、我的问题是根据数据表、PHY 使用 IEEE 802.3u、交换机 (SJA1105Q) 具有 IEEE 802.3 协议但支持 10,100,1000 Mbps 速度。是否由于协议差异而发生任何问题。 [/报价]802.3u 是 802.3 的子集、因此不会出现问题。
我为混淆而道歉、但我们的绑定选项支持 10/100/1000 或 100/1000 的自动协商。 我们没有仅用于 10/100 广播的 strap 配置选项。
若要仅支持 10 和 100、您必须在配置 (strap) 上启用 10/100/1000 并禁用寄存器 0x0009 的位 9 和 8。 目前、您的寄存器转储显示寄存器 0x0009 为 0x0300、这意味着这些位已开启。
此致、
j
您好 Prasad、
正如 David 说的、将 LED_1 引脚搭接至模式 1 或 2(具体取决于您偏好的 RGMII TX 时钟偏差)会选择自动协商广播为 10/100/1000。
启用自动协商本身由 RX_CTRL 引脚控制、将其配置到模式 3 将启用自动协商。
您的寄存器转储已经显示已启用自动协商(寄存器 0x0000 的第 12 位为 1)。
但似乎自动协商未完成、因此未建立链路。
请遵循下表以了解建议的电阻设置:
此致、
j
尊敬的 J:
现在、我的硬件工作正常、感谢您的帮助。
目前、我正在为 phy 执行环回测试(模拟,数字,PCS)、但其无法正常工作。
我遵循 TI 给出的指南、如下所示:
注:我同时测试了 10 和 100 Mbps 的代码。
代码:
mdio_write (phy_addr、0x001F、0x8000);
HAL_delay (100);
//步骤 2:禁用自动协商、强制 10 Mbps
mdio_write (phy_addr、0x0000、0x0100);//(1) 速度选择
//步骤 3:启用模拟环回(假定为默认值)
MDIO_WRITE (phy_addr、0x0016、0x0003);//(2) 数字环回
//步骤 4:强制 MDI 模式(对于 10/100Mbps)
MDIO_WRITE (phy_addr、0x0010、0x5008);
//步骤 5:配置环回寄存器
MDIO_WRITE (phy_addr、0x00FE、0xE720);
HAL_DELAY (10);
//步骤 6:启用数据包生成、保留模拟环回
MDIO_WRITE (phy_addr、0x0016、0x5003);//(3) 数据包生成器+数字环回
HAL_delay (1000);//等待 PRBS 发送数据包
//锁定字节计数
MDIO_WRITE (phy_addr、0x0072、0x0201);
//读取锁定状态、数据包计数和错误计数
uint16_t LOCK_STATUS = mdio_read (phy_addr、0x0017);
uint16_t packet_count_1 = mdio_read (phy_addr、0x0071);
uint16_t ERROR_COUNT = mdio_read (phy_addr、0x0072);
//启用连续计数
MDIO_WRITE (phy_addr、0x0016、0xD004);
//更新数据包计数器
MDIO_WRITE (phy_addr、0x0072、0x0201);//(4)
uint16_t packet_count_2 = mdio_read (phy_addr、0x0071);//(5)
HAL_DELAY (1000);//可选:重复以观察计数器递增
MDIO_WRITE (phy_addr、0x0072、0x0201);
uint16_t packet_count_3 = mdio_read (phy_addr、0x0071);
//可选软复位
mdio_write (phy_addr、0x001F、0x4000);
//显示结果
printf(“PHY Addr:0x%02x\n“、phy_addr);
printf(“PRBS 锁定状态:0x%04X\n“、LOCK_STATUS);
printf(“初始数据包计数:%u\n“、packet_count_1);
printf(“更新的数据包计数:%u\n“、packet_count_2);
printf(“最终数据包计数:%u\n“、packet_count_3);
printf(“错误计数:%u\n“、ERROR_COUNT);
if (LOCK_STATUS &(1 << 11)){
printf(“PRBS 测试成功。\n“);
}其他{
printf(“PRBS 测试失败。\n“);
}
输出:
PHY 地址:0x00
PRBS 锁定状态:0x0000
初始数据包计数:2.
更新了数据包计数:2.
最终数据包计数:2.
错误计数:513
PRBS 测试失败。
请让我知道我在哪里做了错误的步骤。
谢谢、
Prasad