采用非缓存的方式碰到同样的问题,SPI写是对的,QSPI写还是出错。
SPI写的代码:
uint16_t i;
for(i = 0; i < len; i++)
{
SFLASH->REG_SF_RADR2 = (uint8_t)((flashAddr + i) >> 16);
SFLASH->REG_SF_RADR1 = (uint8_t)((flashAddr + i) >> 8);
SFLASH->REG_SF_RADR0 = (uint8_t)((flashAddr + i) >> 0);
SFLASH->REG_SF_WDATA = buf[i];
SFLASH->REG_SF_CMD = (1 << 4); // bit4 : WR
ac78xxSFlashWaitDone((uint32_t)(&(SFLASH->REG_SF_CMD)), (1 << 4), 0);
}
QSPI写的代码:
uint8_t qspiConfig = SFLASH->REG_QSPI_CFG;
uint16_t i;
if(sflashManufactor == SFLASH_MXIC)
{
SFLASH->REG_QSPI_CFG = 0x06;
SFLASH->REG_SF_PRGDATA0 = 0x38; //MXIC is special
}
else
{
SFLASH->REG_QSPI_CFG = 0x04;
SFLASH->REG_SF_PRGDATA0 = 0x32; //QSPI page program command
}
SFLASH->REG_SF_CFG2 = 0x10; //use PRGDATA0 as write command
while((SFLASH->REG_SF_CFG2 & 0x10) != 0x10);
for(i = 0; i < len; i++)
{
SFLASH->REG_SF_RADR2 = (uint8_t)((flashAddr + i) >> 16);
SFLASH->REG_SF_RADR1 = (uint8_t)((flashAddr + i) >> 8);
SFLASH->REG_SF_RADR0 = (uint8_t)((flashAddr + i) >> 0);
SFLASH->REG_SF_WDATA = buf[i];
SFLASH->REG_SF_CMD = (1 << 4); // bit4 : WR
ac78xxSFlashWaitDone((uint32_t)(&(SFLASH->REG_SF_CMD)), (1 << 4), 0);
}
SFLASH->REG_QSPI_CFG = qspiConfig;
SFLASH->REG_SF_CFG2 = 0x00;
while((SFLASH->REG_SF_CFG2 & 0x01) == 0x01);
|