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.

[参考译文] AM2431:将 AM2431 RGMII 接口链接到以太网交换机 IC

Guru**** 2513045 points
Other Parts Discussed in Thread: AM2431, UNIFLASH, SYSCONFIG, AM2432

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1307038/am2431-linked-the-am2431-rgmii-interface-to-ethernet-switch-ic

器件型号:AM2431
主题中讨论的其他器件: UNIFLASHSysConfigAM2432

您好!所有 TI 专家!

我目前正在配置我们采用 AM2431的定制电路板、旨在从外部 PHY、特别是以太网交换机 IC (Realtek:RTL8363NB-V)连接 AM2431的 RGMII 接口。 通过我的研究、我收到了在很大程度上与所提供的 SDK 文档一致的建议:

https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/latest/exports/docs/api_guide_am243x/enet_migration_guide_top.html#CustomBoardSupport

https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/latest/exports/docs/api_guide_am243x/enet_migration_guide_top.html#ExternalPhyManagement

我已在 LP-AM243x 板上成功测试了 SDK 示例代码"Enet Layer 2 CPSW Example"。 我打算为我们的定制电路板复制该逻辑。

因此、根据我对文档的了解、我计划创建必要的驱动程序.c.h文件。 此外、我将启用定制板项、如下面的文档片段中所示:

[启用自定义板项的片段]

我采用这种方法的方向是否正确、或者我可能忽视了哪些重要因素?

您能为我提供更多有关如何在定制电路板上完成此任务的指导吗?

此致、

