尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
STM32 SPI 第四课学习笔记
STM32 SPI 第四课学习笔记嵌入式学习笔记 · 第 4 课今天学习了 SPI 总线的电路结构、通信原理时钟极性/相位、4 种模式以及 STM32 SPI 模块的 CubeMX 配置、W25Q64 存储芯片和全双工数据收发编程整理成文方便复习。文章目录STM32 SPI 第四课学习笔记一、SPI 总线基础1. 为什么需要 SPI2. 四根信号线3. 一主多从的电路结构4. 本课学习脉络SPI 基础二、SPI 的通信原理1. 通信流程移位寄存器交换2. 参数 1时钟极性和相位4 种模式3. 参数 2传输顺序4. 参数 3数据宽度三、SPI 模块的使用与 W25Q641. SPI 模块简介STM32F1032. W25Q64 简介3. 定位 SPI 引脚 IO 引脚模式4. IO 的最大输出速度5. CubeMX 配置Mode 选择6. CubeMX 配置Parameter Settings四、SPI 数据收发与编程1. 数据收发的特点2. 编程接口HAL 库3. 数据收发过程4. 代码编写示例W25Q64 读 ID五、SPI 知识点速查表六、记忆口诀汇总一、SPI 总线基础1. 为什么需要 SPI前几课学了串口点对点和 I2C两线制但速率有限。当需要高速、全双工通信比如刷屏幕、读写 Flash时SPI 是最常用的选择总线线数全双工速率多设备串口 UART2TX/RX是中等点对点I2C2SDA/SCL否半双工较慢一主多从地址寻址SPI4SCK/MOSI/MISO/SS是快一主多从片选寻址2. 四根信号线信号线名称作用SCK时钟线Serial Clock主机产生时钟决定传输节奏MOSI主出从入Master Out Slave In主机发数据 → 从机收MISO主入从出Master In Slave Out从机发数据 → 主机收SS片选Slave Select也叫 CS主机选中某个从机低电平有效3. 一主多从的电路结构图解析SCK / MOSI / MISO 是公共总线三条线并联到所有从机大家共享时钟和数据线SS 是独立片选每个从机一根单独的片选线SS1、SS2、SS3主机同时只拉低一个被选中的从机才参与通信通信时主机先拉低目标从机的 SS然后在 SCK 节拍下MOSI 上主机发数据、MISO 上从机回数据结束时拉高 SS。记忆SPI 一主多从 3 根公共总线 N 根独立片选谁被拉低谁通信。4. 本课学习脉络SPI 基础主题内容1SPI 总线的电路结构2通信流程及波形3参数 1时钟信号的极性和相位4SPI 的 4 种模式5参数 2传输顺序6参数 3数据宽度二、SPI 的通信原理1. 通信流程移位寄存器交换SPI 的本质是主从双方的移位寄存器按 SCK 节拍逐位交换数据每个 SCK 时钟沿主机通过 MOSI 移出 1 位、同时通过 MISO 移入 1 位发一个字节的同时也收到一个字节——所以 SPI 总是全双工即使只想写也会同步收到从机返回的数据反之亦然。2. 参数 1时钟极性和相位4 种模式两个关键参数决定了数据在时钟的哪个沿采样CPOL时钟极性空闲时 SCK 电平。CPOL0 空闲低电平CPOL1 空闲高电平CPHA时钟相位数据在哪个沿采样。CPHA0 第一个沿采样CPHA1 第二个沿采样。组合出4 种 SPI 模式模式CPOLCPHA说明Mode 000空闲低第一个沿采样最常用Mode 101空闲低第二个沿采样Mode 210空闲高第一个沿采样Mode 311空闲高第二个沿采样收发双方如 W25Q64必须使用相同的模式否则数据全错。3. 参数 2传输顺序MSB First高位先发先发最高位 D7最后发 D0LSB First低位先发先发 D0最后发 D7。多数设备用 MSB First按从机手册要求设置。4. 参数 3数据宽度常见8 位一个字节一个字节传或16 位STM32 SPI 支持 8 位/16 位帧格式与从机约定一致即可。三、SPI 模块的使用与 W25Q64本部分学习脉络模块与器件主题内容1SPI 模块简介2W25Q64 简介3定位 SPI 的引脚位置4选择 IO 引脚的模式5选择 IO 的最大输出速度1. SPI 模块简介STM32F103F103 有 2 个 SPISPI1、SPI2F103ZET6 有 SPI3。默认引脚外设SCKMISOMOSINSSSPI1PA5PA6PA7PA4SPI2PB13PB14PB15PB12SPI1 可重映射到 PB3/PB4/PB5CubeMX 中可直接选择2. W25Q64 简介W25Q64 是华邦Winbond的 SPI 接口 Flash 存储芯片图解析芯片丝印25Q64CVSIG即 W25Q64 系列容量64 Mbit 8 MByte。芯片通过 SPI 接口与 MCU 通信常用 Mode 0 或 Mode 3支持读、写、擦除擦除最小单位是扇区 4KB。3. 定位 SPI 引脚 IO 引脚模式在 CubeMX 选好 SPI 外设后引脚自动分配到默认位置。各引脚需要配置成什么模式参考手册表 22SPI 引脚配置GPIO 配置SPIx_SCK主模式推挽复用输出从模式浮空输入SPIx_MOSI全双工模式/主模式推挽复用输出全双工模式/从模式浮空输入或带上拉输入简单的双向数据线/主模式推挽复用输出简单的双向数据线/从模式未用可作为通用 I/OSPIx_MISO全双工模式/主模式浮空输入或带上拉输入全双工模式/从模式推挽复用输出简单的双向数据线/主模式未用可作为通用 I/O简单的双向数据线/从模式推挽复用输出SPIx_NSS硬件主/从模式浮空输入或带上拉输入或带下拉输入硬件主模式/NSS 输出使能推挽复用输出软件模式未用可作为通用 I/O一句话主机是输出时钟/数据从机是输入MISO 与 MOSI 正好相反。全双工主机模式下SCK/MOSI 推挽复用输出MISO 浮空或上拉输入。4. IO 的最大输出速度配置为输出的引脚还要选最大输出速度GPIO Speed选项说明Low2MHz低速场景省电抗干扰Medium10MHz常用中间档High50MHz高速 SPI如 W25Q64 快速读写SPI 时钟越快输出引脚速度档位要越高选太低会导致波形变差、通信出错。5. CubeMX 配置Mode 选择图解析SPI Mode 下拉有 8 个选项本课W25Q64 读写选Full-Duplex Master全双工主机选项说明Full-Duplex Master / Slave全双工主/从模式4 线Half-Duplex Master / Slave半双工主/从模式单线双向Receive Only Master / Slave只接收主/从模式Transmit Only Master只发送主机模式6. CubeMX 配置Parameter Settings图解析全双工主机常用配置参数值说明Frame FormatMotorola帧格式摩托罗拉 SPI 标准Data Size8 Bits数据宽度 8 位First BitMSB First高位先发Prescaler (for Baud Rate)2时钟预分频Baud Rate4.0 MBit/s波特率 PCLK / 预分频如 8MHz/2Clock Polarity (CPOL)Low空闲低电平Clock Phase (CPHA)1 Edge第一个沿采样即 Mode 0CRC CalculationDisabled关闭 CRC 校验NSS Signal TypeSoftware片选用软件控制GPIO 拉低/拉高波特率公式SPI 波特率 外设时钟 / 预分频SPI1 挂 APB272MHzSPI2 挂 APB136MHz上图为 8MHz APB2 ÷ 2 4.0 MBit/s 示例。四、SPI 数据收发与编程本部分学习脉络数据收发主题内容1SPI 数据收发的特点2声明数据收发的编程接口3SPI 数据收发过程简介4代码编写1. 数据收发的特点全双工发送和接收同时进行主机发数据时必须同时收数据读一个字节 先发一个字节可以是 0x00/0xFF 占位通过状态标志判断进度TXE发送数据寄存器空、RxNE接收数据寄存器非空、BSY忙。2. 编程接口HAL 库// 发送 Size 个字节阻塞方式HAL_SPI_Transmit(hspi1,txBuf,Size,Timeout);// 接收 Size 个字节阻塞方式HAL_SPI_Receive(hspi1,rxBuf,Size,Timeout);// 同时收发全双工核心接口HAL_SPI_TransmitReceive(hspi1,txBuf,rxBuf,Size,Timeout);常用套路操作 W25Q64 时先拉低 NSS片选用 TransmitReceive 发指令/收数据完成后拉高 NSS。3. 数据收发过程图解析以接收 Size 个字节为例对应 HAL_SPI_Receive 内部流程闭合总开关使能 SPI开始产生时钟向 TDR 写第一个字节先发一个占位字节启动时钟循环 Size-1 次等待TXE发送寄存器空→ 向 TDR 写第 i1 个字节保持时钟等待RxNE接收寄存器非空→ 从 RDR 读第 i 个字节循环结束后再等一次RxNE读最后一个字节断开总开关关闭 SPI。核心逻辑每收一个字节就要先发一个字节维持时钟——这就是全双工的本质。4. 代码编写示例W25Q64 读 IDuint8_ttx[4]{0x9F,0x00,0x00,0x00};// 0x9F 读 JEDEC ID 指令uint8_trx[4]{0};HAL_GPIO_WritePin(SPI1_CS_GPIO_Port,SPI1_CS_Pin,GPIO_PIN_RESET);// 片选拉低HAL_SPI_TransmitReceive(hspi1,tx,rx,4,100);// 发指令收3字节HAL_GPIO_WritePin(SPI1_CS_GPIO_Port,SPI1_CS_Pin,GPIO_PIN_SET);// 片选拉高// rx[1]厂商ID(0xEFWinbond)rx[2..3]器件ID(0x40 0x17W25Q64)五、SPI 知识点速查表项目内容信号线SCK时钟、MOSI主出从入、MISO主入从出、SS片选低有效通信方式全双工、同步主机提供时钟多从机SCK/MOSI/MISO 并联SS 独立片选4 种模式CPOL(0/1) × CPHA(0/1)收发双方必须一致传输顺序MSB First / LSB First数据宽度8 位 / 16 位F103 SPI1PA5SCK、PA6MISO、PA7MOSI、PA4NSSF103 SPI2PB13SCK、PB14MISO、PB15MOSI、PB12NSSGPIO 模式主机 SCK/MOSI推挽复用输出MISO浮空/上拉输入波特率PCLK ÷ 预分频SPI1 挂 APB2SPI2 挂 APB1关键标志TXE发送空、RxNE接收非空、BSY忙HAL 接口HAL_SPI_Transmit / Receive / TransmitReceiveW25Q6464Mbit 8MByteSPI 接口支持 Mode 0/3六、记忆口诀汇总SPI 四根线SCK 给时钟MOSI 主出从入MISO 主入从出SS 片选低有效。全双工主发一字节的同时也收一字节收数据要先发占位字节维持时钟。4 种模式 CPOL × CPHA双方模式必须一致。一主多从3 根公共线并联 N 根片选线谁被拉低谁通信。收数据看 RxNE发数据看 TXE一次全双工 发占位 收真数据。本文为第四课学习笔记如有错误欢迎评论区指正。
RELATED

