上一篇 下一篇


SPI

SPI:串行外设设备接口(Serial Peripheral Interface)

1)简介

SPI 是一种高速的,全双工,同步的通信总线。主要应用于存储芯片、片外 AD 转换器以及 LCD/OLED 等。

主机一般是 MCU 主板上的 SPI 外设,从机一般是其他的传感器,并且主机也可以是从机(此主板作为另一个主板的从机),但是传感器这些从机是当不了主机的。

① SPI 和 IIC 的区别如下

在这里插入图片描述

SPI 一般是全双工、8位、高位先行

SPI 其实也是支持半双工的,不过用的非常少,具体看下面的结构框图。主机一般是 MCU。

采样时机指的是:当时钟信号处于什么状态时,设备会读取数据线上的数据( 数据线上高电平表示 1 ,低电平表示 0 ):

  • SPI 遵循边沿采样协议,即当时钟信号处于上升/下降沿的时候,才会读取数据线上的电平
  • IIC 遵循电平采样协议,当时钟信号为高电平时,才会读取数据线上的电平

② 主机/从机连接图

在这里插入图片描述

  • SCK时钟线 ,时钟信号由主机发出

    • SCK 有时也叫 SCLK

  • MOSI(Master Out Slave In):主机输出、从机输入 ,主机通过这条线向从机发送数据

    • 站在从设备角度,MOSI 有时也叫 SDI(Serial Data In,串行数据输入)

  • MISO(Master In Slave Out):主机输入、从机输出 ,从机通过这条线向主机返回数据

    • 站在从设备角度,MISO 有时也叫 SDO(Serial Data Out,串行数据输出)

  • CS片选引脚,用来选择从机 C S ‾ \overline{CS} CS 上方的横杠表示低电平有效,将某个从机的 CS 引脚电平拉低,则意味着选中。

    • CS 有时也叫 SS、NSS

  • 引脚要一一对应,MOSI 引脚互联、MISO 引脚互联…

2)F1 SPI 主机结构框图(了解即可)

F1 和 F4 的框图如下,F7 和 H7 的不一样

在这里插入图片描述

  • SPI 相关引脚

    • MOSI:输出数据线
    • MIS0:输入数据线
    • SCK:时钟
    • NSS:片选

  • 数据发送和接收

    • 与缓冲区、移位寄存器以及引脚相关,LSBFIRST 位控制低位还是高位先行

    • 数据发送和接收流程图

      在这里插入图片描述

    • 数据的发送和接收是同步的,当发送一个 bit 时,会同时接收一个 bit 。

  • 时钟信号

    • SPI 时钟信号是通过 SPI_CR1 寄存器配置波特率产生的
    • 时钟频率: f P C L K / ( 2 , 4 , 8 , 16 , 32 , 64 , 128 , 256 ) f_{PCLK}/(2,4,8,16,32,64,128,256) fPCLK/(2,4,8,16,32,64,128,256),这里的 f P C L K f_{PCLK} fPCLK 是 APB1(max=72MHz)或 APB2(max=32MHz)的时钟。
    • 每产生一个时钟脉冲,主机和从机就同步移入/移出一个 bit

  • 主控制逻辑

    • 涉及两个控制寄存器 SPI_CR1/2 用于配置 SPI 工作,SPI_SR 用于查看工作状态

① STM32 芯片普遍包含多个 SPI 外设

所有内置的 SPI 外设(如 SPI1、SPI2、SPI3 等)都是由 MCU(即 STM32 本身)作为主控制器(Master)来使用的

为什么要设计多个 SPI 外设?

  1. 同时连接多个 SPI 设备,避免分时复用带来的效率损失。
  2. 支持不同通信参数(如速率、模式),无需频繁重配置。
  3. 提升系统性能与实时性,可配合 DMA 实现并发传输。
  4. 优化 PCB 布局和引脚分配,减少干扰,提高可靠性。

② SPI 外设对应的引脚

STM32F1 有三个 SPI,引脚如下表所示:

在这里插入图片描述

F4 / F7 / H7 系列芯片 SPI 外设都有 6 个。

3)工作模式

SPI 的工作模式由 时钟极性(CPOL)时钟相位(CPHA) 共同决定,主要是为了配置上升沿还是下降沿采样。

