在间接模式下,通过写入 QSPI 寄存器来触发命令;并通过读写数据寄存器来传输数据,就如同对待其他通信外设那样。
若 FMODE = 00,则 QSPI 处于间接写入模式,字节在数据阶段中发送到 Flash。通过写入数据寄存器 QSPI_DR 的方式提供数据。
若 FMODE = 01,则 QSPI 处于间接读取模式,在数据阶段中从 Flash 接收字节。通过读取QSPI_DR 来获取数据。
读取/写入的字节数在数据长度寄存器(QSPI_DLR)中指定。如果 QSPI_DLR = OxFFF_FFFF(全为“1”),则数据长度视为未定义,QSPI 将继续传输数据,直到到达(由 FSIZE 定义的)Flash 的结尾。如果不传输任何字节,DMODE 应设置为 00。
如果 QSPI_DLR = 0xFF,并且 FSIZE = 0x1F (最大值指示一个 4GB 的 Flash),在此特殊情况下,传输将无限继续下去,仅在出现终止请求或 QSPI 被禁止后停止。在读取最后一个存储器地址后(地址为 OxFFFF_FFFF),将从地址=0x0000_0000 开始继续读取。
当发送或接收的字节数达到编程设定值时,如果 TCIE = 1,则 TCF 置 1 并产生中断。在数据数量不确定的情况下,将根据 QSPI_CR 中定义的 Flash 大小,在达到外部 SPI 的限制时,TCF 置1。
一、触发命令启动
从本质上讲,在固件给出命令所需的最后一点信息时,命令即会启动。根据 QSPI 的配 置,在间接模式下有三种触发命令启动的方式。在出现以下情形时,命令立即启动:
1、 对 INSTRUCTION[7:0] (QSPI_CCR1)执行写入操作,如果没有地址是必需的(当ADMODE = 00)并且不需要固件提供数据(当 FMODE = 01 或 DMODE = 00)
2、 对 ADDRESS[31:0] (QSPI_AR)执行写入操作,如果地址是必需的(当 ADMODE = 00)并且不需要固件提供数据(当 FMODE = 01 或 DMODE = 00)
3、 对 DATA[7:0](QSPI_DR)执行写入操作,如果地址是必需的(当 ADMODE != 00) 并且需要固件提供数据(当 FMODE = 00 并且 DMODE != 00)
写入交替字节寄存器(QSPI_ABR)始终不会触发命令启动。如果需要交替字节,必须预先进行编程。
如果命令启动,BUSY 位(QSPI_LSR 的位 5)将自动置 1。
二、FIFO 和数据管理
在间接模式中,数据将通过 QSPI 内部的一个 32 字节 FIFO。FLEVEL[5:0] (QSPI_SR2)指示FIFO 目前保存了多少字节。
在间接写入模式下(FMODE = 00),固件写入 QSPI_DR 时,将在 FIFO 中加入数据。 字写入将在 FIFO 中增加 4 个字节,半字写入增加 2 个字节,而字节写入仅增加 1 个字节。
如果固件在 FIFO 中加入的数据过多(超过 DL[31:0]指示的值),将在写入操作结束(TCF 置1)时从 FIFO 中清除超出的字节。
对 QSPI_DR 的字节/半字访问必须仅针对该 32 位寄存器的最低有效字节/半字。
FTHRES[3:0]用于定义 FIFO 的阈值如果达到阈值,FTF(FIFO 阈值标志)置 1 在间接读取模式下,从 FIFO 中读取的有效字节数超过阈值时,FTF 置 1。从 Flash 中读取最后一个字节后,如果 FIFO 中依然有数据,则无论 FTHRES 的设置为何,FTF 也都会置 1。在间接写入模式下,当 FIFO 中的空字节数超过阈值时,FTF 置 1。
如果 FTIE = 1,则 FTF 置 1 时产生中断。如果阈值条件不再为“真” (CPU 传输了足够的数据后),则 FTF 由 HW 清零。
在间接模式下,当 FIFO 已满,QSPI 将暂时停止从 Flash 读取字节以避免上溢。