QSPI 通过命令与 Flash 通信每条命令包括指令、地址、交替字节、空指令和数据这五个阶段。任一阶段均可跳过,但至少要包含指令、地址、交替字节或数据阶段之一。
nCS 在每条指令开始前下降到低电平,在每条指令完成后再次上升为高电平。
一、指令段
这一阶段,将在 QSPI_CCR1 寄存器的 INSTRUCTION 字段中配置的一条 8 位指令发送到 Flash,指定待执行操作的类型。
尽管大多数 Flash 从 IO0/SO 信号(单线 SPI 模式)只能以一次 1 位的方式接收指令,但指令阶段可选择一次发送 2 位(在双线 SPI 模式中通过 IO0 / IO1)或一次发送 4 位(在四线 SPI 模式中通过 IO0 / IO1 / IO2 / IO3)。这可通过 QSPI_CCR2 寄存器中的 IMODE[1:0]字段进行配置。
若 IMODE = 00,则跳过指令阶段,命令序列从地址阶段(如果存在)开始。
二、地址段
在地址阶段,将 1~4 字节地址发送到 Flash,指示操作地址。待发送的地址字节数在 QSPI_CCR2寄存器的 ADSIZE[1:0]字段中进行配置。在间接模式和自动轮询模式下,待发送的地址字节在QSPI_AR1~QSPI_AR4 寄存器的 ADDRESS[31:0]中指定。
地址阶段可一次发送 1 位(在单线 SPI 模式中通过 SO)、2 位(在双线 SPI 模式中通过 IO0 / IO1)或 4 位(在四线 SPI 模式中通过 IO0 / IO1 / IO2 / IO3)。这可通过 QSPI_CCR2 寄存器中的ADMODE[1:0]字段进行配置。若 ADMODE = 00,则跳过地址阶段,命令序列直接进入下一阶段(如果存在)。
三、交替字节段(复用字节段)
在交替字节阶段,将 1 字节发送到 Flash,一般用于控制操作模式。待发送的交替字节数在QSPI_CCR3寄存器的ABSIZE[1:0]字段中进行配置。待发送的字节在QSPI_ABR寄存器中指定。
交替字节阶段可一次发送 1 位(在单线 SPI 模式中通过 S0)、2 位(在双线 SPI 模式中通过 IO0/ IO1)或 4 位(在四线 SPI 模式中通过 IO0 / IO1 / IO2 / IO3)。这可通过 QSPI_CCR2 寄存器中的 ABMODE[1:0]字段进行配置。若 ABMODE = 00,则跳过交替字节阶段,命令序列直接进入下一阶段(如果存在)。
交替字节阶段存在仅需发送单个半字节而不是一个全字节的情况,比如采用双线模式并且仅使用两个周期发送交替字节时。在这种情况下,固件可采用四线模式(ABMODE = 11)并发送一个字节,方法是 ALTERNATE 的 Bit7 和 Bit3 置“1”(I03 保持高电平)且 Bit6 和 Bit2 置“0”(I02 线保持低电平)。此时,半字节的高 2 位存放在 ALTERNATE 的 Bit4 和 Bit3,低 2 位存放在位 1 和 0 中。例如,如果半字节 2(0010)通过 IO0/IO1 发送,则 ALTERNATE 应设置为 0x8A(1000_1010)。
四、空周期段
在空周期阶段,给定的 1-31 个周期内不发送或不接收任何数据,目的是当采用更高的时钟频率时,给 Flash 留出准备数据阶段的时间。这一阶段中给定的周期数在 QSPI_CCR3 寄存器的DCYC[4:0]字段中指定。在 SDR 模式下,持续时间被指定为一定个数的全时钟周期。
若 DCYC 为零,则跳过空指令周期阶段,命令序列直接进入数据阶段(如果存在)。
空指令周期阶段的操作模式由 DMODE 确定。
为确保数据信号从输出模式转变为输入模式有足够的“周转”时间,使用双线和四线模式从Flash 接收数据时,至少需要指定一个空指令周期。
五、数据段
在数据阶段,可从 Flash 接收或向其发送任意数量的字节。
在间接模式和自动轮询模式下,待发送/接收的字节数在 QSPI_DLR 寄存器中指定。
在间接写入模式下,发送到 Flash 的数据必须写入 QSPI_DR 寄存器。在间接读取模式下,通过读取 QSPI_DR 寄存器获得从 Flash 接收的数据。
数据阶段可一次发送/接收 1 位(在单线 SPI 模式中通过 SO)、2 位(在双线 SPI 模式中通过IO0 / IO1)或 4 位(在四线 SPI 模式中通过 IO0 / IO1 / IO2 / IO3)。这可通过 QSPI_CCR2 寄存器中的 ABMODE[1:0]字段进行配置。
若 DMODE = 00,则跳过数据阶段,命令序列在拉高 nCS 时立即完成。这一配置仅可用于仅间接写入模式。