一起玩儿物联网人工智能小车(ESP32)——63 SD和TF卡模块的使用

2024-02-18 03:12

本文主要是介绍一起玩儿物联网人工智能小车(ESP32)——63 SD和TF卡模块的使用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

摘要:本文介绍SD和TF卡模块的使用方法

前面介绍了非易失性存储的使用方法,由于空间和本身只支持键值对的限制,非易失性存储只适用于少量数据的记录。而不适用于各种声音、图片、大量数据等情况的使用。这时候就需要有文件系统或者更大容量存储空间的支持。SD卡(Secure Digital Memory Card)和TF卡(Trans-flash Card,也叫Micro SD卡)就是扩展存储空间的不错的选择,因为这两种卡都支持SPI模式,也就是可以通过SPI通信协议直接访问,因此这两种卡成了很多移动设备扩展存储空间的不二选择。

SD卡通常有两种工作模式:SDIO模式和SPI模式。其实这也是两种通信协议,也就是说SD卡支持SDIO和SPI两种通信方式。SPI通信协议在前面已经介绍过了。SDIO是安全数字输入输出接口(Secure Digital Input and Output)的缩写,是从SD内存卡接口的基础上演化出来的一种外设接口。SDIO接口兼容以前的SD内存卡,并且可以连接支持SDIO接口的设备。SDIO接口有4根数据线,数据传输速度非常快。有兴趣的可以进一步的了解SDIO的详细信息。

下面来看一下SD卡和TF卡的接口定义:

通过上面的接口可知,应该有两种方法用来读取SD卡上的数据,一种是通过SDIO接口,一种是SPI接口,为了简单方便,现在大部分访问SD卡都使用SPI的方式,市面上能买到的SD开模块,也都是SPI接口的。

虽然可以直接把SD卡与ESP32单片机相连接来进行数据的读写操作,但接线不是那么方便,因此还是使用的功能模块来进行实验,通常的功能模块都是只支持SPI模式的,将SD卡的SPI数据线引出到了接线排针上。因为现在TF卡更普遍一些,因此这次使用的是TF卡模块,其使用方法与SD卡功能模块没有任何区别。模块的样子如下图所示:

熟悉SPI协议的应该对上图中的引脚非常的属性了,应该不需要再进一步的解释了,不了解的可以看之前关于SPI通信协议的文章。下面就把TF卡模块连接到我们的ESP32单片机引脚上。

ESP32芯片共有3个SPI接口,其中一个被用作片上SPI Flash使用,另外两个可以给开发人员使用,其引脚定义如下:

Pin Name

HSPI(GPIO Number)

VSPI(GPIO Number)

CSO*

15

5

SCLK

14

18

MISO

12

19

MOSI

13

23

QUADWP

2

22

QUADHD

4

21

其中的QUADWP为写保护信号,QUADHD为保持信号。这两个引脚只用于4位传输。

在设计电路的时候,可以尽量使用默认的引脚,这样在开发中就不需要再进行额外的配置了。当然,ESP32在强大的GPIO交换矩阵的支持下,基本上可以用任意的引脚来连接到SPI控制器,实现使用任意引脚与外部SPI设备的连接。我所使用的连接方法如下表所示:

TF卡模块

ESP32扩展板

GND

GND

VCC

+5V

MISO

P19

MOSI

P23

SCK

P18

CS

P5

这是使用VSPI默认引脚的连接方法。SPI通信协议中有明显的主从设备定义,因此收发引脚也明确了主从,这样连接起来就非常的方便,不容易接错。回想前面UART通信协议中,收发引脚都是站在自身的角度来说的,因此在与其他设备通信的时候,就应该自己的接收与对方的发送相连接,对方的接收与自己的发送相连接。这点不同之处要关注一下,很容易搞错了。

接下来就来看一下在Arduino IDE中,如何读写SD卡中的内容,这其中会包含非默认引脚的处理方法。下面来看一下主要的操作过程。

1. 引入头文件

#include "SD.h"

#include "SPI.h"

2. 配置SPI通信引脚

如果使用HSPI的默认引脚,那么可以忽略本步骤,直接进入到下一步。否则,就需要使用这里列举的几种方法来配置SPI的通信引脚。通常有下面两种方法:

(1)调用SPI实例的begin()方法来指定SPI通信的引脚,该方法的定义如下:

void begin(int8_t sck = -1, int8_t miso = -1, int8_t mosi = -1, int8_t ss = -1)

这个方法有4个参数,依次是:sck、miso、mosi和ss。

(2)创建一个新的SPIClass的实例

SPIClass spi = SPIClass(VSPI);

