17. QSPI总线控制器 (QSPI)

17.1. 概述

QSPI 专用于和外部存储器通信的接口,支持单线,双线,四线模式。

17.2. 特性

  • AHB Slave接口:CPU Master/DMA通过AHB访问QSPI接口模块

  • QSPI Master接口:可访问外置SPI Flash

  • 三种功能模式:间接模式、状态轮询模式、内存映射模式

  • 集成 FIFO,用于发送和接收

  • 允许 8、16 和 32 位数据访问

  • 在达到 FIFO 阈值、超时、操作完成以及发生访问错误时产生中断

17.3. 功能描述

17.3.1. QSPI 常规命令模式

常规命令模式下,每个命令最多有五个阶段:指令、地址、交替字节、空指令和数据,任一阶段均可跳过,但至少要包含指令、地址、交替字节或数据阶段的其中一个阶段。

../../_images/QSPI_Command_Seq.svg

图 79 四线模式下的读命令示例

指令阶段

这一阶段,将在 QSPI_CCR [7:0] 寄存器的CODE字段中配置的一条8位指令发送到外部SPI设备,指定待执行操作的类型。

可通过QSPI_CCR[9:8]寄存器中的 IMODE[1:0]字段进行配置一次1位、2位(在双线 SPI 模式中通过 IO0/IO1)、4位(在四线 SPI 模式中通过IO0/IO1/IO2/IO3)的方式接收指令。

地址阶段

在地址阶段,待发送的地址字节数在 QSPI_CCR[13:12] 寄存器的 ADSIZE[1:0] 字段中进行配置。

在间接模式和自动轮询模式下,待发送的地址字节在 QSPI_ ADDR寄存器的ADDRESS[31:0] 中指定。在间接模式下,此寄存器需要在配置命令寄存器之后进行配置(不能之前),且每次传输过程都需要配置。

可通过QSPI_CCR[11:10]寄存器中的ADMODE[1:0]字段进行配置一次发送1位(在单线 SPI 模式中通过 SO)、2位(在双线SPI模式中通过IO0/IO1)或4位(在四线SPI模式中通过 IO0/IO1/IO2/IO3)。

交替字节阶

在交替字节阶段,一般用于控制操作模式。待发送的交替字节数在QSPI_CCR[17:16]寄存器的ABSIZE[1:0]字段中进行配置。待发送的字节在 QSPI_ABR 寄存器中指定。

可通过QSPI_CCR[15:14]寄存器中的ABMODE[1:0]字段进行配置一次发送1位(在单线 SPI 模式中通过SO)、2 位(在双线SPI模式中通过IO0/IO1)或4位(在四线SPI模式中通过IO0/IO1/IO2/IO3)。

空指令周期阶段

在空指令周期阶段,给定的 0-31 个周期内不发送或接收任何数据,这期间与外部设备没有数据交互,为了等待外部设备准备数据。

这一阶段中给定的周期数在 QSPI_CCR[22:18] 寄存器的DUMMY [4:0]字段中指定。在SDR模式下,持续时间被指定为一定个数的全时钟周期。

当工作在2线、4线模式下从外部存储器中接收数据时,至少设置一个空指令周期。

数据阶段

在数据阶段,可从外部设备接收或向其发送任意数量的字节。

在间接模式和自动轮询模式下,待发送/接收的字节数在 QSPI_SIZE寄存器中指定。 在间接写入模式下,发送的数据必须写入 QSPI_DATA 寄存器。在间接读取模式下,通过读取 QSPI_DATA寄存器获得接收的数据;在自动轮询模式下,包含从设备读取到的最后一个数据。

数据阶段可通过QSPI_CCR[15:14] 寄存器中的ABMODE[1:0]字段进行配置一次发送/接收1位(在单线SPI模式中通过 SO)、2位(在双线SPI模式中通过 IO0/IO1)或4位(在四线SPI模式中通过IO0/IO1/IO2/IO3)。

nCS和SCK的行为

