本帖最后由 hoop 于 2022-3-5 13:54 编辑
SPI几种工作模式简介 SPI作为一个通用MCU均支持的基本接口,被广泛应用于各类带通讯的应用场景。其涵盖多种配置方式以满足不同的应用需求。本文以AT32F403A_407_Firmware_Library_V2.x.x版本库为基础,简单介绍各个模式的一个基本特点
依据工作模式特征划分,SPI通常可以工作在双线单向全双工,单线单向只收,单线双向半双工发送和单线双向半双工接收四种模式中的一种。
①双线单向全双工模式
【基础配置】
SPI_CTRL1寄存器的SLBEN和ORA清零
对应配置代码为,设定初始结构体的transmission_mode,即spi_init_struct.transmission_mode = SPI_TRANSMIT_FULL_DUPLEX;
【IO使用】
此模式用到的IO最多,SCK_Pin、MISO_Pin、MOSI_Pin、CS_Pin(当选择使用硬件CS时)
【模式要点】
此模式下的SPI将同步进行数据的收发,通讯起始是可控的,通过向主机发送数据缓冲器写数据来产生。因此此模式下若想关闭SPI或进入低功耗模式的话,需要等待RDBF置位,TDBE置位,并等待BF变为0
②单线单向只收模式模式
【基础配置】
SPI_CTRL1寄存器的SLBEN清零并将ORA置位
对应配置代码为,设定初始结构体的transmission_mode,即spi_init_struct.transmission_mode = SPI_TRANSMIT_SIMPLEX_RX;
【IO使用】
作为主机时——将使用SCK_Pin、MISO_Pin、CS_Pin(当选择使用硬件CS时),MOSI_Pin脚将被释放为普通IO
作为从机时——将使用SCK_Pin、MOSI_Pin、CS_Pin(当选择使用硬件CS时),MISO_Pin脚将被释放为普通IO
【模式要点】
作为主机时,通讯将在SPI使能后立即开始,且直到SPI被关闭且关闭时刻帧数据接收完成时才会停止。因此此模式下若想关闭SPI或进入低功耗模式的话,需要等待倒数第二个RDBF置起,随后等待一个SPI_SCK周期立即关闭SPI,最后再等待RDBF置位并读出最后一笔通讯数据
作为从机时,通讯是在SPI使能后且SCK线上出现有效边沿时(即CS线为低时的SCK线边沿)开始,且只要SCK线上无时钟边沿,通讯就会暂停。因此此模式下若想关闭SPI或进入低功耗模式的话,仅需等待BF变为0即可
③单线双向半双工发送模式
【基础配置】
SPI_CTRL1寄存器的SLBEN和SLBTD置位
对应配置代码为,设定初始结构体的transmission_mode,即spi_init_struct.transmission_mode = SPI_TRANSMIT_HALF_DUPLEX_TX;
【IO使用】
作为主机时——将使用SCK_Pin、MOSI_Pin、CS_Pin(当选择使用硬件CS时),MISO_Pin脚将被释放为普通IO
作为从机时——将使用SCK_Pin、MISO_Pin、CS_Pin(当选择使用硬件CS时),MOSI_Pin脚将被释放为普通IO
【模式要点】
不管是作为主机还是从机,通讯起始均是可控的(作主机时通过向发送数据缓冲器写数据来产生、作从机时SPI使能后且SCK线上出现有效边沿时),因此此模式下若想关闭SPI或进入低功耗模式的话,需要等待TDBE置位,且BF变为0
④单线双向半双工接收模式
【基础配置】
SPI_CTRL1寄存器的SLBEN置位且SLBTD清零
对应配置代码为,设定初始结构体的transmission_mode,即spi_init_struct.transmission_mode = SPI_TRANSMIT_HALF_DUPLEX_RX;
【IO使用】
作为主机时——将使用SCK_Pin、MOSI_Pin、CS_Pin(当选择使用硬件CS时),MISO_Pin脚将被释放为普通IO
作为从机时——将使用SCK_Pin、MISO_Pin、CS_Pin(当选择使用硬件CS时),MOSI_Pin脚将被释放为普通IO
【模式要点】
作为主机时,通讯将在SPI使能后立即开始,且直到SPI被关闭且关闭时刻帧数据接收完成时才会停止。因此此模式下若想关闭SPI或进入低功耗模式的话,需要等待倒数第二个RDBF置起,随后等待一个SPI_SCK周期立即关闭SPI,并再等待最后一个RDBF置位读出最后一笔通讯数据
作为从机时,通讯是在SPI使能后且SCK线上出现有效边沿时(即CS线为低时的SCK线边沿)开始,且只要SCK线上无时钟边沿,通讯就会暂停。因此此模式下若想关闭SPI或进入低功耗模式的话,仅需等待BF变为0即可
|