2. 硬件接口与连接:SPI/QSPI/OSPI接口协议详解、多片Flash级联与片选设计、PCB布局要点(信号完整性)、电源去耦与参考电压设计

好,咱们直接切入正题。这一章聊的是硬件层面的硬功夫——接口协议、多片级联、PCB布局和电源设计。说白了,就是NOR Flash能不能跑得快、跑得稳,全看这部分的功底。我这些年调试过的板子,十有八九的问题都出在这几个环节上。

2.1 SPI/QSPI/OSPI接口协议详解

先说说接口协议。很多人觉得SPI简单,不就是四根线嘛。但到了QSPI和OSPI,事情就没那么简单了。

2.1.1 标准SPI(Serial Peripheral Interface)

标准SPI用四根线:SCK(时钟)、MOSI(主出从入)、MISO(主入从出)、CS(片选)。工作模式有四种,由时钟极性(CPOL)和时钟相位(CPHA)组合决定。我个人习惯用模式0(CPOL=0, CPHA=0),因为大多数Flash默认就是这个模式,省心。

关键点:

  • 单线传输,一个时钟周期传1位数据
  • 最大时钟频率通常50MHz~104MHz
  • 适合容量不大、速度要求不高的场景
我的经验: 调试SPI时,先拿示波器看CS拉低后SCK的第一个边沿。我曾经被一个CPHA配置搞了整整两天,最后发现是芯片手册里时序图画错了。

2.1.2 QSPI(Quad SPI)

QSPI在标准SPI基础上增加了两根数据线,变成四根数据线(IO0~IO3)。这样每个时钟周期能传4位数据。说白了,就是带宽翻了四倍。

QSPI的三种传输模式:

  • 单线模式: 兼容标准SPI,用于发送命令和地址
  • 双线模式: 用两根数据线,每个时钟传2位
  • 四线模式: 用四根数据线,每个时钟传4位

实际应用中,命令和地址通常用单线模式发送,数据阶段切换到四线模式。为什么?因为命令和地址需要兼容性,而数据追求速度。

2.1.3 OSPI(Octal SPI)

OSPI是QSPI的升级版,数据线扩展到8根(IO0~IO7)。每个时钟周期能传8位数据。配合DDR(双数据率)模式,一个时钟周期能传16位数据。

我去年做一个高速数据采集项目,用了一颗OSPI接口的NOR Flash,时钟跑到200MHz DDR模式,实测读取速度达到400MB/s。嗯,这个速度已经可以跟一些并行NOR Flash掰手腕了。

接口类型 数据线数量 单时钟传输位数 典型时钟频率 理论峰值带宽
SPI 1 1 50~104MHz ~13 MB/s
Dual SPI 2 2 50~104MHz ~26 MB/s
QSPI 4 4 50~108MHz ~54 MB/s
OSPI 8 8 100~200MHz ~200 MB/s
避坑指南: 我曾经在QSPI四线模式下忽略了一个问题——IO2和IO3在标准SPI模式下是WP(写保护)和HOLD(保持)引脚。如果主控默认把这些引脚拉高,Flash可能无法正常工作。记得在初始化时正确配置引脚功能。

2.2 多片Flash级联与片选设计

当单颗Flash容量不够,或者需要同时读写多片Flash时,就要考虑级联设计了。常见的方案有两种:

2.2.1 独立片选方案

每片Flash使用独立的CS引脚。主控有多少个GPIO,就能接多少片Flash。优点是互不干扰,可以独立操作。缺点是占用IO资源多。

我建议: 如果主控GPIO充足,优先用独立片选。调试方便,出了问题也好定位。

2.2.2 菊花链级联方案

所有Flash共享SCK、MOSI、MISO,但通过数据线串联。第一片的MISO接到第二片的MOSI,以此类推。这种方案节省IO,但延迟会累加,而且一旦中间某片出问题,整条链都废了。

注意: 菊花链方案对时序要求极高。我见过一个项目,级联了4片Flash,结果最后一片的信号眼图已经惨不忍睹。如果你非要用,建议不超过2片。

2.2.3 片选信号去耦

多片Flash共用数据总线时,片选信号的去耦很重要。每片的CS引脚要加一个10kΩ~100kΩ的上拉电阻,防止浮空时误触发。

另外,CS信号切换时要有足够的间隔时间。我记得有一次调试,连续操作两片Flash,CS间隔只留了50ns,结果第二片总是响应超时。后来查手册才发现,片选释放到下一次片选有效,至少需要100ns的间隔。

