您好-
在 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、然后重新启用时钟时、我获得预期的输出时钟频率。
谢谢、
不需要