QSPI协议
1、QSPI协议简介
QSPI是Queued SPI 的简写,是 Motorola公司推出的 SPI 接口的扩展,比 SPI 应用更加广泛。在 SPI 协议的基础上,Motorola 公司对其功能进行了增强,增加了队列传输机制,推出了队列串行外围接口协议(即 QSPI 协议),使用该接口,用户可以一次性传输包含多达16个8位或16位数据的传输队列。一旦传输启动,直到传输结束,都不需要CPU干预,极大的提高了传输效率。该协议在ColdFire系列MCU得到广泛应用。与SPI相比,QSPI的最大结构特点是以80字节的RAM代替了SPI的发送和接收寄存器。QSPI 是一种专用的通信接口,连接单、双或四(条数据线) SPI Flash 存储介质。
QUADSPI 主要特性:
三种功能模式:间接模式、状态轮询模式和内存映射模式
双闪存模式,通过并行访问两个 Flash,可同时发送/接收 8 位数据
支持 SDR 和 DDR 模式
针对间接模式和内存映射模式,完全可编程操作码
针对间接模式和内存映射模式,完全可编程帧格式
集成 FIFO,用于发送和接收
允许 8、 16 和 32 位数据访问
具有适用于间接模式操作的 DMA 通道
在达到 FIFO 阈值、超时、操作完成以及发生访问错误时产生中断
该接口可以在以下三种模式下工作:
(1)间接模式:使用 QSPI 寄存器执行全部操作
(2)状态轮询模式:周期性读取外部 Flash 状态寄存器,而且标志位置 1 时会产生中断(如擦除或烧写完成,会产生中断)
(3)内存映射模式:外部 Flash 映射到微控制器地址空间,从而系统将其视作内部存储器采
采用双闪存模式时,将同时访问两个 Quad-SPI Flash,吞吐量和容量均可提高二倍。
QSPI 的工作模式非常灵活,它既可以配置为全双工,也可以配置为半双工,甚至是一种特殊的“增强”半双工模式。具体模式取决于控制器和外部设备的配置以及正在执行的命令。
(1)标准 SPI 模式(兼容模式)
QSPI 完全向下兼容标准 SPI。在这种模式下,它使用标准的 MOSI 和 MISO 线。正如我们之前讨论的:
理论上支持全双工:主机可以通过 MOSI 发送指令,同时从机通过 MISO 返回数据。
实际中常为半双工:很多操作是“先写命令,再读数据”的顺序过程。
所以,在标准 SPI 模式下,QSPI 的双工性与传统 SPI 一致。
(2)QSPI 的“Quad”模式(核心价值所在)
“Q”代表“Quad”,即使用 4 条数据线(IO0, IO1, IO2, IO3) 进行数据传输。这才是 QSPI 真正发挥性能的地方。在这个模式下,情况变得复杂:
a) 全双工模式
描述:在这种模式下,4 条数据线被分为两组。
发送:主机通过其中两条线(例如 IO0 和 IO1)向从设备发送数据。
接收:主机同时通过另外两条线(例如 IO2 和 IO3)从从设备接收数据。
特点:数据在同一个时钟周期内实现了真正的双向同时传输。
局限性:这种模式并不常见,因为它需要从设备(如 Flash 存储器)也支持如此复杂的、引脚复用的双向通信。大多数常见的 QSPI Flash 器件不支持这种真正的全双工模式。
b) 半双工模式(最常见)
这是 QSPI 最主流、最常用的工作模式。它虽然被称为“半双工”,但是一种性能增强的半双工。
描述:在任一时刻,所有 4 条数据线都用于同一个方向的数据传输。
指令阶段:可能只用 1 条线(IO0)发送命令。
地址阶段:可能使用 4 条线发送地址(速度更快)。
数据阶段(读):4 条线全部用于从 Flash 读取数据。这是 QSPI 性能远超标准 SPI 的关键——每个时钟周期可以传输 4 个比特!
数据阶段(写):4 条线全部用于向 Flash 写入数据。
特点:虽然读和写不能同时进行,但在执行读或写操作时,带宽是标准 SPI 的 4 倍。这种分时、但高速的单向爆发式传输,是 QSPI 在存储器接口中广泛应用的原因。
c) 特殊模式:SDR 与 DDR
SDR:数据在时钟的单一沿(通常是上升沿)被采样。
DDR:数据在时钟的两个沿(上升沿和下降沿)都被采样,从而使数据传输率再翻一倍。
DDR 模式进一步提升了半双工传输的峰值速度。
2、QSPI功能框图
(1)双闪模式禁止
双闪存模式禁止见下图:

