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_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,使用三线数据传输模式。三线模式时序图如下:
注意:三线模式默认是以位为单位的模式传输,通过配置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进行选择,四路输入/输出模式的时序图如下:
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控制器默认工作在延时半个周期的采样模式。不同的采样模式配置见下表:
采样模式 |
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进行复位。