:并口PPI NAND Flash 软件设计规范)
1. 目的与范围本规范规定PPI NANDParallel Peripheral Interface NAND即传统并行接口裸 NAND软件层的设计约束与推荐实现目标是正确实现CLE / ALE / CE# / WE# / RE# / R/B#及可选 DQS时序下的命令、地址、数据周期规范HAL / NFC 控制器与驱动的职责边界时序寄存器、位宽、EDMA、ECC 引擎保证读/编/擦可靠性超时、R/B# Status 双重确认、Fail 位、掉电安全正确处理坏块管理BBM、片上/主机 ECC含8-bit 下 ≥6 bit 迁块标坏、OOB/Spare落实整页一次写入与Partial Page Program 次数限制默认 ≤4、块内顺序编程、擦后 Blank Check控制物理擦写次数软件防抖 / 磨损均衡 / 读干扰 scrub / FTL规范使用ONFI Parameter Page、Read ID、UID、OTP、WP# / 分区锁、Cache、多 Plane 等能力落实SDR 保底与 NV-DDR/Toggle 防变砖、替换池耗尽降级、Boot 非 XIP规范PPI NAND 与文件系统的分层选型、分区重要性/频率隔离、挂载与掉电策略与 SPI NOR / SPI NAND / SD NAND 的本质差异必须理解维度SPI NORSPI NANDPPI NANDSD NAND主机视角SPI 字节命令SPI 页 Cache 命令并行总线命令周期CLE/ALESD 块设备坏块 / ECC通常无 / 可选主机 BBM ECC主机 BBM ECC同裸 NAND片内 FTL 完成忙判定WIP05hFeature C0h OIPR/B# 引脚 Status70hDAT0 Busy / 令牌发现参数SFDPFeature Param PageONFI Parameter Page / ID 表CID/CSD接口SPI/QSPISPI/QSPI8/16-bit IO 控制线SD/SPI文件系统可直挂友好 FS禁裸挂 FatFS禁裸挂 FatFS同 SPI NAND可挂 FatFSPPI NAND 与 SPI NAND 在阵列语义上高度一致页编程、块擦除、坏块、ECC、FTL差异几乎全在主机接口与命令组帧。本规范 BBM / ECC / FS 策略对齐《SPI NAND》接口与 HAL 章节按并行总线展开。不在本规范范围PCB 走线与 DDR/Toggle 电气完整性细则、具体厂商扩展命令全表以 Datasheet 为准、完整 FTL 算法论文级细节、某一 SoC NFC 寄存器手册全文。2. 术语与缩写术语说明PPI NANDParallel Peripheral Interface NAND并行接口裸 NAND相对 SPI NANDCLE / ALECommand Latch Enable / Address Latch Enable锁存命令或地址CE# / WE# / RE#Chip Enable / Write Enable / Read Enable低有效惯例R/B#Ready/Busy#忙时拉低完成后释放为高开漏常见需上拉I/Ox双向数据总线常见×8或×16DQS源同步数据选通NV-DDR / Toggle 模式SDR / Async异步单数据速率接口经典并行 NAND本规范默认NV-DDR / ToggleONFI / Toggle 源同步高速模式NFC / EBI / FSMCSoC 侧并行 NAND / 外部总线控制器名称因芯片而异Page编程最小单位常见 2KB64B、4KB128/218/224B 等含 OOBBlock擦除最小单位常见 64/128/256 页Plane / LUN / Die / Target多平面/逻辑单元/Die/目标片选影响并行与 CE# 选择Column / Row页内字节偏移 / 页号含 BlockPage多 Plane 含平面位OOB / Spare页外带区ECC、坏块标记、FTL 元数据Status Register读状态命令常70h返回的 SR含 Ready、Fail、WP 等FailProgram Fail / Erase Fail 状态位命名因厂而异ONFIOpen NAND Flash InterfaceParameter PageONFI 参数页几何、时序、特性、CRCECC 强度每码字可纠正最大比特数本规范默认示例8-bit位翻转阈值可纠正错误达阈值时迁块默认8-bit 下 ≥6 bitPPPPartial Page Program同一物理页在两次 Erase 之间的部分编程次数BBMBad Block ManagementFBBTFactory Bad Block Table由扫描 OOB 工厂标记生成BB Marker坏块标记通常为 Block 内指定页 Spare 首字节非0xFF初始坏块率出厂允许坏块比例行业常见上限约2%总块数FTL / NFTLFlash Translation Layer向通用 FS 提供块设备抽象LBALogical Block AddressGCGarbage CollectiontCLS/tCLH/tALS/tALH命令/地址建立与保持时间tWP / tWH / tRP / tREHWE#/RE# 脉冲宽度与高电平时间tWB / tR / tPROG / tBERS / tRST命令后忙、读阵列、编程、擦除、复位时间tVSL / tPOR上电到允许命令的等待时间WP#Write Protect 引脚硬件写保护Cache Read / Program页缓冲流水命令用于吞吐优化Copyback片内页搬移默认禁止作用户迁移主路径容量与几何换算约定软件内部统一用字节逻辑地址或(target, lun, plane, block, page, column)驱动层必须能互转禁止把 PPI NAND 当成“按 4KB Sector 擦的 NOR”或“SD 块设备”来建模禁止把 SPI NAND 的13h/0FhFeature 帧直接套到 PPI 总线上×16 器件能力表必须写明 Column 与主机缓冲是按字节还是按字计数3. 软件分层架构 推荐┌──────────────────────────────────────────────┐ │ 应用 / 文件系统 (UBIFS / LittleFSFTL...) │ ├──────────────────────────────────────────────┤ │ FTL / 磨损均衡 / 逻辑卷 │ ├──────────────────────────────────────────────┤ │ BBM坏块表、替换、标记 │ ├──────────────────────────────────────────────┤ │ PPI NAND 驱动命令序列、ECC、超时、ONFI │ ├──────────────────────────────────────────────┤ │ HAL周期原语 时序/位宽/DMA/硬件 ECC │ ├──────────────────────────────────────────────┤ │ 并行 NAND 控制器FSMC/EBI/NFC/GPIO bitbang│ └──────────────────────────────────────────────┘强制要求应用层禁止直接拨 CLE/ALE 发 Erase / Program必须经驱动统一入口。坏块判定与替换不得散落在业务代码统一由 BBM 层处理。HAL 只提供发命令 / 发地址 / 写数据 / 读数据 / 读 R/B# / 可选硬件 ECC 结果不得在 HAL 内散落业务超时策略。驱动初始化必须完成等待 tVSL→ ResetFFh→ 等 R/B# → Read ID → 读 ONFI Parameter Page / 静态几何表 → 配置时序/位宽/ECC → 扫描/加载坏块表 →可选挂载 FTL。同一颗料的SDR / DDR / Toggle模式切换必须有能力表与恢复路径禁止未验证就开高速模式。3.1 上电时序 tVSL 强制VCC 到达工作电压后PPI NAND不能立刻接收命令。Datasheet 规定的tVSL / tPOR厂商命名不一未满足时发90h/70h/FFh等可能导致ID 全0x00/0xFF、R/B# 假 Ready、擦写进入不确定态甚至把控制器时序状态机卡死在错误模式。并行总线比 SPI 更依赖电源稳定——IO 上拉、CE# 默认态、R/B# 开漏在上电斜坡期间都可能处于中间电平。项要求等待起点以“电源好 / 电压监控释放 / ADC 确认 VCC≥VCC(min)”为起点而非仅以 MCU 复位释放为起点等待时间≥ 目标器件 DatasheetMax tVSL / tPOR多料号兼容时取清单内最大值典型量级常见数十 µs ~ 数 ms以 Datasheet 为准禁止凭经验写死过小值与 BOR 关系Brown-out 恢复后视为重新上电必须重新等待 tVSL并强制回SDR 安全时序首条命令tVSL 满足前禁止Read ID / Status / Parameter Page / 擦写 / 切 DDRSoft ResetFFh后须满足tRST并等 R/B# Ready双重确认再发其它命令R/B# 上拉开漏必须有合适上拉上电初期高阻/毛刺不得判为 Ready——以 Status 为准实现位置建议在ppi_nand_init()最前部统一等待避免各调用点遗漏wait_until_vcc_ok() delay_at_least(tVSL_max) hal_set_bus_sdr_safe() // 控制器回异步安全时序 nand_reset() // CLE: FFh wait_rb_ready_double() // R/B# 或 Status Ready双重确认 id read_id() // CLE: 90h ALE 读 ID param read_parameter_page() // ECh 等 configure_timing_ecc_wp() scan_or_load_bbt()3.2 Boot / 启动架构 强制PPI NAND通常不支持像 SPI NOR 那样的 CPU Memory-Map XIP 直接取指启动部分 SoC 的 NFC BootROM 属专项认证例外。项要求启动介质BootROM / 片内 ROM /小容量 SPI NOR/ eMMC 等可执行介质加载一级 LoaderNAND 角色存放 App、文件系统、资源由 Loader/App通过命令模式访问禁止假定把 NAND 映射到地址空间即可执行代码除非芯片与料号明确支持且已专项认证双 Flash推荐NOR 存 Bootloader 关键恢复镜像PPI NAND 存大容量数据恢复NAND BBT/FTL 损坏时仍须能从 NOR/ROM 进入维护模式重刷Loader 接口Loader必须能在Async SDR下完成 Reset / ID / 基本页读Power-On → ROM/NOR 启动 Loader → 初始化 PPI NAND 驱动§3.1 → 加载 BBT / 挂载 FTL → 校验并跳转 App代码先拷入 RAM或按平台支持方式加载3.3 HAL 原语与职责边界 强制HAL 原语示例职责cmd(uint8_t c)CLE1, ALE0写入命令字节满足 tCLS/tCLH/tWPaddr(uint8_t *a, n)CLE0, ALE1写入 n 个地址字节write_data(buf, n)CLE0, ALE0WE# 写入数据read_data(buf, n)CLE0, ALE0RE# 读出数据rb_is_busy()采样 R/B#注意开漏与毛刺ecc_hw_*可选启动/取回硬件 ECC 结果项要求禁止HAL 内写死某料号的“擦完延时 3ms 就返回成功”禁止业务层直接操作 NFC 寄存器绕过驱动锁EDMADMA 完成 ≠ 阵列操作完成仍须 Ready 双重确认中断R/B# 边沿中断可唤醒轮询不可单独作为成功依据3.4 控制器时序配置 强烈推荐软件必须在能力表/设备树中配置名称因 SoC 而异并与 Datasheet全温最差取交参数类示例说明命令/地址tCLS, tCLH, tALS, tALH, tCS, tCH建立/保持写脉冲tWP, tWH, tDS, tDH数据建立相对 WE#读脉冲tRP, tREH, tREA, tRHZ数据有效窗模式SDR / DDR / Toggle、DQS 延迟高速模式专项位宽×8 / ×16与料号一致配错 tREA/tRP 的典型症状读数据偶发错位、ECC 误报升高、ID 字节漂移。量产前必须在高低温下抽测。4. 读 / 编 / 擦操作与 Timeout 强制4.1 命令模型与 SPI NAND 对照PPI NAND 通过命令周期 地址周期 数据周期访问阵列不是 SPI 单帧 Opcode。4.1.1 读页Page Read— 典型 ONFI / 传统序列1. CLE: 00h 2. ALE: Column通常 2 字节 Row通常 3 字节 // 以 Datasheet 为准 3. CLE: 30h 4. 等待 tWB 后轮询 R/B# → Ready双重确认或读 Status Ready 5. 检查 / 准备 ECCOn-Die 状态或主机解码 6. 可选CLE: 00h ALE Column 重定位 → RE# 突发读出 Main/OOB 7. 主机侧处理 OOB / 软件 ECC若未用 On-Die / 硬件 ECC4.1.2 Random Data Output页内随机读出1. 已完成 00h-30h 且 Ready 2. CLE: 05h 3. ALE: Column 4. CLE: E0h 5. RE# 读出从 Column 起的数据用途只读 OOB、只读某 ECC step、BBT 扫描。禁止用错误 Column 宽度导致读飞。4.1.3 编程Page Program1. CLE: 80h 2. ALE: Column Row 3. 写入 Main [ OOB] 数据WE# 周期主机 ECC 则先编码 4. CLE: 10h 5. 等待 R/B# Ready双重确认 6. CLE: 70h 读 Status检查 Fail失败则按坏块策略处理4.1.4 Random Data Input页内随机写入CLE: 85h ALE Column 写数据仍计入PPP与 Main 同一次10h提交前的多次85h也计入次数以 Datasheet 为准。4.1.5 擦除Block Erase1. CLE: 60h 2. ALE: Row指向块内约定页通常首页 3. CLE: D0h 4. 等待 R/B# Ready双重确认 5. Status 检查 Erase Fail失败则标记坏块多 Plane 擦除若启用按 Datasheet 使用60h-60h-D0h等变体默认产品路径关闭。4.2 与 SPI NAND 命令映射防混用速查操作SPI NAND典型PPI NAND典型页读到阵列完成13h 轮询 C0h OIP00h…30h 等 R/B#从页缓冲读出03h/0Bh…RE# 读数据 /05h-E0h编程06hLoad10h80hdata10h擦除06hD8h60hD0h读状态Get Feature0FhC0h70hStatus读 ID9Fh90hResetFFh/66h99hFFh参数页Feature OTP Page ReadEChRead Parameter Page配置Set Feature1FhONFIEFh/EEh若支持4.3 基本原则并行 NAND 的“操作完成”由阵列内部状态决定主机无法从“发完命令”推断结果。噪声、假 Ready、掉电半完成都会让“盲延时成功返回”变成静默坏数据。强制规则所有Page Read阵列搬移/ Program / Block Erase必须按 Datasheet 发送完整命令/地址/数据周期CLE/ALE/数据节拍不得缺周期等待 R/B# Ready并用Status 双重确认见 §4.5本规范唯一合法完成模板同时施加分类 Timeout读 / 编 / 擦 / Reset 分表禁止万能超时完成后检查Fail / ECC statusFail 或不可纠正 ECC 不得当成功禁止仅靠固定delay_ms()盲等轮询为主Timeout 为辅。Timeout 到期后禁止假定成功应读 Status、必要时 Soft ResetFFh并回 SDR返回可区分错误码。禁止在 R/B# 忙期间发起无关命令除 Datasheet 允许的 Read Status70h。禁止在未持驱动锁时穿插另一任务的 CLE/ALE 序列总线被打断等价于命令损坏。Program/Erase 前确认目标块不在坏块表读路径也须拒绝对已知坏块的“当好块用”。4.4 Timeout 取值策略Timeout 过短 → 正常慢擦被当成失败并误标坏块Timeout 过长 → 真卡死拖死整机看门狗。并行 NAND 的 tR / tPROG / tBERS 随工艺、温度、循环次数变化大必须按料号分类配置。优先级方法说明1Datasheet MaxtR / tPROG / tBERS / tRST 最大值 20%~50%余量2Parameter Page若提供典型/最大时间字段则优先解析并交叉核对 Datasheet3产品配置表按 Read ID / ONFI 签名查本地能力表兼容无有效 Parameter 的料推荐默认量级仅参考必须以料号为准操作典型量级软件 Timeout 建议Page ReadtR20 ~ 100 µsMax × 1.5且 ≥ 1 msPage ProgramtPROG0.3 ~ 3 msMax × 1.5且 ≥ 10 msBlock ErasetBERS2 ~ 15 msSLC~ 更长MLC/TLCMax × 1.5且 ≥ 50~100 msSoft ResettRST按 DatasheetMax 余量单独配置Cache 相关按 Datasheet单独配置禁止复用 tR/tPROG命令后进忙tWB数十~数百 ns 量级轮询前可插入极短等待但不得替代 Ready 判定禁止与 SPI NOR 共用 Sector/Chip Erase 超时表禁止与 SPI NAND 共用“只轮询 Feature、不接 R/B#”的实现禁止全项目一个“万能 5 秒超时”。高温、接近寿命末端时 tPROG/tBERS 可能显著变长能力表可提供timeout_hot_scale例如 ×1.2与 §7.5 温度策略联动。4.5 R/B# 与 Status 双重确认 强制擦写/页读阵列操作期间R/B# 引脚可能因上拉过弱、线缆噪声、ESD、控制器采样毛刺、器件内部状态切换瞬间等原因出现偶发假 Ready单独一次 Status 读也可能因总线毛刺得到假 Ready 位。 因此仅观察到一次 Ready不得判定 Page Read / Program / Erase 完成。与《SPI NOR》§4.3WIP 双重确认、《SPI NAND》§4.4OIP 双重确认同级加严接口不同语义相同。实现注意本节以下伪代码为唯一合法完成判定模板。禁止再实现“R/B# 变高就返回成功”或“读一次70hReady 即成功”的简化逻辑。强制规则判定 Page Read / Program / Erase 完成前必须满足R/B# 为 Ready且连续 ≥2 次独立读 Status70h均为 Ready或无可靠 R/B# 连线时连续 ≥2 次Status Ready两次独立命令事务并仍强烈建议接 R/B#。两次 Status 读之间应有短暂间隔建议 ≥ 1~10 µs至少完成两次独立 CLE70h事务。若第一次 Ready、第二次 Busy视为未完成清零确认计数继续轮询直至双重确认成功或 Timeout。双重确认通过后再检查Fail / ECC编擦看 Fail读看 ECC。Fail 或不可纠正不得当成功。DMA/EDMA 半包/全包中断后禁止用“已传输字节数”代替 Ready 判断——DMA 完成 ≠ 阵列操作完成。R/B# 上拉过弱或干扰导致毛刺时以 Status 为准并记录rb_glitch类告警长期毛刺须改硬件/时序。Soft Reset、模式切换、故障恢复路径同样适用本规则。推荐伪代码标准实现 — 唯一合法模板t0 now() ready_streak 0 required 2 // 连续 Ready 次数默认 2可配置 ≥2 do { if (rb_pin_is_busy()) { ready_streak 0 } else { st read_status_70h() // 独立命令事务CLE 70h 读 1B if (!status_ready(st)) { // Ready 位定义须按料号替换 ready_streak 0 } else { ready_streak if (ready_streak required) break } } if (now() - t0 timeout) return PPI_NAND_ERR_TIMEOUT yield_or_sleep(poll_interval) // 建议 10µs~1ms避免占死 CPU } while (1) if (op PROGRAM status_fail(st)) return PPI_NAND_ERR_P_FAIL if (op ERASE status_fail(st)) return PPI_NAND_ERR_E_FAIL if (op READ) return decode_ecc_status(...) // 见 §6说明部分 Datasheet 仅要求“等 R/B# 再读 Status”本规范在此基础上加严为R/B# 连续两次 Status Ready或无脚时两次 Status。Status 位定义Ready / Fail / WP因厂而异能力表必须提供解析掩码附录 E 仅为模板。Memory-Mapped NFC 读阵列不得代替 Status 忙判定。多 LUN / 多 CE# 时确认的是本次命令目标的状态必要时用 Enhanced Status78h等以 Datasheet 为准。4.6 Cache Read / Cache Program可选增强项要求目的流水化提升顺序吞吐启用能力表显式打开单页路径验证稳定前禁止退出异常、BBT 扫描、模式切换、故障恢复前必须回到已知空闲态必要时FFh错误Cache 路径同样必须检查 Fail / ECC禁止“为快而跳过状态”与锁Cache 序列必须原子持锁禁止中途插入其它 Target 命令4.7 失败与恢复失败类型处理Timeout记录 op/row/status/R/B#尝试 Soft Reset重新 ID返回ERR_TIMEOUTProgram Fail该页/块视为不可靠标记坏块返回ERR_P_FAILErase Fail标记坏块返回ERR_E_FAILECC 不可纠正返回ERR_ECC_UNCORRECTABLE按 §6整块迁移 标记坏块ECC 可纠正且 bitflip≥ 迁块阈值8-bit 默认 ≥6按 §6整块迁移 标坏ECC 可纠正且 bitflip 阈值返回成功并上报 corrected bits时序模式异常回 SDR Reset返回ERR_TIMING_MODEPPI-NAND-SW-SPEC-001 · V1.2 · 与 SPI-NAND / SD-NAND / SPI-NOR 规范配套 · 可浏览器打开或打印为 PDF后续章节请下载「芯参谋」查看……篇幅原因, 还有43章· 详见芯参谋→方案设计当前分享仅开放前5章正文。详细资料请在芯参谋客户端中打开完整文档。打开路径解决方案应用市场分析 - 原理方案设计 - PPI_NAND_软件设计规范 下载芯参谋客户端