通常采用的是双闪存禁止的模式连接单片QSPI Flash。QSPI 使用 6 个信号连接Flash,分别是四个数据线BK1_IO0~BK1_IO3,一个时钟输出CLK,一个片选输出(低电平有效)BK1_nCS,它们的作用介绍如下:
BK1_nCS:片选输出(低电平有效),适用于 FLASH 1。如果 QSPI 始终在双闪存模式下工作,则其也可用于 FLASH 2从设备选择信号线。QSPI通讯以BK1_nCS线置低电平为开始信号,以BK1_nCS线被拉高作为结束信号。
CLK:时钟输出,适用于两个存储器,用于通讯数据同步。它由通讯主机产生,决定了通讯的速率, 不同的设备支持的最高时钟频率不一样,如STM32的QSPI时钟频率最大为fpclk/2,两个设备之间通讯时,通讯速率受限于低速设备。
BK1_IO0:在双线 / 四线模式中为双向 IO,单线模式中为串行输出,适用于FLASH 1。
BK1_IO1:在双线 / 四线模式中为双向 IO,单线模式中为串行输入,适用于FLASH 1。
BK1_IO2:在四线模式中为双向 IO,适用于 FLASH 1。
BK1_IO3:在四线模式中为双向 IO,适用于 FLASH 1。
(2)双闪模式使能
双闪存模式使能见下图:

在双闪存模式中, QUADSPI 使用 6 个信号连接单个 Flash,使用 10 到 11 个信号连接两个Flash( FLASH 1 和 FLASH 2):
– CLK - 时钟输出,适用于两个存储器
– BK1_IO0/SO - 在双线 / 四线模式中为双向 IO,单线模式中为串行输出,适用于FLASH 1
– BK1_IO1/SI - 在双线 / 四线模式中为双向 IO,单线模式中为串行输入,适用于FLASH 1
– BK1_IO2 - 在四线模式中为双向 IO,适用于 FLASH 1
– BK1_IO3 - 在四线模式中为双向 IO,适用于 FLASH 1
– BK2_IO0/SO - 在双线/四线模式中为双向 IO,单线模式中为串行输出,适用于FLASH 2
– BK2_IO1/SI - 在双线 / 四线模式中为双向 IO,单线模式中为串行输入,适用于FLASH 2
– BK2_IO2 - 在四线模式中为双向 IO,适用于 FLASH 2
– BK2_IO3 - 在四线模式中为双向 IO,适用于 FLASH 2
– BK1_nCS - 片选输出(低电平有效),适用于 FLASH 1。如果 QUADSPI 始终在双闪存模式下工作,则其也可用于 FLASH 2
– BK2_nCS - 片选输出(低电平有效),适用于 FLASH 2。如果 QUADSPI 始终在双闪存模式下工作,则其也可用于 FLASH 1
3、QSPI命令序列
QUADSPI 通过命令与 Flash 通信, 每条命令包括指令、地址、交替字节、空指令和数据这五个阶段, 任一阶段均可跳过,但至少要包含指令、地址、交替字节或数据阶段之一。nCS 在每条指令开始前下降,在每条指令完成后再次上升。先看看QSPI四线模式下的读命令时序,见下图:

