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.

[参考译文] TMDS64EVM:EtherCAT 初始化卡在 MDIO_phyRegRead 中;处理 verify_identifier_register 命令

Guru**** 2551110 points
Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1568973/tmds64evm-ethercat-initialization-stuck-in-mdio_phyregread-handling-verify_identifier_register-command

器件型号:TMDS64EVM
主题中讨论的其他部分:SysConfigDP83869

工具/软件:

您好、

我最近将一个 EtherCAT 子器件工程从工业通信 SDK 版本 9 更新为 11.00.00.08。 这更改了相对于 EtherCAT 和以太网 PHY 的 SysConfig 选项。
作为 SysConfig 参考、我使用了旧工程和工业 SDK 随附的 EtherCAT 示例工程中的现有 SysConfig 设置组合。

EtherCAT 初始化过程的一部分是启用以太网断电模式。 通过函数完成:  

ETHPHY_command (phy0_handleETHPHY_CMD_VERIFY_IDENTIFIR_REGISTER))

调试时、我注意到固件卡在第二个循环中评估 USER_ACCESS_REG、如以下代码片段所示:

    if(retVal == SystemP_SUCCESS)
    {
        /* Wait till transaction completion if any */
        while(CSL_MDIO_USER_GROUP_USER_ACCESS_REG_GO_EN_0x1 ==
            CSL_FEXT(hMdioRegs->USER_GROUP[userGroup].USER_ACCESS_REG, MDIO_USER_GROUP_USER_ACCESS_REG_GO))
        {}
        CSL_FINS(regVal, MDIO_USER_GROUP_USER_ACCESS_REG_GO, CSL_MDIO_USER_GROUP_USER_ACCESS_REG_GO_EN_0x1);
        CSL_FINS(regVal, MDIO_USER_GROUP_USER_ACCESS_REG_WRITE, CSL_MDIO_USER_GROUP_USER_ACCESS_REG_READ);
        CSL_FINS(regVal, MDIO_USER_GROUP_USER_ACCESS_REG_PHYADR, phyAddr);
        CSL_FINS(regVal, MDIO_USER_GROUP_USER_ACCESS_REG_REGADR, regNum);
        CSL_REG_WR(&hMdioRegs->USER_GROUP[userGroup].USER_ACCESS_REG, regVal);

        /* wait for command completion */
        while(CSL_MDIO_USER_GROUP_USER_ACCESS_REG_GO_EN_0x1 ==
            CSL_FEXT(hMdioRegs->USER_GROUP[userGroup].USER_ACCESS_REG, MDIO_USER_GROUP_USER_ACCESS_REG_GO))
        {}

        /* Store the data if the read is acknowledged */
        if(CSL_MDIO_USER_GROUP_USER_ACCESS_REG_ACK_PASS ==
        CSL_FEXT(hMdioRegs->USER_GROUP[userGroup].USER_ACCESS_REG, MDIO_USER_GROUP_USER_ACCESS_REG_ACK))
        {
            *pData = (uint16_t)(CSL_FEXT(hMdioRegs->USER_GROUP[userGroup].USER_ACCESS_REG,
                MDIO_USER_GROUP_USER_ACCESS_REG_DATA));
            retVal = SystemP_SUCCESS;
        }
        else
        {
            retVal = SystemP_FAILURE;
        }
    }

作为诊断问题的第一步、我检查了文档。 这说明、不应在调用`MDIO_initClock`的情况下调用` DIO_phyRegRead `M。 我通过在驱动程序函数`ETHPHY_DP83869_OPEN`中添加一条 LOG 语句来测试这是否完成、其中 initClock 函数是用基址参数调用的。 它打印了两次:

使用正确的参数调用 ETH PHY 进行初始化。 在“30090E40"处“处初始化 MDIO 时钟
使用正确的参数调用 ETH PHY 进行初始化。 在“30090E40"处“处初始化 MDIO 时钟

但是、即使 MDIO 时钟初始化、phyRegRead 函数也会挂起。 我还可以采取哪些其他步骤来进一步诊断问题? 我应该查看哪些特定的 SysConfig 设置吗?

此致、

Matthijs

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

    您好 Matthijs、

    我将研究这个问题并提供反馈。

    此致、

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

    尊敬的 Matthijs:

    、其中说明如果不调用` DIO_initClock `M、则不应调用`MDIO_phyRegRead`。

    由于您使用的是 MDIO 手动模式(EtherCAT SysConfig 模块中已启用复选框) 、因此 不需要 MDIO_initClock API 调用。  MDIO 时钟 (MCLK) 频率默认固定在 2.5MHz 左右、不支持运行时配置。  有关 MDIO 手动模式、请参阅 PRU-ICSS 固件

    我还可以采取哪些其他步骤来进一步诊断问题? 是否有我应该查看的特定 SysConfig 设置?

    能否提供 MDIO 存储器转储? 我指的是以下存储器空间:

    • ICSS MDIO 存储器空间:0x300B2400 至 0x300B248C
    • MDIO 仿真寄存器空间:0x30090E40 至 0x30090ECF)

    此致、
    Aaron

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

    您好 Aaron、

    感谢您参考该文档。 我注意到tiesc_mdioManualModeSetup()这里的示例函数``、我更新后的 EtherCAT 代码尚未调用。
    添加此引脚会更改寄存器转储中的值、并解决读取标识符寄存器时的挂起问题。

    为完整起见、我有两个寄存器转储、其中添加和未添加函数:

    如果没有名为 mdioManualModeSetup 函数、打印输出为:

     

    ICSSG_MDIO_space [0x300B2400..0x300B248C] dump:
    00070107 810000FF 00000000 00000000 00000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000 00000001 00000000 FFFFFFFF 00000000
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000
    
    MDIO_emulation_space [0x30090E40..0x30090ECF] dump:
    00000000 400000FF 00000000 00000000 00000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000

     

    通过调用设置函数、打印的输出变为:

     

    ICSSG_MDIO_space [0x300B2400..0x300B248C] dump:
    00070107 810000FF 00000000 00000000 00000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000 00000005 80000000 FFFFFFFF 00000000
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000
    
    MDIO_emulation_space [0x30090E40..0x30090ECF] dump:
    00000000 400000FF 00000000 00000000 00000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
    00000000 00000000 00000000 00000000

    我认为这个问题已经解决了。 感谢您的快速响应!