STM32 SPI通讯

【参考资料】:STM32F4xx中文参考手册 & STM32F4开发指南(正点原子)

基本原理

SPI是(串行外设接口 Serial Peripheral Interface)的缩写,一种同步串行接口技术,是一种高速的、全双工、同步的通信总线

SPI是串行同步协议,数据是一位一位传送的,SCK提供时钟脉冲,MOSI、MISO在脉冲基础上完成数据传输。

缺点:没有指定的流控制,没有应答机制确认是否接收到数据

引脚功能

可以主从方式工作,一个主设备,可以连接多个从设备,至少需要4根线

MOSI:主设备输出、从设备输入

MISO:主设备输入,从设备输出

SCLK:时钟信号,由主设备产生,当没有时钟跳变时,从设备不采集或传送数据

CS:片选信号,当一个SPI总线上连接多个设备时,SPI本身的CS可被其他的I/O口引脚替代,每个从设备的CS端可以连接不同的GPIO口引脚

在这里插入图片描述

数据发送和接收过程

缓冲区

在接收过程中,数据收到后,先存储到内部接收缓冲区中;而在发送过程中,先将数据存储到内部发送缓冲区中,然后发送数据
对 SPI_DR 寄存器的读访问将返回接收缓冲值;对 SPI_DR 寄存器的写访问会将写入的数据存储到发送缓冲区中 。

在这里插入图片描述

主模式下启动通信序列

全双工模式下

全双工模式下( BIDIMODE=0 且 RXONLY=0)将数据写入到 SPI_DR 寄存器(发送缓冲区)时,通信序列启动。 随后在第一个位的发送期间,将数据从发送缓冲区并行加载到 8 位移位寄存器中(并行加载,意味着即在数据开始传输的第一个bit时,发送缓冲区会空,TXE标志位置1), 然后以串行方式将其移出到 MOSI 引脚。
同时,将 MISO 引脚上接收的数据以串行方式移入 8 位移位寄存器,然后并行加载 到 SPI_DR 寄存器(接收缓冲区)中。

处理发送和接收

在第一个位的发送期间,将数据从发送缓冲区传输到移位寄存器时, TXE 标志(发送缓冲区为空)置 1。该标志表示内部发送缓冲区已准备好加载接下来的数据。如果 SPI_CR2 寄存器中的 TXEIE 位置 1,可产生中断。通过对 SPI_DR 寄存器执行写操作将 TXE 位清零 。

软件必须确保在尝试写入发送缓冲区之前 TXE 标志已置 1。否则,将覆盖之前写入发送缓冲区的数据

将数据从移位寄存器传输到接收缓冲区时, RXNE 标志(接收缓冲区非空)会在最后一个采样时钟边沿置 1。它表示已准备好从 SPI_DR 寄存器中读取数据。如果 SPI_CR2 寄存器中的 RXNEIE 位置 1,可产生中断。通过读取 SPI_DR 寄存器将 RXNE 位清零

SPI通信模式

强调:主机与从机必须要在工作在相同的模式下才可以正常通讯

模式 CPOL 时钟极性 CPHA 时钟相位
MODE0 0 0
MODE1 0 1
MODE2 1 0
MODE3 1 1
  1. CPOL=0,表示当SCLK=0时处于空闲态,有效状态就是SCLK处于高电平时
  2. CPOL=1,表示当SCLK=1时处于空闲态,有效状态就是SCLK处于低电平时
  3. CPHA=0,表示数据采样是在第1个边沿,数据发送在第2个边沿
  4. CPHA=1,表示数据采样是在第2个边沿,数据发送在第1个边沿
  • CPOL=0,CPHA=0:此时空闲态时,SCLK处于低电平,数据采样是在第1个边沿,也就是 SCLK由低电平到高电平的跳变,所以数据采样是在上升沿,数据发送是在下降沿。

  • CPOL=0,CPHA=1:此时空闲态时,SCLK处于低电平,数据发送是在第2个边沿,也就是 SCLK由低电平到高电平的跳变,所以数据采样是在下降沿,数据发送是在上升沿。

  • CPOL=1,CPHA=0:此时空闲态时,SCLK处于高电平,数据采集是在第1个边沿,也就是 SCLK由高电平到低电平的跳变,所以数据采集是在下降沿,数据发送是在上升沿。

  • CPOL=1,CPHA=1:此时空闲态时,SCLK处于高电平,数据发送是在第2个边沿,也就是 SCLK由高电平到低电平的跳变,所以数据采集是在上升沿,数据发送是在下降沿。

