4、Flash接口协议:SPI NAND、ONFI、Toggle协议简介、接口时序图解析

好,咱们接着聊Flash。前面几章我们把NAND和NOR的架构、存储单元讲透了。但芯片再牛,也得跟外界通信对吧?这就要靠接口协议了。

我个人习惯把Flash接口分成两派:一派是“老江湖”SPI,另一派是“高性能派”ONFI和Toggle。今天咱们就把这三兄弟拉出来遛遛。

4.1 SPI NAND:小身材,大智慧

先说说SPI NAND。你想想看,传统的并行NAND动不动就是x8、x16的数据线,PCB上走线密密麻麻,看着就头疼。SPI NAND呢?就4根线:SCK、SI、SO、CS#。简单粗暴。

为什么会有SPI NAND?

说白了,就是给那些对容量有要求、但对速度不那么敏感的场景准备的。比如物联网模块、机顶盒、路由器。我前几年做一款智能家居网关,主控引脚紧张得要命,最后就是靠一颗SPI NAND搞定了128MB的存储。嗯,真香。

SPI NAND的核心特点:

  • 接口简单:标准SPI或Dual/Quad SPI模式
  • 内部结构:本质还是NAND Flash,有Page、Block、Bad Block管理
  • 命令集:类似并行NAND,但通过SPI命令封装

这里有个坑,我提醒一下。SPI NAND虽然接口简单,但内部依然需要ECC。很多便宜的SPI NAND芯片,ECC全靠主控软件做。我曾经在一个项目里图省事,选了颗号称“内置ECC”的SPI NAND,结果量产时发现它的纠错能力只有4bit/512byte,根本不够用。后来老老实实换了颗支持8bit的。

接口时序图解析(SPI NAND读操作)

咱们看个典型的读操作时序。主控发命令0x03(标准读),然后发24位地址,芯片就开始吐数据。

SCK    ▁▁▇▇▁▁▇▇▁▁▇▇▁▁▇▇▁▁▇▇...
SI     ▔▔▁▁▔▔▁▁▔▔▁▁▔▔▁▁▔▔▁▁...
        [命令0x03] [地址A23-A16] [地址A15-A8] [地址A7-A0]
SO     ▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▁▇▇▁▁...
        高阻态                       [D7-D0] [D7-D0]...

注意看,SO线在地址阶段是高阻态,直到命令和地址发完,芯片才开始驱动数据。这个“切换时间”大概在50ns左右。我刚开始调SPI NAND驱动时,就是没注意这个切换时间,导致第一个字节总是读错。后来加了段延时,问题解决。

4.2 ONFI协议:并行NAND的标准化之路

ONFI,全称Open NAND Flash Interface。这玩意儿诞生的背景很简单:以前各家NAND厂商的接口都是私有的,换家供应商就得重写驱动,烦不烦?ONFI就是要把大家拉到一张桌子上,定个规矩。

ONFI的核心内容:

  • 标准化的引脚定义:数据线DQ[7:0]、控制信号CLE/ALE/WE#/RE#等
  • 标准化的命令集:Read、Program、Erase等命令码统一
  • 标准化的时序参数:tR、tPROG、tBERS等
  • 支持异步和同步模式:同步模式下时钟频率可达200MHz以上

我的经验:ONFI协议里有个“Parameter Page”,里面存着芯片的所有时序参数。我建议你在初始化时一定要读一下这个Page,别硬编码。不同批次、不同容量的芯片,参数可能有细微差异。我就吃过这个亏,一批芯片换了制程,tR从25us变成了30us,结果读操作偶尔超时。

接口时序图解析(ONFI同步读)

ONFI同步模式下的读操作,有点像DDR。数据在时钟的上升沿和下降沿都采样。

CLK    ▁▇▁▇▁▇▁▇▁▇▁▇▁▇▁▇
DQS    ▁▇▁▇▁▇▁▇▁▇▁▇▁▇▁▇  (DQS与CLK有90度相位偏移)
DQ     ▔▔▁▁▔▔▁▁▔▔▁▁▔▔▁▁
        [D0] [D1] [D2] [D3] [D4] [D5] [D6] [D7]

这里有个关键点:DQS信号。它跟数据是边沿对齐的,但跟时钟有90度偏移。为什么要这样?说白了就是为了让主控有足够的建立保持时间去采样数据。我调试ONFI接口时,最头疼的就是DQS的相位调整。每个板子的走线长度不一样,DQS的延迟也不同。后来我干脆在FPGA里做了个动态相位校准模块,每次上电自动调。

4.3 Toggle协议:三星的“独门秘籍”

Toggle协议,是三星和东芝(现铠侠)搞出来的。它跟ONFI是竞争对手,但目标一样:提高NAND接口速度。

Toggle vs ONFI:

特性 ONFI Toggle
发起方 Intel、美光、海力士等 三星、铠侠
数据选通 DQS(与CLK有相位偏移) DQS(与数据边沿对齐)
命令格式 固定5个周期 可变长度
最高速率 DDR3.0: 1600MT/s Toggle 5.0: 2400MT/s

我个人觉得,Toggle协议在时序上更“激进”一些。它的DQS跟数据是边沿对齐的,这就要求主控的接收端必须有很好的延迟锁定环(DLL)来调整采样点。

避坑指南:我曾经在一个项目里混用了ONFI和Toggle的颗粒。理论上主控都支持,但实际调试时发现,Toggle颗粒的输入电容比ONFI的小,导致信号反射严重。最后不得不在PCB上加了串联电阻来匹配阻抗。所以,同一块板上尽量别混用不同协议的颗粒。

接口时序图解析(Toggle写操作)

Toggle的写操作,数据跟DQS是边沿对齐的。主控发完命令和地址后,把数据打在DQS的上升沿和下降沿。

CLK    ▁▇▁▇▁▇▁▇▁▇▁▇▁▇▁▇
DQS    ▁▇▁▇▁▇▁▇▁▇▁▇▁▇▁▇  (DQS与数据边沿对齐)
DQ     ▔▔▁▁▔▔▁▁▔▔▁▁▔▔▁▁
        [D0] [D1] [D2] [D3] [D4] [D5] [D6] [D7]

注意看,Toggle的DQS跟数据是“手拉手”一起变的。而ONFI的DQS跟数据是“错开”的。这两种方式各有优劣。Toggle的方式对主控的采样时钟要求更高,但时序裕量更大。ONFI的方式对主控的DLL要求低一些,但时序裕量小。

4.4 三种协议的选择建议

说了这么多,到底怎么选?我个人的建议是这样的:

  • 引脚受限、容量不大(≤2Gb):选SPI NAND。省引脚,开发简单。
  • 需要大容量、高性能,且供应链灵活:选ONFI。兼容性好,供应商多。
  • 追求极致性能,且主控支持:选Toggle。速率最高,但生态相对封闭。

嗯,最后再啰嗦一句。不管选哪种协议,一定要在原理图阶段就把信号完整性仿真做了。我见过太多项目,PCB都打样回来了,才发现NAND接口跑不到标称频率。那时候再改板,成本就高了去了。

好,这一章就到这儿。下一章咱们聊聊NAND Flash的坏块管理和ECC纠错,这可是存储系统的“保命符”。