ESP IoT Solution 存储媒介完全指南:SPI Flash、SD 卡、eMMC、USB 闪存盘与 EEPROM 选型与实战
2026/9/19 16:44:51 网站建设 项目流程

ESP IoT Solution 存储媒介完全指南:SPI Flash、SD 卡、eMMC、USB 闪存盘与 EEPROM 选型与实战

【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution

ESP 系列芯片的存储方案选择直接决定产品的成本、容量与集成度。本文以 esp-iot-solution 存储方案文档 中「存储媒介」一节为核心骨架,系统梳理 ESP 平台已支持的五大存储媒介(SPI Flash、SD 卡、eMMC、USB 闪存盘、EEPROM)的特性、传输模式、适用场景与芯片约束,并结合仓库内的 AT24C02 驱动源码与测试用例,深入讲解 EEPROM 从 I2C 总线初始化到字节/页读写的完整实现链路,帮助你为参数存储、音视频文件存储等不同需求做出正确的选型决策并快速落地。

存储媒介总览

esp-iot-solution 文档将 ESP 平台已支持的存储媒介整理为下表。表格中「容量」「传输模式」「速度」三列给出了每种媒介的量级特征,可直接作为选型的第一参考依据。

名称关键特性应用场景容量传输模式速度驱动备注
SPI Flash可与代码共用,无附加成本参数存储、文本、图像存储MBSPI40/80 MHz 4 线SPI Flash Driver
SD 卡大容量、可插拔声音、视频文件存储GBSDIO/SPI20/40 MHz 1 线/4 线SD/SDIO/MMC Driver for SD*1
eMMC大容量、高速读写声音、视频文件存储GBSDIO20/40 MHz 1 线/4 线/8 线SD/SDIO/MMC Driver for eMMC*2
USB 闪存盘大容量、可插拔声音、视频文件存储GBUSB12 Mbps/480 MbpsUSB Host Driver*3
EEPROM可按字节寻址,低成本参数存储MBI2C100 ~ 400 kHzeeprom driver

使用上表时,请注意以下芯片级约束(对应表中的备注 *1、*2、*3):

  • *1:SD 卡的 SDIO 模式,仅在支持 SDIO 主机外设的 ESP 芯片(如 ESP32、ESP32-S3)上可用;
  • *2:eMMC 的 SDIO 模式仅在支持 SDIO 主机外设的 ESP 芯片(如 ESP32、ESP32-S3)上可用;
  • *3:USB 闪存盘仅在支持 USB-OTG 外设的 ESP 芯片(如 ESP32-S2、ESP32-S3)上可用。

SPI Flash:与代码共存的低成本存储

ESP 系列芯片默认使用 NOR Flash 存取用户代码和数据,Flash 可集成在模组或芯片中,容量一般为 4 MB、8 MB 或 16 MB。由于可以直接使用主 Flash 芯片进行数据存储、无需额外添加存储芯片,因此特别适合容量需求较小(MB 级)、集成度要求高、成本敏感的应用场景。

用户可以通过分区表对 Flash 进行分区,根据分区表的功能划分,主 Flash 的指定空间可以:

  • 作为非易失性存储(NVS)空间存放应用程序参数;
  • 挂载到文件系统(FatFS 等)存放文本、图像等文件。

Flash 芯片支持双线(DOUT/DIO)和四线(QOUT/QIO)等操作模式,可通过配置工作在 40 MHz 或 80 MHz 模式。此外,对于 ESP-IDF v4.0 以上版本,SPI Flash 组件不仅支持使用主 Flash 进行用户数据存储,同时可支持外接第二块 Flash 芯片进行数据存储。

参考文档(ESP-IDF 官方 API):SPI Flash API、NVS Flash API、FatFS API。

示例程序

  • storage/nvs:使用 NVS 进行参数存储;
  • storage/fatfs:使用 FatFS 进行文件存储。

与文件系统配合使用时,NVS、FAT、SPIFFS、LittleFS 在容量限制、掉电保护、磨损均衡等方面的取舍,可进一步参考仓库的文件系统指南。

SD 卡:可插拔的大容量方案

ESP 系列芯片支持使用SDIO 接口SPI 接口访问 SD 卡,两者在速率与灵活性上各有取舍:

  • SDIO 接口:支持 1 线、4 线或 8 线模式,支持默认速率 20 MHz 或高速 40 MHz 等速率模式。需要注意的是,SDIO 接口一般只能使用固定的引脚;
  • SPI 接口:支持通过 GPIO matrix 为 SD 卡指定任意的 IO,通过 CS 引脚可以支持对多个 SD 卡的访问。SPI 接口硬件设计上更加灵活,但相比 SDIO 接口访问速率较低。