2.3 PCB布局要点(信号完整性)

PCB布局是硬件设计中最容易被忽视的环节。很多人觉得原理图没问题就行,PCB随便布布线。你想想看,高速信号在PCB上跑,走线就是传输线,处理不好就是天线。

2.3.1 走线长度匹配

对于QSPI和OSPI,多根数据线必须等长。我一般要求数据线之间的长度差不超过信号上升时间的1/10。举个例子,如果信号上升时间是1ns,走线长度差不要超过1.5英寸(约38mm)。

具体做法:

  • SCK走线尽量短,优先靠近Flash
  • 数据线(IO0~IO7)走线长度一致
  • CS走线可以稍长,但要远离SCK

2.3.2 阻抗控制

SPI信号通常不需要严格的阻抗控制,但QSPI和OSPI跑在100MHz以上时,建议控制单端阻抗50Ω±10%。

怎么控制?

  • 选择合适的PCB叠层,计算走线宽度
  • 信号线下面要有完整的参考平面(地平面)
  • 避免跨越分割的电源/地平面

2.3.3 串扰抑制

信号线之间距离太近,会产生串扰。我习惯遵循3W原则——线间距是线宽的3倍。如果空间紧张,至少保证2W。

另外,SCK是强辐射源,要跟数据线保持距离。我见过一块板子,SCK跟IO0平行走了5厘米,结果IO0上全是SCK的串扰,数据根本读不对。

2.3.4 过孔使用

每个过孔都会引入寄生电感和电容。高频信号尽量少打过孔。如果必须换层,记得在过孔旁边加地过孔,提供回流路径。

小技巧: 我习惯在Flash芯片下面铺一块完整的地铜皮,然后打一圈地过孔。这样既散热,又能提供低阻抗的回流路径。

2.4 电源去耦与参考电压设计

Flash对电源质量很敏感。电源纹波大,Flash就容易误操作。我见过最离谱的一次,Flash写数据总是校验失败,最后发现是电源纹波达到了200mV。

2.4.1 去耦电容配置

去耦电容不是越多越好,关键是位置和容值搭配。

我的标准配置:

  • 每片Flash的VCC引脚旁边放一个0.1μF陶瓷电容,距离不超过2mm
  • 每2~3片Flash共享一个10μF钽电容或陶瓷电容
  • 板级入口处放一个47~100μF电解电容

为什么这样配?0.1μF负责滤除高频噪声,10μF负责中频,电解电容负责低频和储能。三个频段全覆盖。

2.4.2 参考电压(VREF)设计

有些Flash芯片有VREF引脚,用于内部比较器的参考电压。这个引脚对噪声极其敏感。

设计要点:

  • VREF走线要短而粗,远离SCK等高频信号
  • VREF引脚旁边放一个0.1μF电容,紧贴引脚
  • 如果VREF由电阻分压得到,分压电阻要靠近VREF引脚
血的教训: 我曾经把VREF走线跟SCK平行走了3厘米,结果Flash读取数据时偶尔出现位翻转。查了三天,最后用示波器看到VREF上有SCK的耦合噪声。重新布线后问题解决。

2.4.3 电源平面分割

如果板子上有多个电源域,Flash的电源要单独分割出来。避免跟大电流的数字电路共用同一块电源平面。

我习惯的做法是:Flash电源区域用0.5mm宽的隔离带分割,然后通过一个磁珠或0Ω电阻连接到主电源。磁珠选择100MHz时阻抗100Ω左右的型号。

2.5 本章知识体系

下面这张图总结了本章的核心知识点。你可以把它当作一个快速索引,遇到问题时回来对照。

硬件接口与连接知识体系 接口协议 SPI: 4线, 1位/时钟 QSPI: 6线, 4位/时钟 OSPI: 10线, 8位/时钟 多片级联设计 独立片选方案 菊花链级联方案 CS去耦与时序间隔 PCB布局要点 走线长度匹配 阻抗控制50Ω 串扰抑制(3W原则) 电源去耦设计 去耦电容配置 VREF噪声隔离 电源平面分割 核心目标:信号完整性 → 稳定读写 → 高性能 💡 设计顺序:先定接口 → 再规划级联 → 布局布线 → 最后检查电源

好了,这一章的内容就这些。接口协议、多片级联、PCB布局、电源去耦,每个环节都关系到Flash能不能稳定工作。你设计时多花点心思在硬件上,后面写驱动的时候就能少掉很多头发。


公众号:蓝海资料掘金营,微信deep3321