文章目录
前言
ESP32-S3 是一款功能强大的 Wi-Fi + 蓝牙双模微控制器,广泛应用于物联网 (IoT) 项目。许多项目需要存储数据,例如传感器读数、日志文件、配置文件等。SD 卡是一种常见的、廉价的、大容量的存储解决方案。
在 Arduino 环境下使用 ESP32-S3 操作 SD 卡非常方便,Arduino 提供了 SD
库,可以轻松实现 SD 卡的读写操作。然而,在实际开发中,有时会遇到在 loop()
函数中无法正常读写 SD 卡的问题。这通常是由于 SD 卡操作的阻塞特性、文件系统未正确关闭、或者硬件连接问题导致的。
本文将详细介绍如何在 Arduino 环境下使用 ESP32-S3 进行 SD 卡的读写操作,并重点解决 loop()
函数中无法读写 SD 卡的问题。通过本文的学习,您将能够:
- 了解 ESP32-S3 的 SDMMC 接口。
- 掌握 Arduino
SD
库的基本用法。 - 学会如何在 ESP32-S3 上初始化 SD 卡。
- 实现文件的创建、写入、读取和删除操作。
- 理解
loop()
函数中 SD 卡读写失败的常见原因。 - 掌握解决
loop()
函数中 SD 卡读写问题的技巧。
在setup里面初始化了SD,但是在loop中使用SD的时候未能正常使用,经检查是loop中SD未初始化。
在论坛寻找大神的解决方案未果后(大佬们都不知道这个问题,而且还说是不是内存卡有问题,就离谱),只能自己着手看代码,解决这个问题了。
一、 硬件准备
- ESP32-S3 开发板: 确保您的 ESP32-S3 开发板支持 SD 卡接口。
- SD 卡: 建议使用 Class 10 或更高速度等级的 SD 卡,容量根据您的需求选择。
- SD 卡模块(如果开发板没有内置): 如果您的开发板没有内置 SD 卡插槽,您需要一个 SD 卡模块。
- 杜邦线: 用于连接 SD 卡模块和 ESP32-S3 开发板。
二、 硬件连接
ESP32-S3 支持两种 SD 卡接口:
- SDMMC: 使用 ESP32-S3 的 SDMMC 控制器,速度更快,推荐使用。
- SPI: 使用 SPI 接口,速度较慢,但兼容性更好。
本文只讨论
SPI
的方式,因为我就是这么用的,后面也许会跟进SDMMC
的方式
**
参考接线
**
去esp32-arduino的仓库下找到示例代码,就能找到这段连接方式,虽然芯片差不多的时候连接方式是差不多的,但是也有细微差异,比如esp32c3就有差异,所以按照你的方式去连接电路。
引脚 | 功能 | ESP32-S3 引脚 (示例) |
---|---|---|
CS | 片选 | GPIO5 |
MOSI | 主出从入 | GPIO23 |
MISO | 主入从出 | GPIO19 |
SCK | 时钟 | GPIO18 |
三、软件设置
1. 安装库
在 Arduino IDE 中,打开“工具”->“管理库…”,搜索“SD”,安装由“Arduino”提供的 SD
库。
2. 包含头文件
在您的 Arduino 代码中,包含 SD.h
头文件:
#include <SD.h>
四、 初始化 SD 卡
在 setup()
函数中初始化 SD 卡。直接参考代码即可。
#include <SPI.h>
#include <SD.h>
#define SD_CS_PIN 5 // 定义 CS 引脚
void setup() {
Serial.begin(115200);
// 初始化 SD 卡 (SPI)
if (!SD.begin(SD_CS_PIN)) {
Serial.println("Card Mount Failed");
return;
}
// 其余和SDMMC类似
}
void loop() {
// ...
}
五、SD 卡读写操作
1. 创建文件
// 创建一个新文件 (如果文件已存在,则会被覆盖)
File file = SD.open("/test.txt", FILE_WRITE);
if (!file) {
Serial.println("Failed to open file for writing");
return;
}
file.close(); // 关闭文件
2. 写入文件
File file = SD.open("/test.txt", FILE_WRITE); // 以写入模式打开文件
if (!file) {
Serial.println("Failed to open file for writing");
return;
}
// 写入文本
if (file.println("Hello, SD Card!")) {
Serial.println("File w