☰
SPI、DSPI与QSPI全面对比:从原理时序到硬件设计与应用实践
2026/9/26 14:41:20 网站建设 项目流程

直接开聊。嵌入式圈子里,提到存储芯片、传感器、屏幕驱动,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在这种时钟下就得跑到300MHz,PCB走线根本扛不住。于是就有了DSPI和QSPI这种扩宽数据通道的思路。

1.2 DSPI和QSPI扩展了什么

DSPI和QSPI并不是全新的总线协议,它们是基于SPI的“加线”方案。SPI是单条MOSI和单条MISO,DSPI则把单向传输改成双线双向:两条数据线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、低速Flash
DSPI22高速ADC/DAC、部分LCD
QSPI44NOR Flash、显示缓冲、FPGA配置

这里的“传输bit数”指的是纯数据阶段,命令和地址阶段的效率取决于具体器件的指令集。比如W25Q64在Quad Output模式,命令加地址加Dummy周期共占用了不少时钟,但对于连续大量的数据块来说,平均吞吐依然显著高于SPI。

适用边界我总结成三条:传感器和低速外设用SPI足够,因为传感器数据量小,多两根数据线只会浪费引脚;高速数据采集和双向并行吞吐场景选DSPI,比如某些ADC需要同时采样数据发送控制字;存储类器件和数据密集型场景选QSPI,尤其是NOR Flash、FPGA配置芯片这类既要速度又要管脚少的东西。再往上还有OSPI(Octo SPI,8线)和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为例,tCSS(CS 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总线常见的拓扑有两类:独立片选的一主多从和菊花链。独立片选模式中,每个从设备一条CS,SCLK和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到FPGA

4.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与DSPI

MT6701是角度传感器,它的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和数据线三根信号,比看代码猜问题快十倍。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询