在这里插入图片描述

CPHA等于0时,总是在奇数边沿数据数据采样,如上图

在这里插入图片描述

CPHA等于1时,数据总是在SCK偶数边沿被采样,见上图

在这里插入图片描述

解释:通信时钟由主器件发起,主机和从机的发送数据是同时完成的,两者的接收数据也是同时完成的,即当上升沿主机发送数据的时候,从机也发送了数据。

为了保证主机和从机能够正确通信,两者的SPI应当具有相同的时钟极性和时钟相位,即两者必须工作在同一模式下

SPI工作模式 示波器介绍

SPI状态标志

  • 发送缓冲区空(TXE)

此标志位为1,表示发送缓冲区为空,可以将待发送的下一个数据发送到缓冲区中。对SPI_DR寄存器执行写操作,将清零TXE标志

  • 接收缓冲区非空(RXNE)

此标志位置1时,表示接收缓冲区中存在有效的已接收的数据。读取SPI_DR寄存器,将清零该标志位

  • BUSY

BSY 标志由硬件置 1 和清零(对此标志执行写操作没有任何作用)。 BSY 标志用于指示SPI 通信的状态。
BSY 置 1 时,表示 SPI 正忙于通信。在主模式下的双向通信接收模式( MSTR=1 且 BDM=1且 BDOE=0)有一个例外情况, BSY 标志在接收过程中保持低电平。
如果软件要关闭 SPI 并进入停止模式(或关闭外设时钟),可使用 BSY 标志检测传输是否结束以避免破坏最后一个数据的传输 。

注意:请勿使用 BUSY 标志处理每次数据发送或接收,最好改用 TXE 标志和 RXNE 标志

关闭SPI

若要关闭SPI,建议在主模式或全双工从模式( BIDIMODE=0、 RXONLY=0)下执行以下步骤:

  1. 等待 RXNE=1 以接收最后的数据
  2. 等待 TXE=1
  3. 然后等待 BSY=0
  4. 关闭 SPI (SPE=0),最后进入停止模式(或关闭外设时钟)

使用DMA进行SPI通信

使能SPI_CR2寄存器中的使能位时,将请求DMA访问。发送缓冲区和接收缓冲区会发出各自的DMA请求

  • 发送过程中,每次 TXE 位置 1 都会发出 DMA 请求。 DMA 随后对 SPI_DR 寄存器执-行写操作(此操作会将 TXE 标志清零)
  • 接收过程中,每次 RXNE 位置 1 都会发出 DMA 请求。 DMA 随后对 SPI_DR 寄存器执行读操作(此操作会将 RXNE 标志清零)

在发送模式下, DMA 完成了所有要发送数据的传输( DMA_ISR 寄存器中的 TCIF 标志置1)后,可以对 BSY 标志进行监视,以确保 SPI 通信已完成。在关闭 SPI 或进入停止模式前必须执行此步骤,以避免损坏最后一次数据的发送。软件必须首先等待 TXE=1,再等待BSY=0

在这里插入图片描述

在这里插入图片描述

注:此处对DMA发送和接收时序图的流程不懂,需返回前方理解 --处理数据发送和接收过程-- 部分内容

猜你喜欢

转载自blog.csdn.net/weixin_44333597/article/details/107865007