买了SD读写模块很久了,印象里买来之后就没有进行过测试。后来又买了Max98357模块,在学习了I2S相关的知识以后,也被放到了一边。这几天想起来这两个模块,准备重新捡起来,编程测试。测试Max98367的过程中使用过ESP8266、RP2040,ESP32C3,开发语言用过C和MicroPython。测试SD读写模块用过RP2040,ESP32C3,ArduinoMega2560。最终终于通过使用ESP32C3、SD读写模块、Max98357完成了读SD卡中的WAV文件,并完成播放的测试。现在把整个过程分解为SD卡处理部分和Max98357处理部分两大块,注意发帖记录成果的处理结果。
我买到的SD卡读写模块有两种:


两种。大的那种,无论怎么测试都没有通过。小的,首先通过Arduino Mega2560完成了测试。
SD模块与开发板的连接情况,在代码中注明了,不再单独列出。程序代码如下:
#include <SPI.h>
#include <SD.h>
/**
// 接mega2560开发板
SD卡模块引脚 Mega2560 说明
-----------------------------------------------------------------------------------------------------------------------------------------------------------------
CS 53 片选引脚
MOSI 51 主设备输出,Mega通过此引脚向SD卡发送数据。
MISO 50 主设备输入,Mega通过此引脚从SD卡读取数据。
SCK 52 串行时钟
VCC 5V 为模块供电,SD卡模块本身带有稳压芯片,可提供3.3V。
GND GND 地
------------------------------------------------------------------------------------------------------------------------------------------------------------------
*/
// 定义CS引脚,mega2560场合,这里使用GPIO53
//const int chipSelect = 53;
// 定义CS引脚,ESP32C3场合,这里使用GPIO4
const int chipSelect = 4;
const unsigned char* filename = "/data.txt";
File myFile;
Sd2Card card;
SdVolume volume;
SdFile root;
void setup() {
Serial.begin(115200);
delay(1000); // 等待串口稳定
Serial.print("\n正在初始化SD卡...");
// 关键:初始化SD卡,参数为CS引脚号
// 注意:即使你不使用GPIO10,也建议将其设为输出以保证SD库正常工作,实际我用的GPIO53
pinMode(10, OUTPUT);
if (!SD.begin(chipSelect)) {
Serial.println("初始化失败!请检查接线或卡是否正确插入。");
return;
}
Serial.println("初始化成功。");
if (SD.exists(filename)) {
Serial.println("data.txt文件存在。");
if (SD.remove(filename)) {
Serial.println("删除data.txt文件成功。");
} else {
Serial.println("删除data.txt文件失败!");
}
}
// ---------- 写入数据 ----------
// 打开文件(如果文件不存在,会创建它;FILE_WRITE意为追加模式)
myFile = SD.open(filename, FILE_WRITE);
if (myFile) {
Serial.print("正在写入 data.txt ...");
// 写入一行数据
myFile.println("Hello from Mega2560!");
myFile.print("当前时间戳: ");
myFile.println(millis());
// 关闭文件(非常重要,确保数据实际保存)
myFile.close();
Serial.println("写入完成。");
} else {
Serial.println("打开文件(用于写入)失败!");
}
// ---------- 读取数据 ----------
// 重新打开文件(默认只读模式)
myFile = SD.open(filename);
if (myFile) {
Serial.println("读取 data.txt 内容:");
// 逐字节读取并打印到串口
while (myFile.available()) {
Serial.write(myFile.read());
}
myFile.close();
Serial.println("\n读取结束。");
} else {
Serial.println("打开文件(用于读取)失败!");
}
}
void loop() {
}在完成建立文件、读写测试后,将SD卡连上电脑,找到data.txt文件并查看内容,确认了测试结果无误。
我要赚赏金
