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
- 适合容量不大、速度要求不高的场景
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 |
2.2 多片Flash级联与片选设计
当单颗Flash容量不够,或者需要同时读写多片Flash时,就要考虑级联设计了。常见的方案有两种:
2.2.1 独立片选方案
每片Flash使用独立的CS引脚。主控有多少个GPIO,就能接多少片Flash。优点是互不干扰,可以独立操作。缺点是占用IO资源多。
我建议: 如果主控GPIO充足,优先用独立片选。调试方便,出了问题也好定位。
2.2.2 菊花链级联方案
所有Flash共享SCK、MOSI、MISO,但通过数据线串联。第一片的MISO接到第二片的MOSI,以此类推。这种方案节省IO,但延迟会累加,而且一旦中间某片出问题,整条链都废了。
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 过孔使用
每个过孔都会引入寄生电感和电容。高频信号尽量少打过孔。如果必须换层,记得在过孔旁边加地过孔,提供回流路径。
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引脚
2.4.3 电源平面分割
如果板子上有多个电源域,Flash的电源要单独分割出来。避免跟大电流的数字电路共用同一块电源平面。
我习惯的做法是:Flash电源区域用0.5mm宽的隔离带分割,然后通过一个磁珠或0Ω电阻连接到主电源。磁珠选择100MHz时阻抗100Ω左右的型号。
2.5 本章知识体系
下面这张图总结了本章的核心知识点。你可以把它当作一个快速索引,遇到问题时回来对照。
好了,这一章的内容就这些。接口协议、多片级联、PCB布局、电源去耦,每个环节都关系到Flash能不能稳定工作。你设计时多花点心思在硬件上,后面写驱动的时候就能少掉很多头发。
公众号:蓝海资料掘金营,微信deep3321