11.4.2. 功能描述

11.4.2.1. 传输模式

SPI支持4种不同的传输模式,由外设决定使用某种传输模式,可以通过SPI_TCFG.CPOL配置时钟极性, SPI_TCFG.CPHA配置时钟相位。SPI控制器根据SPI_CLK信号从移位寄存器中读取或写入数据,在任意一种传输格式下被锁存。 在时钟相位为0,极性为0或者相位为1,极性为1的模式下,输出数据在时钟的下降沿采样,上升沿移位; 在时钟相位为0,极性为1或者相位为1,极性为0模式下,输出数据在时钟的上升沿采样,下降沿移位。

CPOL定义了SPI_CLK为空闲状态时的信号极性:

  • 当CPOL为1,SPI_CLK为高电平;

  • 当CPOL为0,SPI_CLK为低电平。

CPHA的状态决定了SPI_CLK在第一个时钟边沿采样数据还是保持数据:

  • 当CPHA为1,在第一个时钟边沿保持数据;

  • 当CPHA为0,在第一个时钟边沿采样数据。

下表总结了4种不同的传输模式:

表 11.1 传输模式

SPI传输模式

CPOL(极性)

CPHA(相位)

第一个边沿

第二个边沿

0

0

0

上升沿采样

下降沿保持

1

0

1

上升沿保持

下降沿采样

2

1

0

下降沿采样

上升沿保持

3

1

1

下降沿保持

上升沿采样

4种传输模式的流程图如下:

../../../_images/qspi_mode0_2.png
../../../_images/qspi_mode1_3.png

11.4.2.2. 工作模式

SPI控制器默认工作在从机模式下,当配置SPI_GCR寄存器的bit1位域为1,选择主机模式。

在主机模式下,控制器产生SPI_CLK时钟发送给外部设备,数据从TX FIFO传送到MOSI PIN, 通过MISO引脚接收从机发来的数据传送给RX FIFO。在数据传输过程中,片选信号必须为低电平。 片选信号可以通过寄存器配置为自动控制还是软件控制,当SPI_TCFG.CS_CTL_SEL字段为0,控制器自动控制片选信号; 当SPI_TCFG.CS_CTL_SEL字段为1,则用软件手动控制片选信号,此时配置SPI_TCFG.CS_LEVEL决定片选信号的状态。

在从机模式下,控制器的时钟由外部主机的时钟决定,从机模式可以配置为Dual I/O或Quad I/O模式。 支持中断模式,系统DMA模式,控制器内部DMA模式。当系统带宽紧张时,推荐使用控制器内部DMA模式。

11.4.2.3. 总线模式

SPI三线模式

SPI三线模式仅当SPI工作在主机模式时有效,该模式下数据的输入和输出都使用相同的数据信号线SPI_MOSI。 可以通过配置寄存器SPI_BMTC.BMOD_SEL字段为0x2,使用三线数据传输模式。三线模式时序图如下:

../../../_images/qspi_3wire.png

注意:三线模式默认是以位为单位的模式传输,通过配置SPI_TCFG.3WIRE_EN,可以支持以字节为单位的模式传输。

SPI双路输入/输出模式

SPI双路输入/双路输出模式是指传输通过两根信号线(SPI_MOSI和SPI_MISO)进行发送或接收数据, 传输速率是标准单路SPI模式的两倍。此时,命令/地址/填充数据通过MOSI线传输,有效数据通过2根信号线同时传输。 双路输入/输出模式时序图如下:

../../../_images/qspi_dual_input_output.png

SPI双路I/O模式

SPI双路I/O模式与前者的区别是地址,填充数据和有效数据都通过两根信号线进行传输,命令通过MOSI进行单线传输。 两种模式都是通过配置寄存器SPI_TMC.DUAL_EN字段为1进行选择。双路IO模式的时序图如下:

../../../_images/qspi_dual_IO.png

SPI四路输入/输出模式

SPI四路输入输出模式是指数据通过4根信号线(MOSI/MISO/WP/HOLD)进行发送或接收,此时传输速率是标准SPI模式的4倍。 此时,命令/地址/填充数据通过MOSI单线传输,有效数据通过4根信号线同时传输。 该模式通过配置寄存器SPI_TMC.QUAD_EN为1进行选择,四路输入/输出模式的时序图如下:

../../../_images/qspi_quad_input_output.png

SPI四路I/O模式

