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种不同的传输模式:
SPI传输模式 |
CPOL(极性) |
CPHA(相位) |
第一个边沿 |
第二个边沿 |
---|---|---|---|---|
0 |
0 |
0 |
上升沿采样 |
下降沿保持 |
1 |
0 |
1 |
上升沿保持 |
下降沿采样 |
2 |
1 |
0 |
下降沿采样 |
上升沿保持 |
3 |
1 |
1 |
下降沿保持 |
上升沿采样 |
4种传输模式的流程图如下:


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,使用三线数据传输模式。三线模式时序图如下:

注意:三线模式默认是以位为单位的模式传输,通过配置SPI_TCFG.3WIRE_EN,可以支持以字节为单位的模式传输。
SPI双路输入/输出模式
SPI双路输入/双路输出模式是指传输通过两根信号线(SPI_MOSI和SPI_MISO)进行发送或接收数据, 传输速率是标准单路SPI模式的两倍。此时,命令/地址/填充数据通过MOSI线传输,有效数据通过2根信号线同时传输。 双路输入/输出模式时序图如下:

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

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

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

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

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个字节
|

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的传输流程如下:
系统上电后,在brom中通过AHB访问的方式,配置基本的SPI NOR初始化信息,使能SPI NOR工作在Quad模式;
CPU通过AXI master发起读请求取指令,AXI slave接收到读请求,获取地址信息和突发传输类型和长度;
XIP控制器从寄存器SPI_BTR和SPI_RCC寄存器获取固定的数据传输格式,该方式仅支持Quad I/O和QPI模式;
QSPI控制器按照解析的格式进行数据传输,读取指令或数据信息并缓存到内部AXI RX buffer;
当AXI RX buffer满时,AXI slave将ready信号拉高,CPU的AXI master开始取数据;
以上,完成一次读操作。
当开启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控制器默认工作在延时半个周期的采样模式。不同的采样模式配置见下表:
采样模式 |
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进行复位。