Using a RFID-RC522 board with an RP2040 chip and the Arduino IDE

Hello!

I recently bought a RFID-RC522 board off of Amazon, and am currently trying to get it to work with an NFC tag with the Raspberry Pi Pico W (RP2040 chip) and the Arduino IDE.

After following multiple online tutorials, I have come to the conclusion that my board is either not correctly connected, or the libraries I am using don't work on the RP2040 chip series.

Using the MFRC522 library, the following message is displayed in the console:

WARNING: library MFRC522 claims to run on avr, megaavr, STM32F1, teensy, esp8266, esp32, samd, atmelsam architecture(s) and may be incompatible with your current board which runs on rp2040 architecture(s).

Here is some code that I have tried. Note that in both attempts shown below, nothing is printed in the serial monitor.

Code sample 1
/*
 * Created by ArduinoGetStarted.com
 *
 * This example code is in the public domain
 *
 * Tutorial page: https://arduinogetstarted.com/tutorials/arduino-rfid-nfc
 */

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

#define SS_PIN 1
#define RST_PIN 0

MFRC522 rfid(SS_PIN, RST_PIN);

void setup() {
  Serial.begin(9600);
  SPI.begin(); // init SPI bus
  rfid.PCD_Init(); // init MFRC522

  Serial.println("Tap RFID/NFC Tag on reader");
}

void loop() {
  if (rfid.PICC_IsNewCardPresent()) { // new tag is available
    if (rfid.PICC_ReadCardSerial()) { // NUID has been readed
      MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
      //Serial.print("RFID/NFC Tag Type: ");
      //Serial.println(rfid.PICC_GetTypeName(piccType));

      // print NUID in Serial Monitor in the hex format
      Serial.print("UID:");
      for (int i = 0; i < rfid.uid.size; i++) {
        Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
        Serial.print(rfid.uid.uidByte[i], HEX);
      }
      Serial.println();

      rfid.PICC_HaltA(); // halt PICC
      rfid.PCD_StopCrypto1(); // stop encryption on PCD
    }
  }
}


Code sample 2
/*
 * --------------------------------------------------------------------------------------------------------------------
 * Example sketch/program showing how to read data from a PICC to serial.
 * --------------------------------------------------------------------------------------------------------------------
 * This is a MFRC522 library example; for further details and other examples see: https://github.com/miguelbalboa/rfid
 * 
 * Example sketch/program showing how to read data from a PICC (that is: a RFID Tag or Card) using a MFRC522 based RFID
 * Reader on the Arduino SPI interface.
 * 
 * When the Arduino and the MFRC522 module are connected (see the pin layout below), load this sketch into Arduino IDE
 * then verify/compile and upload it. To see the output: use Tools, Serial Monitor of the IDE (hit Ctrl+Shft+M). When
 * you present a PICC (that is: a RFID Tag or Card) at reading distance of the MFRC522 Reader/PCD, the serial output
 * will show the ID/UID, type and any data blocks it can read. Note: you may see "Timeout in communication" messages
 * when removing the PICC from reading distance too early.
 * 
 * If your reader supports it, this sketch/program will read all the PICCs presented (that is: multiple tag reading).
 * So if you stack two or more PICCs on top of each other and present them to the reader, it will first output all
 * details of the first and then the next PICC. Note that this may take some time as all data blocks are dumped, so
 * keep the PICCs at reading distance until complete.
 * 
 * @license Released into the public domain.
 * 
 * Typical pin layout used:
 * -----------------------------------------------------------------------------------------
 *             MFRC522      Arduino       Arduino   Arduino    Arduino          Arduino
 *             Reader/PCD   Uno/101       Mega      Nano v3    Leonardo/Micro   Pro Micro
 * Signal      Pin          Pin           Pin       Pin        Pin              Pin
 * -----------------------------------------------------------------------------------------
 * RST/Reset   RST          9             5         D9         RESET/ICSP-5     RST
 * SPI SS      SDA(SS)      10            53        D10        10               10
 * SPI MOSI    MOSI         11 / ICSP-4   51        D11        ICSP-4           16
 * SPI MISO    MISO         12 / ICSP-1   50        D12        ICSP-1           14
 * SPI SCK     SCK          13 / ICSP-3   52        D13        ICSP-3           15
 *
 * More pin layouts for other boards can be found here: https://github.com/miguelbalboa/rfid#pin-layout
 */

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