(1)指令阶段
这一阶段,将在 QUADSPI_CCR[7:0] 寄存器的 INSTRUCTION 字段中配置的一条 8 位指令发送到 Flash,指定待执行操作的类型。
尽管大多数 Flash 从 IO0/SO 信号(单线 SPI 模式)只能以一次 1 位的方式接收指令,但指令阶段可选择一次发送 2 位(在双线 SPI 模式中通过 IO0/IO1)或一次发送 4 位(在四线SPI 模式中通过 IO0/IO1/IO2/IO3)。这可通过 QUADSPI_CCR[9:8] 寄存器中的 IMODE[1:0]字段进行配置。
若 IMODE = 00,则跳过指令阶段,命令序列从地址阶段(如果存在)开始。
(2)地址阶段
在地址阶段,将1-4字节发送到Flash,指示操作地址。待发送的地址字节数在QUADSPI_CCR[13:12]寄存器的ADSIZE[1:0]字段中进行配置。在间接模式和自动轮询模式下,待发送的地址字节在QUADSPI_AR寄存器的ADDRESS[31:0]中指定在内存映射模式下,则通过 AHB(来自于 Cortex ® 或 DMA)直接给出地址。
地址阶段可一次发送1 位(在单线SPI模式中通过SO)、2位(在双线SPI模式中通过IO0/IO1)或4位(在四线 SPI 模式中通过 IO0/IO1/IO2/IO3)。这可通过QUADSPI_CCR[11:10]寄存器中的ADMODE[1:0]字段进行配置。
若 ADMODE = 00,则跳过地址阶段,命令序列直接进入下一阶段(如果存在)。
(3)交替字节阶段
在交替字节阶段,将 1-4 字节发送到 Flash,一般用于控制操作模式。待发送的交替字节数在 QUADSPI_CCR[17:16] 寄存器的 ABSIZE[1:0] 字段中进行配置。待发送的字节在QUADSPI_ABR 寄存器中指定。
交替字节阶段可一次发送 1 位(在单线 SPI 模式中通过 SO)、2 位(在双线 SPI 模式中通过 IO0/IO1)或 4 位(在四线 SPI 模式中通过 IO0/IO1/IO2/IO3)。这可通过QUADSPI_CCR[15:14] 寄存器中的 ABMODE[1:0] 字段进行配置。
若 ABMODE = 00,则跳过交替字节阶段,命令序列直接进入下一阶段(如果存在)。
交替字节阶段存在仅需发送单个半字节而不是一个全字节的情况,比如采用双线模式并且仅使用两个周期发送交替字节时。在这种情况下,固件可采用四线模式 (ABMODE = 11) 并发送一个字节,方法是 ALTERNATE 的位 7 和 3 置“1”(IO3 保持高电平)且位 6 和 2 置“0”(IO2 线保持低电平)。此时,半字节的高 2 位存放在 ALTERNATE 的位 4:3,低 2位存放在位 1 和 0 中。例如,如果半字节 2 (0010) 通过 IO0/IO1 发送,则 ALTERNATE 应设置为 0x8A (1000_1010)。
(4)空指令周期阶段
在空指令周期阶段,给定的 1-31 个周期内不发送或接收任何数据,目的是当采用更高的时钟频率时,给 Flash 留出准备数据阶段的时间。这一阶段中给定的周期数在QUADSPI_CCR[22:18] 寄存器的 DCYC[4:0] 字段中指定。在 SDR 和 DDR 模式下,持续时间被指定为一定个数的全时钟周期。
若 DCYC 为零,则跳过空指令周期阶段,命令序列直接进入数据阶段(如果存在)。
空指令周期阶段的操作模式由 DMODE 确定。
为确保数据信号从输出模式转变为输入模式有足够的“周转”时间,使用双线和四线模式从Flash 接收数据时,至少需要指定一个空指令周期。
(5)数据阶段
在数据阶段,可从 Flash 接收或向其发送任意数量的字节。
在间接模式和自动轮询模式下,待发送/接收的字节数在 QUADSPI_DLR 寄存器中指定。
在间接写入模式下,发送到 Flash 的数据必须写入 QUADSPI_DR 寄存器。在间接读取模式下,通过读取 QUADSPI_DR 寄存器获得从 Flash 接收的数据。
在内存映射模式下,读取的数据通过 AHB 直接发送回 Cortex 或 DMA。
数据阶段可一次发送/接收 1 位(在单线 SPI 模式中通过 SO)、2 位(在双线 SPI 模式中通过 IO0/IO1)或 4 位(在四线 SPI 模式中通过 IO0/IO1/IO2/IO3)。这可通过QUADSPI_CCR[15:14] 寄存器中的 ABMODE[1:0] 字段进行配置。
若 DMODE = 00,则跳过数据阶段,命令序列在拉高 nCS 时立即完成。这一配置仅可用于仅间接写入模式。
4、QUADSPI 信号接口协议模式
(1)单线 SPI 模式
传统 SPI 模式允许串行发送/接收单独的 1 位。在此模式下,数据通过 SO 信号(其 I/O 与IO0 共享)发送到 Flash。从 Flash 接收到的数据通过 SI(其 I/O 与 IO1 共享)送达。
通过将( QUADSPI_CCR 中的) IMODE/ADMODE/ABMODE/DMODE 字段设置为 01,可对不同的命令阶段分别进行配置,以使用此单个位模式。
在每个已配置为单线模式的阶段中:
IO0 (SO) 处于输出模式
IO1 (SI) 处于输入模式(高阻抗)
IO2 处于输出模式并强制置“0”(以禁止“写保护”功能)
IO3 处于输出模式并强制置“1”(以禁止“保持”功能)
若 DMODE = 01,这对于空指令阶段也同样如此。
(2)双线 SPI 模式
在双线模式下,通过 IO0/IO1 信号同时发送/接收两位。
通过将 QUADSPI_CCR 寄存器的 IMODE/ADMODE/ABMODE/DMODE 字段设置为 10,可对不同的命令阶段分别进行配置,以使用双线 SPI 模式。
在每个已配置为双线模式的阶段中:
IO0/IO1 在数据阶段进行读取操作时处于高阻态(输入),在其他情况下为输出
IO2 处于输出模式并强制置“0”
IO3 处于输出模式并强制置“1”
在空指令阶段,若 DMODE = 01,则 IO0/IO1 始终保持高阻态。
(3)四线 SPI 模式
在四线模式下,通过 IO0/IO1/IO2/IO3 信号同时发送/接收四位。
通过将 QUADSPI_CCR 寄存器的 IMODE/ADMODE/ABMODE/DMODE 字段设置为 11,可对不同的命令阶段分别进行配置,以使用四线 SPI 模式。
在每个已配置为四线模式的阶段中, IO0/IO1/IO2/IO3 在数据阶段进行读取操作时均处于高阻态(输入),在其他情况下为输出。
在空指令阶段中,若 DMODE = 11,则 IO0/IO1/IO2/IO3 均为高阻态。
IO2 和 IO3 仅用于 Quad SPI 模式 如果未配置任何阶段使用四线 SPI 模式,即使 QUADSPI激活,对应 IO2 和 IO3 的引脚也可用于其他功能。
(4)SDR 模式
默认情况下, DDRM 位 (QUADSPI_CCR[31]) 为 0, QUADSPI 在单倍数据速率 (SDR) 模式下工作。
在 SDR 模式下,当 QUADSPI 驱动 IO0/SO、 IO1、 IO2、 IO3 信号时,这些信号仅在 CLK的下降沿发生转变。
在 SDR 模式下接收数据时, QUADSPI 假定 Flash 也通过 CLK 的下降沿发送数据。默认情况下 (SSHIFT = 0 时),将使用 CLK 后续的边沿(上升沿)对信号进行采样。
(5)DDR 模式
若 DDRM 位 (QUADSPI_CCR[31]) 置 1,则 QUADSPI 在双倍数据速率 (DDR) 模式下工作。
在 DDR 模式下,当 QUADSPI 在地址/交替字节/数据阶段驱动 IO0/SO、 IO1、 IO2、 IO3 信号时,将在 CLK 的每个上升沿和下降沿发送 1 位。
指令阶段不受 DDRM 的影响。始终通过 CLK 的下降沿发送指令。
在 DDR 模式下接收数据时, QUADSPI 假定 Flash 通过 CLK 的上升沿和下降沿均发送数据。若 DDRM = 1,固件必须清零 SSHIFT 位 (QUADSPI_CR[4])。因此,在半个 CLK 周期后(下一个反向边沿)对信号采样。

