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.

[参考译文] AM2432:EtherCAT。 基于 PHY 轮询的链路检测 (LINKSEL=0) 在 SDK 2025 中 init→PREOP 时失败—在 SDK 11 中工作

Guru**** 2925550 points

Other Parts Discussed in Thread: SYSCONFIG

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1649212/am2432-ethercat-phy-polling-based-link-detection-linksel-0-fails-at-init-preop-in-sdk-2025-works-in-sdk-11

器件型号: AM2432
主题: SysConfig 中讨论的其他器件

  1. 背景

    我们将ind_comms_sdk_am243x_11_00_00_13ind_comms_sdk_am243x_2025_00_00_08在定制 PCB 上使用 AM243x 上的 DP83822 PHY (ICSSG1) 将 EtherCAT CiA402 子器件从 SDK 11 () 迁移到 SDK 2025 ()。

    在 SDK 11 中、我们通过从基于 MLINK 的 链路检测切换到基于 PHY 轮询的链路检测(,LINKSEL=0)、成功解决了定制 PCB 上的 RXLINK 引脚干扰问题ECAT_PHYUSERXLINK_IN = false。 此配置可稳定达到 OP。

    我们尝试在 SDK 2025 中采用相同的方法、但始终失败。


    请参阅: testResult01.zip 

    原始 SDK 示例比较

    SDK 11 原始 (ind_comms_sdk_am243x_11_00_00_13/.../ESL_BOARD_config.h):

    // No ti_drivers_config.h include, no ENHANCED_LINK_ENABLED
    #define ECAT_PHYUSERXLINK_IN    (true)   // MLINK Based (hardware MDIO normal mode)
    #define ECAT_PHYPOLINVERT_IN    (true)   // ACTIVE_HIGH
    

    SDK 2025 原始版本 (ind_comms_sdk_am243x_2025_00_00_08/.../ESL_BOARD_config.h):

    #include "ti_drivers_config.h"   // Contains ENHANCED_LINK_ENABLED
    #ifdef ENHANCED_LINK_ENABLED
        #define ECAT_PHYUSERXLINK_IN    (true)   // MLINK Based (MDIO manual mode, errata i2329)
        // Polarity from SysConfig (PHY0_LINK_POLARITY_ACTIVE_HIGH)
    

    主要区别:SDK 11 不使用 MDIO 手动模式(缺失)ENHANCED_LINK_ENABLED 。 SDK 2025 始终使用 MDIO 手动模式。


    工作参考:SDK 11 自定义项目

    我们的工作 SDK 11 自定义工程 (ethercat_subdevice_cia402_clang_IND11_shyu3test) 使用 LINKSEL=0 作为 RXLINK 引脚干扰敏感性的权变措施:

    #define ECAT_PHYUSERXLINK_IN    (false)   // LINKSEL=0, PHY Polling Based
    #define ECAT_PHYPOLINVERT_IN    (true)    // ACTIVE_HIGH
    

    UART 引导输出(稳定,达到 OP):

    Configure Phy bits: PhyAddr:3, LinPol:HIGH, PhyAddr:1, LinPol:HIGH, (0x0)
    ...
    PDO size In:0x27/0xd
    PDO size Out:0x27/0xd, In:0x27/0xd   ← OP reached, stable
    

    MDIO_LINK (0x300B240C) = 0x00000800 —稳定,无振荡。


    SDK 2025 测试结果 — LINKSEL=0 始终失败

    测试 A:手动 ESL_BOARD_config.h 编辑 (LINKSEL=0 + ACTIVE_HIGH)

    #define ECAT_PHYUSERXLINK_IN    (false)
    #define ECAT_PHYPOLINVERT_IN    PHY_LINK_POL_ACTIVE_HIGH
    

    结果: TwinCAT 扫描完全失败—未检测到从设备。

    测试 B:SysConfig—取消选中“Enable Enhanced Link“(启用增强链接)→基于 PHY Polling

    ti_drivers_config.h 更改 SysConfig 后: ENHANCED_LINK_ENABLED 删除。

    UART 引导输出:

    Configure Phy bits: PhyAddr:3, LinPol:LOW, PhyAddr:1, LinPol:LOW, (0xa)
    ...
    SSC_checkTimer:MaxET:25
    ← No PDO size output, OP never reached
    

    TwinCAT 结果:

    • 扫描:检测到设备(框 1 可见)正常
    • init→PREOP: 失败—通信错误 0x71f (1823) 不正常

    注: (0xa) 即使基于 PHY 轮询、固件配置仍会显示、而 SDK 11 (0x0)则显示。


    汇总表

    配置 扫描 PREOP OP 注释
    SDK 2025、LINKSEL=1、ACTIVE_HIGH(原始) 失败 未检测到器件
    SDK 2025、LINKSEL=1、ACTIVE_LOW 开来 开来 开来 ~1s 端口 A 振荡
    SDK 2025、LINKSEL=0、ACTIVE_HIGH(手动) 失败 未检测到器件
    SDK 2025、LINKSEL=0、基于 PHY 轮询 (SysConfig) 开来 失败 0x71f 始终失败
    SDK 11、LINKSEL=0、基于 PHY 轮询 开来 开来 开来 稳定的基准

    问题

    1. 为什么基于 PHY 轮询的链路检测(,禁用增强型链路)ECAT_PHYUSERXLINK = false在 INIT→PREOP 时失败、 0x71f 但在 SDK 2025 中会出现错误、而相同的 LINKSEL=0 配置在 SDK 11 中可以正常工作?

    2. 在通过 SysConfig 选择基于 PHY 轮询的 SDK 2025 中、UART 仍会打印 FW 配置 (0xa) 、其值与基于 MLINK 的模式相同。 在 SDK 11 中、基于 PHY 轮询生成 (0x0)。 SDK 2025 的基于 PHY 轮询的模式是否与 SDK 11 使用不同的内部实现? 是否需要额外的配置步骤?

    3. ECAT_PHYUSERXLINK = false在采用 MDIO 手动模式的 SDK 2025 中、是否正式支持基于 PHY 轮询的链路检测 ()(勘误表 i2329)? 如果不是、对于定制 PCB 具有 RXLINK 引脚干扰灵敏度的客户、建议使用哪种方法?

