MicroSD阅读器导致RFID阅读器失败

时间:2015-10-10 22:48:05

标签: arduino sd-card rfid

我有一个草图运行MFRC522 RFID阅读器工作正常,但我的目的是将卡刷卡记录在microSD卡上。

问题是,只要我添加SD卡读卡器,无论是否初始化,RFID阅读器都会停止工作。 这似乎是SPI总线上的一个问题。我已经尝试在电路中添加上拉电阻并将芯片选择引脚设置为高电平,然后再初始化任何电路板,但似乎没有任何工作。

这是我的代码:

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

// RFID constants & objects
#define RFPin 10
#define resetPin 9
MFRC522 mfrc522(RFPin, resetPin);

// SD constants
#define SDPin 8

// Other global variables
String IDString;
byte IDList[4];

void setup() {
  pinMode(2, OUTPUT);// For testing

  // Set both chip select pins high
  pinMode(SDPin, OUTPUT);
  digitalWrite(SDPin, HIGH);
  pinMode(RFPin, OUTPUT);
  digitalWrite(RFPin, HIGH);
  delay(10);

  // Init serial bus
  Serial.begin(9600);
  // Wait for serial bus to open
  while (!Serial);// Opens even when not USB connected

  // Init SPI bus
  SPI.begin();
  // Initialise RFID board
  mfrc522.PCD_Init();

  delay(1000);// Just in case SPI is still busy

  // Initialise SD card board
  if (!SD.begin(SDPin)) {
    // SD card board failed to initialise
    Serial.println("SD failed");
    return;
  }
}

void loop() {

  // Look for new cards
  if ( ! mfrc522.PICC_IsNewCardPresent()) {
    return;
  }

  // Select one of the cards
  if ( ! mfrc522.PICC_ReadCardSerial()) {
    return;
  }
  for(int i = 0; i < 4; i++) {
    digitalWrite(2, HIGH);
    delay(100);
    digitalWrite(2, LOW);
    delay(100);
  }

  IDString = "";

  // Get 4 byte ID
  for (int i = 0; i < 4; i++) {
    IDList[i] = mfrc522.uid.uidByte[i];
    // Serial.print(IDList[i], HEX);
    if(IDList[i] < 16) {
      IDString += "0" + String(IDList[i], HEX) + "-";
    } else {
      IDString += String(IDList[i], HEX) + "-";
    }
  }
  mfrc522.PICC_HaltA(); // Stop reading
  IDString = IDString.substring(0, IDString.length() - 1);

  Serial.println(IDString);
  .
  .
  .
  Rest of code

一切都初步确定好了但是一旦进入主循环,程序就永远不会超过第一个声明:检查RFID卡是否存在。

有人可以帮忙吗? 这可能是因为RFDI板是3.3V驱动而SD板是5V驱动的(但是有3.3V稳压器)?每个都有自己独立的电源线

编辑#1: 当MicroSD板插入但未通电时,RFID板工作正常 我还尝试添加一个子程序,在每个循环开始时将两个芯片选择引脚拉高,但无济于事。

编辑#2:编辑#2: SD板在这个草图中工作,我可以从中获取卡的详细信息。

编辑#3:编辑#3: 一旦从SD板上移除MISO线,RFID卡就会再次工作。 显然SD模块没有发布MISO线......

1 个答案:

答案 0 :(得分:0)

这不是最优雅的解决方案,但我现在通过在SD板的MISO输出和MISO线之间连接一个NPN晶体管到引脚12来实现它。它需要另外一个引脚来阻止/解除阻塞SD板使用的MISO线,但它可以工作。

正如我所说,这不优雅,我仍然渴望听到更好的解决方案。