(6)双闪存模式
若 DFM 位 (QUADSPI_CR[6]) 为 1, QUADSPI 处于双闪存模式。 QUADSPI 使用两个外部四线 SPI Flash( FLASH 1 和 FLASH 2),在每个周期中发送/接收 8 位(在 DDR 模式下为16 位),能够有效地将吞吐量和容量扩大一倍。
每个 Flash 使用同一个 CLK 并可选择使用同一个 nCS 信号,但其 IO0、 IO1、 IO2 和 IO3 信号是各自独立的。
双闪存模式可与单比特模式、双比特模式以及四比特模式结合使用,也可与 SDR 或 DDR 模式相结合。
Flash 的大小在 FSIZE[4:0] (QUADSPI_DCR[20:16]) 中指定,指定的值应能够反映 Flash 的总容量,即单个组件容量的 2 倍。
如果地址 X 为偶数, QUADSPI 赋给地址 X 的字节是存放于 FLASH 1 的地址 X/2 中的字节, QUADSPI 赋给地址 X+1 的字节是存放于 FLASH 2 的地址 X/2 中的字节。也就是说,偶地址中的字节存储于 FLASH 1,奇地址中的字节存储于 FLASH 2。
在双闪存模式下读取 Flash 状态寄存器时,需要读取的字节数是单闪存模式下的 2 倍。这意味着在状态寄存器获取指令到达后,如果每个 Flash 给出 8 个有效位,则 QUADSPI 必须配置为 2 个字节( 16 位)的数据长度,它将从每个 Flash 接收 1 个字节。如果每个 Flash 给出一个 16 位的状态,则 QUADSPI 必须配置为读取 4 字节,以在双闪存模式下可获取两个Flash 的所有状态位。结果(在数据寄存器中)的最低有效字节是 FLASH 1 状态寄存器的最低有效字节,而下一个字节是 FLASH 2 状态寄存器的最低有效字节。数据寄存器的第三个字节是 FLASH 1 的第二个字节,第四个字节是 FLASH 2 的第二个字节( Flash 具有 16 位状态寄存器时)。
偶 数 个 字 节 必 须 始 终 在 双 闪 存 模 式 下 访 问。因 此,若 DRM = 1,则 数 据 长 度 字 段(QUADSPI_DLR[0]) 的位 0 始终保持为 1。
在双闪存模式下, FLASH 1 接口信号的行为基本上与正常模式下相同。在指令、地址、交替字节以及空指令周期阶段, FLASH 2 接口信号具有与 FLASH 1 接口信号完全相同的波形。也就 是说,每个 Flash 总是 接收 相同 的指 令与 地址。然后,在 数据 阶段, BK1_IOx 和BK2_IOx 总线并行传输数据,但发送到 FLASH 1(或从其接收)的数据与 FLASH 2 中的不同。
5、QUADSPI 三种功能模式
5.1、间接模式
在间接模式下,通过写入 QUADSPI 寄存器来触发命令;并通过读写数据寄存器来传输数据,就如同对待其他通信外设那样。
若 FMODE = 00 (QUADSPI_CCR[27:26]),则 QUADSPI 处于间接写入模式,字节在数据阶段中发送到 Flash。通过写入数据寄存器 (QUADSPI_DR) 的方式提供数据。
若 FMODE = 01,则 QUADSPI 处于间接读取模式,在数据阶段中从 Flash 接收字节。通过读取 QUADSPI_DR 来获取数据。
读取/ 写入的字节数在数据长度寄存器 (QUADSPI_DLR) 中指定。如果 QUADSPI_DLR =0xFFFF_FFFF(全为“1”),则数据长度视为未定义, QUADSPI 将继续传输数据,直到到达(由 FSIZE 定义的) Flash 的结尾。如果不传输任何字节, DMODE (QUADSPI_CCR[25:24])应设置为 00。
如果 QUADSPI_DLR = 0xFFFF_FFFF 并且 FSIZE = 0x1F(最大值指示一个 4GB 的Flash),在此特殊情况下,传输将无限继续下去,仅在出现终止请求或 QUADSPI 被禁止后停止。在读取最后一个存储器地址后(地址为 0xFFFF_FFFF),将从地址 = 0x0000_0000开始继续读取。
当发送或接收的字节数达到编程设定值时,如果 TCIE = 1,则 TCF 置 1 并产生中断。在数据数量不确定的情况下,将根据 QUADSPI_CR 中定义的 Flash 大小,在达到外部 SPI 的限制时, TCF 置 1。
(1)触发命令启动
从本质上讲,在固件给出命令所需的最后一点信息时,命令即会启动。根据 QUADSPI 的配置,在间接模式下有三种触发命令启动的方式。在出现以下情形时,命令立即启动:
1)对 INSTRUCTION[7:0] (QUADSPI_CCR) 执行写入操作,如果没有地址是必需的(当ADMODE = 00)并且不需要固件提供数据(当 FMODE = 01 或 DMODE = 00)
2)对 ADDRESS[31:0] (QUADSPI_AR) 执行写入操作,如果地址是必需的(当 ADMODE =00)并且不需要固件提供数据 (当 FMODE = 01 或 DMODE = 00)
3)对 DATA[31:0] (QUADSPI_DR) 执行写入操作,如果地址是必需的(当 ADMODE != 00)并且需要固件提供数据(当 FMODE = 00 并且 DMODE != 00)
写入交替字节寄存器 (QUADSPI_ABR) 始终不会触发命令启动。如果需要交替字节,必须预先进行编程。
如果命令启动, BUSY 位( QUADSPI_SR 的位 5)将自动置 1。
(2)FIFO 和数据管理
在 间 接 模 式 中,数 据 将 通 过 QUADSPI 内 部 的 一 个 32 字 节 FIFO。 FLEVEL[5:0](QUADSPI_SR[13:8]) 指示 FIFO 目前保存了多少字节。
在间接写入模式下 (FMODE = 00),固件写入 QUADSPI_DR 时,将在 FIFO 中加入数据。
字写入将在 FIFO 中增加 4 个字节,半字写入增加 2 个字节,而字节写入仅增加 1 个字节。
如果固件在 FIFO 中加入的数据过多(超过 DL[31:0] 指示的值),将在写入操作结束( TCF置 1)时从 FIFO 中清除超出的字节。
对 QUADSPI_DR 的字节/半字访问必须仅针对该 32 位寄存器的最低有效字节/半字。
FTHRES[3:0] 用于定义 FIFO 的阈值 如果达到阈值, FTF( FIFO 阈值标志)置 1 在间接读取模式下,从 FIFO 中读取的有效字节数超过阈值时, FTF 置 1。从 Flash 中读取最后一个字节后,如果 FIFO 中依然有数据,则无论 FTHRES 的设置为何, FTF 也都会置 1。在间接写入模式下,当 FIFO 中的空字节数超过阈值时, FTF 置 1。
如果 FTIE = 1,则 FTF 置 1 时产生中断。如果 DMAEN = 1,则 FTF 置 1 时启动数据传送。如果阈值条件不再为“真”( CPU 或 DMA 传输了足够的数据后),则 FTF 由 HW 清零。
在间接模式下,当 FIFO 已满, QUADSPI 将暂时停止从 Flash 读取字节以避免上溢。请注意,只有在 FIFO 中的 4 个字节为空 (FLEVEL ≤ 11) 时才会重新开始读取 Flash。因此,若FTHRES ≥ 13,应用程序必须读取足够的字节以确保 QUADSPI 再次从 Flash 检索数据。否则,只要 11 < FLEVEL < FTHRES, FTF 标志将保持为“0”。
5.2、QUADSPI 状态标志轮询模式
在自动轮询模式下, QUADSPI 周期性启动命令以读取一定数量的状态字节(最多 4 个)。可屏蔽接收的字节以隔离一些状态位,从而在所选的位具有定义的值时可产生中断。
对 Flash 的访问最初与在间接读取模式下相同:如果不需要地址 (AMODE = 00),则在写入QUADSPI_CCR 时即开始访问。否则,如果需要地址,则在写入 QUADSPI_AR 时开始第一次访问。 BUSY 在此时变为高电平,即使在周期性访问期间也保持不变。
在自动轮询模式下, MASK[31:0] (QUADSPI_PSMAR) 的内容用于屏蔽来自 Flash 的数据。
如果 MASK[n] = 0,则屏蔽结果的位 n,从而不考虑该位。如果 MASK[n] = 1 并且位 [n] 的内容与 MATCH[n] (QUADSPI_PSMAR) 相同,说明存在位 n 匹配。
如果轮询匹配模式位 (PMM, QUADSPI_CR[23]) 为 0,将激活“AND”匹配模式。这意味着状态匹配标志 (SMF) 仅在全部未屏蔽位均存在匹配时置 1。
如果 PMM = 1,则激活“OR”匹配模式。这意味着 SMF 在任意未屏蔽位存在匹配时置 1。
如果 SMIE = 1,则在 SMF 置 1 时调用一个中断。
如果自动轮询模式停止 (APMS) 位置 1,则操作停止并且 BUSY 位在检测到匹配时清零。否则, BUSY 位保持为“ 1”,在发生中止或禁止 QUADSPI (EN = 0) 前继续进行周期性访问。
数据寄存器 (QUADSPI_DR) 包含最新接收的状态字节( FIFO 停用)。数据寄存器的内容不受匹配逻辑所用屏蔽方法的影响。 FTF 状态位在新一次状态读取完成后置 1,并且 FTF 在数据读取后清零。
5.3、QUADSPI 内存映射模式
在配置为内存映射模式时,外部 SPI 器件被视为是内部存储器。
QUADSPI 外设若没有正确配置并使能,禁止访问 QUADSPI Flash 的存储区域。
即使 Flash 容量更大,寻址空间也无法超过 256MB。
如果访问的地址超出 FSIZE 定义的范围但仍在 256MB 范围内,则生成 AHB 错误。此错误的影响具体取决于尝试进行访问的 AHB 主设备:
如果为 Cortex® CPU,则生成硬性故障 (Hard fault) 中断
如果为 DMA,则生成 DMA 传输错误,并自动禁用相应的 DMA 通道。
支持字节、半字和字访问类型。
支持芯片内执行 (XIP) 操作, QUADSPI 接受下一个微控制器访问并提前加载后面地址中的字节。如果之后访问的是连续地址,由于值已经预取,访问将更快完成。
默认情况下,即便在很长时间内不访问 Flash, QUADSPI 也不会停止预取操作,之前的读取操作将保持激活状态并且 nCS 保持低电平。由于 nCS 保持低电平时, Flash 功耗增加,应用程序可能会激活超时计数器 (TCEN = 1, QUADSPI_CR[3])。从而在 FIFO 中写满预取的数据后,若在 TIMEOUT[15:0] (QUADSPI_LPTR) 个周期的时长内没有访问,则释放 nCS。
BUSY 在第一个存储器映射访问发生时变为高电平。由于进行预取操作, BUSY 在发生超时、中止或外设禁止前不会下降。
6、QUADSPI Flash 配置
设备配置寄存器 (QUADSPI_DCR) 可用于指定外部 SPI Flash 的特性。
FSIZE[4:0] 字段使用下面的公式定义外部存储器的大小:Flash 中的字节数 = 2[FSIZE+1]
FSIZE+1 是对 Flash 寻址所需的地址位数。在间接模式下, Flash 容量最高可达 4GB(使用32 位进行寻址),但在内存映射模式下的可寻址空间限制为 256MB。
如果 DFM = 1, FSIZE 表示两个 Flash 容量的总和。
QUADSPI 连续执行两条命令时,它在两条命令之间将片选信号 (nCS) 置为高电平默认仅一个 CLK 周期时长。如果 Flash 需要命令之间的时间更长,可使用片选高电平时间 (CSHT) 字段指定 nCS 必须保持高电平的最少 CLK 周期数(最大为 8)。
时钟模式 (CKMODE) 位指示命令之间的 CLK 信号逻辑电平( nCS = 1 时)。
7、QUADSPI 延迟数据采样
默认情况下, QUADSPI 在 Flash 驱动信号后过半个 CLK 周期才对 Flash 驱动的数据采样。
在外部信号延迟时,这有利于推迟数据采样。使用 SSHIFT 位 (QUADSPI_CR[4]),可将数据采样移位半个 CLK 周期。
DDR 模式下不支持时钟移位:若 DDRM 位置 1, SSHIFT 位必须清零。
8、QUADSPI 配置
QUADSPI 配置分两个阶段
QUADSPI IP 配置
QUADSPI Flash 配置
QUADSPI 在配置完毕并使能后,即可在间接模式、状态轮询模式和内存映射模式这三种操作模式之一下工作。
(1)QUADSPI IP 配置
通过 QUADSPI_CR 配置 QUADSPI IP。用户应配置传入数据的时钟预分频器的分频系数以及采样移位设置。
DDR 模式可通过 DDRM 位进行设置。使能该模式后,在每个时钟的上升沿和下降沿都会发送地址和交替字节以及发送/接收数据。无论 DDRM 位如何设置,都将在 SDR 模式下发送指令。
DMA 请求通过 DMAEN 位置 1 使能。若是用于中断,则相关使能位也可在该阶段置 1。
生成 DMA 请求或生成中断的 FIFO 电平在 FTHRES 位中进行编程。
如果需要超时计数器,则可将 TCEN 位置 1 并在 QUADSPI_LPTR 寄存器中编程超时值。
双闪存模式可通过将 DFM 置 1 来激活
(2)QUADSPI Flash 配置
与外部目标 Flash 相关的参数通过 QUADSPI_DCR 寄存器进行配置。用户应在 FSIZE 位中编程 Flash 的大小、在 CSHT 位中编程片选保持高电平的最短时间以及在 MODE 位中编程功能模式(模式 0 或模式 3)。
9、QUADSPI 的用法
使用 FMODE[1:0] (QUADSPI_CCR[27:26]) 选择操作模式。
(1)间接模式的操作步骤
FMODE编程为 00 可选择间接写入模式,将数据发送到 Flash。 FMODE编程为 01 可选择间接读取模式,读取 Flash 中的数据。
QUADSPI 用于间接模式时,采用以下方式构建帧:
1. 在 QUADSPI_DLR 中指定待读取或写入的字节数
2. 在 QUADSPI_CCR 中指定帧格式、模式和指令代码
3. 在 QUADSPI_ABR 中指定要在地址阶段后立即发送的可选交替字节
4. 在 QUADSPI_CR 中指定工作模式。若 FMODE = 00(间接写入模式)并且 DMAEN =1,则应在 QUADSPI_CR 前指定 QUADSPI_AR。否则在 QUADSPI_AR 更新前(如果已经使能 DMA 控制器), DMA 便可能写入 QUADSPI_DR。
5. 在 QUADSPI_AR 中指定目标地址
6. 通过 QUADSPI_DR 从 FIFO 读取数据/向 FIFO 写入数据
在写入控制寄存器 (QUADSPI_CR) 时,用户可指定以下设置:
使能位 (EN) 设置为“1”
DMA 使能位 (DMAEN),用于向/从 RAM 传输/接收数据
超时计数器使能位 (TCEN)
采样移位设置 (SSHIFT)
FIFO 阈值 (FTRHES),以指示 FTF 标志在何时置 1
中断使能
自动轮询模式参数:匹配模式和停止模式 (在 FMODE = 11 时有效)
时钟预分频器
在写入通信配置寄存器 (QUADSPI_CCR) 时,用户指定以下参数:
通过 INSTRUCTION 位指定指令字节
通过 IMODE 位指定指令发送方式( 1/2/4 线)
通过 ADMODE 位指定地址发送方式(无/1/2/4 线)
通过 ADSIZE 位指定地址长度( 8/16/24/32 位)
通过 ABMODE 位指定交替字节发送方式(无/1/2/4 线)
通过 ABSIZE 位指定交替字节数 (1/2/3/4)
通过 DBMODE 位指定是否存在空指令字节
通过 DCYC 位指定空指令字节数
通过 DMODE 位指定数据发送/接收方式(无/1/2/4 线)
如果无需为某个命令更新地址寄存器 (QUADSPI_AR) 与数据寄存器 (QUADSPI_DR),则在写入 QUADSPI_CCR 时,该命令序列便立即启动。在 ADMODE 和 DMODE 均为 00 时,或在间接读取模式 (FMODE = 01) 下仅 ADMODE = 00 时,便属于此情况。
在需要地址( ADMODE 不为 00),但无需写入数据寄存器( FMODE = 01 或 DMODE =00)时,通过写入 QUADSPI_AR 更新地址后,命令序列便立即启动。
在数据传输( FMODE = 00 并且 DMODE ! = 00)中,通过 QUADSPI_DR 写入 FIFO 触发通信启动。
(2)状态标志轮询模式
将 FMODE 字段 (QUADSPI_CCR[27:26]) 设置为 10,使能状态标志轮询模式 在此模式下,将发送编程的帧并周期性检索数据。
每帧中读取的最大数据量为 4 字节。如果 QUADSPI_DLR 请求更多的数据,则忽略多余的部分并仅读取 4 个字节。
在 QUADSPI_PISR 寄存器中指定周期性。
在检索到状态数据后,可在内部进行处理,以达到以下目的:
将状态匹配标志位置 1,如果使能,还将产生中断
自动停止周期性检索状态字节
接收到的值可通过存储于 QUADSPI_PSMKR 中的值进行屏蔽,并与存储在 QUADSPI_PSMAR中的值进行或运算或与运算。
若是存在匹配,则状态匹配标志置 1,并且在使能了中断的情况下还将产生中断;如果AMPS 位置 1,则 QUADSPI 自动停止。
在任何情况下,最新的检索值都在 QUADSPI_DR 中可用。
(3)内存映射模式
在内存映射模式下,外部 Flash 被视为内部存储器,只是存在访问延迟。在该模式下,仅允许对外部 Flash 执行读取操作。
将 QUADSPI_CCR 寄存器中的 FMODE 设置为 11 可进入内存映射模式。
当 AHB 主器件访问存储器映射空间时,将发送已编程的指令和帧。
FIFO 用作预取缓冲区以接受线性读取。在此模式中,对于 QUADSPI_DR 的任何访问均返回零。
数据长度寄存器 (QUADSPI_DLR) 在内存映射模式中无意义。
10、指令仅发送一次
一些 Flash(例如 Winbound)能够提供一种模式,指令在该模式中仅通过第一个命令序列进行发送,后续的命令根据地址直接启动。用户通过使用 SIOO 位 (QUADSPI_CCR[28]) 可利用此功能的优势。
SIOO 对于所有功能模式(间接模式、状态轮询模式和内存映射模式)均有效。如果 SIOO位置 1,仅第一条命令发送指令,接着对 QUADSPI_CCR 执行写入操作。后续命令序列都将跳过指令阶段,直到 QUADSPI_CCR 被写入为止。
在 IMODE = 00(无指令)时, SIOO 不起作用。
11、QUADSPI 差错管理
在以下情况下可能产生错误:
在间接模式或状态标志轮询模式下,如果在 QUADSPI_AR 中编程了错误的地址(根据QUADSPI_DCR 中 FSIZE[4:0] 定义的 Flash 大小): TEF 将置 1,如果使能,还将产生中断。
另外,在间接模式下,如果地址加数据的长度超过 Flash 的大小, TEF 将在访问被触发时置 1。
在内存映射模式下,当 AHB 主器件执行的访问超出范围或 QUADSPI 被禁止时:将产生 AHB 错误,以响应故障 AHB 请求。
当 AHB 主机访问存储器映射空间,但内存映射模式被禁止时:将产生 AHB 错误,以响应故障 AHB 请求。
12、QUADSPI 的繁忙位和中止功能
在 QUADSPI 启动对 Flash 的操作时, QUADSPI_SR 中的 BUSY 位自动置 1。
在间接模式下,在 QUADSPI 完成了请求的命令序列并且 FIFO 为空时, BUSY 位复位。
在自动轮询模式下,仅当最后一次周期性访问完成时(因 APMS = 1 时发生匹配,或因中止), BUSY 位才变为低电平。
在内存映射模式下进行第一次访问后,仅在发生超时事件或中止时BUSY 位变为低电平。
任何操作都可通过将 QUADSPI_CR 中的 ABORT 位置 1 来中止。在完成中止时, BUSY 位和 ABORT 位自动复位, FIFO 清空。
注: 如果中止对状态寄存器的写入操作,有些 Flash 可能发生错误行为。
13、nCS 行为
默认情况下, nCS 为高电平,取消选择外部 Flash。 nCS 在操作开始前下降,在操作完成时立即上升。
当 CKMODE = 0(“模式 0”,在未进行任何操作时 CLK 保持低电平)时, nCS 在操作首次升高 CLK 边沿时的一个 CLK 周期前降至低电平,在操作最后一次升高 CLK 边沿时的一个CLK 周期后升至高电平,如图 65 所示:

