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一次全双工 发占位 收真数据。本文为第四课学习笔记如有错误欢迎评论区指正。