拉里

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

    Larry、您好!
     希望您做得好! 感谢您发布此问题。

    我看到您正在尝试将 AM243x 开关的 RGMII 连接到  RTL8363NB-V 开关的 RGMII。 由于  RTL8363NB-V 额外连接了两个 PHY、因此一个 挑战是从 AM243x 中处理这两个问题。

    我可以建议以下选项开始,如果这不符合您的要求,我们必须探索其他选项-

    使用 No-PHY 接口:

    这可能是更简单的开始方法。 这将忽略驱动程序内部的 PHY 链路状态、并假定链路始终接通。

    1. 请参阅 https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/latest/exports/docs/api_guide_am243x/enet_migration_guide_top.html#CustomBoardSupport 以创建 enet_custom_board_config.c 文件、以便更改电路板的特定详细信息。
      请注意、syscfg 自动生成的 ti_board_config.c 文件不可编辑、因此必须遵循上述链接、这样您就可以在 enet_custom_board_config.c 中开发特定于电路板设置的代码、并且它会忽略自动生成的 ti_board_config.c。
    2. 将与 AM243x 上的以太网端口对应的 PHY 地址设置为"ENETPHY_INVALID_PHYADDR" enet_custom_board_config.c  中、在 应用程序源代码的 EnetApp_initLinkArgs ()函数中设置 RGMII 链接相关参数。
      void EnetApp_initLinkArgs(Enet_Type enetType,
                                uint32_t instId,
                                EnetPer_PortLinkCfg *linkArgs,
                                Enet_MacPort macPort)
      {
      ...
      -        linkCfg->speed = ENET_SPEED_AUTO;
      -        linkCfg->duplexity = ENET_DUPLEX_AUTO;
      +        linkCfg->speed = ENET_SPEED_1GBIT;
      +        linkCfg->duplexity = ENET_DUPLEX_FULL;
      ...
      }
    3. 由于我们已将 PHY 地址设置为"ENETPHY_INVALID_PHYADDR"、因此以太网驱动器(ENET-LLD) 会将其作为未连接 Phy 的特殊情况进行处理。 因此、它不会触发 管理接口引脚(MDIO 和 MDC 引脚)上的任何交互
    4. 此外、将 PHY 地址设置为"ENETPHY_INVALID_PHYADDR"也不会 src 自动调用"cu_plus_SDK/source/networking/enet/core/kernel/SDK/phy"或"cu_plus_SDK/source/networking/enet/core/include/phy"中存在的任何 PHY 驱动程序、例如定期检查链路状态等。
    5. 为了超越(5)的限制、您必须启用外部 PHY 管理。 外部 PHY 管理、允许应用程序代码通过 MDIO/MDC 接口与 PHY 交互并配置 PHY。
      请参阅 https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/latest/exports/docs/api_guide_am243x/enet_migration_guide_top.html#ExternalPhyManagement 、了解如何启用外部 Phy 管理。
      此外、请参考'mcu_plus_sdk/examples/networking/lwip/enet_lwip_cpsw/extPhyMgmt '来查看外部物理管理的示例实现。 请 注意、只有"examples/networking/lwip/enet_lwip_cpsw" 是我们提供了 ExternalPhyManagement 演示的单个示例

      请注意、ExternalPhyManagement 与外部 Phy 驱动器不同。  外部物理管理仅允许 将 PHY 管理接口(MDIO/MDC)控制指定给应用程序、而与 PHY 无关。 具体来说、 ExternalPhyManagement 会禁用"cu_plus_sdk/source/networking/enet/core/include/phy/enetphy.h" 模块的运行、并允许应用定义自定义物理层管理实现。
    6. 为了集成 RTL8363NB-V 的 PHY 驱动器:
      将 PHY 驱动程序代码复制到应用程序的"extPhyMgmt"文件夹中。 修改  Drv_Handle gEnetExtPhyDrvs[] 并链接到新的驱动程序代码。 确保"EnetExtPhy_bindDriver ()"调用成功。
    7.  RTL8363NB-V 的控制配置 ,例如 在适当的函数中设置 enet_custom_board_config.c 中的 MII 模式(RGMII)、速度和其他控制参数。 我无法再发表更多评论、因为我们没有 RTL8363NB-V 方面的专业知识。 您可能必须创建两个内置的 PHY 驱动程序句柄(即 gEnetExtPhy_phyObjs 应该 是两个数组)来处理 RTL8363NB-V 的两个 PHY。
    8. 在应用中编写一个新任务、以并行轮询 MDIO 接口 、以了解 RTL8363NB-V 的两个 PHY 的链路状态、并根据此任务管理数据包 Tx 和 Rx 的数据路径。


    谢谢。此致、

    普拉德普

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

    Pradeep、您好!

    感谢您的详细解释;我再补充一下。 目前、我们的产品板只有一个 RTL8363NB-V 连接到 AM2431。 它们之间的通信接口仅为 MDC/MDIO 和 RGMII。 我已经做了以下事情:

    1. 在 syscfg 中的 Enet (CPSW)-> MAC Port Config -> MAC Port2 Config 下、我禁用了 Mac 端口2。
    2. 在 syscfg 中的"Enet (CPSW)-> Pinmux config"下、我取消选中了 RGMII2信号。
    3. 我还按照 SDK 说明创建 custom_board_config.c 和 phy 驱动程序。

    我基于"Enet Layer 2 CPSW 示例"、运行后、我在控制台上看到以下内容:

    [MAIN_Cortex_R5_0_0] ==========================
         Layer 2 CPSW Test    
    ==========================
    
    Init all peripheral clocks
    ----------------------------------------------
    Enabling clocks!
    
    Create RX tasks
    ----------------------------------------------
    cpsw-3g: Create RX task
    
    Open all peripherals
    ----------------------------------------------
    cpsw-3g: Open enet
    EnetAppUtils_reduceCoreMacAllocation: Reduced Mac Address Allocation for CoreId:1 From 4 To 2 
    
    Init all configs
    ----------------------------------------------
    cpsw-3g: init config
    Mdio_open: MDIO Manual_Mode enabled
    
    cpsw-3g: Open port 1
    
    Attach core id 1 on all peripherals
    ----------------------------------------------
    cpsw-3g: Attach core
    cpsw-3g: Open DMA
    initQs() txFreePktInfoQ initialized with 16 pkts
    cpsw-3g: Waiting for link up...

    如上所示、控制台在"cpsw-3G:正在等待链路建立..."处停止。 在我看来、它无法识别 PHY。 在调试模式下、我发现未执行我写入的 PHY 驱动程序。 在 enetphy.c 的第313行、有一条条件语句似乎用于通过 MDC/MDIO 确认 PHY 是否处于活动状态。 由于它不会传递这个条件、将绑定我的 PHY 驱动程序的函数 EnetPhy_bindDriver 不会被执行。 奇怪的是、当我在 enet (CPSW)-> Pinmux 配置中取消选择 MDC 和 MDIO 信号时、此条件语句成功、并执行 EnetPhy_bindDriver、从而允许 PHY 驱动程序运行。

    最后、研究 SDK 代码后、我发现对 MDIO 的控制需要使用 IOCTL 宏。 但是、RTL8363NB-V 需要我通过 MDIO 将值写入其寄存器、以进行初始化设置。 您能否分享一下应该如何做到这一点? 谢谢!

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

    Larry、您好!

    • 在 syscfg 中的 Enet (CPSW)-> MAC Port Config -> MAC Port2 Config 下、我禁用了 Mac 端口2。
    • 在 syscfg 中的"Enet (CPSW)-> Pinmux config"下、我取消选中了 RGMII2信号。
    • 我还按照 SDK 说明创建 custom_board_config.c 和 phy 驱动程序。
    [/报价]

    这是正确而正确的方法。


    关于"cpsw-3G:正在等待链路建立。。。"
     一些后续问题:

    • 您的 SDK 版本是什么? 我需要用它来关联您提到的行号。
    • 您是如何设置 PHY 地址的? 它是否在 custom_board_config.c 文件中?  RTL8363NB-V 中有两个 PHY、您设置了哪个地址?

    关于-  

    最后,研究完 SDK 代码后,我发现对 MDIO 的控制需要使用 IOCTL 宏。 但是、RTL8363NB-V 需要我通过 MDIO 将值写入其寄存器、以进行初始化设置。 您能否分享一下该如何完成此操作?

    不允许/建议直接从应用程序写入 PHY 寄存器。 PHY 寄存器读取或写入只应从"y-phy-driver"发生。

    如果您遵循了- https://software-dl.ti.com/mcu-plus-sdk/esd/AM243X/latest/exports/docs/api_guide_am243x/enetphy_guide_top.html#enetphy_guide_implementing

    EnetPhy_Drv gEnetPhyDrvMyDrv =
    {
        .name = "My PHY driver",
        .isPhyDevSupported = MyPhy_isPhyDevSupported,
        .isMacModeSupported = MyPhy_isMacModeSupported,
        .config = MyPhy_config,
        .reset = MyPhy_reset,
        .isResetComplete = MyPhy_isResetComplete,
        .runComplianceTest = NULL,
        .readExtReg = GenericPhy_readExtReg,
        .writeExtReg = GenericPhy_writeExtReg,
        .printRegs = MyPhy_printRegs,
    };


    在上述结构中、链接了"y-phy-driver"函数指针。 在初始化期间会执行"myPhy_config()",您可以通过调用该函数中的以下函数读取/写入 PHY 寄存器:

    EnetPhy_readReg(hPhy, PHY_REG_ADDRESS, &val); // to read a PHY register
    EnetPhy_writeReg(hPhy, PHY_REG_ADDRESS, val); // to write a PHY register

    上述 API 应执行内部的 MDIO ioctls 以通过 MDIO 接口读取/写入 PHY 寄存器。

    PS: 如果您仍需要从应用程序写入/读取 PHY 寄存器(绕过 enet-LLD 驱动程序)、则 可以使用以下参考代码-

    // read a phy register
    void App_readPhyRegister()
    {
        Enet_IoctlPrms prms;
        EnetMdio_C22ReadInArgs inArgs;
        int32_t status = -1;
        uint16_t val; // register read value
    
        inArgs.group = ENET_MDIO_GROUP_0; // set to group 0 
        inArgs.phyAddr = phyAddr; // your phy address
        inArgs.reg = reg; // your phy regiser
    
        ENET_IOCTL_SET_INOUT_ARGS(&prms, &inArgs, &val);
        ENET_IOCTL(hEnet, EnetSoc_getCoreId(), ENET_MDIO_IOCTL_C22_READ, &prms, status);
        DebugP_assert(status == ENET_SOK);
    }
    
    // write a phy register
    void App_writePhyRegister()
    {
        Enet_IoctlPrms prms;
        EnetMdio_C22WriteInArgs inArgs;
        int32_t status = -1;
        
        inArgs.group = ENET_MDIO_GROUP_0; // set to group 0 
        inArgs.phyAddr = phyAddr; // your phy address
        inArgs.reg = reg; // your phy register address
        inArgs.val = val; // Value to be written in the phy register address
    
        ENET_IOCTL_SET_IN_ARGS(&prms, &inArgs);
        ENET_IOCTL(hEnet, EnetSoc_getCoreId(), ENET_MDIO_IOCTL_C22_WRITE, &prms, status);
        DebugP_assert(status == ENET_SOK);
    }


    谢谢。此致、

    普拉德普

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

    Pradeep、您好!

    • 您的 SDK 版本是什么? 我需要用它来关联您提到的行号。

    我的 SDK 版本是 MCU_PLUS_SDK_am243x_09_00_00_35。

    • 您是如何设置 PHY 地址的? 它是否在 custom_board_config.c 文件中?  RTL8363NB-V 中有两个 PHY、您设置了哪个地址?

    我在我的 custom_board_config.c 中定义。

    RTL8363NB-V 是一种以太网交换机 IC。 我们已通过 RGMII 连接至 RTL8363的 PHY。 其他两个端口用作我们产品的外部通信接口。 地址当前设置为0。

    此外、我想问您实施 ExternalPhyManagement 的建议是否涉及使用我自定义的 PHY 状态来强制驱动程序直接连接到 PHY。 这意味着我们忽略了 Enetphy.c 中定义的 PHY 状态机的顺序、以进行确认、对吗?

    此致、

    拉里

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

    Larry、您好!

    关于-

    此外,我想询问您实施 ExternalPhyManagement 的建议是否涉及使用我自定义的 PHY 状态来强制驱动程序直接连接到 PHY。 这意味着不考虑 Enetphy.c 中定义的 PHY 的状态机顺序、以进行确认、对吗?


    是的、回答正确。 ExternalPhyManagement 应通过 enetphy.c 中定义的内部他/他/她、您可能需要根据您的需要在您的 externalPhyManagement 实施中实施此项功能、以便进行更多自定义 Phy 管理。


    关于-  

    Unknown 说:
    RTL8363NB-V 是一种以太网交换机 IC。 我们已通过 RGMII 连接至 RTL8363的 PHY。 其他两个端口用作我们产品的外部通信接口。 地址当前设置为0.[/报价]

    表示您正在使用的 PHY 的有效地址"0"。 您可能必须查看  RTL8363NB-V 的数据表 以确认这一点。 如果 phy 地址不是正确的、那么您可能会面临与 phy 通信(例如活动、链接、读取、写入等)相关的问题

    此致、

    普拉德普

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

    Pradeep、您好!

    我想确认 PHY 地址和 PHY ID 是否相同。 根据 RTL836的数据表、我当前的硬件设置已将 PHY ID 设置为0。 我还尝试将 MDC 和 MDIO 引脚设置为通用 GPIO 来模拟 MDIO/MDC 行为、通过此仿真成功地初始化 RTL8363。 因此、我认为这个 PHY ID 没有问题。

    如上图所示、当我通过 GPIO 仿真 MDIO 通信时、为了初始化 RTL8363、我在图中将 PHYAD 位置设置为0。 如果 PHY ID 的内容不正确、初始化将失败。 但是、结果是我成功完成了 RTL8363的初始化。 因此、我想确认我们对 PHY 地址的认知是否存在误解。

    此致、

    拉里

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

    Larry、您好!
     感谢您提供这些详细信息。 您的理解是正确的,在按照您的硬件设置将 phy ID (即 PHYAD)设置为"0"时应该可以找到。

    谢谢。此致、

    普拉德普

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

    Pradeep、您好!

    我尝试将您提到的示例代码"examples/networking/lwip/enet_lwip_cpsw"集成到我的当前程序中、但在其中一个部分遇到了问题。

    static void EnetApp_waitForPhyAlive(Enet_Type enetType,
                                        uint32_t instId,
                                        uint32_t coreId,
                                        Enet_MacPort macPort)
    {
        bool alive = 1;
        Enet_IoctlPrms prms;
        int32_t status = 1;
        Enet_Handle hEnet = Enet_getHandle(enetType, instId);
        uint32_t phyAddr;
        EnetBoard_EthPort ethPort;
        const EnetBoard_PhyCfg *boardPhyCfg;
    
        EnetAppUtils_assert(hEnet != NULL);
        /* Setup board for requested Ethernet port */
        ethPort.instId   = instId;
        ethPort.macPort  = macPort;
        ethPort.boardId  = EnetBoard_getId();
        ethPort.enetType = enetType;
        ethPort.mii.layerType      = ENET_MAC_LAYER_GMII;
        ethPort.mii.sublayerType   = ENET_MAC_SUBLAYER_REDUCED;
        ethPort.mii.variantType    = ENET_MAC_VARIANT_FORCED;
        boardPhyCfg = EnetBoard_getPhyCfg(&ethPort);
        EnetAppUtils_assert(boardPhyCfg != NULL);
        phyAddr = boardPhyCfg->phyAddr;
    
        do {
            ENET_IOCTL_SET_INOUT_ARGS(&prms, &phyAddr, &alive);
            ENET_IOCTL(hEnet,
                       coreId,
                       ENET_MDIO_IOCTL_IS_ALIVE,
                       &prms,
                       status);
        } while ((status == ENET_SOK) && (alive != true));
        EnetAppUtils_assert (status == ENET_SOK);
    }

    在此函数中、MDIO 似乎持续检测不到 PHY 活动状态、从而阻止了循环退出。 我对基本实现很好奇:它如何确定 PHY 是否存在? 我需要确定问题是否源于我的编码方法、特别是如果之前的初始设置不正确导致检测失败。 下面我将介绍其他参数的内容、以供进一步参考。

    ethPort.instId = 0

    ethPort.macPort = ENET_MAC_PORT_FIRST

    ethPort.boardId = 3

    ethPort.enetType = ENET_CPSW_3G

    phyAddr = 0

    您能帮助我确定问题所在吗?

    此致、

    拉里

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

    Larry、您好!

    关于-

    我对底层实施感到好奇:它如何确定 PHY 不存在?

    具体实现取决于在 syscfg-Gui 中选择的 MDIO 工作模式;

    • 对于 MDIO_MODE_MANUAL:

      文件中存在"ENET_MDIO_IOCTL_IS_ALIVE "的实现:source/networking/enet/core/mod/MDIO_manual_ioctl.c 函数:MDIO_manual_ioctl_handler_ENET_MDIO_IOCTL_IS_ALIVE ()。  基本上、驱动程序读取配置的 PHY 的 BMSR 寄存器、如果读取成功、则将 PHY 标记为活动。

    • 对于 MDIO_MODE_STATE_CHANGE_MON 或 MDIO_MODE_NORMAL:
      文件中存在"ENET_MDIO_IOCTL_IS_ALIVE "的实现: source/networking/enet/core/mod/MDIO_ioctl.c 函数:MDIO_normal_ioctl_handler_ENET_MDIO_IOCTL_IS_ALIVE ()。  此处、驱动程序使用 CPSW 外设的 MDIO 硬件模块来获取 PHY 状态。 MDIO 硬件在内部跟踪由驱动程序在 MDIO_open ().(file:source/networking/enet/core/mod/MDIO.c)中配置的 PHY 的活动和链路 寄存器 MDIO 硬件通过独立读取 BMS 在内部和定期监控 PHY 活动和链路状态、并存储在其寄存器中以供驱动程序了解 PHY 的状态。

    在 AM243x 上、开箱即用示例使用  MDIO_MODE_MANUAL 模式进行配置。 要调试该问题、您是否可以尝试  在 syscfg-GUI 中将 MDIO 模式更改为 MDIO_MODE_STATE_CHANGE_MON、并勾选受监控 PHY 地址中的所有 PHY 地址? 您可以将 MDCLK 频率降低到一个较低的值、例如200KHz、以克服 MDIO-CLK 线路上的任何 PCB 跟踪问题。




    请告诉我'EnetApp_waitForPhyAvive'的结果与上述更改。

    关于-

    您能帮助我确定问题所在吗?

    您之前提到过、必须在 syscfg-Gui pinmux 设置中取消选中 MDC 和 MDIO:

    由于它没有通过此条件,因此不执行将绑定 PHY 驱动程序的函数 EnetPhy_bindDriver。 奇怪的是、当我在 Enet (CPSW)-> Pinmux 配置中取消选择 MDC 和 MDIO 信号时、此条件语句成功、并执行 EnetPhy_bindDriver、从而允许我的 PHY 驱动程序运行。

    我认为这不是正确的方法、我们需要使用 MDC 和 MDIO 信号。 否则、SOC 无法使用 MDIO 线路与 PHY 通信。 在 pinmux 中使用这些信号时、您可能必须调试为什么"EnetPhy_bindDriver"失败。

    谢谢。此致、

    普拉德普

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

    请注意、您可以运行以下函数来确认已设置的 PHY。


    static void EnetApp_scanPhy(Enet_Type enetType,
                                        uint32_t instId,
                                        uint32_t coreId)
    {
        EnetMdio_C22ReadInArgs inArgs;
        Enet_IoctlPrms prms;
    
        Enet_Handle hEnet = Enet_getHandle(enetType, instId);
        uint32_t phyAddr;
    
        while (1)
        { 
            int32_t status = -1;
            DebugP_logInfo(">>> Scan Start\r\n");
            
            for (phyAddr = 0; phyAddr < 32; phyAddr++)
            {
                uint16_t val = 0;
                inArgs.group = ENET_MDIO_GROUP_0;
                inArgs.phyAddr = phyAddr;
                inArgs.reg = reg;
                ENET_IOCTL_SET_INOUT_ARGS(&prms, &inArgs, &val);
                ENET_IOCTL(hEnet,
                           coreId,
                           ENET_MDIO_IOCTL_C22_READ,
                           &prms,
                           status);
                           
                if (ENET_SOK != status)
                {
                    DebugP_logInfo("PHY NOT FOUND at address: %d\r\n", phyAddr);            
                }
                else
                {
                    DebugP_logInfo("PHY FOUND at address: %d\r\n", phyAddr);
                }
                
                ClockP_usleep(100000); // sleep for 100 m-sec
            }
        
        
        }
        return;
    }


    请务必在 EnetApp_driverOpen(gEnetApp.enetType,  gEnetApp.instId);执行后调用上述函数(EnetApp_scanPhy())

    谢谢。此致、

    普拉德普

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

    Pradeep、您好!

    我尝试了您提供的 EnetApp_scanPhy 函数、但失败了。 这是日志的内容:下面,

    Mdio_manual_ioctl_handler_ENET_MDIO_IOCTL_C22_READ: failed to read PHY 0 C22 reg 4864: -1
    
    EnetMod_ioctl: cpsw3g.mdio: Failed to do IOCTL cmd 0x01000605: -1
    
    EnetPer_ioctl: cpsw3g: Failed to do IOCTL cmd 0x01000605: -1
    
    Enet_ioctl: cpsw3g: IOCTL 0x01000605 failed: -1

    我提供了我的 syscfg 的内容:如下所示、

    我在函数中提供变量的内容:

    EnetType = ENET_CPSW_3G

    instId = 0

    CoreID = 1

    此外、我尝试了修改 inArgs.group = ENET_MDIO_GROUP_0的内容、将其替换为 ENET_MDIO_GROUP_1和 ENET_MDIO_GROUP_NUM、但仍然所有尝试失败。


    此次读取寄存器内容的尝试应该是开关 IC 的芯片编号、但很明显、它不能被读取。 该第22条帧是否与我之前问您的 PHY ID 图像中显示的 MDIO 结构一致?

    此致、

    拉里

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

    另外一点、我尝试向 MDC/MDIO 写入值。 使用逻辑分析仪监控 MDC 和 MDIO 引脚、我注意到这两个引脚根本没有活动。 我的初始设置可能有问题吗?

    下面是我的测试代码、

    static void EnetApp_writeMagicId(Enet_Type enetType,
                                        uint32_t instId,
                                        uint32_t coreId)
    {
        EnetMdio_C22WriteInArgs inArgs;
        Enet_IoctlPrms prms;
    
        Enet_Handle hEnet = Enet_getHandle(enetType, instId);
        uint32_t phyAddr = 0;
    
        //while (1)
        { 
            int32_t status = -1;
            EnetAppUtils_print(">>> Write Start\r\n");
            
            //for (phyAddr = 0; phyAddr < 32; phyAddr++)
            {
                uint16_t val = 0;
                inArgs.group = ENET_MDIO_GROUP_0;
                inArgs.phyAddr = phyAddr;
                inArgs.reg = 0x13c2;
                inArgs.val = 0x0249;
                ENET_IOCTL_SET_IN_ARGS(&prms, &inArgs);
                ENET_IOCTL(hEnet,
                           coreId,
                           ENET_MDIO_IOCTL_C22_WRITE,
                           &prms,
                           status);
                           
                if (ENET_SOK != status)
                {
                    EnetAppUtils_print("PHY write at address: %d fail\r\n", phyAddr);            
                }
                else
                {
                    EnetAppUtils_print("PHY write at address: %d success\r\n", phyAddr);
                }
                
                ClockP_usleep(100000); // sleep for 100 m-sec
            }
        
        
        }
        return;
    }

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

    Larry、您好!

    打开:

    此第22条帧是否与我之前问您的 PHY ID 图像中显示的 MDIO 结构一致?

    是的、您之前提到的 MDIO 帧结构确实是第22条类型的  

    参考: https://en.wikipedia.org/wiki/Management_Data_Input /输出#Bus_timing_(子句_22)


    关于:

    我尝试过您提供的 EnetApp_scanPhy 函数,但该函数失败了。
    使用逻辑分析仪监控 MDC 和 MDIO 引脚时,我注意到这两个引脚根本没有任何活动。 我的初始设置是否存在问题?
    1. 您是否检查了 MDC 和 MDIO 信号 Pinmux 设置。 我想您已按照您的初始评论禁用了此功能。 如果不设置这些信号引脚、您将不会在线路/示波器上看到任何信号。 请保持设置。
      另外、在我们了解当前问题之前、请尝试使用 MDIO 操作模式作为之前建议的 MDIO_MODE_STATE_CHANGE_MON。

    2. 您是否确认已在 PHY 管理接口的 MDIO 模式下设置 RTL8363NB 配置、而不是 I2C 模式?
    3. 您是否确认 电路板上的 MDIO 时钟和 MDIO 数据线路上有外部上拉电阻器?

    普拉德普

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

    Pradeep、您好!

    您是否检查了 MDC 和 MDIO 信号 Pinmux 设置。 我想您已按照您的初始评论禁用了此功能。 如果不设置这些信号引脚、您将不会在线路/示波器上看到任何信号。 请保持设置。
    另外、在我们了解当前问题之前、请尝试使用 MDIO 操作模式作为之前建议的 MDIO_MODE_STATE_CHANGE_MON。

    如前所述、我确认了 MDC 和 MDIO 功能未禁用且在 CPSW 引脚多路复用器中启用。

    我还遵循了您的建议、将 MDIO 配置的工作模式设置为 MDIO_MODE_STATE_CHANGE_MON、将频率设置为200kHz、地址设置为 ALL。

    但是、当我尝试向 PHY 的寄存器写入值时、  

    static void EnetApp_writeMagicId(Enet_Type enetType,
                                        uint32_t instId,
                                        uint32_t coreId)
    {
        EnetMdio_C22WriteInArgs inArgs;
        Enet_IoctlPrms prms;
    
        Enet_Handle hEnet = Enet_getHandle(enetType, instId);
        uint32_t phyAddr = 0;
    
        //while (1)
        { 
            int32_t status = -1;
            EnetAppUtils_print(">>> Write Start\r\n");
            
            //for (phyAddr = 0; phyAddr < 32; phyAddr++)
            {
                uint16_t val = 0;
                inArgs.group = ENET_MDIO_GROUP_0;
                inArgs.phyAddr = phyAddr;
                inArgs.reg = 0x13c2;
                inArgs.val = 0x0249;
                ENET_IOCTL_SET_IN_ARGS(&prms, &inArgs);
                ENET_IOCTL(hEnet,
                           coreId,
                           ENET_MDIO_IOCTL_C22_WRITE,
                           &prms,
                           status);
                           
                if (ENET_SOK != status)
                {
                    EnetAppUtils_print("PHY write at address: %d fail\r\n", phyAddr);            
                }
                else
                {
                    EnetAppUtils_print("PHY write at address: %d success\r\n", phyAddr);
                }
                
                ClockP_usleep(100000); // sleep for 100 m-sec
            }
        
        
        }
        
        return;
    }

    我观察到流程在以下函数中卡住:

    您是否确认已在 PHY 管理接口的 MDIO 模式下设置 RTL8363NB 配置、而不是 I2C 模式?

    我已经确认 RTL8363处于 MDIO 模式、因为我确实使用了 GPIO 来模拟 MDIO 行为、并且能够初始化 RTL8363。

    您是否确认 电路板上的 MDIO 时钟和 MDIO 数据线路上有外部上拉电阻器?

    我们在 MDIO 引脚上添加了一个上拉电阻器。

    此致、

    拉里

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我观察到该过程在以下函数中卡住:

    如果 MDIO 未初始化、则可能会发生这种情况。
    您是否可以使用调试程序确认 MDIO_OPEN()已执行? 请验证在 Mdio_Open ()调用中收到的 MDIO 配置参数?

    此外、在解决此问题之前、请继续将 MDIO 模式用作 STATE_CHANGE_MON。

    此致、

    普拉德普

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

    在调试模式中,我已经确认 MDIO_OPEN()被执行。 以下是传入的参数的值:

    Mdio_Handle hMdio =(Mdio_Handle) hMod;

    EnetType = ENET_CPSW_3G

    instId = 0

    const Mdio_Cfg * mdioCfg =(const Mdio_Cfg *) cfg;

    cfgSize = 24

    此致、

    拉里

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

    非常感谢您的详细信息!  
    很抱歉、我需要再问您一些问题:

    1. 您是否还可以共享电路板中使用的 AM243x SOC 封装的完整/确切器件型号?
    2. MDIO 第22条寄存器读取是否也与 STATE_CHANGE_MON 模式卡住?
    3. 您在应用代码中对开箱即用示例进行了哪些更改? 您是否正在使用 TI 交付的 SBL 或 SBL 是否有任何变化?

    此致、

    普拉德普

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

    您是否还可以共享电路板中使用的 AM243x SOC 的完整/确切器件型号?

    AM2431BSDGHIALXR

    MDIO 第22条寄存器读取是否也与 STATE_CHANGE_MON 模式卡住?

    读取操作也会卡住、但在 CSL_MDIO_phyRegRead2函数中会发生这种情况。

    您在应用代码中对开箱即用示例进行了哪些更改? 您是否正在使用 TI 交付的 SBL 或 SBL 是否有任何变化?

    由于我启用了"Custom Board"、因此我添加了 custom_board_config.c 文件。 如果需要、我可以附加此.c 文件的内容。

    由于我们的定制板使用不同品牌的外部闪存、并且我使用 uart_uniflash.py 来刷写次级引导加载程序(SBL)、因此我按照 SDK 指南修改了 SBL_UART_uniflash 的内容、以允许刷写第二个 SBL。 第二个 SBL 是对 DEFAULT_SBL_null 的修改。 原始过程专为在 LP-AM243x 上进行初始化而设计、但 LP 板的 AM243具有四个内核、而我们板的 AM2431只有一个内核、因此我仅初始化了一个内核。 以下是我所做的修改:

    DebugP_log("\r\n");
        DebugP_log("Starting NULL Bootloader ... \r\n");
    
        status = Sciclient_getVersionCheck(1);
        if(status == SystemP_SUCCESS)
        {
            Bootloader_Params bootParams;
            Bootloader_BootImageInfo bootImageInfo;
            Bootloader_Handle bootHandle;
    
            Bootloader_Params_init(&bootParams);
            /* set default which will basically allow to simply power on reset the CPU and run a while(1) loop */
            Bootloader_BootImageInfo_init(&bootImageInfo);
    
            bootHandle = Bootloader_open(CONFIG_BOOTLOADER0, &bootParams);
            if(bootHandle != NULL)
            {
                uint32_t coreVariant = Bootloader_socGetCoreVariant();
                // if((coreVariant == BOOTLOADER_DEVICE_VARIANT_QUAD_CORE) || (coreVariant == BOOTLOADER_DEVICE_VARIANT_DUAL_CORE))
                // {
                //     if(status == SystemP_SUCCESS)
                //     {
                //         status = Bootloader_bootCpu(bootHandle, &bootImageInfo.cpuInfo[CSL_CORE_ID_R5FSS1_0]);
                //     }
                //     if((Bootloader_socIsR5FSSDual(BOOTLOADER_R5FSS1) == TRUE) && (status == SystemP_SUCCESS))
                //     {
                //         status = Bootloader_bootCpu(bootHandle, &bootImageInfo.cpuInfo[CSL_CORE_ID_R5FSS1_1]);
                //     }
                // }
                /* Do not boot M4 when MCU domain is reset isolated */
                if (!Bootloader_socIsMCUResetIsoEnabled())
                {
                    if(status == SystemP_SUCCESS)
                    {
                        status = Bootloader_bootCpu(bootHandle, &bootImageInfo.cpuInfo[CSL_CORE_ID_M4FSS0_0]);
                    }
                }
                if(status == SystemP_SUCCESS)
                {
                    /* Reset self cluster, both Core0 and Core 1. Init RAMs and run dummy loop  */
                    //status = Bootloader_bootSelfCpu(bootHandle, &bootImageInfo);
    
                    /* Initial Core0 */
                    uint32_t isSelfBoot = FALSE;
                    if(TRUE == Bootloader_isCorePresent(bootHandle, CSL_CORE_ID_R5FSS0_0))
                    {
                        isSelfBoot = TRUE;
                    }
                    bootImageInfo.cpuInfo[CSL_CORE_ID_R5FSS0_0].clkHz = Bootloader_socCpuGetClkDefault(CSL_CORE_ID_R5FSS0_0);
                    status = Bootloader_loadSelfCpu(bootHandle, &bootImageInfo.cpuInfo[CSL_CORE_ID_R5FSS0_0], FALSE);
    
                    if(status == SystemP_SUCCESS)
                    {
                        status = Bootloader_runSelfCpu(bootHandle, &bootImageInfo);
                    }
                }
                /* it should not return here, if it does, then there was some error */
                Bootloader_close(bootHandle);
            }
        }

    此致、

    拉里

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

    谢谢您的



     

     


    讲解。 只是想确认所使用的引脚编号。 看起来是正确的。 您能再尝试一件事吗- 09.01 SDK 上修复了一个 MDIO 驱动程序错误。 不过、此错误仅适用于手动模式。 由于 MDIO 操作没有成功、我认为 MDIO 模块时钟可能未设置。 补丁在此处- github.com/.../34ad60f9035633eaebdbe33d57bb19c32bd93717 您能否在工作区中应用上述更改、并在 MDIO 模式= MDIO_MODE_MANUAL 下重新运行测试? 此致、 普拉德普
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    由于 MDIO 操作没有成功、我认为 MDIO 模块时钟可能未设置。

    您是否认为我的初始化设置可能存在问题、这可能会导致 MDIO 时钟未正确初始化? 如果是、可能需要修改哪个器件?

    您能否在工作区中应用上述更改、并在 MDIO 模式= MDIO_MODE_MANUAL 下重新运行测试?  

    是的、我已经将 MDIO_MODE 更改为 MDIO_MODE_MANUAL、而且我还将链接中的更改融入到了 SDK 修改中。 不过、这是否仅涉及在发送 MDIO 消息之前添加前导码?

    在进行这些修改后、通过逻辑分析器观察时、无论是写入还是读取数据、都看不到传输任何 MDIO 消息。

    此致、

    拉里

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

    Pradeep、您好!

    我已经意识到 MDIO 实际上正在运行;这只是我的逻辑分析仪(LA)的参数设置中的一个错误、阻止了触发激活、对此我深表歉意。

    但是、我注意到 MDIO 不会发送如下图所示的32位高位前导码:

    正如您提到的、我的确在 SDK 中进行了修改。 添加这两行代码后、是否需要执行任何额外操作来确保 SDK 正确执行新添加的器件?

    此致、

    拉里

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

    Larry、您好!
    感谢您的分享。
    必须重新编译库才能使更改生效。
    请按照以下步骤重新编译库

    cd <mcu_plus_sdk_intall_dir>
    gmake -s -j4 DEVICE=am243x PROFILE=debug libs-clean
    gmake -s -j4 DEVICE=am243x PROFILE=debug libs
    gmake -s -j4 DEVICE=am243x PROFILE=release libs-clean
    gmake -s -j4 DEVICE=am243x PROFILE=release libs

    然后重新编译并运行示例/应用程序。

    此致、

    普拉德普

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

    Larry、您好!
    请注意、以下问题已在最新的 MCU+ SDK 版本 09.01.00.41 (发布日期:2023年12月13日)上修复。

    此致、

    普拉德普

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

    Pradeep、您好!

    感谢您的详细答复。 我已将 SDK 版本替换为 mcu_plus_sdk_am243x_09_01_00_41、并将 SysConfig 版本升级到 SysConfig_1.18.1。 现在、我可以从逻辑分析器中看到、MDIO 操作按预期运行。

    但是、仍无法使用 ENET_MDIO_IOCTL_IS_ALIVE。 我认为这是因为我们的开关 IC 具有独特的控制方法。 读取 PHY 寄存器需要四个步骤:

    1. 写入寄存器0x1F。 带有0x0E
    2. 将要读取的寄存器写入寄存器0x23。
    3. 写入  寄存器0x15。 使用0x01
    4. 从寄存器0x19读取该值。

    因此、如果 ENET_MDIO_IOCTL_IS_ALIVE 尝试直接从 PHY 读取、则会失败并且无法通过条件检查。 这就是为什么我在随后的代码中删除了与 MDIO 读取和写入相关的部分。 因此、初始化部分现在已完成、但我仍然无法读取 RGMII 的内容。

    我们已经尝试使用示波器来观察 RTL8363的 TX 引脚。 完成 RTL8363的初始化后、我们可以看到 TX 引脚持续输出数据、因为我们有另一个器件持续输出以太网原始数据包。 不过、在 AM2431内部的调试模式下、我无法看到任何数据进入 DMA、因此 rxTask 从不被触发、因此我们无法接收由 RTL8363发送的原始数据包。 您能告诉我应该检查哪些方面来解决此问题吗? 谢谢你!

    此致、

    拉里

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

    Larry、您好!
     
    很高兴看到您能够读取或写入 PHY 寄存器。

    因此、如果 ENET_MDIO_IOCTL_IS_ALIVE 尝试直接从 PHY 读取、它将失败并且无法通过条件检查。 这就是为什么我在随后的代码中删除了与 MDIO 读取和写入相关的部分。 因此,初始化部分现在已完成,但我仍然无法读取 RGMII 的内容。

    感谢此更新!

    关于-

    您能否告知我应该检查哪些方面来解决此问题? 谢谢你!

    我们可能需要首先检查几个方面、

    1. 是否看到链路建立事件? 链路建立事件将打开 CPSW 的 MAC 端口。 也就是说,调用 Cpsw_handleLinkUp()和 CPSW_MACPORT_IOCTL_enable IOCTL 执行。 此调用应将 CPSW MAC 端口状态设置为接收数据包、并将其配置为将流量转发到 R5F 内核(通过主机端口)。 因此、请确认已执行这些 API。
    2. 您可以查看 CPSW 统计信息、以使用 GEL 脚本检查 CPSW 硬件外设接收或传输的数据包数量? 您可以 通过该链接 了解具体方法。
      这将告诉您第一个 CPSW 硬件是否接收数据包。

    此致、

    普拉德普

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

    Pradeep、您好!

    是否看到链路建立事件?  

    不,我在 cpsw.c 中添加了断点,无论它是 V1还是 V2 ,我都没有观察到 Cpsw_handleLinkUp()正在执行。 我也没有看到 Cpsw_periodicTick()正在运行。 在驱动程序中,似乎需要执行 Cpsw_periodicTick ()才能有机会运行 Cpsw_handleLinkUp (),对吗?

    您可以查看 CPSW 统计信息、以使用 GEL 脚本检查 CPSW 硬件外设接收或传输的数据包数量?

    执行您提到的 GEL 脚本后、日志显示以下内容、这似乎表明根本没有启动 CPSW、对吗?

    这种现象是否可能是我未能执行某些功能导致的? 我目前的程序仍然基本上基于"Enet Layer 2 CPSW 示例"。 如前所述、我已将有关外部 PHY 管理的"mcu_plus_sdk/examples/networking/lwip/enet_lwip_cpsw/extPhyMgmt "部分集成到我的程序中。 但是、我尚未包含任何与 lwip 相关的器件。 这是否是 CPSW 未启动的主要原因?

    此致、

    拉里

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

    Pradeep、您好!

    我注意到在外部 PHY 管理示例代码中我没有执行 EnetApp_createPhyRegisterPollingTask ()。 在内部有一个 IOCTL 命令:enet_IOCTL_SET_IN_args (&PRMS、&linkupEventInfo);ENET_IOCTL (hEnet、selfCoreId、ENET_PER_IOCTL_Handle_EXTPHY_LinkUp_EVENT、 &PRMS、status);我猜它的功能与您刚才提到的 CPSW_MACPORT_IOCTL_ENABLE 的功能相似、对吗? 因为在执行它之后、日志显示了以下内容:

    这是否表明发生了链路建立事件?

    此外、再次运行 GEL 脚本后、我仍然看不到与您的链接显示的类似的输出。

    此致、

    拉里

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

    Pradeep、您好!

    您有任何更新吗?

    此致、

    拉里

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

    Larry、您好!
     在你所做的工作中、存在与 MDIO 读取相关的故障  
    EnetPhy_rmwreg:Phy 0:无法读取 reg0:-3

    您是否尝试过解决这个问题?

    我怀疑 MAC 端口配置。

    1. 哪个 CPSW MAC 端口连接到 端口1和端口2的"RTL8363NB-V"?
    2. 您是否可以尝试使用 syscfg-GUI 交换端口以查看是否有不同的结果(尝试禁用其他端口)?
    3. 您是否可以尝试在 syscfg-Gui 工具中启用 CPSW 的两个 MAC 端口、并查看统计信息是否有任何变化?
    4. 您能否比较工作板(TI-LP 板)和不工作设置(定制板)之间的 CPSW MAC 端口寄存器设置?
      您是互换端口还是 RGMII?

    谢谢。此致、

    普拉德普

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

    Pradeep、您好!

    您是否尝试过解决这个问题?

    是的、我已经解决了此错误。

    哪个 CPSW MAC 端口连接到 端口1和端口2的"RTL8363NB-V"?

    我认为它已连接到端口1。 在硬件侧、我连接到 RGMII1的引脚、如下图所示。

    在程序中、我已将其设置为连接到 ENET_MAC_PORT_1。 我不确定您是指的是硬件端口还是 MAC 端口? 我还尝试在程序中添加 ENET_MAC_PORT_2、但失败了。 我会再试一次。

    您是否可以尝试使用 syscfg-GUI 交换端口以查看是否有不同的结果(尝试禁用其他端口)?

    我已经在原始 syscfg 中禁用了 Mac 端口2。 我将尝试切换到使用 Mac 端口2、看看是否有机会使其正常工作。

    您是否可以尝试在 syscfg-Gui 工具中启用 CPSW 的两个 MAC 端口、并查看统计信息是否有任何变化?

    结果似乎和以前一样;没有区别。

    您能否比较工作板(TI-LP 板)和不工作设置(定制板)之间的 CPSW MAC 端口寄存器设置?
    您是互换端口还是 RGMII?

    此外、是否还有其他可以尝试修改的器件? 以下是到目前为止我找到的一些寄存器设置、我认为这些设置符合我的当前需要、但仍然无法与开关 IC 进行通信。

    CPSW_SS_RGMII1_STATUS_REG

    全双工模式= 1h =全双工

    速度= 10 = 2h = 1000Mbps

    链路= 1h =链路已建立

    CPSW_STAT_PORT_EN_REG

    P2_STAT_EN = 1h = 端口2统计信息已启用。

    P1_STAT_EN = 1h = 端口1统计信息已启用。

    P0_STAT_EN = 1h = 端口0统计信息启用。

    CTRLMMR_ENET1_CTRL

    PORT_MODE_SEL = 010 = 2h - RGMII

    CTRLMMR_CPTS_CLKSEL

    CPTS_CLKSEL_CPTS_CLKSEL = 0h = MAIN_PLL2_HSDIV5_CLKOUT

    关于将 AM-243连接到交换机 IC 的可行性、我的理解是、如果 AM-243内部的 MAC 配置正确、那么只要交换机 IC 侧的 PHY 初始化、就应该可以进行通信。 我们是否有机会进行更详细的沟通? 此功能对于我们的产品非常重要。

    此致、

    拉里

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

    Larry、您好!

    • 关于:
    我们尝试使用示波器观察 RTL8363的 TX 引脚。 [/报价]

    您是否尝试在 RGMII 接口上测量 TX_CLK 的时钟频率? 是否根据125MHz 的 RGMII 规范匹配?

    • 同样、您是否可以尝试从 AM2432端发送数据、方法是写入新的图来发送数据包并观察 RTL8363的 RGMII RX 引脚?

    此致、

    普拉德普

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

    Pradeep、您好!

    我尝试添加一个任务来持续向 RTL8363发送数据包。 可以观察到数据包已成功发送。 我们通过 Wireshark 验证了数据包确实是按照我设计的格式传输的。 但是、仍然无法接收从 RTL8363发送到 AM2431的数据、尤其是 AM2431的 RX。 是否存在可能导致此问题的任何设置?
    问题是否可能是因为我们发送的数据包是广播数据包而出现的? MAC 地址为0xFF:0xFF:0xFF:0xFF:0xFF:0xFF:0xFF。 我们是否需要启用特定寄存器中的某些功能?
    因为我在 CCS 上的 Registers 列表中看到如下所示的寄存器:

    根据数据表说明、它似乎与广播相关。 是否需要配置类似的寄存器?

    此外、您是否收到了我发送给您的固件? 此外、我们的电气工程师(EE)已通过电子邮件向您发送电路图。 您能否联系您的 EE 以帮助检查电路是否有任何缺陷? 谢谢!

    此致、

    拉里

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

    Larry、您好!
    关于:

    我试图添加一个任务来持续向 RTL8363发送数据包。 发现数据包已成功发送。

    在 AM2431 Tx 侧观察到的电压电平是多少?

    关于原理图分析、我来关注一下 TI EE 并向您分享最新动态。

    谢谢。此致、

    普拉德普

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

    Pradeep、您好!

    感谢您的详细帮助和解释。 我们已经确定了这个问题。 这是由于返工导致 RGMII 连续出现故障。 我们的电气工程师(EE)仔细重新检查并解决了问题。 谢谢你!

    此致、

    拉里

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

    感谢 Larry 的确认! 很高兴看到该问题得到解决!


    此致、

    普拉德普