前言:在嵌入式系统中,外设通信是非常重要的一部分。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)在写数据时的流程一般为:
-
拉低 SS,选中从机
-
发送写指令(如 0x02)
-
发送 24 位地址(高位在前)
-
连续写入数据
-
拉高 SS,结束通信
这是一种非常典型的 SPI 写时序结构。
3. 指定地址读数据
读数据的过程与写数据非常类似:
-
拉低 SS,选中从机
-
发送读指令(如 0x03)
-
发送目标地址
-
接收从机返回的数据
-
拉高 SS,结束通信
这种方式常见于:Flash、EEPROM、传感器寄存器读取等应用。
五、SPI 和其他通信协议对比
|----|------|------|------|----|-------|
| 协议 | 引脚数量 | 是否同步 | 通信方式 | 速度 | 使用复杂度 ||-----|----|----|-----|----|----|
| SPI | 4根 | 同步 | 全双工 | 很快 | 简单 ||-----|----|----|-----|----|-----|
| I2C | 2根 | 同步 | 半双工 | 中等 | 较复杂 ||------|----|----|-----|----|-----|
| UART | 2根 | 异步 | 全双工 | 较慢 | 最简单 |
虽然 SPI 占用 IO 较多,但它的速度和效率非常高,因此在对实时性要求比较高的场合非常常用,比如:
-
OLED 屏幕
-
高速 ADC
-
外部 Flash
-
触控芯片
-
显示驱动芯片
六、总结
SPI 是 STM32 中极其重要且常用的一种通信方式,掌握 SPI 的基本原理,是嵌入式开发中的必修课。