SPI四路I/O模式与四路输入输出模式类似,区别在于地址信号和数据信号全都使用4线传输。同时,device 支持快速读模式,该模式下只需要发送一次读命令,后续操作可以跳过读命令,只要CS信号拉低,在此期间 发送地址即可读取数据。同时,该传输下支持带回环功能的突发读配置,支持的突发长度为8/16/32/64字节, 常用于XIP工作模式。下图为四路I/O模式时序图。当模式byte的bit[5:4]=2b’10时,工作在读命令bypass模式, 下一笔读操作不需要发送读命令。

../../../_images/qspi_qio.png

SPI QPI模式

QPI模式命令,地址和数据全部使用4线传输。QPI模式不是标准的SPI模式,与标准SPI模式之间需要使用 命令进行切换。QPI模式也支持突发传输配置。时序图如下:

../../../_images/qspi_qpi.png

SPI突发传输配置

当SPI工作在Quad I/O模式下,可以进行带回环的突发传输(Burst With Wrap),通过发送配置突发传输命令, 经过三个dummy周期,通过修改mode byte的bit[6:4]配置相应的突发类型和突发长度。该配置常用于XIP访问 模式下,CPU进行cache操作,可以提高总线的传输效率,提高代码的执行性能。当CPU使用Cache,并开启预取 功能,突发传输类型配置为WRAP,突发传输长度配置为32byte。

Bit[6:4]

突发类型

突发长度

3b’001

Linear

取决与Flash容量

3b’000

WRAP

8个字节

3b’010

WRAP

16个字节

3b’100

WRAP

32个字节

3b’110

WRAP

64个字节

当SPI工作在QPI模式,突发传输配置命令与标准模式下的命令不同,增加了频率相关的dummy bytes数量的配置。 对于QPI模式,不同厂家的突发传输配置方式或许不同,需要参考具体厂家的芯片规格书。举例Winbond的W25Q128JW芯片定义如下:

Bit[5:4]

Dummy时钟周期数

Bit[1:0]

WRAP长度

2b’01

4(80MHz)

2b’01

16个字节

2b’10

6(104MHz)

2b’10

32个字节

2b’11

8(133MHz)

2b’11

64个字节
../../../_images/qspi_burst_set.png

11.4.2.4. XIP模式

在主机模式下,可以配置SPI0控制器工作在XIP模式,即AXI可以直接读取SPI的物理地址空间,就像访问 内存空间一样,常用于XIP启动。此时,SPI的物理地址需要映射为AXI可访问地址。实现AXI直接访问模式,主要包括两个模块:

  • AXI slave模块:用于和AXI master进行通讯,并将地址和数据信息转换为SPI的地址和数据内容;

  • AXI数据缓存:AXI的TX buffer用于缓存AXI发送到SPI的命令和地址,RX buffer用于缓存从SPI接收回来的数据。

XIP模式传输

通过配置寄存器使能XIP模式传输,该功能主要用于XIP启动和读取部分不常用的代码数据,CPU直接从QSPI 取指令和数据,不用将数据拷贝到SRAM再读取。

对于XIP启动,CPU通过AXI直接访问QSPI的映射地址进行取指令。在引导启动阶段使用AHB的方式初始化QSPI, 随后跳转到QSPI映射空间的起始地址进行取指令。

控制器支持8/16/32/64字节的突发长度配置,可用于XIP模式。XIP的传输流程如下:

  1. 系统上电后,在brom中通过AHB访问的方式,配置基本的SPI NOR初始化信息,使能SPI NOR工作在Quad模式;

  2. CPU通过AXI master发起读请求取指令,AXI slave接收到读请求,获取地址信息和突发传输类型和长度;

  3. XIP控制器从寄存器SPI_BTR和SPI_RCC寄存器获取固定的数据传输格式,该方式仅支持Quad I/O和QPI模式;

  4. QSPI控制器按照解析的格式进行数据传输,读取指令或数据信息并缓存到内部AXI RX buffer;

  5. 当AXI RX buffer满时,AXI slave将ready信号拉高,CPU的AXI master开始取数据;

  6. 以上,完成一次读操作。

当开启Cache功能,CPU每次读取4*64bit数据,相当于一条cache line的大小,此时只需要配置一次SPI NOR 的突发长度即可,每次cache读取数据都会使用固定的突发长度,且突发类型为WRAP模式。

如果SPI NOR配置为读命令bypass模式,之后的读操作不需要再发送读命令。

11.4.2.5. 连续传输

