STM32 SPI通信协议详解
2025-10-20 来源:cnblogs
1. SPI协议概述
1.1 什么是SPI?
SPI(Serial Peripheral Interface)是由摩托罗拉公司于1980年代提出的同步串行通信协议,主要用于短距离高速芯片间通信。作为四线制全双工通信协议,它以简单的硬件实现和高效的传输速率著称,广泛应用于存储器、传感器、显示模块等嵌入式设备中。
典型应用场景:
微控制器与Flash存储器通信(如W25Q128)
触摸屏控制器数据传输
数字信号处理器与ADC/DAC模块连接
TFT液晶屏驱动控制
1.2 核心特性对比
| 特性 | SPI | I2C | UART |
|---|---|---|---|
| 通信方式 | 全双工 | 半双工 | 全双工 |
| 拓扑结构 | 点对点/主从 | 多主多从 | 点对点 |
| 最大速率 | 100Mbps+ | 3.4Mbps | 115200bps |
| 信号线数量 | 4 | 2 | 2 |
| 寻址方式 | 硬件片选 | 软件地址 | 无地址 |
https://i3.wp.com/img-blog.csdnimg.cn/20210720172318888.png
2. SPI物理层详解
2.1 四线制信号定义
MOSI (Master Output Slave Input)
主设备数据输出线
传输方向固定:主→从
典型应用:发送控制指令或写入数据
MISO (Master Input Slave Output)
从设备数据输出线
传输方向固定:从→主
注意:同一时刻只能有一个从设备驱动该线路
SCLK (Serial Clock)
主设备产生的同步时钟
频率范围:通常1MHz-50MHz(具体取决于器件)
时钟相位和极性可配置(详见第4章)
SS/CS (Slave Select)
低电平有效的片选信号
每个从设备独立拥有CS线
多从机系统需要多个GPIO控制
2.2 硬件连接注意事项
总线长度限制:一般不超过30cm
上拉电阻:根据器件需求添加(通常4.7kΩ-10kΩ)
信号完整性:高速传输时需考虑阻抗匹配
多从机连接方式:
独立片选(推荐):每个从机单独CS线
菊花链:数据级联传输(需器件支持)
3. SPI协议层深度解析
3.1 通信时序模型
// 典型SPI数据传输伪代码
void SPI_Transfer(uint8_t *txData, uint8_t *rxData, int length)
{
CS_LOW(); // 起始信号
for(int i=0; i // 时钟边沿触发数据交换 for(int bit=7; bit>=0; bit--){ MOSI = (txData[i] >> bit) & 0x01; SCLK_TOGGLE(); rxData[i] |= (MISO << bit); SCLK_TOGGLE(); } } CS_HIGH(); // 停止信号 } 3.2 关键时序参数 https://i3.wp.com/img-blog.csdnimg.cn/20210720172536907.png 4. SPI工作模式详解 4.1 CPOL与CPHA组合模式 typedef enum { SPI_MODE0 = 0, // CPOL=0, CPHA=0 SPI_MODE1, // CPOL=0, CPHA=1 SPI_MODE2, // CPOL=1, CPHA=0 SPI_MODE3 // CPOL=1, CPHA=1 } SPI_Mode; 4.1.1 模式0(最常用) 时钟空闲状态:低电平 数据采样时刻:上升沿 应用案例:大多数SPI Flash存储器 4.1.2 模式3 时钟空闲状态:高电平 数据采样时刻:下降沿 应用案例:某些型号的SD卡 4.2 模式选择实践建议 严格参照器件手册确定工作模式 使用逻辑分析仪验证实际波形 当通信异常时首先检查模式设置 注意不同厂家对模式的命名差异 5. STM32的SPI外设配置 5.1 初始化代码示例 void SPI1_Init(void) { GPIO_InitTypeDef GPIO_InitStruct = {0}; SPI_HandleTypeDef hspi1 = {0}; // 时钟使能 __HAL_RCC_SPI1_CLK_ENABLE(); __HAL_RCC_GPIOA_CLK_ENABLE(); // MOSI(PA7), MISO(PA6), SCLK(PA5) GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); // SPI参数配置 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_LOW; hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; hspi1.Init.NSS = SPI_NSS_SOFT; hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_4; hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; HAL_SPI_Init(&hspi1); } 5.2 关键配置参数解析 BaudRatePrescaler 计算公式:SCLK = APB Clock / (2 * prescaler) 常用值:2分频(高速模式)、8分频(常规模式) DataSize 支持8/16位数据帧 注意对齐16位访问(使用__packed关键字) NSS管理 硬件模式:自动片选(需配置NSS引脚) 软件模式:手动控制GPIO(推荐) 6. SPI与I2C的对比选择 6.1 协议特性对比 6.2 选型建议 选择SPI当: 需要高速数据传输 系统对实时性要求高 通信距离短(<30cm) 主设备引脚资源充足 选择I2C当: 设备数量多且布线空间有限 通信速率要求不高 需要热插拔支持 低功耗设计场景 7. SPI实战应用案例 7.1 OLED显示屏驱动 // SSD1306写命令函数 void OLED_WriteCmd(uint8_t cmd) { OLED_CS_LOW(); OLED_DC_CMD(); // 命令模式 HAL_SPI_Transmit(&hspi1, &cmd, 1, 100); OLED_CS_HIGH(); } // 初始化序列示例 const uint8_t init_seq[] = { 0xAE, // 关闭显示 0xD5, 0x80, // 设置时钟分频 0xA8, 0x3F, // 设置多路复用率 // ...其他初始化命令 }; void OLED_Init(void) { for(int i=0; i OLED_WriteCmd(init_seq[i]); } } 7.2 FLASH存储器读写 #define W25Q_CMD_READ 0x03 #define W25Q_CMD_WRITE 0x02 void W25Q_ReadData(uint32_t addr, uint8_t *buffer, uint16_t len) { uint8_t cmd[4] = { W25Q_CMD_READ, (addr >> 16) & 0xFF, (addr >> 8) & 0xFF, addr & 0xFF }; W25Q_CS_LOW(); HAL_SPI_Transmit(&hspi1, cmd, 4, 100); HAL_SPI_Receive(&hspi1, buffer, len, 1000); W25Q_CS_HIGH(); } 8. 常见问题排查指南 8.1 通信失败常见原因 模式配置错误(占故障的60%以上) 检查CPOL/CPHA设置 使用逻辑分析仪捕获实际波形 时序问题 确保CS信号有效时间足够 调整时钟分频系数 硬件连接故障 检查线路短路/断路 确认电压电平匹配 8.2 调试技巧 使用示波器测量关键信号: SCLK频率是否符合预期 MOSI/MISO数据是否对齐时钟边沿 CS信号的有效时间 分步验证: 先测试单字节传输 验证主从设备各自独立工作 添加软件延时辅助调试 9. 未来发展趋势 增强型SPI协议 QSPI(四线制,带宽翻倍) OSPI(Octal SPI,八线制) HyperBus(混合协议) 自动化配置技术 基于AI的自动模式识别 动态时钟调整技术 安全增强 硬件加密引擎集成 时序随机化防窃听 10. 总结与建议 通过本文的系统讲解,我们深入剖析了SPI协议的各个技术细节。在实际项目开发中,建议: 建立标准化的SPI驱动框架 编写完善的错误检测和恢复机制 使用版本控制管理设备配置参数 定期进行总线信号完整性测试 随着物联网设备的爆发式增长,SPI作为经典的高速通信协议,仍将在嵌入式领域发挥重要作用。掌握其核心原理并积累实战经验,是嵌入式工程师的必备技能。参数 描述 典型值 t_SCLK 时钟周期 20ns@50MHz t_SU 数据建立时间 5ns t_HOLD 数据保持时间 3ns t_CS2CLK CS有效到第一个时钟边沿的延迟 10ns 对比维度 SPI I2C 传输速率 高速(50MHz+) 中速(400kHz-1MHz) 引脚资源 4线+N*CS 2线 寻址方式 硬件片选 7/10位地址 拓扑复杂度 多CS线导致布线复杂 总线式易于扩展 功耗 较高(持续时钟) 较低(时钟拉伸)
- 意法半导体中国本地造STM32微控制器启动规模量产
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 基于机智云与STM32的智能拐杖安全监测系统在养老物联网中的应用
- 内置全栈安全,一站式满足CRA法案与IEC 62443标准——米尔STM32MP257核心板
- 如何用 STM32 FLASH 实现等效 100 万次擦写的 EEPROM 功能?
- 实战解析:通过一个小项目掌握STM32所有外设
- STM32学了两年半,却还是不会做项目
- 意法半导体推出最新STM32MP21微处理器,兼具高性价比、低功耗、高灵活性
- 基于STM32的矿井作业环境监测系统设计与实现
- 六大全新产品系列推出,MCX A微控制器家族迎来创新
- 意法半导体全新STM32C5系列,重新定义入门级微控制器性能与价值,赋能万千智能设备
- 从控制到系统:TI利用边缘AI重塑嵌入式MCU的边界
- 模组复用与整机重测在SRRC、CCC、CTA/NAL认证中的实践操作指南
- 有源晶振与无源晶振的六大区别详解
- 英飞凌持续巩固全球微控制器市场领导地位
- 使用 Keil Studio for Visual Studio Code开发 STM32 设备
- 蓝牙信道探测技术原理与开发套件实践
- LoRa、LoRaWAN、NB-IoT与4G DTU技术对比及工业无线方案选型分析
- Microchip 推出生产就绪型全栈边缘 AI 解决方案,赋能MCU和MPU实现 智能实时决策




