工具与软件:
嗨、团队:
您能解释一下我们如何通过 Linux 代码启动器件吗?
dp83822.c«phy«net«drivers - kernel/git/stable/linux.git - Linux 内核稳定树
1.初始状态时,我们需要先运行哪个命令?
dp83822_of_init 或 dp8382x_config_init
2.我们需要在初始化代码中修改什么寄存器?
谢谢!
LEO
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.
工具与软件:
嗨、团队:
您能解释一下我们如何通过 Linux 代码启动器件吗?
dp83822.c«phy«net«drivers - kernel/git/stable/linux.git - Linux 内核稳定树
1.初始状态时,我们需要先运行哪个命令?
dp83822_of_init 或 dp8382x_config_init
2.我们需要在初始化代码中修改什么寄存器?
谢谢!
LEO
尊敬的先生
我们将在 STM32H7R7L8H6H 平台上使用 LWIP 与 DP83825 PHY。 不过、我们只具有 DP83848的初始化代码、而不具有 DP83825的初始化代码。 因此、该器件无法执行 ping 操作、我们需要知道如何初始化 DP83825。
我打印了 DP83825的寄存器、 您能否确认 DP83825现在是否工作正常? 或者、您可以提供任何调试说明来帮助我们了解为何器件仍然无法 ping 通?
**打印 ETH 注册开始**
** Reg =0x00 value = 0x3100 **
** Reg =0x01 value = 0x786d **
** Reg =0x02 value = 0x2000 **
** Reg =0x03 value = 0xa140 **
**寄存器=0x04值= 0x01**
** Reg =0x05 Value = 0xc1e1 **
**寄存器=0x06值= 0x000D **
** Reg =0x07 Value = 0x2001 **
** Reg =0x08 value = 0x0000 **
** Reg =0x09 value = 0x0000 **
** Reg =0x0a value = 0x0100 **
** Reg =0x0B value = 0x0000 **
** Reg =0x0c value = 0x0000 **
** Reg =0x0d value = 0x0000 **
** Reg =0x0E value = 0x0000 **
** Reg =0x0F value = 0x0000 **
** Reg =0x10 value = 0x0615 **
** Reg =0x11 value = 0x0108 **
** Reg =0x12 value = 0x0000 **
** Reg =0x13 value = 0x0000 **
** Reg =0x17 value = 0x0065 **
** Reg =0x19 value = 0x8c00 **
** Reg =0x1f value = 0x0000 **
** Reg =0x4a0 value = 0xFFFF **
尊敬的 David/Leo:
我可以看到、您将 DP83822驱动器改用 DP83825、用于该应用。 加载驱动程序后这个寄存器转储吗?
我还想更好地了解这里使用的设置。 使用的是什么 xMII 接口? 此设置中的连接伙伴是什么?
我从寄存器转储中注意到的一点是 FIFO 下溢标志。 这通常指向时钟之间的 ppm 不匹配。 这可以通过测量 TX_CLK 和 PHY RX_CLK 进行检查。 它们彼此之间最多应在100ppm 之内。
此致!
Vivaan
您好、Vivaan
感谢您的答复。
寄存器转储在加载驱动程序后、初始代码位于下方。
int32_t DP83848_Init(dp83848_Object_t *pObj) { uint32_t regvalue = 0, addr = 0; int32_t status = DP83848_STATUS_OK; uint32_t phyID, regValue; //phy address = 0 pObj->IO.ReadReg(0x0, 0x02, ®value); //PHY_ID1_REG phyID = regvalue << 16; pObj->IO.ReadReg(0x0, 0x03, ®value); //PHY_ID2_REG phyID = (phyID | (regValue)); /* Reset PHY. */ status = pObj->IO.WriteReg(0x0, DP83848_BCR, 0x8000); //DP83848_BCR is 0x0 if (status == 0) { status = pObj->IO.ReadReg(0x0, 0x01, ®Value ); /* RMII configuration */ status = pObj->IO.ReadReg(0x0, 0x17, ®Value ); //status = pObj->IO.WriteReg(0x0, 0x17, 0x80| 0x1 ); /* Disable Wake on Lan. */ status = pObj->IO.ReadReg(0x0, 0x4a0, ®Value ); regValue &= ~(0x80|0x1|0x20); //DP83822_WOL_EN|DP83822_WOL_MAGIC_EN|DP83822_WOL_SECURE_ON status = pObj->IO.WriteReg(0x0, 0x12, regValue); /* Set PHY link status management interrupt. */ status = pObj->IO.ReadReg(0x0, 0x12, ®Value ); regValue |= 0x20; //regValue |= DP83822_LINK_STAT_INT_EN; -- Enable interrupt on change of link status status = pObj->IO.WriteReg(0x0, 0x12, regValue); /* Enable/Disable link up+down interrupt. */ status = pObj->IO.ReadReg(0x0, 0x11, ®Value ); //MII_DP83822_PHYSCR regValue |= 0x2; // DP83822_PHYSCR_INTEN regValue |= 0x1; // DP83822_PHYSCR_INT_OE status = pObj->IO.WriteReg(0x0, 0x12, regValue); /* Initialize AutoMDIX */ status = pObj->IO.ReadReg(0x0, 0x19, ®Value ); //MII_DP83822_PHYSCR regValue |= 0x8000; //DP83822_MDIX_AUTO_EN status = pObj->IO.WriteReg(0x0, 0x12, regValue); #if 0 /* Set the auto-negotiation then start it. */ status = pObj->IO.WriteReg(0x0, 0x04, 0x100 |0x080 |0x040 | 0x20 | 0x01 ); //PHY_AUTONEG_ADVERTISE_REG //(PHY_100BASETX_FULLDUPLEX_MASK | PHY_100BASETX_HALFDUPLEX_MASK | PHY_10BASETX_FULLDUPLEX_MASK |PHY_10BASETX_HALFDUPLEX_MASK // | PHY_IEEE802_3_SELECTOR_MASK status = pObj->IO.WriteReg(0x0, 0x0, 0x1000U | 0x0200U ); //PHY_AUTONEG_ADVERTISE_REG //result = PHY_DP83825_WRITE(handle, PHY_BASICCONTROL_REG, // (PHY_BCTL_AUTONEG_MASK | PHY_BCTL_RESTART_AUTONEG_MASK)); #else status = pObj->IO.ReadReg(0x0, 0x0, ®Value ); //regValue &= ~PHY_BCTL_ISOLATE_MASK; regValue &= ~0x400; status = pObj->IO.ReadReg(0x0, 0x0, ®Value ); /* Disable the auto-negotiation and set user-defined speed/duplex configuration. */ #endif } return status; }
我正在使用一台带10/100M/1G 网卡的笔记本电脑、并已设置静态 IP (192.168.1.100)。 DP83825配置为 RMII 模式、禁用 DHCP、IP 地址192.168.1.101、网络掩码255.255.255.0和网关192.168.1.100。
我将使用25MHz xtal 连接到 XI 引脚、因此 DP83825在主模式下运行、它将向 RMII_REF_CLK 输出50MHz
您好!
感谢您提供有关设置的所有说明性信息。
初始化代码看起来没有问题。
注意:uou 是指寄存器 Overflow_Status 寄存器(0x17)= 0x65、它似乎是 RMII_RCSR 标志。
是的、我讨论的是寄存器0x17。 此寄存器中有错误。 上溢/下溢位应翻转以显示0x1欠载/上溢、而0x0为正常运行。 此变更已被注意到、并将在下周之前在即将发布的数据表修订版中予以修正。 基于此、我们可以得出结论、器件出现下溢而不是上溢。
我认为导致这个问题的原因是电阻器 R98、R101和 R102。 这些电阻器用于产生环回、不应用于正常运行。 我建议您在移除这些电阻的情况下再次尝试测试。 如果由于任何原因这样做而无法解决此行为、我将执行以下调试步骤。
由于 PHY 设置为 RMII 主模式、因此我想再次检查可能导致此行为的某些因素。
首先、我要验证输入时钟是否满足数据表中规定的以下要求。 由于无法在原理图中找到确切的晶体、因此请您确认是否满足这些要求。
其次、我想验证50MHz 输出时钟。 您能否在 MAC 接口输入端测量此时钟、并确保 ppm 低于 MAC 预期的限值? 解释 ppm 差异的常见问题解答可以解决此问题。 对于此应用、我认为 RMII 配置#1示例最能描述该情况。
此致!
Vivaan
尊敬的 Leo:
以下两个文档应具有完成 IEEE 合规性测试所需的所有信息
本文档的第5节详细介绍了不同测试的寄存器设置
如有任何问题、请告诉我。
此致!
Vivaan