默认情况下,nCS 为高电平,取消选择外部设备。nCS 在操作开始前下降,在操作完成 时立即上升。

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

../../_images/QSPI_nCS_SCLK1.svg

图 80 nCS和SCLK时序关系图1

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

../../_images/QSPI_nCS_SCLK2.svg

图 81 nCS和SCLK时序关系图2

当读操作时FIFO处于满状态,或写操作时FIFO处于空状态时,该操作将停止,CLK保持在低电平,如果在操作停止时发生中止,则nCS在请求中止后立即上升,SCLK信号会在一半的SCLK周期之后拉高,如图所示。

../../_images/QSPI_nCS_SCLK3.svg

图 82 nCS和SCLK时序关系图3

17.3.2. QSPI 信号接口协议模式

单线SPI模式

在单线模式下,数据通过SO信号(其I/O与IO0共享)发送。收到的数据通过SI(其I/O与IO1 共享)送达。

通过将QSPI_CCR中的IMODE/ADMODE/ABSIZE/DMODE 字段设置为01,可对不同的命令阶段分别进行配置,以使用此单个位模式。

双线SPI模式

在双线模式下,通过IO0/IO1信号同时发送/接收两位。

通过将QSPI_CCR寄存器的IMODE/ADMODE/ABSIZE/DMODE字段设置为10,可对不同的命令阶段分别进行配置,以使用双线SPI模式。

四线SPI模式

在四线模式下,通过 IO0/IO1/IO2/IO3信号同时发送/接收四位。

通过将QSPI_CCR寄存器的IMODE/ADMODE/ ABSIZE /DMODE字段设置为11,可对不同的命令阶段分别进行配置,以使用四线SPI模式。

SDR模式

默认情况下,QSPI在单倍数据速率(SDR)模式下工作。

17.3.3. QSPI操作模式

间接模式

通过配置QSPI_CCR[27:26] MODE = 00,则处于间接写入模式,字节在数据阶段中发送到 。通过写入数据寄存器 (QSPI_DATA) 的方式提供数据。若FMODE = 01,则 QSPI处于间接读取模式,在数据阶段中接收字节。通过读取数据寄存器 (QSPI_DATA)来获取数据。 读取/ 写入的字节数在数据长度寄存器 (QSPI_SIZ E)中指定。如果 QSPI_SIZE =0xFFFF_FFFF(全为“1”),则数据长度视为未定义,QSPI将继续传输数据,直到到达(由QSPI_DCR[20:16]FSIZE 定义的)FLASH的结尾。

如果不传输任何字节,DMODE (QSPI_CCR[25:24]) 应设置为 00。

常规模式下触发命令序列

命令序列在根据通信需求配置好最后信息之后立即开始。

当没有地址并且没有数据时,在访问QSPI_CODE寄存器之后立即开始命令序列。

当存在地址但没有数据时,在访问QSPI_ADDR寄存器之后立即开始命令序列。

当在间接模式写操作时需要地址并且有数据,在访问QSPI_DATA寄存器之后立即开始命令序列。

如果命令启动,BUSY位置1。

FIFO和标志控制

在间接模式中,数据将通过QSPI内部的一个16字节FIFO。FLEVEL (QSPI_SR[12:8]) 指示 FIFO目前保存了多少字节。

在间接写入模式下 (MODE = 00),写入QSPI_DATA时,将在FIFO中加入数据。字写入将在FIFO中增加4个字节,半字写入增加2个字节,而字节写入仅增加1个字节。如果固件在 FIFO中加入的数据过多(超过 SIZE[31:0] 指示的值),将在写入操作结束(TCF置1)时从FIFO中清除超出的字节。

状态轮询模式

在自动轮询模式下,QSPI 周期性启动命令以读取一定数量的状态字节,每个帧读取的最大数据量是4 字节。自动轮询间隔周期(按照SCLK周期计数)在QSPI_PIR寄存器中设定。

