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.

[参考译文] DP83822I:合规性测试- 10BASE-T 0x0027不执行任何操作

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

https://e2e.ti.com/support/interface-group/interface/f/interface-forum/1176056/dp83822i-compliance-testing---10base-t-0x0027-does-nothing

器件型号:DP83822I

大家好、

在 DP83822I 上运行10BASE-T 标准的合规性测试时遇到问题、因为0x0027寄存器没有为我执行任何操作。

我可能缺少启用此函数的指令、或者我们为写入扩展寄存器而编写的包装程序无法正常工作。

我将在明天尝试绕过该函数。  

首先、我按照 SNLA266进行了测试、因为本手册绕过了0x0027的使用、但对于特定测试、我的 LeCroy 范围要求提供全1代码。

对应 于寄存器0x0027的0x0013值、这不起作用。

/*Start of Test modes*/
        // snla266 A.3 10BASE-Te Standsard Test Script MDI works but only with the 0x0016 not with 0x0027
        HalEthInitStatus = HAL_ETH_WritePHYRegister(&LWIP_MOD_ETHIF_EtherHandle, ETH_PHY_ADDRESS, 0x001F, 0x8000); // software reset (clears register
        HalEthInitStatus = HAL_ETH_WritePHYRegister(&LWIP_MOD_ETHIF_EtherHandle, ETH_PHY_ADDRESS, 0x0000, 0x0100); // programs DUT to 10BASE-T mode
        HalEthInitStatus = HAL_ETH_WritePHYRegister(&LWIP_MOD_ETHIF_EtherHandle, ETH_PHY_ADDRESS, 0x0019, 0x0021); // programs DUT to Forced MDI mode
        HalEthInitStatus = HAL_ETH_WritePHYRegister(&LWIP_MOD_ETHIF_EtherHandle, ETH_PHY_ADDRESS, 0x0016, 0x7108); //programs DUT to generate data and enables analog loopback mode
        //HalEthInitStatus = HAL_ETH_WritePHYRegister(&LWIP_MOD_ETHIF_EtherHandle, ETH_PHY_ADDRESS, 0x0027, 0x0019);   // this should never work since 0x0027 is bigger than the biggest standard register (0x001F) 
        //HalEthInitStatus = writeExtRegister(&LWIP_MOD_ETHIF_EtherHandle, ETH_PHY_ADDRESS, 0x0027, 0x0019); // this doesn't work I don't know why
        HalEthInitStatus = HAL_ETH_WritePHYRegister(&LWIP_MOD_ETHIF_EtherHandle, ETH_PHY_ADDRESS, 0x001F, 0x4000); // digital reset (doesn’t clear reg
        // end
        HAL_Delay(1000);
        // snla266 A.3 10BASE-Te Standard Link Pulse works
        HalEthInitStatus = HAL_ETH_WritePHYRegister(&LWIP_MOD_ETHIF_EtherHandle, ETH_PHY_ADDRESS, 0x001F, 0x8000); // software reset (clears register
        HalEthInitStatus = HAL_ETH_WritePHYRegister(&LWIP_MOD_ETHIF_EtherHandle, ETH_PHY_ADDRESS, 0x0000, 0x0100); // programs DUT to 10BASE-T mode
        HalEthInitStatus = HAL_ETH_WritePHYRegister(&LWIP_MOD_ETHIF_EtherHandle, ETH_PHY_ADDRESS, 0x0019, 0x0021); // programs DUT to Forced MDI mode
        HalEthInitStatus = HAL_ETH_WritePHYRegister(&LWIP_MOD_ETHIF_EtherHandle, ETH_PHY_ADDRESS, 0x001F, 0x4000); // digital reset (doesn’t clear reg
        // end
        HAL_Delay(1000);
        // snla266 A.3 10BASE-Te All Ones doesn't work
        HalEthInitStatus = HAL_ETH_WritePHYRegister(&LWIP_MOD_ETHIF_EtherHandle, ETH_PHY_ADDRESS, 0x001F, 0x8000); // software reset (clears register
        HalEthInitStatus = HAL_ETH_WritePHYRegister(&LWIP_MOD_ETHIF_EtherHandle, ETH_PHY_ADDRESS, 0x0000, 0x0100); // programs DUT to 10BASE-T mode
        HalEthInitStatus = HAL_ETH_WritePHYRegister(&LWIP_MOD_ETHIF_EtherHandle, ETH_PHY_ADDRESS, 0x0019, 0x0021); // programs DUT to Forced MDI mode  
        HalEthInitStatus = writeExtRegister(&LWIP_MOD_ETHIF_EtherHandle, ETH_PHY_ADDRESS, 0x0027, 0x0013);
        HalEthInitStatus = HAL_ETH_WritePHYRegister(&LWIP_MOD_ETHIF_EtherHandle, ETH_PHY_ADDRESS, 0x001F, 0x4000); // digital reset (doesn’t clear reg
        HAL_Delay(1000);

有人能告诉我0x0027寄存器的秘密吗?

提前感谢  

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

    尊敬的 Lukas:

    寄存器0x0027位于扩展寄存器空间中、您无法直接访问它。 请按照第8.4.2.1节中的"扩展寄存器空间"过程来写入或读取该寄存器:
    8.4.2.1扩展寄存器空间访问
    https://www.ti.com/lit/ds/symlink/dp83822i.pdf?ts=1669830898442&ref_url=https%253A%252F%252Fwww.ti.com%252Fproduct%252FDP83822I

    此致、
    Rahul

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

    您好、Rahul、

    我可以告诉 writeExtRegister()函数执行数据表中指定的操作。 将 LED 设置为特定行为可以正常工作。

    ...
    #define PHY_REGCR (0x000D)
    #define PHY_REGCR_MMD31 (0x001F) /**< DEVAD = 11111 (general MMD register accesses) */
    #define PHY_REGCR_CMD_ADDRESS (0x0000) /**< CMD = 00 (address) */
    #define PHY_REGCR_CMD_DATA_NO_POST_INCREMENT (0x4000) /**< CMD = 01 (Data, no post increment) */
    #define PHY_ADDAR (0x000E)
    ...
    static HAL_StatusTypeDef writeExtRegister(ETH_HandleTypeDef *ETHHandle, uint32_t PHYAddr, uint16_t PHYReg, uint32_t RegValue)
    {
        HAL_StatusTypeDef HalEthStatus = HAL_OK;
    
        HalEthStatus |= HAL_ETH_WritePHYRegister(ETHHandle, PHYAddr, PHY_REGCR, (PHY_REGCR_CMD_ADDRESS | PHY_REGCR_MMD31));
        HalEthStatus |= HAL_ETH_WritePHYRegister(ETHHandle, PHYAddr, PHY_ADDAR, PHYReg); /* address to write to */
        HalEthStatus |= HAL_ETH_WritePHYRegister(ETHHandle, PHYAddr, PHY_REGCR, (PHY_REGCR_CMD_DATA_NO_POST_INCREMENT | PHY_REGCR_MMD31));
    
        /* Write value into indirectly addressed register */
        HalEthStatus |= HAL_ETH_WritePHYRegister(ETHHandle, PHYAddr, PHY_ADDAR, RegValue);
    
        return HalEthStatus;
    }
    ...

    有没有其他的建议,为什么它可能不起作用?

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

    尊敬的 Lukas:

    让我尝试在我们的实验中重复此操作、并使用我的结果更新您。

    本周我还有几个其他客户问题需要调试、下周早些时候我会再与您联系。

    谢谢、
    Rahul