QSPI是基于SPI的加强版,SPI的简介见点击跳转
是基于STM32F767,APLLO开发板进行学习的,参见其33章
简介 & SPI与QSPI的比较
- Quad Serial Perpheral Interface
- QSPI 接口通过 6 根线与 SPI 芯片连接,包括:4 根数据线(IO0~3)、1 根时钟线(CLK)和 1 根片选线(nCS);
- 普通的 SPI 通信一般只有一根数据线(MOSI);
- QSPI 有 4 根数据线,所以 QSPI 的速率是SPI 的 4 倍,提高了通信速率。
命令序列的分析
- STM32F7 具有 QSPI 接口,支持如下三种工作模式:
间接模式:使用 QSPI 寄存器执行全部操作
状态轮询模式:周期性读取外部 FLASH 状态寄存器,当标志位置 1 时会产生中断(如
擦除或烧写完成,产生中断)
内存映射模式:外部 FLASH 映射到微控制器地址空间,从而系统将其视作内部存储器 - 以QSPI 通过命令与 FLASH 通信为例,进行分析:
- 每条命令包括:指令、地址、交替字节、空指令和数据这五个阶段。任一阶段均可跳过,但至少要包含指令、地址、交替字节或数据阶段之一。
- nCS 在每条指令开始前下降,在每条指令完成后再次上升。
- 指令阶段
此阶段通过 QUADSPI_CCR[7:0]寄存器的 INSTRUCTION 字段指定一个 8 位指令发送到FLASH。指令阶段,一般是通过 IO0 单线发送,但是也可以配置为双线/四线发送指令,可以通过 QUADSPI_CCR[9:8]寄存器的 IMODE[1:0]这两个位进行配置,如 IMODE[1:0]=00,则表示无需发送指令。 - 地址阶段
此阶段可以发送 1 ~ 4 字节地址给 FLASH 芯片,指示要操作的地址。地址字节长度由QUADSPI_CCR[13:12]寄存器的 ADSIZE[1:0]字段指定,0~ 3 表示 1~4 字节地址长度。在间接模式和轮询模式下,待发送的地址由 QUADSPI_AR 寄存器指定。地址阶段同样可以以单线/双线/四线模式发送,通过 QUADSPI_CCR[11:10]寄存器的 ADMODE[1:0]这两个位进行配置,如ADMODE [1:0]=00,则表示无需发送地址。 - 交替字节(复用字节)阶段
此阶段可以发送 1~4 字节数据给 FLASH 芯片,一般用于控制操作模式。待发送的交替字节数由 QUADSPI_CCR[17:16]寄存器的 ABSIZE[1:0]位配置。待发送的数据由 QUADSPI_ABR寄存器中指定。交替字节同样可以以单线/双线/四线模式发送,通过 QUADSPI_CCR[15:14]寄存器的 ABMODE[1:0]这两个位配置,ABMODE[1:0]=00,则跳过交替字节阶段。 - 空指令周期阶段
在空指令周期阶段,在给定的 1~31 个周期内不发送或接收任何数据,目的是当采用更高的时钟频率时,给 FLASH 芯片留出准备数据阶段的时间。这一阶段中给定的周期数由QUADSPI_CCR[22:18]寄存器的 DCYC[4:0]位配置。 若 DCYC 为零,则跳过空指令周期阶段,命令序列直接进入下一个阶段。 - 数据阶段
此阶段可以从 FLASH 读取/写入任意字节数量的数据。在间接模式和自动轮询模式下,待发送/接收的字节数由 QUADSPI_DLR 寄存器指定。在间接写入模式下,发送到 FLASH 的数据必须写入 QUADSPI_DR 寄存器。在间接读取模式下,通过读取 QUADSPI_DR 寄存器获得从FLASH 接收的数据。数据阶段同样可以以单线/双线/四线模式发送,通过 QUADSPI_CCR[25:24]寄存器的 DMODE [1:0]这两个位进行配置,如 DMODE [1:0]=00,则表示无数据。以上就是 QSPI 数据传输的 5 个阶段,其中交替字节阶段我们一般用不到,可以省略(通过设置 ABMODE[1:0]=00)。
间接模式
- 在间接模式下,通过写入 QUADSPI 寄存器来触发命令,通过读写数据寄存器来传输数据。
- 当 FMODE=00 (QUADSPI_CCR[27:26])时,QUADSPI 处于间接 写入模式,在数据阶段,将数据写入数据寄存器(QUADSPI_DR),即可写入数据到 FLASH。
- 当 FMODE=01 时,QUADSPI 处于间接 读取模式,在数据阶段,读取 QUADSPI_DR 寄存器,即可读取 FLASH 里面的数据。
- 读/写字节数由 数据长度 寄存器(QUADSPI_DLR)指定。当 QUADSPI_DLR=0xFFFFFFFF 时,
则数据长度视为未定义,QUADSPI 将持续传输数据,直到到达 FLASH 结尾(FLASH 容量由
QUADSPI_DCR[20:16]寄存器的 FSIZE[4:0]位定义)。如果不传输任何数据,则 DMODE[1:0]
(QUADSPI_CCR[25:24])应设置为 00。 - 当发送或接收的字节数(数据量)达到编程设定值时( 数据溢出),如果 TCIE=1,则 TCF 置 1 并产生
中断。在数据量不确定的情况下,将根据 FSIZE[4:0]定义的 FLASH 大小,在达到外部 SPI FLASH
的限制时,TCF 置 1。 - 在间接模式下有三种触发命令启动的方式,即:
- 当不需要发送地址(ADMODE[1:0]==00)和数据(DMODE[1:0]==00)时,对INSTRUCTION[7:0](QUADSPI_CCR[7:0])执行写入操作。
- 当需要发送地址(ADMODE[1:0]!=00),但不需要发送数据(DMODE[1:0]==00),对ADDRESS[31:0](QUADSPI_AR)执行写入操作。
- 当需要发送地址(ADMODE[1:0]!=00)和数据(DMODE[1:0]!=00)时,对 DATA[31:0] (QUADSPI_DR)执行写入操作。
如果命令启动,BUSY 位(QUADSPI_SR 的第 5 位)将自动置 1。