在自动轮询模式下,MASK[31:0] (QSPI_PSMKR) 的内容用于屏蔽数据。如果 MASK[n] = 0,则屏蔽结果的位n,从而不考虑该位。如果MASK[n] = 1 并且位[n]的内容与 MATCH[n] (QSPI_PSMAR) 相同,说明存在位n匹配。

内存映射模式

在配置为内存映射模式时,外部SPI器件被视为是内部存储器。

即使 FLASH 容量更大,寻址空间也无法超过128MB。 如果访问的地址超出FSIZE定义的范围但仍在128MB 范围内,则根据FLASH特性处理,一般为回卷读取。内存映射模式下每一个AHB读请求,都会完整执行一次符合QSPI接口协议读请求命令。

17.3.4. QSPI延迟数据采样

默认情况下,QSPI在FLASH驱动信号后过半个CLK周期才对FLASH驱动的数据采样。在外部信号延迟时,有利于推迟数据采样。 使用SSHIFT位(QSPI_CR[4] ),可将数据采样移位半个QSPI CLK周期;使用CYCLE位(QSPI_SSHIFT [0:3]),配置的是系统时钟CLK下延迟采样的周期数,延时采样开关开启时(SSHIFT=1),在这之后再延时采样半SCLK周期。即实际的延迟采样时间是QSPI_SSHIFT[CYCLE]与QSPI_CR[SSHIFT]设定延时的累加。

17.4. 寄存器映射

名称

偏移

复位值

QSPI BASE: 0x40001800

CR

0x00

0x00000000

DCR

0x04

0x00000000

SR

0x08

0x00000000

FCR

0x0C

0x00000000

DLR

0x10

0x00000000

CCR

0x14

0x00000000

AR

0x18

0x00000000

ABR

0x1C

0x00000000

DATA

0x20

0x00000000

PSMSK

0x24

0x00000000

PSMAT

0x28

0x00000000

PSITV

0x2C

0x00000000

SSHIFT

0x40

0x00000000

17.5. 寄存器描述

17.5.1. 控制寄存器CR

偏移: 0x00

复位值: 0x00000000

31

30

29

28

27

26

25

24

CLKDIV

23

22

21

20

19

18

17

16

PSMATMOD

PSSTPMOD

PSMATIE

FFTHRIE

DONEIE

ERRIE

15

14

13

12

11

10

9

8

FFTHR

7

6

5

4

3

2

1

0

BIDI

SSHIFT

DMAEN

ABORT

EN

位域

名称

类型

描述

31:24

CLKDIV

R/W

时钟分频器

分频系数(值 + 1),最大256分频

奇分频不为50%,低电平比高电平时间长

最小配置为1,即2分频

注:仅在BUSY = 0时,可修改

23

PSMATMOD

R/W

轮询匹配模式(BUSY = 0时,可修改)

0:AND匹配模式,全匹配则拉高SMF

1:OR匹配模式,只要有一位匹配则拉高SMF

22

PSSTPMOD

R/W

自动轮询匹配模式停止位

0:自动轮询模式仅通过中止或禁用QUADSPI停止

1:一旦匹配,自动轮询模式停止

注:仅在BUSY = 0时,可修改

20:21

RO

19

PSMATIE

R/W

状态匹配中断使能位

0:关闭

1:使能

18

FFTHRIE

R/W

FIFO阈值中断使能位

0:关闭

1:使能

17

DONEIE

R/W

传输完成中断使能位

0:关闭

1:使能

16

ERRIE

R/W

传输错误中断使能位

0:关闭

1:使能

15:12

RO

11:8

FFTHR

R/W

FIFO阈值等级

间接模式下,定义拉高FTF的 FIFO阈值字节数。

写模式(FMODE=00)

0-15:FIFO中有1-16或更多空闲字节可写入时,拉高FTF

读模式(FMODE=01)

0-15:FIFO中有1-16或更多有效字节可读取时,拉高FTF

当DMA(或CPU)读写数据寄存器时:

