3. 外部存储选型:SPI Flash、SD卡、NAND Flash、eMMC的对比与选择

做LVGL图片加载,第一个要面对的问题就是:图片放哪儿?

MCU内部Flash通常只有几MB,放个全屏JPEG就没了。所以外部存储几乎是必选项。但市面上存储器件那么多,SPI Flash、SD卡、NAND Flash、eMMC……到底选哪个?

我这些年在这上面踩过不少坑。有一次选型时图便宜用了某款SPI Flash,结果图片解码速度慢得离谱,最后不得不改板子。嗯,今天就把这些经验掰开揉碎讲清楚。

3.1 四种存储器件的基本定位

先看一张对比表,心里有个底:

特性 SPI Flash SD卡 NAND Flash eMMC
接口 SPI(4线/1线) SDIO/SPI 并行/SPI eMMC协议(8位并行)
典型容量 1MB ~ 256MB 1GB ~ 512GB 128MB ~ 8GB 4GB ~ 256GB
读取速度 10~50 MB/s 20~100 MB/s 20~50 MB/s 100~400 MB/s
写入速度 1~5 MB/s 10~80 MB/s 5~20 MB/s 50~200 MB/s
坏块管理 无(出厂无坏块) 内部控制器处理 需要软件处理 内部控制器处理
擦写寿命 10万次 1~10万次 1~10万次 1~10万次
成本(每MB) 较高 低 低 中等
典型应用 代码存储、小图片 大容量文件、日志 嵌入式文件系统 高性能嵌入式、Linux

核心结论:没有最好的存储,只有最合适的。选型要看你的图片大小、读取频率、成本预算和MCU资源。

3.2 SPI Flash:小容量场景的稳妥之选

SPI Flash是我用得最多的器件。为什么?因为它简单、稳定、驱动成熟。

我个人习惯在以下场景优先考虑SPI Flash:

  • 图片总量小于64MB——比如图标、小尺寸背景图
  • MCU没有SDIO接口——很多低端MCU只有SPI
  • 对可靠性要求高——SPI Flash出厂无坏块,不需要坏块管理
  • 代码和图片共用存储——很多方案把代码和资源放在同一颗SPI Flash里

但SPI Flash有个硬伤:写入速度慢。尤其是页编程和擦除操作,动辄几十毫秒。如果你需要OTA升级图片资源,那体验会很糟糕。

经验之谈:用SPI Flash存图片时,建议把图片打包成二进制文件,用LVGL的lv_fs文件系统接口直接读取。不要用SPI Flash跑文件系统(如FATFS),除非你做好磨损均衡。

3.3 SD卡:大容量低成本,但小心速度陷阱

SD卡的优势很明显:容量大、便宜、随处可买。我做过一个项目,用SD卡存了上千张高清图片,成本才几十块钱。

但SD卡有几个坑:

  • 速度分级混乱——Class 10、UHS-I、UHS-II……实际读取速度可能只有标称的1/3
  • SPI模式慢——很多MCU用SPI驱动SD卡,速度被限制在20MHz以下,读取只有几MB/s
  • 热插拔不稳定——工业环境下接触不良是常事

我曾经在一个户外设备上用了SD卡,结果半年后频繁出现图片加载失败。排查下来是SD卡座氧化导致接触电阻变大。从那以后,工业产品我尽量不用SD卡。

避坑指南:如果非要用SD卡,优先选择SDIO接口(4位模式),速度能到40MB/s以上。另外,一定要加电容滤波和ESD保护,SD卡座选带锁扣的。

3.4 NAND Flash:便宜但麻烦

NAND Flash是很多工程师的噩梦。为什么?因为坏块管理、ECC校验、擦写均衡全得自己搞。

NAND Flash的优点是单位成本低,128MB以上的容量比SPI Flash便宜很多。但代价是:

  • 出厂就有坏块——必须用软件跳过
  • 需要ECC——至少1位/512字节的纠错能力
  • 擦写次数少——SLC约10万次,MLC只有几千次
  • 读取速度一般——并行NAND快,但SPI NAND慢

我个人建议:除非你团队有文件系统专家,或者用现成的NAND Flash驱动库(如LittleFS、YAFFS),否则别碰裸NAND。我见过一个团队因为NAND坏块管理没做好,产品出货后批量返修。

一句话总结:NAND Flash适合对成本极度敏感、且团队有存储经验的场景。新手慎入。

3.5 eMMC:高性能但贵

eMMC本质上就是NAND Flash加了个控制器,把坏块管理、ECC、磨损均衡全封装好了。你只需要通过eMMC协议读写,就像操作一个硬盘一样。

eMMC的优势:

  • 速度快——8位并行,读取轻松上百MB/s
  • 可靠性高——内部控制器处理一切
  • 容量大——4GB起步,上不封顶

但缺点也很明显:

  • 贵——同样容量,eMMC比SD卡贵2~3倍
  • 封装大——BGA封装,焊接和Layout都有门槛
  • 协议复杂——需要eMMC控制器,很多MCU不支持

eMMC通常用在高端MCU(如STM32MP1、i.MX RT)或Linux方案上。如果你的LVGL项目跑在Cortex-A核上,eMMC是首选。

3.6 选型决策流程图

下面这张图是我自己总结的选型逻辑,帮你快速定位:

外部存储选型决策流程图 外部存储选型决策流程 图片总量评估 容量 < 64MB ? 是 否 SPI Flash 需要高速读取? MCU有SDIO? 是 SD卡(SDIO模式) 否 eMMC 否 NAND Flash 说明: • SPI Flash:小容量、高可靠、驱动简单,适合图标和小尺寸背景图 • SD卡:大容量、低成本,但注意接口速度和工业环境可靠性 • NAND Flash:单位成本最低,但需要坏块管理和ECC,适合有存储经验的团队 • eMMC:高性能、高可靠,适合高端MCU或Linux方案

3.7 我的推荐组合

根据不同的项目类型,我给出三套经过验证的组合方案:

项目类型 推荐存储 理由
低功耗小屏(1~3寸) SPI Flash(16~64MB) 驱动简单、功耗低、代码和图片共用
中端彩屏(3~7寸) SD卡(SDIO模式) 容量灵活、成本可控、读取速度够用
高端大屏(7寸以上) eMMC(4GB以上) 高速读取、大容量、适合复杂UI

个人建议:如果你刚开始做LVGL项目,从SPI Flash起步最稳妥。等你对图片加载流程熟悉了,再考虑SD卡或eMMC。别一上来就挑战NAND Flash,那玩意儿真的会让人掉头发。