三十七、STM32的SPI

前言:在嵌入式系统中,外设通信是非常重要的一部分。STM32C8T6 作为一款应用广泛的单片机,支持多种串行通信协议,其中 SPI(Serial Peripheral Interface)串行外设接口 以其速度快、结构简单的特点,被广泛应用于 Flash 存储器、OLED 屏幕、AD/DA 转换器、传感器等外设的通信中。

目录

[一、什么是 SPI 通信?](#一、什么是 SPI 通信?)

[二、SPI 的硬件连接方式](#二、SPI 的硬件连接方式)

[三、SPI 的时序基础](#三、SPI 的时序基础)

[1. 起始与终止条件](#1. 起始与终止条件)

[2. SPI 的 4 种工作模式](#2. SPI 的 4 种工作模式)

[四、SPI 的数据交换机制](#四、SPI 的数据交换机制)

[1. 发送指令](#1. 发送指令)

[2. 指定地址写数据](#2. 指定地址写数据)

[3. 指定地址读数据](#3. 指定地址读数据)

[五、SPI 和其他通信协议对比](#五、SPI 和其他通信协议对比)

六、总结


一、什么是 SPI 通信?

SPI(Serial Peripheral Interface)是由 Motorola 公司提出的一种同步串行通信协议 。它采用主从模式进行数据传输,支持全双工通信,通信速度通常比 I2C 更高,且协议本身更加简单。

SPI 的基本特征包括:

  • 同步通讯(由时钟线控制数据传输节奏)

  • 全双工(可以同时发送和接收数据)

  • 一主多从架构(一个主设备可以控制多个从设备)

  • 不需要设备地址(通过片选线决定通信对象)

SPI 协议通常由四根信号线构成:

信号线 名称 说明

|-----|--------------|-----------|
| SCK | Serial Clock | 时钟线,由主机输出 |

|------|---------------------------|-----------|
| MOSI | Master Output Slave Input | 主机输出,从机输入 |

|------|---------------------------|-----------|
| MISO | Master Input Slave Output | 从机输出,主机输入 |

|-------|--------------|---------------|
| SS/CS | Slave Select | 从机选择信号(低电平有效) |

二、SPI 的硬件连接方式

在真实电路中,SPI 的连接方式遵循以下原则:

  • 所有从设备的 SCK、MOSI、MISO 是并联的

  • 主机通过不同的 SS 引脚 来选择不同的从设备

  • 主设备通过拉低某一条 SS 线来选中相应的从机

  • 从机只有在 SS 为低时才参与通信

也就是说,当多个 SPI 设备共用一条 SPI 总线时,片选信号是区分不同从机的关键点

在 STM32 的配置中,一般设置:

  • 输出引脚:推挽输出

  • 输入引脚:浮空输入或上拉输入

这些硬件连接方式决定了 SPI 能够在同一总线上连接多个设备而互不干扰。

三、SPI 的时序基础

1. 起始与终止条件

SPI 通信依赖 SS 信号控制开始与结束:

  • 起始条件: SS 由高电平 → 低电平

  • 终止条件: SS 由低电平 → 高电平

只有当 SS 处于低电平时,主从设备之间才能进行数据交换。

2. SPI 的 4 种工作模式

SPI 一共有 4 种工作模式,由 CPOL(时钟极性)和 CPHA(时钟相位)两位决定:

|----|------|------|------|--------|
| 模式 | CPOL | CPHA | 空闲状态 | 数据采样方式 |

|-----|---|---|---------|---------|
| 模式0 | 0 | 0 | SCK 低电平 | 第一个边沿采样 |

|-----|---|---|---------|---------|
| 模式1 | 0 | 1 | SCK 低电平 | 第二个边沿采样 |

|-----|---|---|---------|---------|
| 模式2 | 1 | 0 | SCK 高电平 | 第一个边沿采样 |

|-----|---|---|---------|---------|
| 模式3 | 1 | 1 | SCK 高电平 | 第二个边沿采样 |

它们的区别在于:

  • CPOL 决定空闲时钟电平

  • CPHA 决定在第几个边沿采样数据

不同的设备要选择不同的 SPI 模式,如果主从模式不匹配,将会导致通信失败。

四、SPI 的数据交换机制

SPI 的一个非常重要的特性是:全双工传输

这意味着:

  • 主机在发送数据的同时

  • 从机也在向主机发送数据

  • 每发送 1 个字节,就会接收 1 个字节

因此,在 SPI 中并不存在"只写或只读"的情况,读操作本质上也是在发送数据,只是发送的是无意义数据(例如 0xFF 或 0x00)。

1. 发送指令

主设备选中从设备后,通过 MOSI 发送指令,例如 0x06 这样的写使能指令,从机在 MISO 上返回状态数据。

2. 指定地址写数据

SPI 设备(比如 SPI Flash)在写数据时的流程一般为:

  1. 拉低 SS,选中从机

  2. 发送写指令(如 0x02)

  3. 发送 24 位地址(高位在前)

  4. 连续写入数据

  5. 拉高 SS,结束通信

这是一种非常典型的 SPI 写时序结构。

3. 指定地址读数据

读数据的过程与写数据非常类似:

  1. 拉低 SS,选中从机

  2. 发送读指令(如 0x03)

  3. 发送目标地址

  4. 接收从机返回的数据

  5. 拉高 SS,结束通信

这种方式常见于:Flash、EEPROM、传感器寄存器读取等应用。

五、SPI 和其他通信协议对比

|----|------|------|------|----|-------|
| 协议 | 引脚数量 | 是否同步 | 通信方式 | 速度 | 使用复杂度 |

|-----|----|----|-----|----|----|
| SPI | 4根 | 同步 | 全双工 | 很快 | 简单 |

|-----|----|----|-----|----|-----|
| I2C | 2根 | 同步 | 半双工 | 中等 | 较复杂 |

|------|----|----|-----|----|-----|
| UART | 2根 | 异步 | 全双工 | 较慢 | 最简单 |

虽然 SPI 占用 IO 较多,但它的速度和效率非常高,因此在对实时性要求比较高的场合非常常用,比如:

  • OLED 屏幕

  • 高速 ADC

  • 外部 Flash

  • 触控芯片

  • 显示驱动芯片

六、总结

SPI 是 STM32 中极其重要且常用的一种通信方式,掌握 SPI 的基本原理,是嵌入式开发中的必修课。

相关推荐
CODECOLLECT2 小时前
京元 I62D Windows PDA 技术拆解:Windows 10 IoT 兼容 + 硬解码模块,如何降低工业软件迁移成本?
stm32·单片机·嵌入式硬件
BackCatK Chen2 小时前
STM32+FreeRTOS:嵌入式开发的黄金搭档,未来十年就靠它了!
stm32·单片机·嵌入式硬件·freertos·低功耗·rtdbs·工业控制
全栈游侠5 小时前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件
Lsir10110_5 小时前
【Linux】中断 —— 操作系统的运行基石
linux·运维·嵌入式硬件
深圳市九鼎创展科技7 小时前
瑞芯微 RK3399 开发板 X3399 评测:高性能 ARM 平台的多面手
linux·arm开发·人工智能·单片机·嵌入式硬件·边缘计算
辰哥单片机设计7 小时前
STM32项目分享:车辆防盗报警系统
stm32·单片机·嵌入式硬件
風清掦9 小时前
【江科大STM32学习笔记-05】EXTI外部中断11
笔记·stm32·学习
小龙报9 小时前
【51单片机】从 0 到 1 玩转 51 蜂鸣器:分清有源无源,轻松驱动它奏响新年旋律
c语言·数据结构·c++·stm32·单片机·嵌入式硬件·51单片机
范纹杉想快点毕业9 小时前
嵌入式与单片机开发核心学习指南——从思维转变到第一性原理的深度实践
单片机·嵌入式硬件
Industio_触觉智能9 小时前
瑞芯微RK3566开发板规格书,详细参数配置,型号EVB3566-V1,基于RK3566核心板SOM3566邮票孔封装
嵌入式硬件·开发板·rk3568·rk3566·核心板·瑞芯微