ESP-IDF 中的SD/SDIO/MMC Driver基于 SD 卡的两种访问模式进行了协议层封装,提供了 SD 卡的初始化接口和协议层 API。SD 卡具有大容量、可插拔的特点,广泛适用于智能音响、电子相册等具有大容量存储需求的应用场景。

参考文档(ESP-IDF 官方 API)

  • SD/SDIO/MMC 驱动:提供 SD 卡的初始化接口和协议层 API;
  • SDMMC 主机驱动:提供 SDIO 模式的接口实现;
  • SD SPI 主机驱动:提供 SPI 模式的接口实现;
  • 使用 SPI 或 1-bit 模式时,请注意引脚上拉需求(SD 卡的引脚上拉要求)。

示例程序storage/sd_card——访问使用 FAT 文件系统的 SD 卡。

eMMC:高集成度的大容量存储

eMMC(embedded MMC)内存芯片与 SD 卡具有相似的协议,可以使用与 SD 卡相同的SD/SDIO/MMC 驱动。但有一个关键区别需要特别注意:eMMC 芯片仅能使用 SDIO 模式,不支持 SPI 模式

eMMC 一般以芯片的形式焊接到主板上,相比 SD 卡集成度更高,适用于可穿戴设备等具有大容量存储需求、同时对系统集成度有一定要求的场景。

参考文档(ESP-IDF 官方 API)SD/SDIO/MMC 驱动已支持的 eMMC 速度模式

示例程序storage/emmc——访问使用 FAT 文件系统的 eMMC 存储。

USB 闪存盘:即插即用的大容量存储

USB 闪存盘通过 USB 主机(Host)接口访问,传输速率为 12 Mbps(USB Full Speed)/ 480 Mbps(USB High Speed),容量可达 GB 级,主要用于声音、视频文件存储。其「大容量、可插拔」的特性与 SD 卡类似,但受制于芯片外设能力,仅可在支持 USB-OTG 外设的 ESP 芯片(如 ESP32-S2、ESP32-S3)上使用(见总览表备注 *3)。

在仓库中,USB 相关组件位于 components/usb 目录下(如 iot_usbh 等 USB Host 组件),对应的示例程序位于 examples/usb/host,可结合 FAT 文件系统(FatFS 与 VFS 配合)实现对 USB 闪存盘上文件的读写。

EEPROM:按字节寻址的参数存储方案

EEPROM(如 AT24C0X 系列)是 1024~16384 位的串行电可擦写存储器(通过控制引脚电平也可运行在只读模式)。其存储空间一般按照word进行分布,每个word包含8-bit空间。EEPROM可按字节寻址,读写操作简单,特别适合保存配置参数等小数据;经过优化,也可应用于对功耗和可靠性有一定要求的工业和商业场景。

已适配的 EEPROM 芯片

名称功能总线供应商驱动
AT24C01/021024/2048 bits EEPROMI2CAtmelAT24C02 driver

仓库内已适配的驱动为 at24c02,下文以该驱动为例展开源码级剖析。

AT24C02 驱动接口与底层实现

