You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32-S3在SDMMC 1位模式下写入速度过慢问题求助

解决ESP-IDF 5.5.0下SDMMC 1位模式写入速度过低的问题

1. 修复文件缓存配置错误

你的代码中setvbuf注释标注128KB缓存,但实际参数是16 * 1024(仅16KB),过小的缓存会导致频繁磁盘IO,直接拉低写入速度。修改为:

setvbuf(file, NULL, _IOFBF, 128 * 1024); // 实际设置128KB缓存

2. 启用SDMMC DMA传输

ESP-IDF默认未开启DMA,而Arduino环境通常默认启用该功能,这是两者速度差异的核心原因之一。在slot_config中添加DMA启用标志:

sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT();
slot_config.clk = 39;
slot_config.cmd = 38;
slot_config.d0 = 40;
slot_config.width = 1;
slot_config.flags = SDMMC_SLOT_FLAG_DMA_ENABLE; // 启用DMA传输

3. 匹配SD卡擦除块大小设置分配单元

将allocation_unit_size设置为SD卡的实际擦除块大小(通常为32KB或64KB),避免碎片化写入损耗性能。可先在挂载成功后打印实际擦除块大小:

printf("SD卡擦除块大小: %u bytes\n", card->csd.sector_size * card->csd.sectors_per_block);

再修改挂载配置:

esp_vfs_fat_sdmmc_mount_config_t mount_config = {
    .format_if_mount_failed = false,
    .max_files = 5,
    .allocation_unit_size = 64 * 1024 // 替换为打印出的实际擦除块大小
};

4. 启用引脚内部上拉电阻

部分SD卡需要引脚内部上拉才能稳定工作,添加上拉标志:

slot_config.flags |= SDMMC_SLOT_FLAG_INTERNAL_PULLUP;

5. 预分配文件空间优化写入逻辑

写入前预分配文件空间,减少文件系统元数据操作开销:

FILE *file = fopen(path, "wb");
if (file) {
    setvbuf(file, NULL, _IOFBF, 128 * 1024);
    ftruncate(fileno(file), fb->len); // 预分配与图片大小一致的空间
    fwrite(fb->buf, 1, fb->len, file);
    fclose(file);
    // ... 打印日志
}

验证与后续排查

修改后重新测试,正常情况下1位模式写入速度应能接近Arduino环境水平(400KBps以上)。若仍无改善:

  • 确认挂载日志中Frecvență reală是否与设置的80000kHz一致,若实际频率更低,说明SD卡不支持80MHz,可尝试降至40MHz
  • 更换UHS-I Class 10及以上的高速SD卡
  • 检查SD卡引脚硬件连接,确保无虚焊、接触不良问题

内容的提问来源于stack exchange,提问作者Radu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 04:13:11