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.

[参考译文] TMS570LS3137:DP83640高精度 PHYTER 通信问题

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1017277/tms570ls3137-dp83640-precision-phyter-communication-problem

器件型号:TMS570LS3137
主题中讨论的其他器件:DP83640HALCOGEN

我尝试将微控制 器与 DP83640精密 PHYTER 器件通信、但由于 MDIO_useraccess_go 值始终为零、因此我收到错误。 我如何理解与 PHY 的通信? (注意:我从 PINMUX 中激活了 RMII、SCI、MDCLK 和 MDIO)  

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

    您好!

     MDIO 时钟由 VCLK3驱动、最大 MDIO 时钟为2.5MHz。 您是否使用由 HalCoGen 生成的 MDIO 驱动程序? 您的测试中使用了什么 MDIO 时钟频率?

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

    大家好、mdio.h 和 HalCoGen 中的时钟是不同的、即使我重新生成代码并重建 CCS 文件。

    mdio.h 中的配置如下:

    /* MDIO 输入和输出频率,单位为 Hz */
    #define MDIO_FREQ_INPUT ((UINT32)(VCLK3_FREQ * 1000000.00F)
    #define MDIO_FREQ_OUTPUT 1000000U

    在 HalCoGen 文件中、我将 VCLK3分频器从1调整为6、因此 VCLK3时钟变为22.857MHz

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

    您的测试中使用 MDIO_CLK=1MHz。  

    我从 HDK 上的以太网 PHY 读取 PHY ID:

    MDIO_CONTROL = 0x4100004F;   //VCLK3=80MHz、MDIO_CLK=1MHz

    MDIO_USERACCESS0 = 0        //读取 PHY ID 1
                          |(1 << 31)//[31]开始
                          |(0 < 30)//[30]读取
                          |(0 << 29)//[29]采集
                          |(2 << 21)//[25-21] PHY 寄存器地址
                          |(1 << 16)//[20-16] PHY 地址
                          |(0 << 0);//[15-0]数据

      while (MDIO_USERACCESS0 & 0x8000000);//等待结果

      无符号短整型值= MDIO_USERACCESS0;

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

    我的 phy ID 为:

    #define DP83640_PHY_ID           (0x0007C0F0u)

    这是由 holcogen 为 TMS570LS31生成的 hw_mdio.h 文件

    /*
    * hw_mdio.h
    *

    /*
    *版权所有(C) 2009-2018 Texas Instruments Incorporated - www.ti.com
    *
    *
    *以源代码和二进制形式重新分发和使用、有无
    *如果满足以下条件、则允许进行修改
    符合*:
    *
    *源代码的重新分发必须保留上述版权
    *注意、此条件列表和以下免责声明。
    *
    *二进制形式的再发行必须复制上述版权
    *请注意、中的此条件列表和以下免责声明
    *随提供的文档和/或其他材料
    *分发。
    *
    *德州仪器公司的名称和名称均不相同
    *其贡献者可用于认可或推广衍生产品
    *未经特定的事先书面许可。
    *
    *本软件由版权所有者和贡献者提供
    *"按原样"以及任何明示或暗示的保证、包括但不包括
    *仅限于对适销性和适用性的暗示保证
    *一项特定目的不予承认。 在任何情况下、版权均不得
    *所有者或贡献者应对任何直接、间接、偶然或
    *特殊、惩戒性或后果性损害(包括但不包括)
    *仅限于采购替代货物或服务;丧失使用、
    *数据或利润;或业务中断)
    *责任理论、无论是合同责任、严格责任还是侵权行为
    *(包括疏忽或其他)因使用而以任何方式产生
    *、即使被告知可能会发生此类损坏。
    *
    *


    #ifndef _hw_mdio_H_
    #define _HW_MDIO_H_

    /*用户代码开始(0)*/
    /*用户代码结束*/

    #ifdef __cplusplus
    extern "C"{
    #endif

    /*用户代码开始(1)*/
    /*用户代码结束*/

    #define MDIO_base (0xFCF78900U)

    #define MDIO_REVID (0x0U)
    #define MDIO_CONTROL (0x4U)
    #define MDIO_ALIVE (0x8U)
    #define MDIO_LINK (0xCU)
    #define MDIO_LINKINTRAW (0x10U)
    #define MDIO_LINKINTMASKED (0x14U)
    #define MDIO_USERINTRAW (0x20U)
    #define MDIO_USERINTMASKED (0x24U)
    #define MDIO_USERINTMASKSET (0x28U)
    #define MDIO_USERINTMASKCLEAR (0x2CU)
    #define MDIO_USERACCESS0 (0x80U)
    #define MDIO_USERPHYSEL0 (0x84U)
    #define MDIO_USERACCESS1 (0x88U)
    #define MDIO_USERPHYSEL1 (0x8CU)

    / \
    *字段定义宏
    《国际环境与发展会议》 /

    /* REVID */

    #define MDIO_REVID_REV (0xFFFFU)
    #define MDIO_REVID_REV_SHIFT (0x00000000U)


    /*控件*/

    #define MDIO_CONTINT_IDLE (0x80000000U)
    #define MDIO_CONTINT_IDLE_SHIFT (0x0000001FU)
    /*--Idle Tokens---*/
    #define MDIO_CONTINT_IDLE_NO (0x000000000000)
    #define MDIO_CONTINT_IDLE_YesN (0x00000001U)

    #define MDIO_CONTINT_ENABLE (0x40000000U)
    #define MDIO_CONTINT_ENABLE_SHIFT (0x0000001EU)

    #define MDIO_CONTINT_TOSTEL_USER_CHANNEL (0x1F000000U)
    #define MDIO_CONTINT_TOSTEL_USER_CHANGE_SHIFT (0x00000018U)


    #define MDIO_CONTRAL_PREAMBLE (0x00100000U)
    #define MDIO_CONTING_PREAMARE_SHIFT (0x00000014U)
    /*--前导 码令牌--*/

    #define MDIO_CONTINT_FAULT (0x00080000U)
    #define MDIO_CONTINL_FAULT_SHIFT (0x00000013U)

    #define MDIO_CONTROL_FAULTENB (0x00040000U)
    #define MDIO_CONTROL_FAULTENB_SHIFT (0x00000012U)
    /*--FAULTENB 令牌---*/

    #define MDIO_CONTINT_CLKDIV (0x0000FFFFU)
    #define MDIO_CONTINT_CLKDIV_SHIFT (0x00000000U)
    /*--CLKDIV 令牌---*/


    /* Alive */

    #define MDIO_ALIVE_REGVAL (0xFFFFFFFFU)
    #define MDIO_Alive_REGVAL_SHIFT (0x00000000U)


    /*链接*/

    #define MDIO_LINK_REGVAL (0xFFFFFFFFU)
    #define MDIO_LINK_REGVAL_SHIFT (0x00000000U)


    /* LINKINTRAW */


    #define MDIO_LINKINTRAW_USERPHY1 (0x00000002U)
    #define MDIO_LINKINTRAW_USERPHY1_SHIFT (0x00000001U)

    #define MDIO_LINKINTRAW_USERPHY0 (0x00000001U)
    #define MDIO_LINKINTRAW_USERPHY0_SHIFT (0x000000000000)


    /* LINKINTMASKED *


    #define MDIO_LINKINTMASKED_USERPHY1 (0x00000002U)
    #define MDIO_LINKINTMASKED_USERPHY1_SHIFT (0x00000001U)

    #define MDIO_LINKINTMASKED_USERPHY0 (0x00000001U)
    #define MDIO_LINKINTMASKED_USERPHY0_SHIFT (0x00000000U)


    /* USERINTRAW */


    #define MDIO_USERINTRAW_USERACCESS1 (0x00000002U)
    #define MDIO_USERINTRAW_USERACCESS1_SHIFT (0x00000001U)

    #define MDIO_USERINTRAW_USERACCESS0 (0x00000001U)
    #define MDIO_USERINTRAW_USERACCESS0_SHIFT (0x00000000U)


    /* USERINTMASKED */


    #define MDIO_USERINTMASKED_USERACCESS1 (0x00000002U)
    #define MDIO_USERINTMASKED_USERACCESS1_SHIFT (0x00000001U)

    #define MDIO_USERINTMASKED_USERACCESS0 (0x00000001U)
    #define MDIO_USERINTMASKED_USERACCESS0_SHIFT (0x00000000U)


    /* USERINTMASKSET */


    #define MDIO_USERINTMASKSET_USERACCESS1 (0x00000002U)
    #define MDIO_USERINTMASKSET_USERACCESS1_SHIFT (0x00000001U)

    #define MDIO_USERINTMASKSET_USERACCESS0 (0x00000001U)
    #define MDIO_USERINTMASKSET_USERACCESS0_SHIFT (0x00000000U)


    /* USERINTMASKCLEAR */


    #define MDIO_USERINTMASKCLEAR_USERACCESS1 (0x00000002U)
    #define MDIO_USERINTMASKCLEAR_USERACCESS1_SHIFT (0x00000001U)

    #define MDIO_USERINTMASKCLEAR_USERACCESS0 (0x00000001U)
    #define MDIO_USERINTMASKCLEAR_USERACCESS0_SHIFT (0x00000000U)


    /* USERACCESS0 */

    #define MDIO_USERACCESS0_GO (0x80000000U)
    #define MDIO_USERACCESS0_GO_SHIFT (0x0000001FU)

    #define MDIO_USERACCESS0_WRITE (0x40000000U)
    #define MDIO_USERACCESS0_READ (0x00000000U)
    #define MDIO_USERACCESS0_WRITE_SHIFT (0x0000001EU)

    #define MDIO_USERACCESS0_ACK (0x20000000U)
    #define MDIO_USERACCESS0_ACK_SHIFT (0x0000001DU)


    #define MDIO_USERACCESS0_REGADR (0x03E00000U)
    #define MDIO_USERACCESS0_REGADR_SHIFT (0x00000015U)

    #define MDIO_USERACCESS0_PHYADR (0x001F0000U)
    #define MDIO_USERACCESS0_PHYADR_SHIFT (0x00000010U)

    #define MDIO_USERACCESS0_DATA (0x0000FFFFU)
    #define MDIO_USERACCESS0_DATA_SHIFT (0x00000000U)


    /* USERPHYSEL0 */


    #define MDIO_USERPHYSEL0_LINKSEL (0x00000080U)
    #define MDIO_USERPHYSEL0_LINKSEL_SHIFT (0x00000007U)

    #define MDIO_USERPHYSEL0_LINKINTENB (0x00000040U)
    #define MDIO_USERPHYSEL0_LINKINTENB_SHIFT (0x00000006U)


    #define MDIO_USERPHYSEL0_PHYADRMON (0x0000001FU)
    #define MDIO_USERPHYSEL0_PHYADRMON_SHIFT (0x00000000U)


    /* USERACCESS1 *

    #define MDIO_USERACCESS1_GO (0x80000000U)
    #define MDIO_USERACCESS1_GO_SHIFT (0x0000001FU)

    #define MDIO_USERACCESS1_WRITE (0x40000000U)
    #define MDIO_USERACCESS1_WRITE_SHIFT (0x0000001EU)

    #define MDIO_USERACCESS1_ACK (0x20000000U)
    #define MDIO_USERACCESS1_ACK_SHIFT (0x0000001DU)


    #define MDIO_USERACCESS1_REGADR (0x03E00000U)
    #define MDIO_USERACCESS1_REGADR_SHIFT (0x00000015U)

    #define MDIO_USERACCESS1_PHYADR (0x001F0000U)
    #define MDIO_USERACCESS1_PHYADR_SHIFT (0x00000010U)

    #define MDIO_USERACCESS1_DATA (0x0000FFFFU)
    #define MDIO_USERACCESS1_DATA_SHIFT (0x00000000U)


    /* USERPHYSEL1 */


    #define MDIO_USERPHYSEL1_LINKSEL (0x00000080U)
    #define MDIO_USERPHYSEL1_LINKSEL_SHIFT (0x00000007U)

    #define MDIO_USERPHYSEL1_LINKINTENB (0x00000040U)
    #define MDIO_USERPHYSEL1_LINKINTENB_SHIFT (0x00000006U)


    #define MDIO_USERPHYSEL1_PHYADRMON (0x0000001FU)
    #define MDIO_USERPHYSEL1_PHYADRMON_SHIFT (0x00000000U)

    /*用户代码开始(2)*/
    /*用户代码结束*/

    #ifdef __cplusplus

    #endif

    #endif

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

    您好!

    您是否在 HalCoGen 引脚复用配置窗口中启用 MDIO 和 MDCLK? 当您启用 MII 或 RMII 时、这两个信号不会被选择。 您必须手动启用这两个信号。

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

    您好!

    我已经激活了它们。 我卡在这一点。

    /*等待命令完成*/
    /*SAFETYMCUSW 28 D MR:NA "硬件状态位读取检查"*/
    while ((HWREG (baseAddr + MDIO_USERACCESS0)& MDIO_USERACCESS0_GO)== MDIO_USERACCESS0_GO)

    }/*等待*/

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

    您好!

    您使用哪种硬件板? PHY 的时钟是否正确? MII 要求25MHz、RMII 要求50MHz。

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

    您好!

    硬件尚未验证。 我仔细检查了晶振、它为 RMII 连接生成了50MHz。 此外、我还会在 PHY 的 MDIO 和 MDCLK 输入端看到信号。  我 还怀疑 PHY 版本不兼容。  

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

    您使用的是 TI EVM 还是您自己的电路板?

    如果您使用 RMII、 DP83640 RX_DV 引脚应被拉高。 要使用 MII 模式、  DP83640  RX_DV  引脚应被拉低。

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

    它是我们自己的电路板、仅针对 RMII 设计。  DP83640  RX_DV  引脚被拉低、因此即使我为 RMII 配置了软件、我也无法使用 RMII。  

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

    是的、由于 RX_DV=LOW、MII 模式被选择、所以您不能使用 RMII 模式。 DP83640 PHY 使用50MHz 晶体、但 MII 模式要求 PHY 为25MHz 或2.5MHz、因此 MII 模式也不起作用。

    请更正其中一个(RX_DV 或晶振时钟)。

    1. RX_DV =高电平、低温= 50MHz -> RMII

    2、RX_DV =低电平、晶振= 25MHz (对于100mips)或2.5MHz (对于10Mbps)-> MII