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总线对线材敏感,尽量使用短杜邦线,避免与电源线并行。
四、排查步骤
- 单独测试SD卡:先断开RFID,运行SD卡读写测试代码,确认SD卡本身和接线正常。
- 检查引脚映射:确认ESP32的GPIO引脚功能,避免使用有特殊功能的引脚(如GPIO0、GPIO1用于烧录)。
- 调试串口输出:通过Serial.println输出初始化状态和错误信息,定位问题节点。
内容的提问来源于stack exchange,提问作者Boguz
相关产品推荐
相关产品推荐