字节传输时,此位取值0~C;

半字传输时,此位取值0~D;

字传输时,此位取值4~F;

7: 6

RO

5

BIDI

R/W

IO0模式选择

0:关闭(IO0输出,IO1输入)

1:使能(IO0负责输入输出)

注:仅适用于间接读模式单SPI模式

4

SSHIFT

R/W

延迟采样开关

0:不延迟QSPI Clock半周期

1:半个QSPI Clock周期延迟

3

RO

2

DMAEN

R/W

DMA访问使能

间接模式下通过DMA访问DR寄存器

0:关闭

1:使能

1

ABORT

R/W

中止请求

0:未请求中止

1:请求中止

0

EN

R/W

QUADSPI使能位

0:关闭

1:使能

17.5.2. 设备配置寄存器DCR

偏移: 0x04

复位值: 0x00000000

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

FSIZE

15

14

13

12

11

10

9

8

CSHIGH

7

6

5

4

3

2

1

0

CLKMOD

位域

名称

类型

描述

31:21

RO

20:16

FLSIZE

R/W

FLASH大小设置

外部FLASH字节数=2[FSIZE+1];[FSIZE+1]为寻址FLASH所需的地址位数。

间接模式32位寻址,最高可达4GB。

注:仅在BUSY = 0时,可修改

15:11

RO

10:8

CSHIGH

R/W

片选高电平时间

CSHT+1为片选nCS在向FLASH发命令前必须保持高电平的最小周期数。

最大为8个周期

注:仅在BUSY = 0时,可修改

7:1

RO

0

CLKMOD

R/W

选择模式0或模式3

该位指示SCLK在命令之间采取的级别(当nCS=1时)。

0:nCS为高时,CLK必须保持低。这被称为模式0。

1:nCS为高时,CLK必须保持高。这被称为模式3。

17.5.3. 状态寄存器SR

偏移: 0x08

复位值: 0x00000000

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

FFLVL

7

6

5

4

3

2

1

0

BUSY

TO

PSMAT

FFTHR

DONE

ERR

位域

名称

类型

描述

31:13

RO

12:8

FFLVL

RO

FIFO等级

字段给出FIFO中保存的有效字节数

当FIFO为空时,FLEVEL=0

当FIFO为满时,FLLEVEL=16

在内存映射模式和自动状态轮询模式下,FLEVEL为零。

7:6

RO

5

BUSY

RO

忙线

操作进行时置1

操作结束或者FIFO为0时自动清零

4

TO

RO

超时标志

超时出现时置1

写1到CTOF后清0

3

PSMAT

RO

状态匹配标志位

自动轮询模式下,当未屏蔽的接收数据与匹配寄存器(QUADSPI_PSMAR)中的相应位匹配时,该位置1

写1给CSMF后清零。

2

FFTHR

RO

FIFO阈值标志位

间接模式下FIFO阈值达到,或是读操作后还有数据时,该位置1

1

DONE

RO

传输完成标志位

在间接模式下,当传输的数据数量达到编程设定值,或其余模式传输中止,该位置1

写1给CTCF后进行清零

0

ERR

RO

传输错误标志位

在间接方式访问无效地址时,该位置1

写1给CTEF之后进行清零

17.5.4. 标志清零寄存器FCR

偏移: 0x0C

复位值: 0x00000000

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

PSMAT

DONE

ERR

位域

名称

类型

描述

31:4

RO

3

PSMAT

R/W

清零状态匹配标志

写1时,清零QUADSPI_SR中SMF标志位,完成自动归零

2

RO

1

DONE

R/W

清零传输完成标志

写1时,清零QUADSPI_SR中TCF标志位,完成自动归零

0

ERR

R/W

清零传输错误标志

写1时,清零QUADSPI_SR中TEF标志位,完成自动归零

17.5.5. 数据长度寄存器DLR

偏移: 0x10

复位值: 0x00000000

31

30

29

28

27

26

25

24

DL

