news 2026/2/5 20:50:24

STM32 SPI通信协议实战指南——从模式配置到FLASH读写

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
STM32 SPI通信协议实战指南——从模式配置到FLASH读写

1. SPI协议基础与STM32硬件连接

SPI(Serial Peripheral Interface)是一种高速全双工同步串行通信协议,在嵌入式系统中广泛应用。我第一次接触SPI是在做一个温湿度传感器项目时,当时被它简单的四线制连接方式惊艳到了——相比I2C的两根线,SPI虽然多用了两根线,但传输速度能轻松达到MHz级别。

STM32的SPI接口通常包含以下四个信号线:

  • SCK:时钟线,由主机产生
  • MOSI:主机输出从机输入
  • MISO:主机输入从机输出
  • NSS:片选信号(低电平有效)

以STM32F103为例,SPI1的默认引脚映射是:

PA4 - NSS PA5 - SCK PA6 - MISO PA7 - MOSI

硬件连接时有个容易踩的坑:如果使用硬件NSS模式,需要特别注意上拉电阻的配置。我在一个项目中因为没加10K上拉电阻,导致通信一直不稳定,后来用逻辑分析仪抓包才发现NSS信号有抖动。

2. SPI模式配置关键细节

SPI有四种工作模式,由CPOL(时钟极性)和CPHA(时钟相位)组合决定。刚开始学的时候我总记混这两个参数,后来发现可以用"时钟空闲状态"和"采样边沿"来理解:

  • CPOL=0:时钟空闲时为低电平
  • CPOL=1:时钟空闲时为高电平
  • CPHA=0:在第一个时钟边沿采样
  • CPHA=1:在第二个时钟边沿采样

最常用的模式是Mode0和Mode3。FLASH芯片通常支持这两种模式,比如W25Q64芯片就同时兼容两种模式。配置时一定要确保主从设备模式一致,我有次调试时主机设成Mode0而从机是Mode3,结果数据完全对不上。

STM32的SPI初始化代码示例:

SPI_InitTypeDef SPI_InitStruct; SPI_InitStruct.SPI_Direction = SPI_Direction_2Lines_FullDuplex; SPI_InitStruct.SPI_Mode = SPI_Mode_Master; SPI_InitStruct.SPI_DataSize = SPI_DataSize_8b; SPI_InitStruct.SPI_CPOL = SPI_CPOL_High; // Mode3 SPI_InitStruct.SPI_CPHA = SPI_CPHA_2Edge; // Mode3 SPI_InitStruct.SPI_NSS = SPI_NSS_Soft; // 软件控制片选 SPI_InitStruct.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_4; // 18MHz/4=4.5MHz SPI_InitStruct.SPI_FirstBit = SPI_FirstBit_MSB; SPI_Init(SPI1, &SPI_InitStruct); SPI_Cmd(SPI1, ENABLE);

3. FLASH芯片读写实战

以W25Q128FV FLASH芯片为例,其典型操作流程包括:写使能、页编程、扇区擦除、读取数据等。在实际项目中,我发现有几点需要特别注意:

  1. 写操作前必须先发WREN指令
