Cortex-M3-STM32F1 开发:(五十二)详细介绍了 SPI 的结构、工作模式、寄存器、函数等
| 上一篇 | 下一篇 |
|---|---|
目 录
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
- SCK 有时也叫 SCLK
-
MOSI(Master Out Slave In):主机输出、从机输入 ,主机通过这条线向从机发送数据
- 站在从设备角度,MOSI 有时也叫 SDI(Serial Data In,串行数据输入)
- 站在从设备角度,MOSI 有时也叫 SDI(Serial Data In,串行数据输入)
-
MISO(Master In Slave Out):主机输入、从机输出 ,从机通过这条线向主机返回数据
- 站在从设备角度,MISO 有时也叫 SDO(Serial Data Out,串行数据输出)
- 站在从设备角度,MISO 有时也叫 SDO(Serial Data Out,串行数据输出)
-
CS:片选引脚,用来选择从机 , C S ‾ \overline{CS} CS 上方的横杠表示低电平有效,将某个从机的 CS 引脚电平拉低,则意味着选中。
- CS 有时也叫 SS、NSS 。
- 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 外设?
- 同时连接多个 SPI 设备,避免分时复用带来的效率损失。
- 支持不同通信参数(如速率、模式),无需频繁重配置。
- 提升系统性能与实时性,可配合 DMA 实现并发传输。
- 优化 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校验多项式 */ …
更多推荐
所有评论(0)