当 CKMODE = 1(“模式 3”,在未进行任何操作时 CLK 升至高电平)且 DDRM = 0( SDR 模式)时, nCS 仍在操作首次升高 CLK 边沿时的一个 CLK 周期前降至低电平,在操作最后一次升高 CLK 边沿时的一个 CLK 周期后升至高电平,如图 66 所示。

当 CKMODE = 1(模式 3)且 DDRM = 1( DDR 模式)时, nCS 在操作首次升高 CLK 边沿时的一个 CLK 周期前降至低电平,在操作最后一次升高 CLK 边沿时的一个 CLK 周期后升至高电平,如图 67 所示。由于 DDR 操作必须伴随下降沿完成,当 nCS 变为高电平时, CLK为低电平并在经过半个周期后恢复高电平。

若 FIFO 在读取操作中保持写满状态或在写入操作中保持为空,则在固件干预 FIFO 前,操作停止并且 CLK 保持低电平。若操作停止时发生中止,则 nCS 在请求中止后即升至高电平, CLK 则在半个周期后升至高电平,如图 68 所示。

不处于双闪存模式 (DFM = 0) 时,仅访问 FLASH 1,因此 BK2_nCS 保持高电平。在双闪存模式下, BK2_nCS 与 BK1_nCS 的行为完全相同。因此,如果存在 FLASH 2 并且应用程序始终处于双闪存模式,则 FLASH 2 可使用 BK1_nCS,而 BK2_nCS 引脚输出可用于其他功能。
14、QUADSPI 中断
发生如下事件时可生成中断:
超时
状态匹配
FIFO 阈值
传输完成
传输错误
可以使用单独的中断使能位以提高灵活性。

浙公网安备 33010602011771号