硬汉嵌入式论坛

 找回密码
 立即注册
查看: 4342|回复: 2
收起左侧

[技术讨论] SPI几种工作模式简介

[复制链接]

38

主题

4

回帖

118

积分

初级会员

积分
118
发表于 2021-6-26 14:01:31 | 显示全部楼层 |阅读模式
本帖最后由 hoopzhao 于 2022-3-5 13:59 编辑

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即可

评分

参与人数 1金币 +100 收起 理由
eric2013 + 100 赞一个!

查看全部评分

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2021-6-26 16:33:47 | 显示全部楼层
谢谢楼主分享,非常好

楼主可以再配个图,效果更佳
回复

使用道具 举报

38

主题

4

回帖

118

积分

初级会员

积分
118
 楼主| 发表于 2021-6-28 17:52:17 | 显示全部楼层
eric2013 发表于 2021-6-26 16:33
谢谢楼主分享,非常好

楼主可以再配个图,效果更佳

谢谢提醒
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-15 21:43 , Processed in 0.270898 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表