文章目录

  • 目的
  • SDMMC方式
    • 常用方法
    • 使用示例
  • SPI方式
    • 常用方法
    • 使用示例
  • 注意事项
  • 总结

目的

对于嵌入式设备来说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 - IO4void 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

使用Arduino开发ESP32(13):SD卡的使用相关推荐

  1. 《Arduino》开发 TFT_eSPI-master 库 之用 ESP32 读取SD卡上的图片并显示在1.14IPS屏幕上

    前几天解决了 TFT_eSPI-master 库 图片取模问题,但尽管是ESP32的 flash 也无法存储太多图片的数组,因此我找到了ESP32从SD卡读取图片并显示在LCD屏幕上的方法,SD卡可以 ...

  2. Arduino ESP32 读取SD卡接口选择参考

    ESP32 读取SD卡接口选择参考 ESP3232读取SD卡可以通过spi和sdmmc两种方式来读取,不过我们在市面上能买到的都基本上是4线的SPI接口的SD卡模块套件. 卡类型有如下,8-9Pin被 ...

  3. Arduino ESP32录音+ SD卡储存开源项目

    Arduino ESP32录音+ SDHC卡储存开源项目 一个好的开源项目可以帮助我们学习和提升自己的知识. ESP32录音并记录在SD卡中 开源项目地址 因为是国外的项目,基本都是github,,为 ...

  4. k210 C语言开发-3 使用SD卡

    k210 C语言开发-3 使用SD卡 文章目录 k210 C语言开发-3 使用SD卡 前言 整合工程 修改IO口 前言 记录k210的学习之旅. 准备:我用的是MaixPy DOCK,kendryte ...

  5. 使用Arduino开发ESP32(八):ESP32的EPROM的写入读取

    写入EPROM /* 该代码向EEPROM写入4096字节数据 */ #include <EEPROM.h>void setup() {Serial.begin(115200);Seria ...

  6. 使用Arduino开发ESP32(11):IO口与相关外设说明与记录

    文章目录 目的 数字IO口 基本使用 外部中断 使用示例 参考链接 LEDC(PWM) 常用方法 使用示例 参考链接 SigmaDelta 参考链接 ADC 常用方法 使用示例 参考链接 存在的问题 ...

  7. Arduino UNO驱动micro SD卡读写模块

    目录 一.简介 二.使用前准备 三.测试方法 四.实验现象 一.简介 Micro SD卡模块TF卡读写卡器板载电平转换电路,即接口电平可为5V或3.3V,支持支持Micro SD卡(≤2G).Micr ...

  8. S5PV210开发系列五 sd卡驱动实现

    SD卡(Secure Digital Memory Card)具有体积小.容量大.数据传输快.可插拔.安全性好等优点,被广泛应用于便携式设备上.例如作为数码相机的存储卡,作为手机.平板多媒体扩展卡用的 ...

  9. k210 C语言开发-4 从sd卡读取播放烟花视频

    k210 C语言开发-4 先上成果图吧,祝大伙新年快乐! B站原视频.完整代码在文末. 前天无意中看到CSDN有个活动,我一看只要是和烟花相关的都可以,然后我就准备用k210播放个烟花视频.结果我哼哧 ...

最新文章

  1. 2022-2028年中国2,3,6-三甲基苯酚行业市场研究及前瞻分析报告
  2. JBPM深入解析之变量设计
  3. Top Competitors(连接查询)
  4. 关注地方门户网站盈利模式
  5. 用python编21点游戏_【Python3】21点游戏
  6. LeetCode 215. 数组中的第K个最大元素(快速排序)
  7. Android 刘海屏来袭,全网最全适配技巧
  8. 《SQL Server 必知必会》读书笔记
  9. SeleniumCSS选择器
  10. MVC---------ViewBag
  11. Web_信息搜集(DAY2)
  12. idea快速创建serilizableuid
  13. html怎么引用桌面图片,html怎么引入图片?
  14. CentOS7配简单的桌面环境openbox
  15. Datagrip连接mysql错误[08S01]解决办法
  16. 【数据库实验】实验四 基于嵌入SQL的综合应用编程(基于QSqlTableModel实现)
  17. css background-attachment属性详解
  18. 42岁巨星陨落!黑客之神Dan Kaminsky去世,曾因发现DNS安全漏洞一战成名
  19. 数制转换的概念和转换
  20. Ubuntu22.04右上角网络图标消失

热门文章

  1. 球从100米高的地方落下时反弹的高度
  2. selenium中使用cookie登录
  3. android rtorrent 编译,在Ubuntu下rtorrent编译安装笔记
  4. postgresql后台查询删除与垃圾清理
  5. windows下STS(Spring Tools Suite,自带spring插件的eclipse)的下载与安装
  6. python对有重复值的列求和之后放到第一次出现的位置
  7. ubuntu切换内核版本
  8. C语言实例——四种排序算法(冒泡排序、选择排序、插入排序、快速排序)
  9. 腺样体肥大的症状表现有哪些?
  10. java模拟商店购买