SPI总线接口原理与应用全解析
2026/9/14 22:35:32 网站建设 项目流程

1. SPI总线接口概述

SPI(Serial Peripheral Interface)是一种同步串行通信协议,由Motorola在1980年代提出,现已成为嵌入式系统和芯片间通信的行业标准。与I2C、UART等其他串行协议相比,SPI以其全双工、高速率(可达数十MHz)和简单硬件实现的特性,在存储器、传感器、显示模块等外设连接中占据重要地位。

典型的SPI系统包含一个主设备(Master)和一个或多个从设备(Slave),通过四根基本信号线建立通信:

  • SCLK(Serial Clock):主设备提供的时钟信号
  • MOSI(Master Out Slave In):主设备发送数据线
  • MISO(Master In Slave Out):从设备发送数据线
  • SS/CS(Slave Select/Chip Select):从设备选择信号(低电平有效)

关键特性:SPI没有官方标准规范,不同厂商的实现可能存在细节差异,但核心通信机制保持一致。实际应用中需特别注意时钟极性和相位的配置。

2. SPI工作模式深度解析

2.1 四种通信模式

SPI通过CPOL(Clock Polarity)和CPHA(Clock Phase)两个参数定义了四种工作模式:

模式CPOLCPHA时钟空闲状态数据采样边沿
000低电平上升沿
101低电平下降沿
210高电平下降沿
311高电平上升沿

模式0最常用,适用于多数SPI Flash和传感器。模式3在SD卡通信中较为常见。实际选择需严格参照器件数据手册。

2.2 时钟速率考量

SPI时钟速率理论上仅受物理线路特性限制,实际应用中需考虑:

  1. 主从设备支持的最高频率(如STM32H7 SPI可达108MHz)
  2. 线路长度和PCB布局(高速时需阻抗匹配)
  3. 从设备响应时间(如EEPROM写入需要延迟)

经验法则:长距离传输应降低时钟速率,1MHz以下可有效减少信号完整性问题。高速SPI(>10MHz)建议使用阻抗控制的PCB设计。

3. 多从机系统设计

3.1 硬件拓扑方案

  • 独立片选型:每个从设备独占一个CS引脚

    • 优点:通信互不干扰
    • 缺点:占用MCU引脚资源(n个从机需要n+3根线)
  • 菊花链型:设备串联,数据依次传递

    • 优点:仅需4根线(CS共享)
    • 缺点:软件协议复杂,整体速率受限于最慢设备

3.2 软件地址分配技巧

对于不支持硬件CS的从机,可通过协议层实现寻址:

// 软件片选示例(以SPI Flash为例) void spi_flash_select(uint8_t dev_id) { GPIO_WriteLow(CS_PORT, ALL_CS_MASK); // 拉低所有CS GPIO_WriteHigh(CS_PORT, 1<<dev_id); // 激活目标设备 }

PCB布局要点

  1. 等长走线(特别是SCLK到各从设备的长度差<1/10波长)
  2. 终端匹配电阻(高速时在末端接100Ω电阻)
  3. 避免直角走线(会产生电磁辐射)

4. 典型问题排查指南

4.1 无数据返回故障

现象:主设备发送正常,但MISO始终无信号

  • 检查步骤:
    1. 确认从设备电源正常(实测电压非空载测量)
    2. 验证CS信号是否有效(示波器观察下降沿)
    3. 检查模式设置(CPOL/CPHA需主从一致)
    4. 测量SCLK是否到达从设备(可能线路断路)

案例:某AMOLED屏SPI接口不响应,最终发现是模式配置错误(需Mode 3但配置为Mode 0)。

4.2 数据错位问题

现象:接收数据与预期存在位偏移

  • 解决方案:
    1. 检查字节顺序(MSB/LSB first)
    2. 确认时钟相位(CPHA)设置
    3. 在第一个有效时钟边沿前保持数据稳定(CPHA=0时)
// STM32CubeMX生成的SPI配置示例(Mode 3) hspi1.Instance = SPI1; hspi1.Init.Mode = SPI_MODE_MASTER; hspi1.Init.Direction = SPI_DIRECTION_2LINES; hspi1.Init.DataSize = SPI_DATASIZE_8BIT; hspi1.Init.CLKPolarity = SPI_POLARITY_HIGH; // CPOL=1 hspi1.Init.CLKPhase = SPI_PHASE_2EDGE; // CPHA=1

5. 高级应用技巧

5.1 DMA优化方案

对于高速数据传输(如LCD刷新),启用DMA可大幅降低CPU负载:

  1. STM32配置要点:
    • 设置DMA为循环模式(Circular)
    • 对齐数据宽度(PSIZE=MSIZE)
    • 启用传输完成中断
// STM32H7 SPI DMA配置 hdma_spi1_tx.Init.Request = DMA_REQUEST_SPI1_TX; hdma_spi1_tx.Init.Direction = DMA_MEMORY_TO_PERIPH; hdma_spi1_tx.Init.PeriphInc = DMA_PINC_DISABLE; hdma_spi1_tx.Init.MemInc = DMA_MINC_ENABLE; hdma_spi1_tx.Init.PeriphDataAlignment = DMA_PDATAALIGN_BYTE; hdma_spi1_tx.Init.MemDataAlignment = DMA_MDATAALIGN_BYTE;

5.2 自动片选波形优化

常规CS信号在每字节传输间会产生毛刺,改进方案:

  1. 硬件方案:添加RC滤波(R=100Ω, C=10pF)
  2. 软件方案:在SPI空闲时手动保持CS有效
    void spi_write_continuous(uint8_t* data, uint32_t len) { CS_LOW(); HAL_SPI_Transmit(&hspi1, data, len, 1000); // 不立即拉高CS }

6. 协议对比与选型

6.1 SPI vs I2C vs UART

特性SPII2CUART
速度可达100Mbps通常<1Mbps通常<12Mbps
引脚数4+nCS22
拓扑结构点对点/菊花链多主多从点对点
硬件复杂度简单中等简单
错误检测有(ACK)有(奇偶校验)

选型建议

  • 高速场景选SPI(如显示屏、Flash)
  • 多设备总线选I2C(如传感器阵列)
  • 长距离通信选UART(加电平转换)

7. 特殊场景处理

7.1 低功耗设备唤醒

某些SPI设备(如BQ79600)具有休眠模式,需要特殊唤醒序列:

  1. 保持CS低电平至少500μs
  2. 发送特定唤醒命令(如0xA5)
  3. 等待1ms唤醒时间
  4. 开始正常通信
void spi_wakeup_device(void) { CS_LOW(); delay_us(600); // 超时设计 uint8_t cmd = 0xA5; HAL_SPI_Transmit(&hspi1, &cmd, 1, 100); delay_ms(1); // 稳定等待 }

7.2 电平转换方案

当主从设备电压不匹配时(如3.3V MCU与5V外设):

  • 专用芯片:TXS0108E(自动方向转换)
  • 分立元件:MOSFET方案(成本低但速度受限)
  • 电阻分压:仅适用于5V→3.3V单向传输

注意:避免直接连接不同电压器件,可能损坏IO口或导致逻辑错误。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询