打印
[应用相关]

SPI几种工作模式简介

[复制链接]
3233|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hoop|  楼主 | 2021-6-26 13:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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即可

使用特权

评论回复
沙发
wsnsyy| | 2021-6-28 13:30 | 只看该作者
用了硬件SPI后,SPI的这组IO是不是都不能做其他功能了?

使用特权

评论回复
板凳
hoop|  楼主 | 2021-6-28 17:48 | 只看该作者
wsnsyy 发表于 2021-6-28 13:30
用了硬件SPI后,SPI的这组IO是不是都不能做其他功能了?

是的

使用特权

评论回复
地板
sparrow054| | 2021-7-1 11:56 | 只看该作者
貌似在以往的应用中,除了片选脚选择普通IO,其他使用硬件SPI

使用特权

评论回复
5
呐咯密密| | 2021-7-1 13:56 | 只看该作者
用硬件的NSS很方便,但是可能布线会不方便,我用的时候也是软件NSS,其他硬件,

使用特权

评论回复
6
两只袜子| | 2021-7-1 18:43 | 只看该作者
看看,谢谢分享

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

80

主题

322

帖子

0

粉丝