如果您需要更多信息、请向我索取。

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

    更多的信息,告诉你。  

    我从下面的自定义 PCB 获得了自举状态的自举寄存器数据。


    在“ind_comms_sdk_am243x_11_00_00_13“和“ind_comms_sdk_am243x_2025_00_00_08“示例中、此结果是相同的。

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

    您好:徐承镐、

    我最终在 AM243x 目标上在 PHY 轮询模式下重现了问题、该修复程序将包含在即将发布的版本中。

    作为解决方法、您可以在  ecSubDeviceSimple.c 文件中的函数 EC_SLV_APP_SS_registerStacklessBoardFunctions() 中添加以下代码。

    /* Write 0x01 to MDIO Mode Selection Register 0x0E35 to select firmware workaround mode for MDIO before running the PRU core */
    
    /* Method 1 */
    uint32_t regData = 0;
    regData = CSL_REG32_RD_RAW((uint32_t*)(0x30090E34));
    regData |= (0x00000100);
    CSL_REG32_WR_RAW((uint32_t*)(0x30090E34),regData);
    
    /* Method 2 */
    uint8_t regVal = 0;
    /* Note: This API is designed to be used after the initialization of SubDevice handler.
    In this case, it is called before the SubDevice init with a handler to EC_API_SLV_SHandle_t, which is not NULL */  
    EC_API_SLV_writeByteEscRegister((EC_API_SLV_SHandle_t*)pAppInstance_p,0xE35,0x01);
    EC_API_SLV_readByteEscRegister((EC_API_SLV_SHandle_t*)pAppInstance_p,0xE35,&regVal);
    OSAL_printf("Register 0xE35 value = %d\n\r",regVal);

    此外、请在 ESL_BOARD_config.h 文件中正确配置 PHY 链路极性。 要配置链路极性、请参阅 EtherCAT 调试指南。  

        更多详细信息、请参阅控制器寄存器列表和 MDIO 手动模式。

    此致、

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

    您好、Harsha、

    非常感谢您提供的解决方法和及时的响应。 我很高兴地报告、迁移现已完全正常工作。 下面是我应用的内容和结果的摘要、供记录使用。

    应用的更改

    1) 0xE35 权变措施(您建议的代码,方法 2)

    由于我们的项目基于 CiA402 示例ecSubDeviceCiA402.c()、因此我在的条目中添加了变通办法 EC_SLV_APP_CIA_registerStacklessBoardFunctions()ecSubDeviceSimple.c 您引用的函数的 CiA402 对应项:

    void EC_SLV_APP_CIA_registerStacklessBoardFunctions(EC_SLV_APP_CIA_Application_t *pAppInstance_p)
    {
        /* TI_ADVICE: SDK 2025 PHY Polling Based bug workaround.
         * Apply only when MDIO Manual Mode FW is configured for PHY Polling Based
         * link detection (LINK_POLLING_ENABLE bit set). */
    #if defined(MDIO_MANUAL_MODE_FW_CONFIG_VALUE) && \
        ((MDIO_MANUAL_MODE_FW_CONFIG_VALUE) & MDIO_MANUAL_MODE_LINK_POLLING_ENABLE)
        {
            uint8_t regVal = 0;
            EC_API_SLV_writeByteEscRegister((EC_API_SLV_SHandle_t*)pAppInstance_p, 0xE35, 0x01);
            EC_API_SLV_readByteEscRegister((EC_API_SLV_SHandle_t*)pAppInstance_p, 0xE35, &regVal);
            OSAL_printf("Register 0xE35 value = %d\n\r", regVal);
        }
    #endif
        /* ... rest of original function ... */
    }
    

    我将它打包在与 sysconfig 生成的绑定的预处理器保护中 MDIO_MANUAL_MODE_FW_CONFIG_VALUE、因此只有在将项目配置为基于 PHY 轮询的模式时才会编译此变通办法。 这样、可以稍后通过 SysConfig 干净地切换相同的源代码(例如,在发货后验证官方修复)。

    2) Sysconfig — 取消选中 Enable Enhanced Link

    这会将“MDIO 手动模式链接状态更新“自动切换为 基于 PHY 轮询、丢弃 ENHANCED_LINK_ENABLED并设置:

    #define MDIO_MANUAL_MODE_FW_CONFIG_VALUE \
        (MDIO_MANUAL_MODE_LINK_POLLING_ENABLE | MDIO_MANUAL_MODE_LINK_POLLING_INTR_ENABLE | MDIO_MANUAL_MODE_PRU_CLK_FREQ_200)
    

    3) ESL_BOARD_config.h —按照您的指导、确定 PHY 链路极性

    #else 分支中(未定义时处于活动状态) ENHANCED_LINK_ENABLED

    #define ECAT_PHYUSERXLINK_IN     (false)
    #define ECAT_PHYUSERXLINK_OUT    (false)
    #define ECAT_PHYPOLINVERT_IN     PHY_LINK_POL_ACTIVE_HIGH
    #define ECAT_PHYPOLINVERT_OUT    PHY_LINK_POL_ACTIVE_HIGH
    

    ACTIVE_HIGH 之所以选择、是因为在基于 PHY 轮询的模式下、链路状态源自 BMSR.LINK_STS、后者根据 IEEE 802.3 为高电平有效。 原始 MLINK 引脚极性(通过切换时在我们的定制 PCB 上测量为低电平有效) MDIO_LINK_REG 0x300B240C在这种模式下不相关。

    结果

    项目 结果
    UART Register 0xE35 value = 1 已打印✓
    配置 PHY 位打印 PhyAddr:3, LinPol:HIGH, PhyAddr:1, LinPol:HIGH, (0x0)
    TwinCAT 扫描 使用完整 ESI 名称“TI EtherCAT Toolkit CiA402 用于 AM243X...“检测到的框 ✓μ s
    init→PREOP→SAFEOP→OP 所有转换都成功✓
    端口 A Carrier / Open 稳定 (无振荡)✓
    CiA402 PDO Statusword、运行模式、位置/速度/扭矩实际值—所有这些都已映射并更新 μ✓

    感谢你的帮助。 我已经正确完成了 custom_phy 设置、并且“增强型链接“和“基于 MLINK 的“功能已成功实现。
    此附加文件是我创建的一个 custom_phy 文件。 如果有任何错误、请给我一些建议。
    单击下载页面链接。


    我可以再问一下吗?
    1.我是否应该将/*方法 2 */补丁应用于 EC_SLV_APP_SS_registerStacklessBoardFunctions() 函数(基于 MLINK)? 或者、我是否应该保留代码、以便仅使用基于轮询的方法?

     2.您以两种版本分发了 IND_SDK2026:IND_COMMS_SDK_am243x_2026_00_00_06 和 IND_COMMS_SDK_am243x_2026_00_06_eval。 两个版本之间.lib 文件似乎存在差异。
    哪个版本适合实际生产环境?
    它们是否执行不同的功能?

    3. 我们是否可以假设 IND_SDK2026 示例与 IND_SDK2025 示例相同? 是否有任何其他设置或更改?

     -黑盒 EC 子设备的方面, hwal 固件 bin

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

    您好:徐承镐、

    感谢您的确认。

    [quote userid=“532223“ url=“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1649212/am2432-ethercat-phy-polling-based-link-detection-linksel-0-fails-at-init-preop-in-sdk-2025-works-in-sdk-11/6373593 我是否应该将/*方法 2 */补丁应用于 EC_SLV_APP_SS_registerStacklessBoardFunctions() 函数(基于 MLINK)? 或者我是否应该将代码保留为仅使用基于轮询的方法?

    将 0x01 写入 MDIO 模式选择寄存器 (0xE35) 可选择 MDIO 通信的固件权变措施、并且应适用于基于 MLINK 和基于轮询的链路状态更新。

    [quote userid=“532223“ url=“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1649212/am2432-ethercat-phy-polling-based-link-detection-linksel-0-fails-at-init-preop-in-sdk-2025-works-in-sdk-11/6373593  您以两个版本分发了 IND_SDK2026:IND_COMMS_SDK_am243x_2026_00_00_06 和 IND_COMMS_SDK_am243x_2026_00_06_eval。 两个版本之间.lib 文件似乎存在差异。
    哪个版本适合实际生产环境?
    它们是否执行不同的功能?

    请指定 ind_comms_sdk_am243x_2026_00_00_06 和 ind_comms_sdk_am243x_2026_00_06_eval 的来源。  

    请参阅 许可证类型

    [引述 userid=“532223“ url=“~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1649212/am2432-ethercat-phy-polling-based-link-detection-linksel-0-fails-at-init-preop-in-sdk-2025-works-in-sdk-11/6373593

    3. 我们是否可以假设 IND_SDK2026 示例与 IND_SDK2025 示例相同? 是否有任何其他设置或更改?

     -黑盒 EC 子设备的方面, hwal 固件 bin

    [/报价]

    请参阅 发行说明 2026.00.00 页面。

    此致、