资讯动态

【嵌入式通讯协议】SPI与QSPI:从基础到高速传输的实战解析

发布时间:2026/8/4 13:19:39 来源:尧图企业网站定制
1. SPI协议基础从四线制到百万级传输第一次接触SPI是在2013年做智能家居网关项目时当时需要同时控制多个传感器模块。面对I2C地址冲突的困扰老工程师甩给我一句用SPI吧一根片选线解决一个设备。这个看似简单的四线制协议SCK、MOSI、MISO、SS后来成了我嵌入式开发生涯中使用最频繁的通讯方式。SPI全称Serial Peripheral Interface本质是移位寄存器的硬件实现。想象两个面对面的水桶主从设备通过两根水管MOSI和MISO连接。每次时钟脉冲SCK就像同时按压两个活塞主设备的水数据流向从设备的同时从设备的水也反向流动。这种全双工特性让SPI在AD采样、Flash读写等场景优势明显我实测STM32H7系列的SPI3接口能达到108MHz时钟频率传输8MB文件仅需0.6秒。硬件连接有个经典陷阱所有设备的SCK、MOSI、MISO必须并联但片选线必须独立。曾有个血泪教训——把加速度计的SS线误接到光照传感器导致两个设备同时响应造成数据错乱。正确的接法应该是主机GPIO1 → 设备A SS 主机GPIO2 → 设备B SS 主机SCK → 所有设备SCK 主机MOSI → 所有设备MOSI 主机MISO ← 所有设备MISO2. SPI的四种模式与时序玄机很多新手会困惑为什么我的SPI设备偶尔能通信偶尔又失败这通常与模式配置有关。SPI有四种工作模式本质是**时钟极性CPOL和时钟相位CPHA**的组合模式CPOLCPHA时钟空闲状态数据采样时刻000低电平第一个边沿上升沿101低电平第二个边沿下降沿210高电平第一个边沿下降沿311高电平第二个边沿上升沿以常见的NOR Flash为例多数采用模式0或模式3。有次调试Winbond W25Q128时发现读取的ID总是0xFF最终发现是CPHA配置错误。示波器是最直接的调试工具抓取SCK和MOSI/MISO波形时要特别注意SS下降沿标志传输开始数据在有效边沿保持稳定SS上升沿前完成最后一位传输用Verilog实现SPI主机时状态机设计是关键。建议将时钟边沿检测和数据移位分成两个always块比如// 时钟边沿检测 always (posedge clk) begin prev_sck sck; rising_edge (sck1 prev_sck0); falling_edge (sck0 prev_sck1); end // 数据移位模式0为例 always (posedge clk) begin if(rising_edge) begin mosi tx_data[31]; tx_data {tx_data[30:0], 1b0}; end if(falling_edge) begin rx_data {rx_data[30:0], miso}; end end3. QSPI四车道的高速公路当项目需要频繁读写大容量Flash时传统SPI的瓶颈就出现了。记得在开发智能摄像头固件时用标准SPI读取1MB图像数据需要近100ms改用QSPI后直接缩短到22ms。QSPI的精髓在于将单条数据线扩展为四条并行通道IO0-IO3就像单车道变四车道标准SPI1时钟周期传输1bitDual SPI1时钟周期传输2bitQuad SPI1时钟周期传输4bit但要注意信号完整性的挑战。在PCB布局时四条数据线必须等长走线我通常控制在±50ps的时序偏差内。某次六层板设计中因IO2线比其它长3mm导致在80MHz时钟下出现误码后来通过调整走线层解决了问题。QSPI有三大工作模式间接模式通过寄存器操作适合初始化配置状态轮询模式检查状态寄存器位适合擦除/编程等待内存映射模式直接映射到CPU地址空间最快速以MX25L25635E Flash为例切换到QSPI模式需要发送35h命令// 发送命令序列 uint8_t cmd[2] {0x35, 0x00}; HAL_QSPI_Command(hqspi, QSPI_INSTRUCTION_1_LINE, cmd, 2); // 启用四线模式 MODIFY_REG(QUADSPI-CR, QUADSPI_CR_FMODE, QSPI_FMODE_INDIRECT_WRITE);4. 实战SRAM的SPI与QSPI性能对决去年设计高速数据采集系统时需要对VTI7064 SRAM进行性能对比测试。这个案例很典型——同一器件支持两种协议实测数据如下指标SPI模式1线QSPI模式4线写入1KB数据820μs210μs读取1KB数据780μs195μs信号线数量4根6根功耗50MHz12mA18mAQSPI的地址周期需要特别注意。常规SPI发送24位地址要3个字节而QSPI可以压缩// SPI地址发送 0x03 // 读命令 0x00 0x30 0x00 // 24位地址 // QSPI地址发送仅需2周期 0xEB // 四线读命令 0x003000 // 压缩后的地址在STM32CubeIDE中配置QSPI外设时这几个参数最易出错Sample shifting对于长走线建议设为1/2周期Flash size必须与实际芯片容量一致Chip select high timeVTI7064要求至少4个时钟周期遇到CRC校验失败时先检查DLL延迟锁相环配置。有次在-40℃低温测试时出现随机错误最终发现是未启用动态相位补偿// 启用自动校准 QUADSPI-DCR | QUADSPI_DCR_CKMODE; QUADSPI-CR | QUADSPI_CR_EN;经过多个项目验证我的协议选型经验是低速设备用SPI10MHz大数据量必选QSPI。但要注意QSPI的布线复杂度更高在空间受限的双面板上有时宁愿牺牲速度也要保证可靠性。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价