工作模式不分主机和从机,配置好之后,主机和从机同时发、同时收。

时钟极性(CPOL):没有数据传输时时钟线的空闲状态电平

  • 0:SCK 在空闲状态保持低电平
  • 1:SCK 在空闲状态保持高电平

时钟相位(CPHA):时钟线在第几个时钟边沿采样数据

  • 0:在 SCK 的第一(奇数)边沿进行数据采样(接收),在第二边沿进行数据更新(发送)
  • 1:在 SCK 的第二(偶数)边沿进行数据采样(接收),在第一边沿进行数据更新(发送)

① 工作模式表

模式 CPOL CPHA 空闲时 SCLK 电平 数据采样(接收)时刻 数据更新(发送)时刻
0 0 0 上升沿(第1个边沿,奇数) 下降沿(第2个边沿,偶数)
1 0 1 下降沿(第2个边沿,偶数) 上升沿(第1个边沿,奇数)
2 1 0 下降沿(第1个边沿,奇数) 上升沿(第2个边沿,偶数)
3 1 1 上升沿(第2个边沿,偶数) 下降沿(第1个边沿,奇数)
  • 数据采样 = 接收 方读取数据线(MISO 或 MOSI)上的电平(主机读取 MISO 线上的值,从机读取 MOSI 线上的值)

  • 数据更新 = 发送 方在该时刻把下一位数据放到数据线上,以便对方能正确读取

  • 通常使用的是工作模式 0(00)或工作模式 3(11)

② 实例,波形以主机 MOSI(发送)为例

黄色 SCK,绿色 MOSI,MSB 先发,8 位数据格式,发送数据为 0X55=01010101(由于是 MOSI ,所以看起来会有些别扭)

以 CPOL=0、CPHA=0 为例:

  • 上升沿(奇数边沿)的时候进行数据采样,主机 MOSI 此时已经将发送数据稳定,从机进行数据读取;
  • 下降沿(偶数边沿)的时候进行数据更新,主机 MOSI 此时将下一位数据放到了数据线上;

以 CPOL=1、CPHA=1 为例:

  • 上升沿(偶数边沿)的时候进行数据采样,主机 MOSI 此时已经将发送数据稳定,从机进行数据读取;
  • 下降沿(奇数边沿)的时候进行数据更新,主机 MOSI 此时将下一位数据放到了数据线上;

在这里插入图片描述

4)相关寄存器(F1/F4/F7)

在这里插入图片描述

对于 H7 系列,寄存器非常之多。

① SPI_CR1

控制寄存器1主要用来配置:SPI 模式、方向、NSS、数据帧、CPOL、CPHA、波特率、帧格式。

在这里插入图片描述

在这里插入图片描述

F1 的 SPI1 时钟挂 APB2 ,SPI2、3 挂 APB1 。

② SPI_SR

在这里插入图片描述

当 TXE 位置 1 时,表示数据已经全部发送出去

当 RXE 位置 1 时,表示已经接收到数据

③ SPI_DR

在这里插入图片描述

8 位模式下,只用低 8 位。

5)SPI相关HAL库驱动介绍(F1/F4/F7)

在这里插入图片描述

要更改参数的话,需要先失能 SPI 外设,修改完之后再使能。

SPI 外设相关结构体:SPI_HandleTypeDef 和 SPI_InitTypeDef

  • SPI_HandleTypeDef:

    SPI_TypeDef			*Instance
    SPI_InitTypeDef 	Init
    
  • SPI_InitTypeDef:

    uint32_t Mode				/* SPI模式(主机)  */
    uint32_t Direction			/* 工作方式(全双工) */
    uint32_t DataSize			/* 帧格式(8位) */
    uint32_t CLKPolarity		/* 时钟极性(CPOL = 0) */
    uint32_t CLKPhase			/* 时钟相位 (CPHA = 0)*/
    uint32_t NSS				/* SS控制方式(软件) */
    uint32_t BaudRatePrescaler	/* SPI波特率预分频值 */
    uint32_t FirstBit			/* 数据传输顺序(MSB)*/
    uint32_t TIMode				/* 帧格式:默认Motorola / TI  */
    uint32_t CRCCalculation		/* 设置硬件CRC校验 */
    uint32_t CRCPolynomial		/* 设置CRC校验多项式 */

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