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.

[参考译文] TM4C1294NCPDT:TivaWare EMAC.c 使用的地址不正确

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/620626/tm4c1294ncpdt-tivaware-emac-c-is-using-incorrect-addresses

器件型号:TM4C1294NCPDT

我正在尝试将 Stellaris 项目移植到 Tivaware、并且我遇到了初始化 lwiplib 的问题。  我使用的是 Tivaware 2.1.4.178。

位于 TivaWare\driverlib 中的 EMAC.c 正在为以太网控制器使用不正确的存储器位置。  根据数据表、以太网控制器从0x400E.C000开始。  但是、EMAC.c 使用 SYSCLT_Periph_EPHY0 #define (位于 TivaWare\Driverlib\sysctl.h 中)。  SYSCTL_PERIPH_EPHY0定义为0xF000.3000

这是在 EMA c 中导致问题的函数

void
EMACPHYConfigSet (uint32_t ui32Base、uint32_t ui32Config)
{
//
//将以太网 PHY 配置写入外设配置
//寄存器。
//
HWREG (ui32Base + EMAC_O_PC)= ui32Config;

//
//如果使用内部 PHY,请将其复位以确保新配置为
//锁定在此处。
//
if (((ui32Config & EMAC_PHY_TYPE_MASK)== EMAC_PHY_TYPE_INTERNAL)
{
SysCtlPeripheralReset (SYSCTL_Periph_EPHY0);
while (!SysCtlPeripheralReady (SYSCTL_Periph_EPHY0))
{
//
//等待 PHY 复位完成。
//
}

//
//延迟一点以确保 PHY 复位已完成。
//
SysCtlDelay (10000);
}

//
//如果使用外部 RMII PHY,我们必须在以太网 MAC 中设置2个位
//时钟配置寄存器。
//
if (((ui32Config & EMAC_PHY_TYPE_MASK)== EMAC_PHY_TYPE_EXTERNAL_RMII)
{
//
//从 RMII PHY 选择和启用外部时钟。
//
HWREG (EMAC0_BASE + EMAC_O_CC)|= EMAC_CC_CLKEN;
}
其他
{
//
//禁用外部时钟。
//
HWREG (EMAC0_BASE + EMAC_O_CC)&&~EMAC_CC_CLKEN;
}

//
//重置 MAC,不管 PHY 连接是否更改。
//
EMACReset (EMAC0_BASE);

SysCtlDelay (1000);
} 

根据数据表、所有 SYSCTL_PERIPh #defines 都位于0xF000.XXXX 存储器区域中、应保留该区域。

我的代码正在"等待 PHY 复位完成"自旋等待循环中挂起。  

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

    您好、Curtis、

     我看不到代码有什么问题。 0x400E.C000是以太网(EMAC)控制器的基地址。 SysCtlPeripheralReady (SYSCLT_Periph_EPHY0)正在检查"PHY"是否就绪。 这未检查 EMAC 就绪。 您的 PHY 未准备就绪、但这不是由任何错误的地址导致的。

     SYSCLT_Periph_EPHY0 #define 不是绝对的 PHY 地址。 它更像是一个掩码值。  请参阅以下代码。 SYSCTL_PRBASE 等于0x400FEA00。 (ui32Peripheral & 0x0000)>> 8)将为0xF0003000 & 0xFF00)>> 8)、即0x30。 将偏移量添加到基址后、最终地址为0x400F_EA30。 这是以太网 PHY 外设就绪寄存器的地址。  

    bool
    SysCtlPeripheralReady (uint32_t ui32Peripheral)
    {
    //
    //检查参数。
    //
    Assert (_SysCtlPeripheralValid (ui32Peripheral));
    
    //
    //查看此外设是否就绪。
    //
    RETURN (HWREGBITW (SYSCTL_PRBASE +((ui32Peripheral & 0x0000)>> 8)、
    ui32Peripheral & 0xff);
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我刚才也得出了同样的结论。 我最初没有看到所有的位变化。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我还弄清楚了我在 SysCtlPeripheralReady (SYSCTL_Periph_EPHY0)的自旋等待调用中遇到的问题。  我没有正确设置时钟。

    使用以下代码配置时钟可以解决问题。

    uint32_t SysClock = SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz |
    SYSCTL_OSC_MAIN |
    SYSCTL_USE_PLL |
    SYSCTL_CFG_VCO_480)、120000000); 

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