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.

[参考译文] RM57L843:lwIP 实现、Dp83640IDGet ()函数返回0 (数据= 0)

Guru**** 2482105 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/710788/rm57l843-lwip-implementation-dp83640idget-function-returns-0-data-0

器件型号:RM57L843
主题中讨论的其他器件:HALCOGEN

大家好、

标题中描述了我的问题。 lwIPinit()函数无法完成运行,我对它进行了调试,直到我发现了这个问题(以及其他一些问题,但我设法解决了这些问题)。 但我不能用它做任何事情。 我已经阅读过论坛、但 却看不到清晰的解决方案。 我使用的是 Hercules Launchpad。

提前感谢您的帮助。

此致、

Zsolt

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

    我之前使用 RM57 Launchpad 进行了网络带宽测试、它应该可以正常工作。 我今天将测试 PHY 的读取/写入。 您是否使用了通过 HALCoGen 生成的驱动程序?

    我假设您具有正确的引脚多路复用设置和 ECLK 设置(MII 使用 ECLK 输出作为 Launchpad 上的时钟源)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Zsoft、

    LaunchPad 使用与 HDK 不同的以太网引脚。 请仔细检查您在 HALCoGen 中的引脚多路复用器:

    驱动程序启用选项卡:启用 GIO、SCI1和 EMAC 驱动程序  


    ECLK 选项卡:需要25MHz 的 PHY 时钟

    3. PINMUX/引脚复用选项卡:启用 MII  

      

    • 取消选中所有 MII 和 MDIO 信号
    • 将焊球 T4、U7选择为默认功能:MII_RXCLK 和 MII_TX_CLK。 PHY 向 MAC 提供这些时钟。

    4. PINMUX/输入引脚复用选项卡:检查左列上的 MDIO 和 MII 信号(默认)。

    MDIO=F4、MII_COL=W4、MII_CRS=V4、MII_RX_DV=U6、MII_RX_ER=U5、 MII_RXCLK=T4、MII_RXD[0]=U4、MII_RXD[1]=T3、MII_RXD[2]=U3、MII_RXD[3]=V3、 MII_TX_CLK=U7

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

    刚刚进行了测试、我可以毫无问题地读取寄存器。 这里是我用于配置 PHY 以及从 PHY 寄存器读取/写入值的代码。

    /*包含文件*/

    #include "hL_sys_common.h"

    /*用户代码开始(1)*/
    #include "HL_EMAC.h"
    //#include "HL_HW_REG_ACCESS.h"
    //#include "HL_HW_MDIO.h"
    /*用户代码结束*/

    /**@fn void main (void)
    *@应用程序主函数简介
    *@请注意、默认情况下、此函数为空。
    *
    *此函数在启动后调用。
    *用户可以使用此函数来实现应用程序。
    *

    /*用户代码开始(2)*/
    /*---------------------------------------------- *
    * phy_getReg (phynum、Regnum) *
    ******************************************************************************************************* *
    #define mdioUSERACCESS0 *(volatile uint32_t*)(MDIO_base + MDIO_USERACCESS0)
    #define mdioCONTROL *(volatile uint32_t*)(MDIO_base + MDIO_control)


    uint16_t phy_getReg (uint16_t phynum、uint16_t RegNum)

    uint16_t 值;

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

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

    值= mdioUSERACCESS0;
    返回值;


    /*---------------------------------------------- *
    * phy_setreg (phynum、Regnum、data) *
    ******************************************************************************************************* *
    void phy_setreg (uint16_t phynum、uint16_t Regnum、uint16_t data)

    mdioUSERACCESS0 = 0 //读取 PHY ID 1
    |(1 <<31) //[31]开始
    |(1 <<30) //[30]写入
    |(0 << 29) //[29]采集
    |((RegNum & 0x1F)<<21) //[25-21] PHY 寄存器地址
    |((phynum & 0x1F)<<16) //[20-16] PHY 地址
    |((数据和0xFFFF)<<0); //[15-0]数据

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


    void delay (void){
    静态易失性 unsigned int delayval;
    delayval = 10000;// 100000大约为10ms
    while (delayval -);


    /*用户代码结束*/

    uint8emacAddress[6U]={0x11U、0x22U、0x33U、0x44U、0x55U、 0x66U};
    uint32emacPhyAddress=1U;

    int main (空)

    /*用户代码开始(3)*/
    uint32_t mdio_reg;
    uint16_t phy_Ctrl_reg;

    _enable_IRQ ();

    /*------------------------------------ *
    * Init PHY/MDIO *
    ********************************************************************************************** *
    mdioCONTROL = 0x41000020; //启用 MII 接口0x40000001

    delay();

    mdioUSERACCESS0 = 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 (mdioUSERACCESS0 & 0x8000000);//等待结果

    PHY_CTRL_reg = 0
    |(0 <<15) //重置
    |(0 <<14) //环回
    |(1 <<13) //速度选择
    |(1 <<12) //自协商启用
    |(0 <<11) //断电
    |(0 <<10) //隔离
    |(0 <<9) //重新启动自动协商
    |(1 <<8) //双工模式
    |(0 <<7) //冲突测试
    |(0 <<6); //速度选择

    mdioUSERACCESS0 = 0 //设置控制寄存器
    |(1 <<31) //[31]开始
    |(1 <<30) //[30]写入
    |(0 << 29) //[29]采集
    |(0 << 21) //[25-21] PHY 寄存器地址
    |(1 <<16) //[20-16] PHY 地址
    |(phy_ctrl_reg << 0); //[15-0]数据

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

    MDIO_reg = phy_getReg (1、0x0);//应为0x3100
    MDIO_reg = phy_getReg (1、0x2);//应为0x0
    MDIO_reg = phy_getReg (1、0x16);
    MDIO_reg = phy_getReg (1、0x19);
    MDIO_reg = phy_getReg (1、0x18);
    MDIO_reg = phy_getReg (1、0x1B);
    /*等待链接*/
    //正在等待链接...
    while ((phy_getReg (1、1)& 0x4)==0);

    /*用户代码结束*/

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

    e2e.ti.com/.../5444.HL_5F00_sys_5F00_main.c

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

    此致、

    Zsolt