背景知识:

ESP32有两种使用SD卡的方法,一种是使用SPI接口访问SD卡,另一种是使用SDMMC接口访问SD卡 。

Arduino core for the ESP32中SPI方式占用4个IO口,SDMMC方式占用6个IO口,一般来说SDMMC方式速度要比SPI方式快。

1. SDMMC方式

ESP32虽然有两组SDMMC接口,但Arduino core for the ESP32中只用到了其中一组,IO口连接为:DAT2 - IO12DAT3 - IO13CMD - IO15CLK - IO14DAT0 - IO2DAT1 - IO4

bool begin(const char * mountpoint="/sdcard", bool mode1bit=false)
挂载存储卡,输入参数分别为挂载点、是否使用一线模式;

void end()
取消挂载;

sdcard_type_t cardType()   返回存储卡类型,0、1、2、3、4,分别如下:
CARD_NONE          未连接存储卡;
CARD_MMC            mmc卡;
CARD_SD                sd卡,最大2G;
CARD_SDHC           sdhc卡,最大32G;
CARD_UNKNOWN  未知存储卡;

uint64_t cardSize()      返回存储卡大小字节数;
uint64_t totalBytes()    返回文件系统总字节数;
uint64_t usedBytes()   返回文件系统已用字节数;

2. 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 - IO5、DI - IO23、SCLK - IO18、DO - IO19;
void end()
取消挂载;
sdcard_type_t cardType()    返回存储卡类型,0、1、2、3、4,分别如下:
CARD_NONE         未连接存储卡;
CARD_MMC           mmc卡;
CARD_SD               sd卡,最大2G;
CARD_SDHC          sdhc卡,最大32G;
CARD_UNKNOWN  未知存储卡;
uint64_t cardSize()      返回存储卡大小字节数;
uint64_t totalBytes()     返回文件系统总字节数;
uint64_t usedBytes();   返回文件系统已用字节数

3. 我的实验

我手头的ESP32_CAM板子的原理图

右图可知,我的SD卡接到了ESP32的GPIO12 13 14 15 2 4 这6个脚上,根据前述,这符合SDMMC方式的IO连接。所以,我在软件上需要使用SDMMC方式来驱动SD卡。

新建arduino项目文件,复制黏贴如下代码,即可以SDMMC方式驱动SD卡

//引用相关库
//#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()
{
}

4. 实验效果

5.补充,如果不追求读写SD卡的速率,那么可以SPI方式来进行SD卡的读写,那么这样就可以省下ESP32宝贵的2个GPIO作其他用途。

其实,这些例程在我们安装好Arduino的ESP32支持包以后,我们电脑本地已经有了,参考下面的路径可以找到这些例程。

.

Arduino+ESP32 之 SD卡读写的更多相关文章

  1. 第36章 SDIO—SD卡读写测试

    第36章     SDIO—SD卡读写测试 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/f ...

  2. 第36章 SDIO—SD卡读写测试—零死角玩转STM32-F429系列

    第36章     SDIO—SD卡读写测试 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/f ...

  3. 【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(终)-配合内存管理来遍历SD卡

    [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(一)-初步认识SD卡 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(二)-了解SD总线,命令的相关介绍 [STM3 ...

  4. 【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(八)-认识内存管理

    [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(一)-初步认识SD卡 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(二)-了解SD总线,命令的相关介绍 [STM3 ...

  5. 【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(七)-准备移植FatFs

    [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(一)-初步认识SD卡 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(二)-了解SD总线,命令的相关介绍 [STM3 ...

  6. 【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(六)-FatFs使用的思路介绍

    [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(一)-初步认识SD卡 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(二)-了解SD总线,命令的相关介绍 [STM3 ...

  7. 【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(五)-文件管理初步介绍

    其他链接 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(一)-初步认识SD卡 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(二)-了解SD总线,命令的相关介绍 ...

  8. 【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(一)-初步认识SD卡

    由于一张SD卡要能读写,涉及到的技术有些多,我打算分以下几篇博客 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(一)-初步认识SD卡 [STM32]使用SDIO进行SD卡读写,包含 ...

  9. 【STM32】使用SDIO进行SD卡读写,包含文件管理FatFs(二)-了解SD总线,命令的相关介绍

    其他链接 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(一)-初步认识SD卡 [STM32]使用SDIO进行SD卡读写,包含文件管理FatFs(二)-了解SD总线,命令的相关介绍 ...

随机推荐

  1. 1188 最大公约数之和 V2

    1188 最大公约数之和 V2 题目来源: UVA 基准时间限制:2 秒 空间限制:262144 KB  给出一个数N,输出小于等于N的所有数,两两之间的最大公约数之和.       相当于计算这段程 ...

  2. 1374 - Confusion in the Problemset

    1374 - Confusion in the Problemset    PDF (English) Statistics Forum Time Limit: 2 second(s) Memory ...

  3. anaconda 如何更换镜像源

    今天需要对anaconda更换其镜像源. 故而做一个小记: 一 查看anaconda的本源方法 电脑路径:C:\Users\14269,找到  .condarc 文件. 打开.condarc文件,可看 ...

  4. CNN、RNN

    卷积神经网络有三个结构上的特性:局部连接,权重共享以及空间或时间上的次采样.这些特性使得卷积神经网络具有一定程度上的平移.缩放和扭曲不变性. CNN由可学习权重和偏置的神经元组成.每个神经元接收多个输 ...

  5. Decoupling Representation and Classifier for Long-tailed Recognition

    目录 概 主要内容 Sampling 分类器 代码 Kang B., Xie S., Rohrbach M., Yan Z., Gordo A., Feng J. and Kalantidis Y. ...

  6. Java——HashMap集合详解

    第一章 HashMap集合简介 1.1 介绍 HashMap基于哈希表的Map接口实现,是以key-value存储形式存在,即主要用来存放键值对.HashMap 的实现不是同步的,这意味着它不是线程安 ...

  7. electron使用动态配置文件及持久化存储

    1.如何在打包之后,把动态配置文件比如[config.json]放在根目录,不被打包到asar文件中 //解决思路,electron可以拷贝静态资源,比如你把config.json放在项目的根目录下, ...

  8. CS5216|DP1.2转HDMI1.4音视频转换芯片|CS5216参数

    Capstone CS5216是一款用于DP1.2转HDMI1.4音视频转换芯片.CS5216是HDMI 电平移位器/中继器专为2型双模Display Port(DP++)电缆适配器应用而设计.它设计 ...

  9. InnoDB学习(八)之 聚簇索引

    InnoDB中,表数据文件本身就是以主键为索引的B+树,树的叶子节点存放一条条表数据,此索引树被称为表的聚簇索引.聚簇索引也称为聚集索引,聚类索引,簇集索引,聚簇索引确定表中数据的物理顺序. Inno ...

  10. 【计项02组01号】Java版图形界面计算器

    Java版图形界面计算器1.0版本 项目分析[1.0] 组成部分 代码结构 (1)窗口的创建 在<JDK 核心 API>中我们提到,创建一个窗口需要使用 JFrame 类.在本实验中,我们 ...