一起玩儿物联网人工智能小车(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卡中的目录和文件进行各种操作了。这将在下一篇中进行介绍。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/689518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何将OpenAI Sora生成的普通AI视频转化为Vision Pro的空间视频,沉浸式体验

【基于AI的Vision Pro空间视频】工作流:这个工作流程用于将2D视频转换为适用于 Vision Pro的Spatial视频: 1、使用Deep3D将2D视频转换为3D SBS: 使用Deep3D工具将2D视频转换为3D SBS格式: 转换例子:Prediction– lucataco/deep3d – Replicatehttps://replicate.com/…

【ArcGIS Pro二次开发】(81):文本符号_CIMTextSymbol

CIMTextSymbol是用于绘制文本图形注释的文本符号。 0、属性 Angel文本符号的放置角度BlockProgression多行文本的堆叠方向Callout引线DrawSoftHyphen连字符FlipAngle文本翻转(镜像)到位的角度FontEffects上下标FontEncoding获取文字的EncodingFontFamil…

Linux 性能分析工具汇总

Linux 性能分析工具汇总 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章。本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面。如果没有完善的计算机系统知识,网络知识和操作系统知识…

关于Future的使用

关于Future的使用 1 说明2 使用 在日常处理业务中,在某些定时任务处理数据时,因待处理数据量较大,如上千上万数据处理.虽然可以使用线程池异步处理,但是线程池处理速度和队列存放能力有限,为保护线程池稳定,需要控制数据处理频率,常见如分批次处理数据, 在多线程处理中分批次,一…

【题解】SPOJ8791 DYNALCA - Dynamic LCA

原题链接 题意 动态求 LCA 板子题。 维护一个森林,支持加边、删边和求 LCA 操作。 思路 不难想到 LCT。 现在问题就是如何在 LCT 上求两个点 u , v u,v u,v 的 LCA。 先进行 access ⁡ ( u ) \operatorname{access}(u) access(u),此时 u u u 到…

springboot 异步执行方法详细介绍

在Spring Boot中,异步执行方法是一种提高应用程序性能和响应性的技术。通过异步执行,你可以在处理耗时的业务逻辑时,不需要阻塞当前线程,从而提高应用程序的吞吐量和并发处理能力。 基本概念 在Spring中&#xff…

【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数

前言 嘿伙计们!准备好了吗?今天我要和你们探讨一个酷炫的话题——Oracle数据库!🎉 在这篇博文【Oracle】玩转Oracle数据库(二):体系结构、存储结构与各类参数,我们要揭开Oracle数据库…

二叉搜索树——迭代实现

———————————————————— 普通的树形结构中数据是杂乱无章的,实际意义不大,要想更好的管理数据,需要让数据有序,二叉搜索树又称二叉排序树,是一种特殊的树形结构。 规定一般的二叉搜索树的左节点小于…

FPGA 高速接口(LVDS)

差分信号环路测试 1 概述 LVDS(Low Voltage Differential Signalin)是一种低振幅差分信号技术。它使用幅度非常低的信号(约350mV)通过一对差分PCB走线或平衡电缆传输数据。大部分高速数据传输中,都会用到LVDS传输。 …

使用vscode传入参数的方式进行debug

使用vscode传入参数的方式进行debug {// 使用 IntelliSense 了解相关属性。 // 悬停以查看现有属性的描述。// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid830387"version": "0.2.0","configurations": [{&quo…

AI论文速读 |【综述】深度学习在多元时间序列插补的应用

论文标题: Deep Learning for Multivariate Time Series Imputation: A Survey 链接:https://arxiv.org/abs/2402.04059 作者:Jun Wang ; Wenjie Du ; Wei Cao ; Keli Zhang ; Wenjia Wang ; Yuxuan Liang ; Qingsong Wen 机构&#xff1a…

vue 学习definproperty方法

definproperty方法是Vue很重要的一个底层方法&#xff0c;掌握他的原理很重要&#xff0c;下面通过代码说明问题&#xff1a; <!DOCTYPE html> <html><head><meta charset"UTF-8" /><title>回顾Object.defineproperty方法</title&…

堆详解以及简单的堆排序(源代码)

一、什么是堆&#xff1f; 堆是将数组看作一颗完全二叉树 大堆&#xff1a;任意一个父亲大于等于孩子 小堆&#xff1a;任意一个父亲小于等于孩子 有序数组一定是堆 但是堆不一定有序 注意&#xff1a;此“堆”是一个数据结构&#xff0c;用来表示完全二叉树 还有另外一个“…

AIGC ChatGPT4完成业务需求SQL学习

源表如下&#xff1a; 例如现在需要显示每个岗位中工资排名前10位的员工信息&#xff0c;并显示排名应该要怎么做呢&#xff1f; Prompt: 有一个某公司职员表&#xff0c;表名为Bank_emp&#xff0c;empno为员工编号&#xff0c;ename为员工姓名&#xff0c;JOB为员工岗位&…

设计健壮且可扩展的软件系统

介绍 系统设计是定义系统的架构、组件、模块、接口和数据以满足特定需求的过程。它涉及就如何构建、维护和操作软件系统做出关键决策。在本文中&#xff0c;我们将深入探讨系统设计的各个方面&#xff0c;涵盖 25 个关键主题&#xff0c;以帮助您了解设计健壮且可扩展的软件系…

平滑升级旧版nginx,使其支持健康检测模组

nginx是部署在华为欧拉的docker容器中&#xff0c;版本是2203sp1.x86_64 查看旧版nginx的版本与编译配置信息&#xff1a; nginx -Vnginx version: nginx/1.14.1 built by gcc 8.3.1 20191121 (Red Hat 8.3.1-5) (GCC) built with OpenSSL 1.1.1g FIPS 21 Apr 2020 (running …

Hadoop-Yarn-NodeManager如何计算Linux系统上的资源信息

一、上下文 <Hadoop-Yarn-NodeManager都做了什么>中讲节点资源监控服务&#xff08;NodeResourceMonitorImpl&#xff09;时只是提了下SysInfoLinux&#xff0c;下面我们展开讲下 SysInfoLinux是用于计算Linux系统上的资源信息的插件 二、SysInfoLinux源码 package o…

前后图片对比控件使用

在build.gradle中添加依赖&#xff1a; implementation com.github.pavel163:BifacialView:1.4.1 在布局文件中&#xff1a; <com.ebr163.bifacialview.view.BifacialViewandroid:id"id/bv_before_after"android:layout_width"match_parent"android:la…

设计模式学习笔记 - 学前简述

1.为什么学习设计模式&#xff1f; 学习设计模式的原因&#xff1a; 应对面试中的设计模式相关问题&#xff1b;写出高质量代码&#xff0c;告别让人吐槽的烂代码&#xff1b;提高复杂代码的设计和开发能力让读源码、学习框架爱事半功倍&#xff1b;为职场发展铺垫。 设计模…

LNMP搭建discuz论坛

discuz论坛是一种网络论坛软件&#xff0c;也称bbs&#xff0c;它是一种用于在互联网上建立论坛社区的程序系统。只哟中功能强大的论坛软件&#xff0c;可以帮助用户建立一个专业、完善的论坛社区&#xff0c;并且可以实现多种功能&#xff0c;如搭建用户注册、登录、查看主题、…