使用Arduino开发ESP32(13):SD卡的使用

目的

对于嵌入式设备来说SD卡也是个比较好用的功能,比如用来存放设备的配置文件、日志文件、执行脚本、应用数据等。ESP32有两种使用SD卡的方法,一种是使用SPI接口访问SD卡,另一种是使用SDMMC接口访问SD卡 。Arduino core for the ESP32中SPI方式占用4个IO口,SDMMC方式占用6个IO口,一般来说SDMMC方式速度要比SPI方式快。

在Arduino core for the ESP32中使用SD卡和之前文章 《使用Arduino开发ESP32(12):文件和文件系统使用(基于SPIFFS)》 中内容比较相似,在这里SD卡相当于具体的文件系统,而真正的操作则是文件本身的操作,这和SD卡本身又没太多关系了。在看这篇文章可以先看前面的文章做个了解。
在这里插入图片描述

SDMMC方式

常用方法

  • bool begin(const char * mountpoint="/sdcard", bool mode1bit=false)
    挂载存储卡,输入参数分别为挂载点、是否使用一线模式;
    ESP32虽然有两组SDMMC接口,但Arduino core for the ESP32中只用到了其中一组,IO口连接为:DAT2 - IO12DAT3 - IO13CMD - IO15CLK - IO14DAT0 - IO2DAT1 - IO4
  • void end()
    取消挂载;
  • sdcard_type_t cardType()
    返回存储卡类型,0、1、2、3、4分别如下:
    CARD_NONE未连接存储卡;
    CARD_MMC mmc卡;
    CARD_SD sd卡,最大2G;
    CARD_SDHCsdhc卡,最大32G;
    CARD_UNKNOWN未知存储卡;
  • uint64_t cardSize()
    返回存储卡大小字节数;
  • uint64_t totalBytes()
    返回文件系统总字节数;
  • uint64_t usedBytes()
    返回文件系统已用字节数;

使用示例

可以使用下面代码进行简单测试:

//引用相关库
//#include "FS.h"
#include "SD_MMC.h"

// 接口连接如下:
// SD卡 - ESP32
// ------------
// DAT2 - IO12
// DAT3 - IO13
// CMD  - IO15
// CLK  - IO14
// DAT0 - IO2
// DAT1 - IO4

void setup()
{
  Serial.begin(115200);
  Serial.println();

  //挂载文件系统
  if (!SD_MMC.begin())
  {
    Serial.println("存储卡挂载失败");
    return;
  }
  uint8_t cardType = SD_MMC.cardType();

  if (cardType == CARD_NONE)
  {
    Serial.println("未连接存储卡");
    return;
  }
  else if (cardType == CARD_MMC)
  {
    Serial.println("挂载了MMC卡");
  }
  else if (cardType == CARD_SD)
  {
    Serial.println("挂载了SDSC卡");
  }
  else if (cardType == CARD_SDHC)
  {
    Serial.println("挂载了SDHC卡");
  }
  else
  {
    Serial.println("挂载了未知存储卡");
  }

  //打开/建立 并写入数据
  File file = SD_MMC.open("/test.txt", FILE_WRITE);
  if (file)
  {
    Serial.println("打开/建立 根目录下 test.txt 文件!");
  }

  char data[] = "hello world\r\n";
  file.write((uint8_t *)data, strlen(data));
  file.close();

  //重命名文件
  if (SD_MMC.rename("/test.txt", "/retest.txt"))
  {
    Serial.println("test.txt 重命名为 retest.txt !");
  }

  //读取文件数据
  file = SD_MMC.open("/retest.txt", FILE_READ);
  if (file)
  {
    Serial.print("文件内容是:");
    while (file.available())
    {
      Serial.print((char)file.read());
    }
  }

  //打印存储卡信息
  Serial.printf("存储卡总大小是: %lluMB \n", SD_MMC.cardSize() / (1024 * 1024)); // "/ (1024 * 1024)"可以换成">> 20"
  Serial.printf("文件系统总大小是: %lluB \n", SD_MMC.totalBytes());
  Serial.printf("文件系统已用大小是: %lluB \n", SD_MMC.usedBytes());
}

void loop()
{
}

在这里插入图片描述
上面示例只是基本的使用测试,很多方面都不完善,对于文件操作来说比较重要的是检查文件系统或文件对象是否可用、是否规范,这个可以参考文后链接中包含的例程,例程中各个关键点的检查都很完善。

SPI方式

