RC522是一款应用于 13.56MHz 频段的高集成度非接触式读写芯片,是学习RFID应用的首选。其通讯接口支持SPI、I2C 和 UART。按照我学习的理解,它相当于一个单片机系统,一方面它通过SPI、I2C 和 UART接口和外部上位机单片机系统通讯,通过接口接收指令及像外部设备收发数据。另一方面它通过射频方式与另外一套单片机系统(也就是射频卡,例如常见的门禁卡)无线通讯。因此大体上学习RC522需要学习两块儿知识:RC522的知识和射频卡知识。
门禁卡平时是处于无电状态,在需要工作时,靠近RC522系统,通过电磁转换原理,从RC522所在设备产生的无线电获取工作电源,启动工作,同时通过无线通讯完成卡与RC522上位系统之间的数据通讯。

在进一步学习RC522只是之前,我准备在Arduino下使用库函数,做一次简单的测试。开发板使用合宙ESP32C3,RC522使用网上常见的那种SPI接口的模块,电路连接如下:

Arduino下需要安装MFRC522v2库。测试代码如下:
#include <MFRC522v2.h>
#include <MFRC522DriverSPI.h>
#include <MFRC522DriverPinSimple.h>
#include <MFRC522Debug.h>
// 定义引脚 (与硬件连接一致)
#define SCK_PIN 4
#define MISO_PIN 5
#define MOSI_PIN 6
#define SS_PIN 7 // SDA
#define RST_PIN 8
// 初始化 SPI 驱动
MFRC522DriverPinSimple rst_pin(RST_PIN);
MFRC522DriverPinSimple ss_pin(SS_PIN);
MFRC522DriverSPI driver{ss_pin};
MFRC522 mfrc522{driver};
void setup() {
Serial.begin(115200);
SPI.begin(SCK_PIN, MISO_PIN, MOSI_PIN, SS_PIN); // 明确指定 SPI 引脚
mfrc522.PCD_Init();
delay(1000);
Serial.println("Ready to read card...");
}
void loop() {
// 检测新卡并读取序列号
if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
return;
}
// 打印 UID
Serial.print("Card UID: ");
for (byte i = 0; i < mfrc522.uid.size; i++) {
if (mfrc522.uid.uidByte[i] < 0x10) Serial.print("0");
Serial.print(mfrc522.uid.uidByte[i], HEX);
}
Serial.println();
// 停止与当前卡的通信
mfrc522.PICC_HaltA();
mfrc522.PCD_StopCrypto1();
}这块处理程序是最简单的读取射频卡的ID。上电启动后,将射频卡靠近感应区,计算机串口会输出ID信息。

我要赚赏金
