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

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

11.4.2.4. 连续传输

在主机模式下,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.5. 采样模式

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.6. 位模式传输

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.7. 错误状态

对于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进行复位。