在主机模式下,SPI可以进行连续数据传输,即发送或接收数据以字节为单位进行多个字节连续传输。发送数据 的连续传输字节长度通过寄存器SPI_TWC.TXD_CNT字段配置。在单路模式下,连续传输的长度通过寄存器SPI_TMC.STXD_CNT字段配置。

对于填充数据,SPI控制器会自动发送,它的连续传输长度通过配置寄存器SPI_TMC.DMY_CNT字段配置。 如果不希望控制器自动传输填充数据,可以将填充数据作为发送数据一起写入寄存器SPI_TWC.TXD_CNT字段。

在主机模式下,所有数据的突然传输长度配置在寄存器SPI_TBC.TB_CNT字段,当所有的发送数据和接收数据 连续传输完成后,上述的配置字段都会被清零。

11.4.2.6. 采样模式

SPI控制器的接口时钟频率范围为3kHz~100MHz。在主机模式下,内部的SPI时钟频率与外部接口的时钟频率一致。 SPI时钟根据不同的时钟源工作在不同的模式下,主要有3种时钟模式:正常采样模式,延时半周期采样模式, 延时1个周期采样模式。 SPI控制器默认工作在延时半个周期的采样模式。不同的采样模式配置见下表:

表 11.2 采样模式配置

采样模式

RXDLY_DIS位

RXINDLY_EN位

时钟频率范围

正常模式

1

0

<= 24MHz

延时半个周期采样

0

0

24 ~ 48MHz

延时一个周期采样

0

1

48 ~ 100MHz

注意:采样模式与时钟频率的关系不是唯一确定的,取决于传输路径的延时时间,用户可根据实际情况选择合适的配置。

11.4.2.7. 位模式传输

SPI位模式传输是以位为单位进行数据传输,用于对SPI接口的非Flash类型的外设进行访问,兼容更多的SPI的设备。

位模式分为标准模式和三线模式。通过配置SPI_BMTC寄存器的BMOD_SEL位域,选择两种不同的工作模式。 通过配置SPI_BMCLK寄存器选择位模式下的工作时钟。

位模式一次最大传输的位数为32bit,对于写操作,将待发送数据写入到SPI_BMTXD寄存器,并通过 SPI_BMTC.BM_TXCNT配置写有效数据的长度;对于读操作,通过SPI_BMTC.BM_RXCNT配置读有效数据的长度, 读到的数据会自动存入SPI_BMRXD寄存器。 使能BM_START寄存器启动数据传输,传输完成后BM_TD寄存器会置1,也可以使能BM_TD_INTE完成中断, 在中断服务程序中检查数据传输完成标志。

11.4.2.8. 错误状态

对于SPI控制器,发生任何一种错误,硬件都会将SPI中断状态寄存器中对应的位置1并停止传输,主要的错误 状态描述如下:

TX_FIFO下溢出

TX_FIFO下溢出发生在从空的FIFO中读取数据。在这种情况下,SPI控制器会停止传输并将对应的中断状态位TF_UDF置1, 此时SPI控制器会产生一个硬件中断信号,处理完该异常后需要软件将该状态位清零。如果开始新的数据传输, 需要在SPI_CFG寄存器中将CTRL_RST位置1,将FIFO进行复位。

TX_FIFO上溢出

TX_FIFO上溢出发生在向满的FIFO中发送数据。在这种情况下,SPI控制器会停止传输并将对应的中断状态位TF_OVF置1, 此时SPI控制器会产生一个硬件中断信号,处理完该异常后需要软件将该状态位清零。如果开始新的数据传输, 需要在SPI_CFG寄存器中将CTRL_RST位置1,将FIFO进行复位。

RX_FIFO下溢出

RX_FIFO下溢出发生在从空的FIFO中读取数据。在这种情况下,SPI控制器会停止传输并将对应的中断状态位RF_UDF置1, 此时SPI控制器会产生一个硬件中断信号,处理完该异常后需要软件将该状态位清零。如果开始新的数据传输, 需要在SPI_CFG寄存器中将CTRL_RST位置1,将FIFO进行复位。

RX_FIFO上溢出

RX_FIFO上溢出发生在向满的FIFO中发送数据。在这种情况下,SPI控制器会停止传输并将对应的中断状态位RF_OVF置1, 此时SPI控制器会产生一个硬件中断信号,处理完该异常后需要软件将该状态位清零。如果开始新的数据传输, 需要在SPI_CFG寄存器中将CTRL_RST位置1,将FIFO进行复位。