SPI四种工作模式

以下是 SPI四种模式 的详细对比与配置指南,结合STM32硬件特性,以表格和时序图清晰展示差异:


SPI四种模式核心对比表

模式 CPOL CPHA 空闲时钟电平 数据采样边沿 数据切换边沿 典型应用场景
Mode 0 0 0 低电平 上升沿(第一个边沿) 下降沿(第二个边沿) 大多数传感器(如BME280)
Mode 1 0 1 低电平 下降沿(第二个边沿) 上升沿(第一个边沿) 部分ADC芯片(如MCP3008)
Mode 2 1 0 高电平 下降沿(第一个边沿) 上升沿(第二个边沿) 少数EEPROM(如93LCxx)
Mode 3 1 1 高电平 上升沿(第二个边沿) 下降沿(第一个边沿) SD卡(SPI模式)、RFID

时序图解析


模式选择与配置要点

1. 如何选择模式?
  • 查阅从设备手册:优先确认从设备支持的SPI模式(如BME280传感器强制要求Mode 0)。
  • 默认推荐 :无特殊要求时选择 Mode 0 (最通用)或 Mode 3(SD卡常用)。
2. STM32硬件SPI配置示例
c 复制代码
// 以Mode 0为例配置SPI1(STM32标准库)
SPI_InitTypeDef SPI_InitStruct = {
    .SPI_Mode              = SPI_Mode_Master,     // 主模式
    .SPI_Direction         = SPI_Direction_2Lines_FullDuplex, // 全双工
    .SPI_DataSize          = SPI_DataSize_8b,     // 8位数据
    .SPI_CPOL              = SPI_CPOL_Low,        // CPOL=0 (Mode 0/1)
    .SPI_CPHA              = SPI_CPHA_1Edge,      // CPHA=0 (Mode 0)
    .SPI_NSS               = SPI_NSS_Soft,         // 软件控制片选
    .SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8, // 分频系数
    .SPI_FirstBit          = SPI_FirstBit_MSB     // 高位先行
};
SPI_Init(SPI1, &SPI_InitStruct);
SPI_Cmd(SPI1, ENABLE);
3. 软件模拟SPI的关键差异
c 复制代码
// Mode 0 vs Mode 3的GPIO初始化差异(关键部分)
if (mode == 0) {
    // CLK初始低电平(CPOL=0)
    GPIO_ResetBits(SPI_CLK_PORT, SPI_CLK_PIN);
} else if (mode == 3) {
    // CLK初始高电平(CPOL=1)
    GPIO_SetBits(SPI_CLK_PORT, SPI_CLK_PIN);
}

// 数据采样边延选择
if (mode == 0 || mode == 3) {
    // CPHA=0: 第一个边沿采样 | CPHA=1: 第二个边沿采样
}

各模式下的通信流程

Mode 0 数据收发流程
c 复制代码
void SPI_Mode0_SendByte(uint8_t data) {
    for (uint8_t i = 0; i < 8; i++) {
        // 下降沿切换数据
        if (data & 0x80) MOSI_HIGH();
        else MOSI_LOW();
        data <<= 1;
        
        // 上升沿采样(从设备读取)
        SCLK_HIGH();
        delay_ns(50);  // 保持稳定
        SCLK_LOW();
    }
}
Mode 3 数据收发流程
c 复制代码
void SPI_Mode3_SendByte(uint8_t data) {
    for (uint8_t i = 0; i < 8; i++) {
        // 上升沿切换数据
        SCLK_HIGH();
        if (data & 0x80) MOSI_HIGH();
        else MOSI_LOW();
        data <<= 1;
        
        // 下降沿采样(从设备读取)
        SCLK_LOW();
        delay_ns(50);
    }
}

常见问题解答

Q1:如何判断设备使用哪种模式?
  • 方法1:查阅从设备数据手册的"SPI Timing Diagram"部分。
  • 方法2:用逻辑分析仪捕获实际通信波形,观察SCLK空闲电平和采样边沿。
Q2:模式配置错误会怎样?
  • 现象:数据错位、通信失败(如读取的传感器数据全为0xFF或0x00)。
  • 解决方案:检查主从设备的CPOL/CPHA是否匹配。
Q3:为什么SD卡常用Mode 3?
  • 原因:SD卡规范要求SPI模式为CPOL=1, CPHA=1(Mode 3),确保在时钟下降沿切换数据时,上升沿能稳定采样。

总结

  • 模式0模式3是最常用的两种模式,覆盖90%的应用场景。
  • 关键区别在于时钟空闲状态(CPOL)和数据采样时刻(CPHA)。
  • 在STM32中,硬件SPI可通过SPI_CPOLSPI_CPHA参数快速配置,软件模拟SPI需严格遵循时序。
相关推荐
ZH15455891311 小时前
Flutter for OpenHarmony Python学习助手实战:GUI桌面应用开发的实现
python·学习·flutter
编程小白20261 小时前
从 C++ 基础到效率翻倍:Qt 开发环境搭建与Windows 神级快捷键指南
开发语言·c++·windows·qt·学习
学历真的很重要2 小时前
【系统架构师】第二章 操作系统知识 - 第二部分:进程与线程(补充版)
学习·职场和发展·系统架构·系统架构师
深蓝海拓2 小时前
PySide6,QCoreApplication::aboutToQuit与QtQore.qAddPostRoutine:退出前后的清理工作
笔记·python·qt·学习·pyqt
酒鼎2 小时前
学习笔记(3)HTML5新特性(第2章)
笔记·学习·html5
L***一2 小时前
2026届大专跨境电商专业毕业生就业能力提升路径探析
学习
.小墨迹2 小时前
apollo学习之借道超车的速度规划
linux·c++·学习·算法·ubuntu
ZH15455891312 小时前
Flutter for OpenHarmony Python学习助手实战:模块与包管理的实现
python·学习·flutter
Gain_chance2 小时前
33-学习笔记尚硅谷数仓搭建-DWS层交易域用户粒度订单表分析及设计代码
数据库·数据仓库·hive·笔记·学习·datagrip
全栈游侠2 小时前
STM32F103XX 02-电源与备份寄存器
stm32·单片机·嵌入式硬件