以下是 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_CPOL
和SPI_CPHA
参数快速配置,软件模拟SPI需严格遵循时序。