You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32在第二SPI总线添加Micro SD卡读卡器的问题求助

ESP32同时驱动RFID-RC522与SD卡适配器(SPI)解决方案

ESP32支持多SPI主机,你可以选择共享同一SPI总线(节省引脚)或使用独立的HSPI总线两种方案,以下是具体实现步骤:

一、硬件接线方案

方案1:共享VSPI总线(推荐)

两个设备共用SCK/MOSI/MISO引脚,仅通过独立的CS引脚区分:

  • RFID-RC522 接线:
    • SCK → GPIO18(VSPI SCK)
    • MOSI → GPIO23(VSPI MOSI)
    • MISO → GPIO19(VSPI MISO)
    • CS → GPIO5(可自定义,需与SD卡CS不同)
    • RST → GPIO2(可选,部分模块需此引脚复位)
    • VCC → 3.3V(RC522禁止接5V)
    • GND → GND
  • SD卡适配器 接线:
    • SCK → GPIO18(与RFID共用)
    • MOSI → GPIO23(与RFID共用)
    • MISO → GPIO19(与RFID共用)
    • CS → GPIO4(独立CS引脚,不可与RFID的CS重复)
    • VCC → 3.3V(多数适配器支持,若识别失败可尝试5V)
    • GND → GND

方案2:独立HSPI总线(避免干扰)

保持RFID原VSPI接线,SD卡使用HSPI总线:

  • SD卡适配器 接线:
    • SCK → GPIO14(HSPI SCK)
    • MOSI → GPIO13(HSPI MOSI)
    • MISO → GPIO12(HSPI MISO)
    • CS → GPIO27(可自定义)
    • VCC → 3.3V/5V
    • GND → GND

二、代码实现示例(Arduino框架)

方案1:共享VSPI总线代码

#include <SPI.h>
#include <MFRC522.h>
#include <SD.h>

// RFID配置
#define RST_PIN         2
#define SS_RFID_PIN     5
MFRC522 mfrc522(SS_RFID_PIN, RST_PIN);

// SD卡配置
#define SS_SD_PIN       4
File mp3File;

void setup() {
  Serial.begin(115200);
  
  // 初始化VSPI总线(两个设备共用)
  SPI.begin();
  
  // 初始化RFID
  mfrc522.PCD_Init();
  Serial.println("RFID模块初始化完成");
  
  // 初始化SD卡,指定独立CS引脚
  if (!SD.begin(SS_SD_PIN)) {
    Serial.println("SD卡初始化失败,请检查接线或卡的格式");
    while (1); // 暂停程序排查问题
  }
  Serial.println("SD卡初始化成功");
}

void loop() {
  // 检测RFID卡
  if (mfrc522.PICC_IsNewCardPresent() && mfrc522.PICC_ReadCardSerial()) {
    // 将UID转换为字符串作为MP3文件名
    String uidStr = "";
    for (byte i = 0; i < mfrc522.uid.size; i++) {
      uidStr += String(mfrc522.uid.uidByte[i], HEX);
    }
    uidStr.toUpperCase();
    Serial.print("扫描到UID: ");
    Serial.println(uidStr);
    
    // 拼接MP3文件路径
    String mp3Path = "/" + uidStr + ".mp3";
    
    // 打开并处理MP3文件
    mp3File = SD.open(mp3Path);
    if (mp3File) {
      Serial.print("成功打开文件: ");
      Serial.println(mp3Path);
      // 此处添加MP3播放逻辑(需根据你的音频输出硬件调整,比如VS1053模块播放)
      // 示例:读取文件字节(实际播放需对接音频驱动)
      while (mp3File.available()) {
        byte audioData = mp3File.read();
        // 输出到音频模块
      }
      mp3File.close();
    } else {
      Serial.print("未找到对应文件: ");
      Serial.println(mp3Path);
    }
    
    // 停止RFID读取
    mfrc522.PICC_HaltA();
    mfrc522.PCD_StopCrypto1();
  }
}

方案2:独立HSPI总线代码

若共享总线出现干扰,可使用HSPI单独驱动SD卡:

#include <SPI.h>
#include <MFRC522.h>
#include <SD.h>

// RFID配置(保持原VSPI接线)
#define RST_PIN         2
#define SS_RFID_PIN     5
MFRC522 mfrc522(SS_RFID_PIN, RST_PIN);

// HSPI配置SD卡
SPIClass hspi(HSPI);
#define SS_SD_PIN       27
File mp3File;

void setup() {
  Serial.begin(115200);
  
  // 初始化VSPI(RFID用)
  SPI.begin();
  mfrc522.PCD_Init();
  Serial.println("RFID模块初始化完成");
  
  // 初始化HSPI(SD卡用),参数顺序:SCK, MISO, MOSI, CS
  hspi.begin(14, 12, 13, SS_SD_PIN);
  
  // 用HSPI初始化SD卡
  if (!SD.begin(SS_SD_PIN, hspi)) {
    Serial.println("SD卡初始化失败");
    while (1);
  }
  Serial.println("SD卡初始化成功");
}

// loop函数与方案1一致,此处省略

三、关键注意事项

  • 电压匹配:RC522必须接3.3V,接5V会烧毁;SD卡适配器优先试3.3V,部分兼容5V。
  • CS引脚唯一性:两个设备的CS引脚必须是不同的GPIO,且代码中要正确指定。
  • SD卡格式:必须为FAT32格式,容量建议32G以内(部分老模块不支持大容量卡)。
  • 抗干扰:SPI总线对线材敏感,尽量使用短杜邦线,避免与电源线并行。

四、排查步骤

  1. 单独测试SD卡:先断开RFID,运行SD卡读写测试代码,确认SD卡本身和接线正常。
  2. 检查引脚映射:确认ESP32的GPIO引脚功能,避免使用有特殊功能的引脚(如GPIO0、GPIO1用于烧录)。
  3. 调试串口输出:通过Serial.println输出初始化状态和错误信息,定位问题节点。

内容的提问来源于stack exchange,提问作者Boguz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 10:03:35