在嵌入式开发中,当我们需要让微控制器与高速外设(如Flash存储器、显示屏、传感器)进行数据交换时,UART和I2C的速度和灵活性有时会显得捉襟见肘。这时,SPI(Serial Peripheral Interface)协议凭借其全双工、高速、协议简单的特点,成为了许多开发者的首选。然而,其灵活的时序模式、硬件/软件片选机制也常让初学者感到困惑。本文将系统性地拆解SPI通信的核心原理,并通过一个完整的STM32驱动W25Q64 Flash存储器的实战案例,手把手带你从零实现SPI通信。无论你是刚接触SPI的新手,还是希望深入理解其工作细节的开发者,都能从中获得可直接复用的代码和清晰的排错思路。
1. SPI通信协议核心概念解析
SPI是一种高速、全双工、同步的串行通信总线协议,由摩托罗拉公司推出。它因其硬件实现简单、数据传输速率高(可达数十Mbps)而被广泛应用于微控制器与各种外设(如存储器、ADC、DAC、显示屏、传感器等)之间的短距离通信。
1.1 SPI与UART、I2C的对比
在深入SPI之前,理解它与其他常见串行协议的区别至关重要。这有助于我们在实际项目中做出正确的技术选型。
- UART (Universal Asynchronous Receiver/Transmitter) :
- 通信方式 :异步、全双工或半双工。
- 线路 :通常需要TX(发送)、RX(接收)、GND三根线。
- 特点 :双方需要预先约定相同的波特率,没有时钟线,依靠起始位和停止位来同步。结构简单,常用于设备间的调试、通信,但速度相对较慢,且点对点通信为主。
- I2C (Inter-Integrated Circuit) :
- 通信方式 :同步、半双工。
- 线路 :只需要两根线:SDA(数据线)和SCL(时钟线)。
- 特点 :支持多主多从,通过设备地址寻址,节省引脚资源。但通信速率受上拉电阻和总线电容影响,速度通常低于SPI,协议也相对复杂(需要起始、停止、应答信号)。
- SPI (Serial Peripheral Interface) :
- 通信方式 :同步、全双工。
- 线路 :通常需要四根线:SCK、MOSI、MISO、CS。
- 特点 :通信速率高,协议简单(只有时钟和数据),无复杂的起始、停止、应答机制。缺点是每个从设备需要独占一根片选线,在从设备数量多时会占用大量主控IO口。
简单来说,如果你需要 极高的速度 和 简单的数据流控制 ,SPI是理想选择;如果需要连接 大量设备 且 引脚资源紧张 ,I2C可能更合适;如果只是简单的 点对点调试或通信 ,UART就足够了。
1.2 SPI总线的基本构成与工作模式
一个典型的SPI系统包含一个主设备(Master)和一个或多个从设备(Slave)。其通信基于以下四根基本信号线:
- SCK (Serial Clock) :时钟信号,由主设备产生,用于同步数据位传输。
- MOSI (Master Out Slave In) :主设备输出,从设备输入的数据线。
- MISO (Master In Slave Out) :主设备输入,从设备输出的数据线。
- CS/SS (Chip Select / Slave Select) :片选信号,由主设备控制。当主设备需要与某个从设备通信时,将该从设备的CS线拉低(通常低电平有效),选中该设备。
SPI协议本身只定义了物理层和数据流,其灵活性体现在**时钟极性(CPOL) 和 时钟相位(CPHA)**这两个参数的组合上,它们共同决定了四种工作模式。
- 时钟极性 CPOL :决定了SCK时钟线在空闲状态时的电平。
- CPOL = 0:SCK空闲时为低电平。
- CPOL = 1:SCK空闲时为高电平。
- 时钟相位 CPHA :决定了数据在时钟的哪个边沿被采样。
- CPHA = 0:数据在时钟的第一个边沿(即SCK从空闲状态跳变到有效状态的边沿)被采样。对于CPOL=0,第一个边沿是上升沿;对于CPOL=1,第一个边沿是下降沿。
- CPHA = 1:数据在时钟的第二个边沿(即SCK从有效状态跳变回空闲状态的边沿)被采样。
这四种模式(Mode 0, 1, 2, 3)必须由主从设备共同约定一致,否则通信必然失败。 Mode 0 (CPOL=0, CPHA=0) 和 Mode 3 (CPOL=1, CPHA=1) 是最常用的两种模式。
2. 环境准备与硬件连接
在开始代码实战前,我们需要搭建好软硬件环境。本次实战以意法半导体的STM32F103C8T6(蓝桥杯常用核心板)作为主设备,以华邦的W25Q64(8MB SPI Flash)作为从设备。
2.1 所需硬件与软件清单
- 硬件 :
- STM32F103C8T6 核心板(或其他STM32系列开发板) x1
- W25Q64 Flash模块 x1
- USB转TTL串口模块(用于打印调试信息) x1
- 杜邦线若干
- 面包板(可选)
- 软件 :
- IDE:Keil uVision5 或 STM32CubeIDE
- 开发库:STM32标准外设库(Standard Peripheral Library)或HAL库。本文示例基于标准库,因其更贴近底层硬件,便于理解原理。
- 串口调试助手:如XCOM、SecureCRT等。
2.2 硬件电路连接
将STM32与W25Q64按照SPI总线规则连接。我们使用STM32的SPI1外设。
| STM32F103C8T6引脚 | W25Q64模块引脚 | 信号线 |
|---|---|---|
| PA5 (SPI1_SCK) | CLK | SCK |
| PA7 (SPI1_MOSI) | DI (Data In) | MOSI |
| PA6 (SPI1_MISO) | DO (Data Out) | MISO |
| PA4 (GPIO Output) |


7949

被折叠的 条评论
为什么被折叠?