AT24C02 驱动构建在仓库的 i2c_bus 组件 之上(头文件直接#include "i2c_bus.h"),核心接口定义在 at24c02.h,实现位于 at24c02.c。

设备默认 I2C 地址定义在头文件中:

#define AT24C02_I2C_ADDRESS_DEFAULT (0x50) //1 0 1 0 A2 A1 A0 R/W

0x50 对应地址位A2 A1 A0全为 0 的情况。AT24C01A/AT24C02 的 A2、A1、A0 引脚为硬件接线地址输入,一条 I2C 总线上最多可寻址 8 个 1K/2K 器件(见 AT24C02 README)。

驱动提供的 API 按功能分为三组(全部封装自 i2c_bus 的底层接口):

1. 生命周期管理

at24c02_handle_t at24c02_create(i2c_bus_handle_t bus, uint8_t dev_addr); esp_err_t at24c02_delete(at24c02_handle_t *device);

at24c02_create()(at24c02.c)内部调用i2c_bus_device_create()在指定 I2C 总线上创建设备句柄,并保存设备地址;传入的busi2c_bus_create()的返回值。

2. 字节读写(按字节寻址)

esp_err_t at24c02_write_byte(at24c02_handle_t device, uint8_t addr, uint8_t data); esp_err_t at24c02_read_byte(at24c02_handle_t device, uint8_t addr, uint8_t *data);

3. 连续多字节读写(页读写)

esp_err_t at24c02_write(at24c02_handle_t device, uint8_t start_addr, uint8_t write_num, uint8_t *data_buf); esp_err_t at24c02_read(at24c02_handle_t device, uint8_t start_addr, uint8_t read_num, uint8_t *data_buf);

多字节写实现中有一个必须注意的硬件限制(at24c02.c):

if (write_num > 8) { ESP_LOGW(TAG, "must write_num <= 8, extra bytes will overwrite from byte 0 in this 8B page"); }

这是因为 AT24C01A/02 的 EEPROM 内部以8 字节页组织(2K 器件内部由 32 页 × 8 字节构成,采用 8 位数据字地址),一次页写最多可传输 8 个数据字;若超过 8 个(4K/8K/16K 器件为 16 个),数据字地址会「回卷」(roll over),之前写入的数据将被覆盖(详见 AT24C02 README 的 Write Operations 一节)。

4. 位级读写(可选)

esp_err_t at24c02_write_bit(at24c02_handle_t device, uint8_t addr, uint8_t bit_num, uint8_t data); esp_err_t at24c02_write_bits(at24c02_handle_t device, uint8_t addr, uint8_t bit_start, uint8_t length, uint8_t data); esp_err_t at24c02_read_bit(at24c02_handle_t device, uint8_t addr, uint8_t bit_num, uint8_t *data); esp_err_t at24c02_read_bits(at24c02_handle_t device, uint8_t addr, uint8_t bit_start, uint8_t length, uint8_t *data);

bit_start取 0~7(0 为 MSB),length取 1~8,便于在单个配置字节中操作标志位。

初始化与读写实战(基于测试用例)

仓库的测试用例给出了完整的初始化流程,可直接作为业务代码模板:

i2c_config_t conf = { .mode = I2C_MODE_MASTER, .sda_io_num = I2C_MASTER_SDA_IO, // 例:GPIO1 .sda_pullup_en = GPIO_PULLUP_ENABLE, .scl_io_num = I2C_MASTER_SCL_IO, // 例:GPIO2 .scl_pullup_en = GPIO_PULLUP_ENABLE, .master.clk_speed = I2C_MASTER_FREQ_HZ, // 例:100000 (100 kHz) }; i2c_bus = i2c_bus_create(I2C_MASTER_NUM, &conf); at24c02 = at24c02_create(i2c_bus, AT24C02_I2C_ADDRESS_DEFAULT);

字节写读的往返验证(at24c02_test.c)展示了两个关键实践点:

  1. 写入后需要延时:每次at24c02_write_byte()之后调用vTaskDelay(50 / portTICK_RATE_MS),以等待 EEPROM 内部写周期(write cycle)完成。AT24C02 数据手册给出的写周期典型值在几毫秒量级,测试中留出 50 ms 余量;
  2. 写读回环校验:写入数据后立即读回并用断言比对,可快速验证器件与总线状态。

硬件与电气特性要点

根据 AT24C02 README 汇总的芯片关键特性:

  • 电压等级:支持 2.7V(VCC = 2.7V ~ 5.5V)与 1.8V(VCC = 1.8V ~ 5.5V)两档工作电压;
  • I2C 速率:1.8V 下兼容 100 kHz,2.7V/5V 下兼容 400 kHz(对应总览表中 100 ~ 400 kHz 的速度范围);
  • 页写模式:1K/2K 为 8 字节页,4K/8K/16K 为 16 字节页,支持部分页写;
  • 高可靠性:擦写寿命 100 万次(Endurance: 1 Million Write Cycles),数据保持 100 年(Data Retention: 100 Years);
  • 写保护(WP):WP 引脚接地(GND)时允许正常读写;WP 接 VCC 时启用硬件写保护。

选型建议与常见问题

如何选择存储媒介?可按下述思路快速决策:

  • 小容量参数存储(KB 级):首选 NVS(SPI Flash 内部分区)或 EEPROM(AT24C02)。需要按字节寻址、器件可独立更换或对功耗可靠性有要求时选 EEPROM;希望零附加成本、直接利用主 Flash 时选 NVS;
  • 文本/图像/中等容量文件存储(MB 级):使用主 Flash 或外接第二块 Flash,配合 FAT/SPIFFS/LittleFS 文件系统;
  • 音视频大容量存储(GB 级):在 SD 卡、eMMC、USB 闪存盘之间选择——需要可插拔选 SD 卡或 USB 闪存盘(注意 USB 仅限支持 USB-OTG 的芯片);需要高集成度、可焊接选 eMMC;SD 卡的 SDIO 高速模式与 eMMC 均要求芯片具备 SDIO 主机外设(如 ESP32、ESP32-S3)。

常见问题(FAQ):关于存储方案的更多问答,请参考 ESP-FAQ 存储部分;文件系统层(NVS、FAT、SPIFFS、LittleFS)的详细比较与设计建议,见仓库的文件系统指南。

【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址: https://gitcode.com/GitHub_Trending/es/esp-iot-solution

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询