相关推荐

解析antSword源码:从Electron架构到自定义编码器的二次开发实战

解析antSword源码:从Electron架构到自定义编码器的二次开发实战

简介:中国蚁剑(AntSword)2.1.9 完整源码压缩包,面向 Web 安全测试人员、渗透测试学习者与开源工具二次开发爱好者。该版本源码包含核心加载器、插件体系与跨平台客户端逻辑,可以帮助读者深入理解远程连接管理、命令执行…

📅 2026/10/11 4:15:38
JSMSOFT:个人开发者的轻量版本控制与快照回滚工具指南

JSMSOFT:个人开发者的轻量版本控制与快照回滚工具指南

简介:JSMSOFT是一款面向个人开发者的轻量级版本控制器,专为单机环境设计,以绿色免安装形式提供,适合网络受限或偏好简洁界面的用户。它聚焦文件版本管理、修改追踪、历史回退等核心操作,可帮助独立开发者高效组织项目代…

📅 2026/10/11 4:15:38
SpringBoot养老服务平台毕设全解析:权限设计、表结构与部署避坑

SpringBoot养老服务平台毕设全解析:权限设计、表结构与部署避坑

1. 为什么选这个题目:养老服务平台的真实需求与毕设定位每年到了毕设选题季,总有一批人会盯着“管理系统”类题目反复纠结。说实话,传统的图书管理、宿舍管理、会议室预约这类题目已经做到近乎饱和,代码开源满天飞,答辩…

