基于实际调试经验整理,适用于 ESP32-S3(如 ESP32-S3-WROOM-1)+ SPI 模式 SD 卡


一、软件(程序)要点

1. 使用 FSPI(推荐)

ESP32-S3 推荐使用 FSPI:

SPIClass spi(FSPI);
spi.begin(SCLK, MISO, MOSI, CS);

2. 显式指定 SPI 引脚

不要使用默认 SPI:

spi.begin(SD_SCLK, SD_MISO, SD_MOSI, SD_CS);

3. 控制 SPI 频率(非常关键)

初始化阶段建议低速:

SD.begin(SD_CS, spi, 100000);   // 100kHz

稳定后可提高:

SD.begin(SD_CS, spi, 4000000);  // 4MHz

SD卡的不能一味追求过低SPI,比如真实录音有 32 KB/s(16kHz16bit1ch),则当需要获得音频数据时,初始化速率最好在1MHz~4MHz(SD的SPI最大不要超过4MHz)


4. CS 引脚初始化

pinMode(SD_CS, OUTPUT);
digitalWrite(SD_CS, HIGH);
delay(10);

避免启动阶段误触发 SD 卡


二、硬件设计要点

1. SPI 引脚连接关系

ESP32

SD 卡

MOSI

CMD

MISO

DAT0

SCLK

CLK

CS

DAT3


2. 上拉电阻(关键)

必须加:

  • CMD(MOSI) → 10K 上拉

  • DAT0(MISO) → 10K 上拉

  • DAT3(CS) → 10K 上拉

  • DAT1、DAT2 → 建议加 10K 上拉(即使不用)

❌ 不建议:

  • CLK 加上拉(会影响边沿)


3. 电源要求

  • 使用 3.3V 供电

  • 电源稳定(建议加 10uF + 0.1uF)


4. 常见硬件错误

  • SD 卡座方向看反(顶视图 / 底视图)

  • CS 没接到 DAT3

  • MOSI/MISO 接反

  • DAT1/DAT2 悬空


三、SD 卡格式(最重要)

❗ 必须满足:

  • MBR 分区表

  • FAT32 文件系统


❌ 不支持:

  • GPT 分区(会报:No valid FAT volume)

  • exFAT

  • NTFS


正确格式化步骤(Windows)

diskpart
list disk
select disk X
clean
convert mbr
create partition primary
format fs=fat32 unit=32768 quick
assign
exit

关键点:

  • 必须 clean

  • 必须 convert mbr

  • 推荐 unit=32768


四、典型错误与对应原因

错误

原因

cmd:0x00 failed

SPI/CS 问题

no card detected

接线问题

f_mount failed (13)

FAT 不合法 / GPT

physical drive cannot work

初始化失败

open(): File system is not mounted

SD.begin 失败后仍操作


五、调试方法

1. 逻辑分析仪判断

正常流程:

  1. CMD0 → 返回 0x01

  2. CMD8 → 返回 0x01 + 数据

  3. ACMD41 → 最终返回 0x00

  4. CMD17 → 成功读扇区


2. 判断 SPI 是否正常

现象

结论

无响应

接线错误

全 FF

CS 未选中

有响应但数据乱

时序/信号问题

能读扇区但不识别

文件系统问题


六、最终总结

ESP32 读取 SD 卡成功的三大核心:

1️⃣ 软件

  • 使用 FSPI

  • 正确 SPI 初始化

  • 控制频率(要符合使用频率,不能过低或过高)

2️⃣ 硬件

  • 正确接线

  • 正确上拉(尤其 DAT1/DAT2)

  • CLK 不要上拉

3️⃣ SD 卡(最关键)

必须是:MBR + FAT32


七、一句话结论

SPI 正常 ≠ 能读文件,真正决定成败的是 SD 卡的分区结构。