#define RST_PIN         0          // Configurable, see typical pin layout above
#define SS_PIN          1         // Configurable, see typical pin layout above

MFRC522 mfrc522(SS_PIN, RST_PIN);  // Create MFRC522 instance

void setup() {
	Serial.begin(9600);		// Initialize serial communications with the PC
	while (!Serial);		// Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4)
	SPI.begin();			// Init SPI bus
	mfrc522.PCD_Init();		// Init MFRC522
	delay(4);				// Optional delay. Some board do need more time after init to be ready, see Readme
	mfrc522.PCD_DumpVersionToSerial();	// Show details of PCD - MFRC522 Card Reader details
	Serial.println(F("Scan PICC to see UID, SAK, type, and data blocks..."));
}

void loop() {
	// Reset the loop if no new card present on the sensor/reader. This saves the entire process when idle.
	if ( ! mfrc522.PICC_IsNewCardPresent()) {
		return;
	}

	// Select one of the cards
	if ( ! mfrc522.PICC_ReadCardSerial()) {
		return;
	}

	// Dump debug info about the card; PICC_HaltA() is automatically called
	mfrc522.PICC_DumpToSerial(&(mfrc522.uid));
}


My board is connected as follows:

RC522 PIN # GPIO #
SDA 2 1
SCK 4 2
MOSI 5 3
MISO 6 4
RIQ 21 16
GND 38 --
RST 1 0
3.3v 36 --

Is there a different library I need to use? Did I connect my board incorrectly?

Thank you in advance for any assistance you can offer!

I am having the exact same problem right now. Did you find a solution?

I believe this code works, not sure though. Been a few months since I've messed with it.

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

#define SS_PIN 1
#define RST_PIN 0

MFRC522 rfid(SS_PIN, RST_PIN);

void setup() {
  Serial.begin(9600);
  SPI.begin(); // init SPI bus
  rfid.PCD_Init(); // init MFRC522

  Serial.println("Tap RFID/NFC Tag on reader");
}

void loop() {
  if (rfid.PICC_IsNewCardPresent()) { // new tag is available
    if (rfid.PICC_ReadCardSerial()) { // NUID has been readed
      MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);
      //Serial.print("RFID/NFC Tag Type: ");
      //Serial.println(rfid.PICC_GetTypeName(piccType));

      // print NUID in Serial Monitor in the hex format
      Serial.print("UID:");
      for (int i = 0; i < rfid.uid.size; i++) {
        Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
        Serial.print(rfid.uid.uidByte[i], HEX);
      }
      Serial.println();

      rfid.PICC_HaltA(); // halt PICC
      rfid.PCD_StopCrypto1(); // stop encryption on PCD
    }
  }
}

After 4 hours of pulling my hair out I got it to work on Adafruit's Feather RP2040 after I failed to get the Feather M0 and 32u4 to work... It's not exactly the Raspberry Pi Pico, but it has the same chip.

Here is the pinout diagram of the board I am using: Adafruit Learning System

I used the DumpInfo.ino sketch found on the MFRC522 Library Example.

Here are the pins I used:

RST 11
SS 8 (Note that the pin number on the board is 6, but keep it as 8 in the code)
SCK 18 (Already labeled on the board)
MOSI 19 (Already labeled on the board)
MISO 20 (Already labeled on the board)

Again, I know I didn't use the same board, but I feel like it is good news that it does work on the RP2040 chip.

I looked at a pinout of the Raspberry Pi Pico here: Pico-R3-A4-Pinout.pdf (raspberrypi.com)

I would use the same pins I did in the code and just make sure you wire the board correctly since the labeled pins on the board don't match the GPIO pin.

(Pin Name - Physical Pin Location - Pin Number for code)
RST - Pin 15 - GPIO 11
SS - Pin 11 - GPIO 8
SCK - Pin 24 - GPIO 18
MOSI - Pin 25 - GPIO 19
MISO - Pin 26 - GPIO 20

Hopefully this at least helps point you in the right direction if I guessed wrong.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.