📅 2026/10/11 4:15:38
MORE NEWS

更多资讯

📰

测试用例设计全攻略:从等价类到场景法,实战组合拳

软件开发这行做了十几年,其中有大半时间泡在测试领域。我见过太多测试新人甚至部分老手,拿到需求就闷头写用例,写出来的东西洋洋洒洒几百条,真正上线前评审一看,核心场景漏了,边界条件没覆盖,异…

📰

集体好奇心如何驱动团队知识分享:从提问到回应的完整链路与落地方法

1. "集体好奇心"通常不是被个人压住的,而是被环境压住的1.1 一个我反复见到的场景:会后私聊很热闹,会上鸦雀无声有次我参加一个产品团队的复盘会,项目上线延期了两周。按道理这种会议应该很热闹,但那天反常地…

📰

# STM32平衡车开发日记 — 速度环:从悖论到闭环(附完整代码)

一、前言 上一篇文章我们搭好了串级PID的骨架,让平衡车能站稳——角度环保持在0,车身不倒了。 但站稳只是第一步。一辆实用的平衡车需要能听话地前进后退:你推摇杆往前,它就按你指定的速度往前走;推摇杆往后&#xf…

📰

小程序版「死了么」:人生进度可视化工具开发全复盘

第一次看到“微信小程序版「死了么APP」,它来了”这句话的人,多半会愣一下:这名字也太直白了吧?但稍微了解过互联网老梗的读者应该知道,“死了么”并不是真的在做死亡直播,而是网友对“寿命倒计时、人生剩余…

📰

Spring Profile 详解:多环境配置隔离与 Spring Boot 实践

Spring Profile 这词儿,在 Spring 家族里其实不算新了,但凡是做过几个正儿八经项目的 Java 开发者,几乎都得跟它打交道。我之前带过几个刚入行的新人,一上来就问“为什么我本地跑得好好的,打包发到服务器上就连不上数据…

📰

本地模型持续进化:Sidecar架构与后训练实战指南

1. 为什么"本地持续进化"是个真问题,而不是伪需求先把场景摆出来。你手头有一台配置还不错的机器,显卡显存够跑一个7B到14B量级的开源模型,日常拿它做代码补全、文档摘要、知识问答。用了一段时间你会发现一个很尴尬的事实&#xf…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