Quadspi可以并行访问两次闪存。这可以将吞吐量性能提高两倍。
但请注意,在并行模式下只允许读取操作和x1模式写入。
通过将QSPI_BFGENCR[par_en]位设置为“1”,使 AHB flexible-buffers 在并行模式下工作, 将QSPI_IPCR[par_en]位设置为“1”,使 IP 命令在并行模式下工作,从任何偶数地址读取提供两个串行闪存设备的位[7:4]和从任何奇数加法读取。RESS提供两个闪存设备的位[3:0]。并行闪存模式适用于串行闪存单IO模式下与数据读取和数据写入相关的命令,这意味着它可以以并行模式写入数据,但仅限于1个PAD模式,并且读取数据完全支持1、2、4个PAD操作。
在并行模式下,当它向闪存设备发出命令时,它会同时在qspi a和b上发出命令,但如果同时以并行模式读取状态,它会得到错误的结果,因为它是qspi a和qspi b的总线数据的组合。
因此,使用并行模式进行命令读取状态是有限制的,需要临时将其改为单模式,单独读取状态寄存器,下面是Macronix(MU25L128)的读取状态寄存器示例。
添加以下下命令以读取qspi flash b状态寄存器。
您只需将IP地址更改为qspi flash b,例如:
QSPI_DRV_SetIPCommandAddr(0,FLASH_B1_BASEADDRESS); //write QSPI flash B address to QuadSPI_SFAR
To read the QSPI status, add the following snippet code.
while(QSPI_DRV_GetQspiStatus(0, kQspiBusy));
QSPI_DRV_ClearFifo(0, kQspiTxFifo);
QSPI_HAL_ClearSeqId(QuadSPI0, kQspiBufferSeq);
QSPI_HAL_ClearSeqId(QuadSPI0, kQspiIPSeq);
//Set the address
QSPI_DRV_SetIPCommandAddr(0,FLASH_A1_BASEADDRESS);
while(QSPI_DRV_GetQspiStatus(0, kQspiBusy));
while(QSPI_DRV_GetQspiStatus(0, kQspiIPAccess));
QSPI_DRV_ClearFifo(0, kQspiTxFifo);
QSPI_DRV_ClearFifo(0, kQspiRxFifo);
QuadSPI0_IPCR = QuadSPI_IPCR_SEQID(3)|0x02;
while(QSPI_DRV_GetQspiStatus(0, kQspiBusy));
val = *(volatile uint32_t *)(FSL_FEATURE_QSPI_ARDB_ADDRESS);
通过编写quadspi_ipcr或quadspi_bfgencr将qspi模式恢复为并行模式。
QuadSPI0_IPCR = IpcrValue;
while(QSPI_DRV_GetQspiStatus(0, kQspiBusy));
while(QSPI_DRV_GetQspiStatus(0, kQspiIPAccess));