23

22

21

20

19

18

17

16

DL

15

14

13

12

11

10

9

8

DL

7

6

5

4

3

2

1

0

DL

位域

名称

类型

描述

31:0

DL

R/W

数据长度

在间接和状态轮询模式中要检索的数据数(值+1)

在状态轮询应不使用大于3的值(表示4字节)

0x0000_0000: 1个字节

0x0000_0001: 2个字节

0x0000_0002: 3个字节

0x0000_0003: 4个字节

……

0xFFFF_FFFF:未定义长度,以实际FLASH决定,读完写完为止

注:仅在BUSY = 0时,可修改

17.5.6. 传输配置寄存器CCR

偏移: 0x14

复位值: 0x00000000

31

30

29

28

27

26

25

24

SIOO

MODE

DMODE

23

22

21

20

19

18

17

16

DUMMY

ABSIZE

15

14

13

12

11

10

9

8

ABMODE

ASIZE

AMODE

IMODE

7

6

5

4

3

2

1

0

CODE

位域

名称

类型

描述

31:29

RO

28

SIOO

R/W

只发送指令一次模式

当IMODE=00时,此位无影响

0:传输指令在每个交互

1:传输指令仅在首次命令

注:仅在BUSY = 0时,可修改

27:26

MODE

R/W

功能模式

此字段定义QUADSPI功能操作模式

00:间接写模式

01:间接读模式

10:自动轮询模式

11:不可用

注:仅在BUSY = 0时,可修改

25:24

DMODE

R/W

数据传输模式

此字段定义数据阶段的操作模式

00:无数据

01:1线数据

10:2线数据

11:4线数据

注:仅在BUSY = 0时,可修改

23

RO

22:18

DUMMY

R/W

空周期大小设置位

此字段定义空阶段的持续时间

在SDR模式中,它指定CLK周期数(0-31)

注:仅在BUSY = 0时,可修改

17: 16

ABSIZE

R/W

交替字节传输模式

00:无数据

01:1线数据

10:2线数据

11:4线数据

注:仅在BUSY = 0时,可修改

15:14

ABMODE

R/W

交替字节模式

此字段定义交替字节阶段的操作模式

00:8 bit 交替字节

01:16 bit 交替字节

10:24 bit 交替字节

11:32 bit 交替字节

注:仅在BUSY = 0时,可修改

13:12

ASIZE

R/W

地址大小设置位

00:8 bit 地址字节

01:16 bit 地址字节

10:24 bit 地址字节

11:32 bit 地址字节

注:仅在BUSY = 0时,可修改

11:10

AMODE

R/W

地址传输模式

00:无数据

01:1线数据

10:2线数据

11:4线数据

注:仅在BUSY = 0时,可修改

9:8

IMODE

R/W

指令传输模式

00:无数据

01:1线数据

10:2线数据

11:4线数据

注:仅在BUSY = 0时,可修改

7:0

CODE

R/W

指令阶段

要发送到外部SPI设备的指令

注:仅在BUSY = 0时,可修改

17.5.7. 地址寄存器AR

偏移: 0x18

复位值: 0x00000000

31

30

29

28

27

26

25

24

ADDRESS

23

22

21

20

19

18

17

16

ADDRESS

15

14

13

12

11

10

9

8

ADDRESS

7

6

5

4

3

2

1

0

ADDRESS

位域

名称

类型

描述

31:0

ADDRESS

R/W

地址

要发送到外部闪存的地址

17.5.8. 交替字节寄存器ABR

偏移: 0x1C

复位值: 0x00000000

31

30

29

28

27

26

25

24

ALTERNATE

23

22

21

20

19

18

17

16

ALTERNATE

15

14

13

12

11

10

9

8

ALTERNATE

7

6

5

4

3

2

1

0

ALTERNATE

位域

名称

类型

描述

31:0

ALTERNATE

R/W

交替字节

指定要在地址后立即发送到外部SPI设备的可选数据

