尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

SPI、DSPI与QSPI全面对比:从原理时序到硬件设计与应用实践

发布时间:2026/9/26 14:41:22

资讯中心
01
ARTICLE

SPI、DSPI与QSPI全面对比:从原理时序到硬件设计与应用实践

SPI、DSPI与QSPI全面对比:从原理时序到硬件设计与应用实践
直接开聊。嵌入式圈子里提到存储芯片、传感器、屏幕驱动SPI几乎是避不开的接口。但真正把SPI、DSPI、QSPI放在一起对比选择的时候不少工程师会卡壳这三种东西到底差在哪什么时候该用哪个为什么QSPI这几年在NOR Flash领域成了主流这篇博文就把这三个协议放到一张桌上从原理拆到应用从时序画到示波器实操最后再聊聊FPGA、Linux驱动、上位机模拟这些常见落地场景。适合正在做存储扩展、传感器采集或者显示驱动的软硬件工程师也适合刚接触总线协议想系统理解的新人。1. 从一根线到四根线三种协议的本质差异1.1 SPI的基线模型SPI全称Serial Peripheral Interface同步串行外设接口。它的核心架构是主从模式主设备提供SCLK时钟和CS片选从设备在时钟节拍下通过MOSI主出从入和MISO主入从出两根数据线交换数据。我习惯用一个比喻来理解SPI主设备像一个拿着排班表的车间主任SCLK是他的指挥哨CS是点名信号MOSI是主任给工人下达指令的传话筒MISO是工人回传结果的汇报线。每到一次哨声两边各往线上放一个bit的数据同时把对方线上已有的bit采进来。这种“边发送边接收”的行为本质是主从两个移位寄存器在同步时钟驱动下互换内容。SPI最吸引人的地方是接口简单4根线不算地能跑几十Mbps而且没有复杂的协议握手主设备想读就读想写就写。相比I2C需要地址应答、UART需要波特率对齐SPI的实时性和确定性都非常强所以高速ADC、Flash、SD卡SDIO模式则是变种、LCD驱动器都爱用它。但SPI的短板也很明显它本质是“1条发送线1条接收线”每个时钟周期只能搬1个bit全双工情况下是双向各1bit。如果一块NOR Flash需要300Mbps的读取带宽SPI在这种时钟下就得跑到300MHzPCB走线根本扛不住。于是就有了DSPI和QSPI这种扩宽数据通道的思路。1.2 DSPI和QSPI扩展了什么DSPI和QSPI并不是全新的总线协议它们是基于SPI的“加线”方案。SPI是单条MOSI和单条MISODSPI则把单向传输改成双线双向两条数据线IO0和IO1分别承担发送和接收相当于在同一个时钟周期里能并行传2个bit单向半双工时或者I/O同时工作时变成“双线并发”。QSPI更进一步用了四条数据线IO0~IO3一个时钟周期最多搬4个bit。打个比方SPI是单车道双向通行一次只能过一个方向一辆车DSPI是双车道对开两个方向各走各的QSPI直接改成四车道单行四个数据流并列往前冲。在同样的时钟频率下QSPI的理论吞吐量是SPI的四倍这才是它能在高速Flash场景站稳脚跟的根本原因。很多初学者会误以为DSPI是“双倍速SPI”QSPI是“两倍DSPI”。实际上扩展数据线后带来的不只是带宽翻倍更重要的是主设备可以用更少的时钟周期完成一次大块数据读取这直接降低了CPU或者DMA的轮转负担。以QSPI NOR Flash为例普通SPI模式下读一个字节要8个时钟周期而QSPI的Fast Read Quad I/O模式地址和命令阶段虽然仍占用一定周期但数据阶段每时钟传4bit整体读取效率提升非常明显。1.3 三种协议的效率对比与适用边界协议数据线数量每时钟传输bit数数据阶段典型应用SPI1发1收1传感器、RTC、低速FlashDSPI22高速ADC/DAC、部分LCDQSPI44NOR Flash、显示缓冲、FPGA配置这里的“传输bit数”指的是纯数据阶段命令和地址阶段的效率取决于具体器件的指令集。比如W25Q64在Quad Output模式命令加地址加Dummy周期共占用了不少时钟但对于连续大量的数据块来说平均吞吐依然显著高于SPI。适用边界我总结成三条传感器和低速外设用SPI足够因为传感器数据量小多两根数据线只会浪费引脚高速数据采集和双向并行吞吐场景选DSPI比如某些ADC需要同时采样数据发送控制字存储类器件和数据密集型场景选QSPI尤其是NOR Flash、FPGA配置芯片这类既要速度又要管脚少的东西。再往上还有OSPIOcto SPI8线和xSPI但那是另一个赛道目前消费级用得最多的还是QSPI。2. 时序细节与工作模式看懂波形才算入门2.1 SPI的四种工作模式SPI通讯协议详解里最让新手头疼的就是CPOL和CPHA。CPOL决定空闲状态下时钟电平是高还是低CPHA决定数据采样发生在时钟的第一个边沿还是第二个边沿。四个组合产生了Mode 0到Mode 3模式CPOLCPHA空闲时钟采样边沿Mode 000低上升沿Mode 101低下降沿Mode 210高下降沿Mode 311高上升沿我实际调试的经验是绝大多数Flash和传感器芯片默认支持Mode 0或Mode 3而有些奇葩器件只支持Mode 1。最稳妥的办法是查数据手册里Figure的时序图别靠猜。选错模式最典型的故障现象就是读回来的数据全是0x00或0xFF或者数据错位半个字节。2.2 关键时序参数与最小片选时间SPI时序图里除了时钟和数据线还有几个参数经常被人忽略建立时间tSU、保持时间tH、数据有效时间tV以及片选信号的最小建立和保持时间。网上经常有人问“CS最小能做到多少微秒”其实这个答案在器件手册里的“Timing Characteristics”章节都有明确定义。以常见NOR Flash为例tCSSCS setup time通常要求命令阶段之前CS拉低要提前至少几纳秒tCSH则要求CS释放前最后一个时钟沿后有最小保持时间。如果把CS当作“选通窗口”来看这个窗口必须完整覆盖整个命令传输期间提前释放甚至会导致Flash内部状态机错乱写入命令被悄无声息地丢掉。实操中我习惯在软件里配置GPIO或者控制器硬件片选时特意检查CS翻转和时钟起始之间的间隙。很多MCU的硬件SPI外设支持“片选延迟”例如STM32的SSN设置可以在硬件上保证tCSS。如果是软件片选就得用逻辑分析仪确认延迟避免写Flash时偶发失败。2.3 示波器实测与波形判读SPI波形用示波器抓是最直观的验证方式。调试时我会把示波器探头接在SCLK、MOSI或IO0和CS上MISO或IO1如果同时抓也可以用四通道示波器基本够用。触发条件设置为SCLK下降沿或者CS下降沿单次触发后开始通信就能看到清晰的一帧数据。对于Mode 0我习惯以时钟上升沿为采样点所以在波形上检查数据线是否在上升沿前后稳定。如果数据跳变发生在上升沿附近说明采样点可能选错了模式或者PCB走线导致的延迟过大。DSPI和QSPI的波形判读麻烦一点因为四条数据线要同时看而且Flash在Quad模式下命令阶段之后会切到IO输出方向波形上能看到双向切换的“三态”阶段。此时我会建议把带宽改成“分组显示”或者用逻辑分析仪以CS为触发源对齐四条数据线逐位解析。多年经验告诉我一个铁律先慢速调通时序再往高速提。用1MHz时钟把SPI波形抓到、读回数据正确再逐步升频看临界点这样排查问题会容易得多。一上来就怼最大时钟频率信号质量差了你根本分不清是时序配置还是硬件布线的问题。3. 硬件设计与片选策略选型之前先想清楚3.1 硬件片选与软件片选的取舍SPI硬件片选与软件片选是项目里绕不开的一个决策。硬件片选由SPI控制器自动控制软件在初始化时配置好CS引脚为外设功能之后每次传输控制器会在开始前拉低CS、结束后拉高。好处是减轻CPU负担时序精确还能配合DMA实现真正的后台传输。坏处是灵活性差比如两个从设备挂在同一条SPI总线上如果其中一个设备需要较长的CS保持时间硬件片选可能来不及调整。软件片选则是用普通GPIO来模拟CS传输出发前手动拉低传输结束后手动拉高。它灵活得多可以在任意时刻插入延迟非常适合多从设备动态切换以及需要和GPIO中断联动的场景。但它也有明显的坑如果软件在传输过程中被高优先级中断打断CS可能保持低电平过久某些从设备会判定为通信异常。我的建议是单从设备、对时序要求高的存储场景用硬件片选多从设备、需要灵活仲裁或者做菊花链的场景优先考虑软件片选。硬件测试用例层面两种片选都需要覆盖异常释放如通信中途CS提前恢复的场景因为这种奇怪的故障在量产中并不少见。3.2 总线拓扑与信号完整性SPI总线常见的拓扑有两类独立片选的一主多从和菊花链。独立片选模式中每个从设备一条CSSCLK和MOSI/MISO共享。这种拓扑下从设备数量增多会导致总线上容性负载增加时钟信号上升沿变缓MISO线上多个器件三态输出切换时还可能产生毛刺。菊花链则把数据从一个设备串到下一个设备I/O线不共享代价是远端的从设备无法独立寻址命令帧必须串联传递延迟会叠加。QSPI场景对信号完整性更敏感因为四根数据线需要严格等长至少要在走线阶段控制好组内长度偏差。我做过一个批量产品最初QSPI读Flash偶尔失败后来发现IO0和IO2在PCB上长度差了几毫米在33MHz时钟下产生了接近1个bit的偏移导致控制器的采样窗口吃掉错误数据。最后通过在短线路径上加蛇形线补长解决这种问题用眼图测试能直接看出来。关于上拉电阻SPI的MISO或QSPI的IO1~IO3不等在三态模式下如果悬空很容易被噪声误触发。建议在每条数据线上加上10kΩ左右上拉保证空闲时是确定电平。3.3 与DMA配合的硬件设计建议SPI DMA是提高系统吞吐的利器但设计时埋了不少雷。STM32 CubeMX配置SPI DMA时首先要确定DMA传输的数据宽度SPI外设的数据寄存器通常是8位如果缓冲区是16位数组DMA传输宽度必须与SPI字长保持一致否则字节序会错乱。其次是DMA缓冲区对齐问题。很多MCU的DMA要求源地址和目的地址按传输宽度对齐如果发送缓冲区是一个结构体里的某个字段起始地址可能不满足对齐要求DMA传输到一半就会触发错误中断。我的经验是为SPI DMA单独分配专用缓冲区用__attribute__((aligned(32)))之类的声明不要直接用栈上临时变量。还有一个小细节DMA配置中循环模式与SPI空闲状态的配合。如果外设持续做周期采集用循环DMA可以省去反复重装的麻烦但要注意在SPI错误中断中及时停止DMA否则错误状态不清除时会一直进中断导致系统卡死。4. 典型应用场景实测从W25Q64到FPGA4.1 NOR Flash的QSPI读写实践W25Q64是我用得最多的QSPI NOR Flash也是很多工程师接触QSPI的第一站。QSPI读写Flash的流程并不复杂但每一步都有讲究第一步读ID确认器件型号和连接是否正常。发送0x9F命令给Flash它会把Manufacturer ID和设备ID从IO0~IO3依次输出。如果读回00FFFFFFFF或者全FF多半是模式配置错误或CS时序不对。第二步写使能和页编程。发送0x06完成写使能再发送0x02命令加24位地址加最多256字节数据。页边界是Flash内部规则跨页编程必须拆分否则数据会绕回页首。第三步扇区擦除。发送0x20命令加地址擦除一个扇区4KB。擦除期间Flash的BUSY位会变高需要轮询0x05读状态寄存器。第四步Quad读取。命令0x6B是Quad Output Fast Read地址之后需要跟一个Dummy周期某些模式下是2个Dummy然后从四根线上读数据。如果把Dummy周期数量配错读回来的数据会整体偏移4位或者8位。4.2 传感器与ADC场景MT6701与DSPIMT6701是角度传感器它的SPI接口可以工作在标准SPI模式或者DSPI变种下。这类传感器数据量不大用标准SPI足够但有一些高速ADC比如工业控制里的同步采样ADC会要求DSPI模式因为需要同时输出多通道数据和控制字。DSPI在ADC场景下的优势是控制字下发和采样数据回传可以双向同时发生对于需要实时调整增益或者通道配置的系统能省掉一整个回合的握手。之前我在某DSP平台用DSPI接ADC采样率直接从200kSPS提到800kSPS整个数据链路非常干净。4.3 FPGA实现QSPI控制器与Linux SPI子系统FPGA实现QSPI是很多高速存储方案绕不开的工作。最直接的办法是用Xilinx的AXI Quad SPI IP核它支持SPI、DSPI、QSPI模式还内建了Flash命令执行逻辑。如果不想依赖IP自己写Verilog控制器也不难状态机按“IDLE - CMD - ADDR - DUMMY - DATA - WAIT”流转命令和地址阶段数据线往一个方向传到Dummy阶段切换方向数据阶段开始按4bit并行收发。状态机最关键的细节是Dummy周期的处理和方向切换。Dummy之后的一个时钟周期Flash会开始输出数据这个方向的切换必须提前把IO缓冲配置成输入否则两边都是输出就会总线冲突直接拉低信号导致数据错误。我在部署FPGA方案时都会加一个IO_t状态寄存器和方向切换控制先切方向再Launch下一条指令。Linux下接入SPI Nor则是另一套思路。在设备树里声明spi-nor节点配置reg、spi-max-frequency和qspi模式支持内核的spi-nor驱动会自动识别Flash ID并选择合适的读取命令。RK3588这类主控有多个SPI控制器支持标准SPI、DSPI和QSPI模式设备树里把spi-rx-bus-width和spi-tx-bus-width设成4就能让控制器用Quad模式访问Flash。这套配置下来BootROM加载引导镜像可以享受到QSPI的带宽优势整个系统启动时间能缩短一大截。4.4 上位机用USB转SPI快速验证在没有开发板的环境下想快速验证一颗SPI器件Python调用usb模拟spi接口是很高效的路径。常见的USB转SPI适配器有FT2232H、MCP2221A等FT2232H可以通过pyftdi库直接操作SPI端口。基本流程是初始化FTDI设备配置SPI模式、时钟和CS控制然后发送读命令并接收返回数据。这套方案特别适合产线测试用例不用写嵌入式固件只要Python脚本就能对一个SPI Flash做全地址读写校验。缺点是传输延迟较大不适合高频时序验证但对于评估“器件能不能正常工作”完全够用。我做过一批板卡直接用上位机发QSPI命令把Flash里的固件导出校验比在MCU里写一大段测试代码省事得多。5. 常见问题与排查技巧实录5.1 时序调试经典案例读Flash返回全FF这个故障我遇到不下五次。排查顺序从软件到硬件逐渐递进检查模式配置CPOL/CPHA是否符合器件要求Mode 0和Mode 3在多数Flash上都可以但某些旧型号只支持Mode 0。检查CS释放时机如果命令帧发完CS就被置高Flash内部可能还没完成内部操作读回数据自然是FF。给CS和下一个命令之间加一点延时。检查时钟频率标称33MHz的Flash如果跑在50MHz可能读出来是乱码或者全FF降频到10MHz验证一下。检查上拉和走线IO线悬空时受干扰导致数据不完整给数据线加上拉并且用示波器看看波形幅度。这个排查路径基本覆盖了八成Flash通信问题。5.2 DMA与中断冲突问题SPI DMA传输卡死是另一类高发问题。特征现象是第一次传输正常第二次开始DMA完成中断不再触发或者数据错位一位。排查时先看DMA描述符的循环模式配置如果在非循环模式下没有正确重装DMA传输完一次就会停在原地。比较坑的是SPI错误中断和DMA完成中断的优先级冲突。如果SPI产生MODF模式错误或OVR溢出而DMA中断处理器还在处理普通完成事件错误标志没被及时清除后续所有DMA传输都会被硬件冻结。我在代码里专门开了一个SPI错误处理函数第一时间读取SPI_SR逐一清除错误标志再重新使能DMA这个“复位重发”机制帮产品扛过了很多次现场偶发故障。5.3 信号完整性与噪声干扰QSPI在高速下偶尔会读错字节而且只在特定温度或特定电压下复现这种问题最磨人。我的经验是优先检查采样点位置控制器在时钟边沿采样如果PCB走线较长导致数据相对时钟有延迟采样点可能正好落在数据跳变区。解决方法是降低时钟频率验证或者调整控制器内部的“采样延迟”很多MCU的QSPI控制器有这个寄存器把采样点往数据稳定区推。另一种情况是电源噪声耦合进IO线尤其在Flash刷写大电流时电源纹波通过地弹反射到SCLK上。对策是Flash电源和主控电源加足够容量的去耦电容并且保证SPI走线参考地完整。如果PCB已经定型可以在软件上规避避开电源剧烈变换的时机做长数据读取或者把QSPI时钟降到20MHz以下一般都能稳住。6. 测试用例设计与量产经验6.1 硬件测试用例怎么覆盖SPI硬件测试用例不能只停留在“读写是否成功”的层面我的覆盖思路是四层功能测试对Flash做全地址写读校验对传感器读固定寄存器验证基础的寄存器读写和存储功能。时序测试用示波器测量上升时间、建立保持时间、片选前后延迟确认满足数据手册要求。这个用例适合在工程样品阶段执行量产阶段可以抽查。异常测试模拟通信中断比如在DMA传输中强制拉高CS、SCLK毛刺、电源跌落观察系统能否正确恢复。压力测试连续长时间循环读写监控错误率尤其适合对温度漂移敏感的场合。6.2 量产阶段的片选与性能优化量产中遇到最多的是多片Flash并联后总是有某一片读写失败这时除了检查焊接还要注意片选引脚的吸收电阻和下拉电阻。如果一片Flash的CS被噪声误拉低而同一总线上的其他芯片正常响应就会造成数据错乱。我在设计中给每片Flash的CS加上4.7kΩ上拉到VCC并且尽可能缩短CS走线到主控的距离这种问题就很少出现了。性能优化方面如果系统同时读写数据和运行代码可以尝试把两个不同用途的Flash挂到不同SPI控制器上硬件上并行软件上双DMA交替工作吞吐量能接近线性翻倍。QSPI的页面编程性能还受“读-改-写”的影响做OTA升级时尽量按整页更新而不是单字节改写能省掉非常多的擦除循环。结语我个人在实际操作中的体会是SPI、DSPI、QSPI的对比并不是简单的“谁比谁强”而是“你的系统需要多少位并行、多少条线、多高的时钟”。新手入门先死磕标准SPI的时序和片选把波形看懂、把GPIO和DMA用顺再去碰QSPI的方向切换和Dummy周期会顺畅很多。最后再分享一个小习惯做任何SPI相关调试前手里永远备一个USB逻辑分析仪抓CS、SCLK和数据线三根信号比看代码猜问题快十倍。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。