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.

[参考译文] AM5718:QSPI 预分频器问题

Guru**** 2554860 points
Other Parts Discussed in Thread: AM5718

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/575704/am5718-qspi-prescaler-issue

器件型号:AM5718

您好-

在 AM5718器件上配置 QSPI 输出时钟时遇到了很大困难。  使用低级驱动程序 QSPI_OPEN_B1 ()从 CSL 调用 QSPISetPreScale()。  要在 QSPI_SPI_SPI_CLOCK _CNTRL_REG 中设置 DCLK_DIV 值、我们必须首先禁用 QSPI 时钟。  如果您看看 QSPISetPreScale()执行的操作:

void QSPISetPrescalt (uint32_t baseAddr、uint32_t clkDividerVal)
{
/*读取时钟控制寄存器的值*/
uint32_t regVal =
HW_RD_REG32 (baseAddr + QSPI_SPI_CLOCK _CNTRL_REG);
/*等待 QSPI 空闲*/
QSPIWaitIdle (baseAddr);

/*关闭 QSPI 数据时钟*/
HW_SET_FIELD32 (regVal、QSPI_SPI_CLOCK _CNTRL_REG_CLKEN、
QSPI_SPI_CLOCK _CNTRL_REG_CLKEN_DCLOCK_OFF);

/*设置 QSPI 时钟分频器位字段值*/
HW_SET_FIELD32 (regVal、QSPI_SPI_CLOCK _CNTRL_REG_DCLK_DIV、
clkDividerVal);

/*启用 QSPI 数据时钟*/
HW_SET_FIELD32 (regVal、QSPI_SPI_CLOCK _CNTRL_REG_CLKEN、
QSPI_SPI_CLOCK _CNTRL_REG_CLKEN_DCLOCK_ON);
/*设置 QSPI 时钟控制寄存器的值*/
HW_WR_REG32 (baseAddr + QSPI_SPI_CLOCK _CNTRL_REG、regVal);
} 

此函数实际上不会禁用 QSPI 时钟。  它看起来是通过在本地 regVal 变量中禁用它来尝试的、但它从未写入物理寄存器以禁用时钟。  我的问题最终是、我的 DCLK_DIV 值没有被重新加载、因为这个函数实际上并不是禁用/重新启用时钟。  这是错误还是我对该函数的解释不正确?  当我禁用实际寄存器中的时钟、设置我所需的 DCLK_DIV、然后重新启用时钟时、我获得预期的输出时钟频率。

谢谢、

不需要

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

    这是什么软件? 哪个版本?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Biser、

    我包含的代码来自 SDK 版本3.2.0.5、特别是在 pdk_am57xx_1_0_5\packages/ti\CSL\src\IP\QSPI\V1\priv\QSPI.c 目录中

    不需要
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢。 在询问有关软件的问题时、请指定您使用的 SDK (Linux 或 RTOS)和版本。 RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有任何相关信息吗? 谢谢。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我已上报请求。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Nathan、

    您的评估正确。 n`t 似乎在本地修改了 regVal 字段、regVal 字段是一个局部变量、但它确实会写入寄存器以关闭时钟。  代码应修改为以下、以便在 建议的序列中工作。

    void QSPISetPrescalt (uint32_t baseAddr、uint32_t clkDividerVal)
    {
    /*读取时钟控制寄存器的值*/
    uint32_t regVal =
    HW_RD_REG32 (baseAddr + QSPI_SPI_CLOCK _CNTRL_REG);
    /*等待 QSPI 空闲*/
    QSPIWaitIdle (baseAddr);
    
    /*关闭 QSPI 数据时钟*/
    HW_SET_FIELD32 (regVal、QSPI_SPI_CLOCK _CNTRL_REG_CLKEN、
    QSPI_SPI_CLOCK _CNTRL_REG_CLKEN_DCLOCK_OFF);
    
    /*设置 QSPI 时钟控制寄存器的值*/
    HW_WR_REG32 (baseAddr + QSPI_SPI_CLOCK _CNTRL_REG、regVal);
    
    
    /*设置 QSPI 时钟分频器位字段值*/
    HW_SET_FIELD32 (regVal、QSPI_SPI_CLOCK _CNTRL_REG_DCLK_DIV、
    clkDividerVal);
    
    /*设置 QSPI 时钟控制寄存器的值*/
    HW_WR_REG32 (baseAddr + QSPI_SPI_CLOCK _CNTRL_REG、regVal);
    
    /*启用 QSPI 数据时钟*/
    HW_SET_FIELD32 (regVal、QSPI_SPI_CLOCK _CNTRL_REG_CLKEN、
    QSPI_SPI_CLOCK _CNTRL_REG_CLKEN_DCLOCK_ON);
    /*设置 QSPI 时钟控制寄存器的值*/
    HW_WR_REG32 (baseAddr + QSPI_SPI_CLOCK _CNTRL_REG、regVal);
    } 

    感谢您将此事提请我们注意。 我将针对此问题提交一个错误。 我不确定我们是否可以在下一个版本中解决此问题、但我将与开发团队讨论此问题、并返回给您。

    此致、

    Rahul

    PS:此问题的错误报告编号为 PRSDK-2034。 当问题得到解决时、您应该会在发行说明中看到这一点。

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

    [引用 user="Rahul Prabhu"]PS:此问题的错误报告编号为 PRSDK-2034。 当问题得到解决时,您应该在发行说明中看到这一点。

    根据 CSL 发行说明、对于可能感兴趣的任何其他人、此问题已在 CSL 版本3.3.0.6中得到解决。