void Flash_WriteEnable(void) { CS_LOW(); SPI_SendByte(W25X_WriteEnable); CS_HIGH(); Delay_us(5); // 等待写使能完成 }
  1. 页编程要注意地址对齐:W25Q128的页大小是256字节,跨页写入会导致数据回卷。我有次没注意这点,导致关键配置数据被覆盖。

  2. 读取状态寄存器判断忙状态

uint8_t Flash_WaitBusy(void) { uint8_t status; do { CS_LOW(); SPI_SendByte(W25X_ReadStatusReg); status = SPI_SendByte(Dummy_Byte); CS_HIGH(); } while(status & 0x01); // 检查BUSY位 return status; }

完整的读数据函数示例:

void Flash_ReadData(uint32_t addr, uint8_t *pData, uint16_t len) { CS_LOW(); SPI_SendByte(W25X_ReadData); SPI_SendByte((addr >> 16) & 0xFF); // 24位地址 SPI_SendByte((addr >> 8) & 0xFF); SPI_SendByte(addr & 0xFF); while(len--) { *pData++ = SPI_SendByte(Dummy_Byte); } CS_HIGH(); }

4. 常见问题排查技巧

调试SPI通信时我总结了几条实用经验:

  1. 用示波器或逻辑分析仪检查信号质量:曾经遇到SCK信号振铃导致通信失败,后来在SCK线上加了个33Ω电阻解决了问题。

  2. 检查供电电压稳定性:FLASH芯片在电压不稳时可能出现奇怪的行为,建议在VCC对地加个0.1μF去耦电容。

  3. 注意时钟相位关系:Mode0和Mode3的主要区别在于第一个时钟边沿是上升还是下降,用错模式会导致采样点不对。

  4. DMA传输优化:对于大数据量传输,可以使用DMA提高效率。但要注意设置正确的数据宽度和FIFO阈值:

DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte; DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; DMA_InitStruct.DMA_BufferSize = BufferSize; SPI_I2S_DMACmd(SPI1, SPI_I2S_DMAReq_Tx, ENABLE);
  1. 跨字节传输问题:当连续发送多字节时,建议在字节间加入微小延时(1-2个时钟周期),特别是对低速从设备。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/3 14:40:57

Lingyuxiu MXJ LoRA从零开始:轻量化挂载+底座模型保护实操教程

Lingyuxiu MXJ LoRA从零开始:轻量化挂载底座模型保护实操教程 1. 为什么你需要这个LoRA引擎——不是又一个风格模型,而是人像创作的“精准手术刀” 你有没有试过用SDXL生成一张真正打动人的真人人像?不是那种五官模糊、皮肤发灰、光影生硬的…

作者头像 李华
网站建设 2026/2/4 20:13:16

OneMore插件完全指南:提升OneNote效率的7个核心技巧

OneMore插件完全指南:提升OneNote效率的7个核心技巧 【免费下载链接】OneMore A OneNote add-in with simple, yet powerful and useful features 项目地址: https://gitcode.com/gh_mirrors/on/OneMore OneMore是一款强大的OneNote插件,它通过命…

作者头像 李华
网站建设 2026/2/3 15:57:15

STLINK-V3MINI 虚拟串口功能与 STDC14 接口的实战应用解析

1. STLINK-V3MINI虚拟串口功能初探 第一次拿到STLINK-V3MINI时,最让我惊喜的不是它的调试功能,而是那个藏在STDC14接口里的虚拟串口功能。你可能不知道,传统开发中我们需要额外准备CH340、FT232这些USB转串口模块的日子终于可以结束了。这个…

作者头像 李华
网站建设 2026/2/3 15:53:20

一文说清Proteus中蜂鸣器的有源与无源工作模式

以下是对您提供的博文内容进行 深度润色与结构重构后的专业级技术文章 。全文已彻底去除AI痕迹,语言自然、逻辑严密、教学感强,兼具工程实践性与教学引导性;同时严格遵循您的所有格式与风格要求(如禁用模板化标题、不设“总结”段、融合模块内容、强化真实经验口吻等),…

作者头像 李华
网站建设 2026/2/4 23:48:05

Clawdbot惊艳效果:Qwen3:32B支持的多模型路由策略与负载均衡实测

Clawdbot惊艳效果:Qwen3:32B支持的多模型路由策略与负载均衡实测 1. 什么是Clawdbot?一个真正为开发者而生的AI代理网关 Clawdbot不是又一个花哨的AI玩具,而是一个能让你在真实项目中立刻用起来的AI代理网关与管理平台。它不讲虚的架构图&a…

作者头像 李华
网站建设 2026/2/3 14:41:02

手把手教你用BEYOND REALITY Z-Image:高精度人像生成保姆级教程

手把手教你用BEYOND REALITY Z-Image:高精度人像生成保姆级教程 1. 这不是普通AI画图,是写实人像的“显微镜级”创作引擎 你有没有试过用AI生成一张真正能当头像、做海报、甚至用于商业宣传的人像?不是那种五官模糊、皮肤塑料感、光影生硬的…

作者头像 李华