17.5.9. 数据寄存器DATA

偏移: 0x20

复位值: 0x00000000

31

30

29

28

27

26

25

24

DATA

23

22

21

20

19

18

17

16

DATA

15

14

13

12

11

10

9

8

DATA

7

6

5

4

3

2

1

0

DATA

位域

名称

类型

描述

31:0

DATA

R/W

数据字节

向外部SPI设备发送/接收的数据

在间接写模式下,写入该寄存器的数据在数据阶段被发送到FLASH之前存储在FIFO上。如果FIFO太满,写操作将被暂停,直到FIFO有足够的空间接受正在写入的数据量

在间接读取模式下,读取这个寄存器给出(通过FIFO)从闪存接收到的数据。粒度大于FIFO缓存字节时,返回数据为0(如果FIFO没有读操作所要求的那么多字节,并且BUSY=1,则读操作将停止,直到有足够的数据存在或直到传输完成,以先发生者为准。)

在自动轮询模式下,该寄存器包含从FLASH内存中读取的最后一个数据(没有屏蔽)

支持对该寄存器的字、半字和字节访问。在间接写模式下,字节写1个字节,半字写2个字节,字写4个字节。类似地,在间接读模式下,字节读从FIFO中读1个字节,半字读2个,字读4个

间接模式下的访问必须与寄存器底部对齐:字节读取必须读取DATA[7:0],半字读取必须读取DATA[15:0]

间接写模式下,如果需要传输数据字节,此寄存器需要在配置命令寄存器之后进行配置(不能之前),且每次传输过程都需要配置

17.5.10. 轮询状态掩码寄存器PSMSK

偏移: 0x24

复位值: 0x00000000

31

30

29

28

27

26

25

24

MASK

23

22

21

20

19

18

17

16

MASK

15

14

13

12

11

10

9

8

MASK

7

6

5

4

3

2

1

0

MASK

位域

名称

类型

描述

31:0

MASK

R/W

状态掩码

对轮询模式下接收的状态字节进行屏蔽

对于位n:

0:在自动轮询模式下接收的数据的第n位被屏蔽,匹配逻辑中不考虑其值

1: 在自动轮询模式下接收的数据的第n位不被屏蔽,其值在匹配逻辑中被考虑

注:仅在BUSY = 0时,可修改

17.5.11. 轮询状态匹配寄存器PSMAT

偏移: 0x28

复位值: 0x00000000

31

30

29

28

27

26

25

24

MATCH

23

22

21

20

19

18

17

16

MATCH

15

14

13

12

11

10

9

8

MATCH

7

6

5

4

3

2

1

0

MATCH

位域

名称

类型

描述

31:0

MATCH

R/W

状态匹配

将与掩码状态寄存器进行比较以获得匹配的值

注:仅在BUSY = 0时,可修改

17.5.12. 轮询间隔寄存器PSITV

偏移: 0x2C

复位值: 0x00000000

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

INTERVAL

7

6

5

4

3

2

1

0

INTERVAL

位域

名称

类型

描述

31:16

RO

15:0

INTERVAL

R/W

轮询间隔

在自动轮询阶段读取的SCLK周期数

注:仅在BUSY = 0时,可修改

17.5.13. 延迟采样寄存器SSHIFT

偏移: 0x40

复位值: 0x00000000

31

30

29

28

27

26

25

24

23

22

21

20

19

18

17

16

15

14

13

12

11

10

9

8

7

6

5

4

3

2

1

0

SPACE

CYCLE

位域

名称

类型

描述

31:8

RO

7:4

SPACE

R/W

在配置了延迟采样时,为了防止溢出,接收FIFO停止接收外部Flash数据时FIFO中预留可缓存字节数量(最多8个)

3:0

CYCLE

R/W

延迟采样周期

配置的是系统时钟CLK下延迟采样的周期数

延时采样开关开启时(SSHIFT=1),在这之后再延时采样半SCLK周期

注:仅在BUSY = 0时,可修改