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
相关产品推荐
相关产品推荐

