Part Number: AM4378
The code of QSPISetPreScaler procedure is not right, it doesn't disable clock before set prescaler.
C:\ti\pdk_am437x_1_0_11\packages\ti\starterware\dal\qspi.c
void QSPISetPreScaler(uint32_t baseAddr, uint32_t clkDividerVal)
{
/* Read the value of Clock control register */
uint32_t regVal = HW_RD_REG32(baseAddr + QSPI_CLOCK_CNTRL_REG);
/* wait for QSPI to be idle */
while (TRUE == QSPIIsBusy(baseAddr));
/* Set the QSPI clock divider bit field value*/
HW_SET_FIELD(regVal, QSPI_CLOCK_CNTRL_REG_DCLK_DIV, clkDividerVal);
/* Enable the QSPI data clock */
HW_SET_FIELD(regVal, QSPI_CLOCK_CNTRL_REG_CLKEN,
QSPI_CLOCK_CNTRL_REG_CLKEN_DCLOCK_ON);
/* Set the value of QSPI clock control register */
HW_WR_REG32(baseAddr + QSPI_CLOCK_CNTRL_REG, regVal);
}
But the code in this file is correct: C:\ti\pdk_am437x_1_0_11\packages\ti\csl\src\ip\qspi\V1\priv\qspi.c
void QSPISetPreScaler(uint32_t baseAddr, uint32_t clkDividerVal)
{
/* Read the value of Clock control register */
uint32_t regVal = HW_RD_REG32(baseAddr + QSPI_CLOCK_CNTRL_REG);
/* wait for QSPI to be idle */
while (TRUE == QSPIIsBusy(baseAddr));
/* Set the QSPI clock divider bit field value*/
HW_SET_FIELD(regVal, QSPI_CLOCK_CNTRL_REG_DCLK_DIV, clkDividerVal);
/* Enable the QSPI data clock */
HW_SET_FIELD(regVal, QSPI_CLOCK_CNTRL_REG_CLKEN,
QSPI_CLOCK_CNTRL_REG_CLKEN_DCLOCK_ON);
/* Set the value of QSPI clock control register */
HW_WR_REG32(baseAddr + QSPI_CLOCK_CNTRL_REG, regVal);
}