今天被打算学习⼀下QSPI的相关知识,以外惊喜发现了SPI协议的其他家族成员,我们常说的SPI协议其实是包
括:Standard SPI(3-wire)、Dual SPI(4-wire)和Queued SPI(6-wire)三种协议接⼝。Standard SPI通常就称SPI,有4根信号线,分别为CLK、CS、MOSI和MISO。Dual SPI通常只是针对SPI Flash⽽⾔,并不应⽤于所有SPI外设,操作SPIFlash往往是向Flash中写⼊数据或者单纯读取Flash中存储的数据,基本不⽤实时的数据交互,导致SPI全双⼯通讯的优势并没有发挥出来,因此扩展了MOSI和MISO的⽤法,让它们⼯作在半双⼯模式,⽤以加倍数据传输。在操作Dual SPI Flash时,可以发送⼀个命令字节进⼊dual mode,这样MOSI变成SIO0(Serial IO 0),MISO变成SIO1(Serial IO 1),这样⼀个时钟周期内就能传输2个bit数据,加倍了数据传输。
Standard SPI和Dual SPI不是今天要学习的重点,QSPI才是今天的主⾓,QSPI与Dual SPI类似,也是应⽤于SPI Flash的操作,6线制的QSPI Flash是在4线制DSPI Flash的基础上增加了两根I/O线(SIO2,SIO3),⽬的是⼀个时钟内传输4个bit数据,显⽽易见的是对于SPI Flash⽽⾔,在相同的时钟速率下,数据线数⽬越多,传输速率越⾼。下⾯就QSPI的相关知识进⾏简单总结,以备后续学习查阅。
QSPI(Queued Serial Peripheral Interface,队列串⾏外设接⼝)
QSPI是Queued SPI的简写,是Motorola公司推出的SPI接⼝的扩展,⽐SPI应⽤更加⼴泛。在SPI协议的基础
上,Motorola公司对其功能进⾏了增强,增加了队列传输机制,推出了队列串⾏外设接⼝协议。使⽤QSPI接⼝,⽤户可以⼀次性传输包含多达16个8位或16位数据的传输队列。⽽且QSPI⼀旦启动传输,直到传输结束,传输过程都不需要CPU⼲预,极⼤的提⾼了传输效率。在总线结构上QSPI与SPI相⽐最⼤的结构特点是以80字节的RAM代替了SPI的发送和接收数据寄存器。
该接⼝可以在以下三种模式下⼯作:间接模式:使⽤ QSPI 寄存器执⾏全部操作
状态轮询模式:周期性读取外部 Flash 状态寄存器,⽽且标志位置 1 时会产⽣中断(如擦除或烧写完成,会产⽣中断)内存映射模式:外部 Flash 映射到微控制器地址空间,从⽽系统将其视作内部存储器QSPI常见的功能框图如下图所⽰
QSPI使⽤6根信号连接Flash,分别是四个数据线BK1_IO0~BK1_IO3,⼀个时钟输出CLK,⼀个⽚选输出(低电平有效)BK1_nCS,它们的作⽤介绍如下:
(1)BK1_nCS:⽚选输出(低电平有效),适⽤于⼀个主设备上挂多个外设Flash的情况下选择要操作的⽬标Flash。QSPI通讯以BK1_nCS线拉低为开始信号,以BK1_nCS线被拉⾼作为结束信号。
(2)CLK:时钟输出,⽤于通讯数据同步,它由通讯主机产⽣,决定了通讯的速率,不同的设备⽀持的最⾼时钟频率不⼀样,如STM32的QSPI时钟频率最⼤为fpclk/2,两个设备之间通讯时,通讯速率受限于低速设备。
(3)BK1_IO0:在双线/四线模式中为双向IO,单线模式中为串⾏输出。(4)BK1_IO1:在双线/四线模式中为双向IO,单线模式中为串⾏输⼊。(5)BK1_IO2:在四线模式中为双向IO。(6)BK1_IO3:在四线模式中为双向IO。QSPI命令序列
QSPI通过命令与Flash通信,每条命令包括指令、地址、交替(复⽤)字节、空指令和数据共五个阶段,⽽这五个阶段任⼀阶段均可跳过,但⾄少要包含指令、地址、交替字节或数据阶段之⼀。nCS在每条指令开始前下降,在每条指令完成后再次上升。QSPI四线模式下的读命令时序如下图所⽰。
1)指令阶段
这⼀阶段,将在QSPI_CCR[7:0]寄存器的instruction字段中配置的⼀条8位指令发送到Flash,指定待执⾏操作的类型。尽管⼤多数Flash从IO0/SO信号(单线SPI模式)只能以⼀次1位的⽅式接收指令,但指令阶段可选择⼀次发送2位(在双线SPI模式中通过IO0/IO1)或⼀次发送4位(在四线SPI模式中通过IO0/IO1/IO2/IO3)。这可通过QSPI_CCR[9:8]寄存器中的IMODE[1:0]字段进⾏配置。若IMODE = 00,则跳过指令阶段,命令序列从地址阶段(如果存在)开始。
2)地址阶段
在地址阶段,将1-4字节发送到Flash,指⽰操作地址。待发送的地址字节数在QSPI_CCR[13:12]寄存器的ADSIZE[1:0]字段中进⾏配置。在间接模式和⾃动轮询模式下,待发送的地址字节在QSPI_AR寄存器的ADDRESS[31:0]中指定;在内存映射模式下,则通过AHB(来⾃于内核或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,⼀般⽤于控制操作模式。待发送的交替字节数在QSPI_CCR[17:16]寄存器的ABSIZE[1:0]字段中进⾏配置。待发送的字节在QSPI_ABR寄存器中指定。
交替字节阶段可⼀次发送1位(在单线SPI模式中通过SO)、2位(在双线SPI模式中通过IO0/IO1)或4位(在四线SPI模式中通过IO0/IO1/IO2/IO3)。这可通过QSPI_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留出准备数据阶段的时间。这⼀阶段中给定的周期数在QSPI_CCR[22:18]寄存器的DCYC[4:0]字段中指定。在SDR和DDR模式下,持续时间被指定为⼀定个数的全时钟周期。若DCYC为零,则跳过空指令周期阶段,命令序列直接进⼊数据阶段(如果存在)。空指令周期阶段的操作模式由DMODE确定。为确保数据信号从输出模式转变为输⼊模式有⾜够的“周转”时间,使⽤双线和四线模式从Flash接收数据时,⾄少需要指定⼀个空指令周期。
5)数据阶段
在数据阶段,可从Flash接收或向其发送任意数量的字节。在间接模式和⾃动轮询模式下,待发送/接收的字节数在QSPI_DLR寄存器中指定。在间接写⼊模式下,发送到Flash的数据必须写⼊QSPI_DR寄存器。在间接读取模式下,通过读取QSPI_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时⽴即完成。这⼀配置仅可⽤于仅间接写⼊模式。
因篇幅问题不能全部显示,请点此查看更多更全内容