Arduino ESP32 使用HSPI和VSPI接口挂载SD卡区别

Arduino ESP32 使用HSPI和VSPI接口挂载SD卡区别


在挂载SD卡时,ESP32使用HSPI和VSPI接口挂载SD卡区别

如果使用hard SPI(HSPI)接口需要注意以下几点:
  1. 烧写程序前先断开SD卡供电,否则无法进行程序烧录。
  2. 并且SD卡需要在复位或重启后再给SD卡供电。否则ESP32会无限重启。
如果使用soft SPI(VSPI)接口不存在以上问题。
不定义SPI引脚直接使用SD.begin();进行初始化时,默认是VSPI接口。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 以上为验证开发板和SD卡槽模块。
    在这里插入图片描述

   if(!SD.begin()){
    Serial.println("存储卡挂载失败");
    return;
  }

接线说明

HSPI接口接线方式:
		HSPI 
[ESP32 IO26 – CS MICRO SD]
[ESP32 IO14 – MOSI MICRO SD]
[ESP32 IO13 – MISO MICRO SD]
[ESP32 IO27 – SCK MICRO SD]
[ESP32 GND – GND MICRO SD]
[VIN – VCC MICRO SD]


VSPI接口接线方式:
    		VSPI
 * MICROSD CS    -    ESP32 IO5
  MICROSD SCK   -     ESP32 IO18
  MICROSD MOSI  -    ESP32 IO23
  MICROSD MISO   -   ESP32 IO19
  MICROSD Vcc   -      ESP32 VIN
  MICROSD GND   -    ESP32 GND

兼容两种模式下的挂载的示例程序程序

根据不同的需求请对应的宏定义即可。

/*
 如果使用hard SPI(HSPI)接口需要注意以下几点:
 1.烧写程序前先断开SD卡供电,否则无法进行程序烧录。
 2.并且SD卡需要在复位或重启后再给SD卡供电。否则ESP32会无限重启。
 如果使用soft SPI(VSPI)接口不存在以上问题。
 不定义SPI引脚直接使用SD.begin();默认是VSPI接口。
*/

#include <Arduino.h>
//引用SD相关库
#include <SD.h>
#include <FS.h>
#include <SPI.h>
//HSPI接口和VSPI接口二选一
//#define  hspi
#define  vspi
#ifdef vspi
SPIClass sdSPI(VSPI);
#define SD_MISO     19
#define SD_MOSI     23
#define SD_SCLK     18
#define SD_CS       5

#else
SPIClass sdSPI(HSPI);
#define SD_MISO     12
#define SD_MOSI     13
#define SD_SCLK     14
#define SD_CS       15

#endif
void SD_init();
 
void setup()
{
  Serial.begin(115200);
  delay(500);
#ifdef  hspi 
  Serial.println("请插入内存卡");
  delay(12000);
#endif 
  SD_init();//初始化SD函数

}
 
void loop() {
  //打印存储卡信息
  Serial.printf("存储卡总大小是: %lluMB \n", SD.cardSize() / (1024 * 1024)); // "/ (1024 * 1024)"可以换成">> 20"
  Serial.printf("文件系统总大小是: %lluB \n", SD.totalBytes());
  Serial.printf("文件系统已用大小是: %lluB \n", SD.usedBytes());
  delay(5000);
}
 
 
void SD_init() {
  //挂载文件系统
   sdSPI.begin(SD_SCLK, SD_MISO, SD_MOSI, SD_CS);
  if (!SD.begin(SD_CS, sdSPI))
  {
    // if(!SD.begin()){
    Serial.println("存储卡挂载失败");
    return;
  }
  uint8_t cardType = SD.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("挂载了未知存储卡");
  }
}
### ESP32-S3 VSPI 配置及使用教程 #### 1. 硬件连接 为了使ESP32-S3能够通过VSPI接口与外设通信,需按照特定的方式连接引脚。通常情况下,默认的VSPI引脚分配如下表所示[^1]: | 功能 | 默认GPIO | | --- | ------- | | SCLK (串行时钟) | GPIO18 | | MOSI (主机输出/从机输入) | GPIO23 | | MISO (主机输入/从机输出) | GPIO19 | | CS (芯片选择) | 用户自定义 | 对于某些应用,比如连接Micro SD模块到ESP32-S3,可以参照上述表格中的默认设置来完成接线工作[^3]。 #### 2. 初始化SPI总线 初始化VSPI之前要先加载必要的库文件并创建相应的对象实例,在Arduino IDE环境中可以通过下面这段代码实现VSPI的初始化操作: ```cpp #include <SPI.h> // 定义CS针脚编号 #define SD_CS_PIN 5 void setup() { // 开启串口调试功能 Serial.begin(115200); // 设置CS针脚模式为OUTPUT pinMode(SD_CS_PIN, OUTPUT); // 启动SPI通讯协议栈 SPI.begin(); } ``` 此部分代码主要用于设定好SPI的工作参数以及指定哪个GPIO作为片选信号(CS),这里选择了GPIO5作为例子。 #### 3. 使用VSPI传输数据 一旦完成了前面两步的操作,则可以直接利用`SPI.transfer()`函数来进行简单的单字节读写交互;如果涉及到更复杂的命令序列发送或是批量的数据交换,则可能需要用到其他API如`writeBytes()`等。以下是向SD发出指令的一个简单示范程序片段: ```cpp uint8_t command[] = {CMD0, CMD8}; // 假设有两个待发命令 digitalWrite(SD_CS_PIN, LOW); // 拉低CS激活目标设备 for(int i=0; i<sizeof(command)/sizeof(uint8_t); ++i){ SPI.transfer(command[i]); // 发送每一条命令给SD } digitalWrite(SD_CS_PIN, HIGH); // 结束后拉高CS释放总线控制权 ``` 以上过程展示了如何构建一个基本框架去操控基于VSPI接口工作的外围组件,具体的应用场景还需要根据实际需求调整相关细节。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值