常用方法

  • bool begin(uint8_t ssPin=SS, SPIClass &spi=SPI, uint32_t frequency=4000000, const char * mountpoint="/sd", uint8_t max_files=5)
    挂载存储卡,输入参数分别为SS引脚号、SPI对象、时钟频率、挂载点、文件最大同时打开数;
    默认IO口连接为:CS - IO5DI - IO23SCLK - IO18DO - IO19
  • void end()
    取消挂载;
  • sdcard_type_t cardType()
    返回存储卡类型,0、1、2、3、4分别如下:
    CARD_NONE未连接存储卡;
    CARD_MMC mmc卡;
    CARD_SD sd卡,最大2G;
    CARD_SDHCsdhc卡,最大32G;
    CARD_UNKNOWN未知存储卡;
  • uint64_t cardSize()
    返回存储卡大小字节数;
  • uint64_t totalBytes()
    返回文件系统总字节数;
  • uint64_t usedBytes();
    返回文件系统已用字节数;

使用示例

使用SPI方式访问SD卡用起来和上面的也没差太多,不复杂的,可以参考文后链接中官方示例。

注意事项

代码上来说使用SD卡是比较简单的,但是这里需要特别注意下的是关于电路方面的—— 总线上下拉电阻
官方推荐的是总线上全部接上50K的上拉电阻,这是比较通用的方法:

CMD and DATA lines D0-D3 of the slave should be pulled up by 50KOhm resistor even in 1-bit mode or SPI mode. The pullups of the slave cards should be connected even if they’re not connected to the host.

其实这里最关键的是ESP32的IO12,这个IO口上上电时的电平会决定外部flash(存放程序的那颗)的工作电压,上电时该脚为高则认为flash工作于1.8V,为低则认为flash工作于3.3V。
常用的像是Wroom-32系列模块该脚内部已下拉,即flash是工作于3.3V的,若外部电路接强上拉则可能导致模块工作异常(接弱上拉不影响,比如上面说的50K,或者干脆不接上拉电阻);而像是WROVER模块该脚是内部上拉的,flash工作于1.8V,外部上拉不影响模块运行。

可以参考下面内容:
https://docs.espressif.com/projects/esp-idf/en/latest/api-reference/peripherals/sd_pullup_requirements.html

总结

Arduino core for the ESP32中使用SD卡还是比较简单的,用上SD卡就可以用来制作更多有意思的东西,后面可能会再介绍一些基于SD卡的应用。

更多内容可以参考:
https://github.com/espressif/arduino-esp32/tree/master/libraries/SD_MMC
https://github.com/espressif/arduino-esp32/tree/master/libraries/SD
https://blog.csdn.net/qq_27114397/article/details/84107441

  • 22
    点赞
  • 135
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
首先,您需要在ESP32上安装ESPAsyncWebServer库,该库允许您创建异步Web服务器。然后,您需要将SD卡插入ESP32,并通过SPI接口将其连接到ESP32。 以下是一个基本的示例代码,可以从SD卡读取文件并在Web浏览器中显示该文件的内容: ```c++ #include <SPI.h> #include <SD.h> #include <WiFi.h> #include <ESPAsyncWebServer.h> // Replace with your network credentials const char* ssid = "your_SSID"; const char* password = "your_PASSWORD"; // Initialize the server AsyncWebServer server(80); // Initialize the SD card #define SD_CS_PIN 5 File file; void setup(){ // Start Serial Monitor Serial.begin(115200); // Connect to Wi-Fi network with SSID and password Serial.print("Connecting to "); Serial.println(ssid); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(1000); Serial.println("Connecting to WiFi..."); } // Print local IP address and start web server Serial.println(WiFi.localIP()); server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){ // Open file from SD card file = SD.open("/test.txt"); if(file){ // Read file content and send to client request->send(200, "text/plain", file.readString()); file.close(); } else{ request->send(404, "text/plain", "File not found"); } }); // Serve web requests server.begin(); } void loop(){ // Nothing to do here } ``` 在此示例中,我们将ESPAsyncWebServer库用于创建异步Web服务器。在设置过程中,我们连接到Wi-Fi网络并启动Web服务器。我们还通过SPI接口初始化SD卡,并在处理请求时从SD卡读取文件。 在此示例中,我们将文件名硬编码为“/test.txt”。您可以根据需要更改文件名。此外,如果尝试访问不存在的文件,则服务器将返回404错误。 请注意,此示例不是最安全的示例。在生产环境中,您需要使用SSL / TLS来保护Web服务器和客户端之间的通信,并对来自客户端的请求进行身份验证和授权。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Naisu Xu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值