创建的时候可以指定使用VSPI控制器,也可以使用默认的HSPI控制器。如果这个时候恰好使用的就是VSPI的默认引脚,那么就不用再进行任何操作了,如果是自己随意选择的几个引脚,那么同样可以调用begin()方法来指定每一个引脚。具体方法同前一种一样,默认的SPI实例就是SPIClass类型的。

3. 初始化SD实例

SD是SDFS类的实例。其初始化方法begin()的定义如下:

bool begin(uint8_t ssPin = SS, SPIClass &spi = SPI,
uint32_t frequency = 4000000, const char *mountpoint = "/sd",
uint8_t max_files = 5, bool format_if_empty = false)

这个begin()方法的参数比较多,重点关注前两个,第一个是片选引脚。第二个就是前面创建的SPIClass类的配置信息。默认值是SPI,如果自己生成了新的SPIClass对象的实例,那么把它作为第二个参数传递给begin()方法。

这个begin()方法返回值位布尔类型的,true表示成功,false表示初始化失败。这时,应检查接线是否牢固、正确。前边的初始化配置与接线是否相符合。

4. 得到卡的类型

调用SD.cardType()方法可以得到卡的类型。该方法返回一个枚举类型的变量,该枚举类型可以有以下几个数值:

    CARD_NONE 无卡

    CARD_MMC MMC卡

    CARD_SD SD卡

    CARD_SDHC SDHC卡

    CARD_UNKNOWN 未知

下面再说一下SD卡类型的小知识。目前SD卡分为三种,分别是SD、SDHC和SDXC卡。这三者的区别是容量上限的不同,其次在传输速度上有的有些差别,但传输速度不是划分的标准。SD卡是由MMC卡发展而来的,最早的SD卡由于FAT16文件系统的限制,其最大容量只有2GB,所以在开发中,小于2GB容量的SD卡,就叫SD卡。容量在2GB至32GB之间的称为SDHC(Secure Digital High Capacity),也就是高容量的SD卡。它使用了FAT32文件系统,能够支持大于2G的文件。相比之下,SDXC(Secure Digital eXtended Capacity)卡的容量更大,可以达到2TB(2048GB)。它是为需要更高容量的设备设计的,并且支持更快的读写速度。SDXC使用了FAT32或者EXFAT文件系统。

设备读取SD卡是向下兼容的,支持高容量的设备是可以读取低容量SD卡的,只支持低容量SD卡的设备,则无法读写高容量SD卡中的内容。这里所说的容量的高低是以2GB和32GB为分界线的。

之后,利用SD实例就可以对SD卡中的目录和文件进行各种操作了。这将在下一篇中进行介绍。

这篇关于一起玩儿物联网人工智能小车(ESP32)——63 SD和TF卡模块的使用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/719864

相关文章

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

使用Python构建智能BAT文件生成器的完美解决方案

《使用Python构建智能BAT文件生成器的完美解决方案》这篇文章主要为大家详细介绍了如何使用wxPython构建一个智能的BAT文件生成器,它不仅能够为Python脚本生成启动脚本,还提供了完整的文... 目录引言运行效果图项目背景与需求分析核心需求技术选型核心功能实现1. 数据库设计2. 界面布局设计3

使用IDEA部署Docker应用指南分享

《使用IDEA部署Docker应用指南分享》本文介绍了使用IDEA部署Docker应用的四步流程:创建Dockerfile、配置IDEADocker连接、设置运行调试环境、构建运行镜像,并强调需准备本... 目录一、创建 dockerfile 配置文件二、配置 IDEA 的 Docker 连接三、配置 Do

Android Paging 分页加载库使用实践

《AndroidPaging分页加载库使用实践》AndroidPaging库是Jetpack组件的一部分,它提供了一套完整的解决方案来处理大型数据集的分页加载,本文将深入探讨Paging库... 目录前言一、Paging 库概述二、Paging 3 核心组件1. PagingSource2. Pager3.

python使用try函数详解

《python使用try函数详解》Pythontry语句用于异常处理,支持捕获特定/多种异常、else/final子句确保资源释放,结合with语句自动清理,可自定义异常及嵌套结构,灵活应对错误场景... 目录try 函数的基本语法捕获特定异常捕获多个异常使用 else 子句使用 finally 子句捕获所

C++11右值引用与Lambda表达式的使用

《C++11右值引用与Lambda表达式的使用》C++11引入右值引用,实现移动语义提升性能,支持资源转移与完美转发;同时引入Lambda表达式,简化匿名函数定义,通过捕获列表和参数列表灵活处理变量... 目录C++11新特性右值引用和移动语义左值 / 右值常见的左值和右值移动语义移动构造函数移动复制运算符

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时