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 选型决策流程图
下面这张图是我自己总结的选型逻辑,帮你快速定位:
3.7 我的推荐组合
根据不同的项目类型,我给出三套经过验证的组合方案:
| 项目类型 | 推荐存储 | 理由 |
|---|---|---|
| 低功耗小屏(1~3寸) | SPI Flash(16~64MB) | 驱动简单、功耗低、代码和图片共用 |
| 中端彩屏(3~7寸) | SD卡(SDIO模式) | 容量灵活、成本可控、读取速度够用 |
| 高端大屏(7寸以上) | eMMC(4GB以上) | 高速读取、大容量、适合复杂UI |
个人建议:如果你刚开始做LVGL项目,从SPI Flash起步最稳妥。等你对图片加载流程熟悉了,再考虑SD卡或eMMC。别一上来就挑战NAND Flash,那玩意儿真的会让人掉头发。