STM32 SPI通信实战:从原理到W25Q64 Flash驱动实现

在嵌入式开发中,当我们需要让微控制器与高速外设(如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)。其通信基于以下四根基本信号线:

  1. SCK (Serial Clock) :时钟信号,由主设备产生,用于同步数据位传输。
  2. MOSI (Master Out Slave In) :主设备输出,从设备输入的数据线。
  3. MISO (Master In Slave Out) :主设备输入,从设备输出的数据线。
  4. 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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值