#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 14 //12 // 配置RFID模块的RST引脚
#define SS_PIN 27 //5 // 配置RFID模块的SS(或SDA)引脚
#define SCK_PIN 26
#define MISO_PIN 15
#define MOSI_PIN 25
MFRC522 rfid(SS_PIN, RST_PIN); // 创建一个MFRC522实例
// RFID卡片的扇区密钥(通常为6个字节)
// 注意:这是一个示例密钥,你需要使用你自己的密钥或卡片的默认密钥
byte sectorKeyA[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
void setup() {
Serial.begin(115200); // 初始化串口通信以供调试
//SPI.begin(18, 19, 23, 5);; // 初始化SPI总线
SPI.begin(SCK_PIN, MISO_PIN, MOSI_PIN, SS_PIN);; // 初始化SPI总线
rfid.PCD_Init(); // 初始化MFRC522
Serial.println("RFID Reader Ready!");
}
/*
void loop() {
// 查找RFID卡片
if (rfid.PICC_IsNewCardPresent()) {
Serial.println("Card detected!");
// 验证RFID卡片并选择一张卡
if (rfid.PICC_ReadCardSerial()) {
// 打印卡片UID
Serial.print("Card UID:");
for (uint8_t i = 0; i < rfid.uid.size; i++) {
Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
Serial.print(rfid.uid.uidByte[i], HEX);
}
Serial.println("");
// 认证卡片扇区(这里以扇区4为例,块地址为16)
uint8_t blockAddr = 16; // 扇区4的第一个块
if (rfid.PCD_Auth(MFRC522::PICC_AUTHENT1A, blockAddr, sectorKeyA, rfid.uid) == MFRC522::MI_OK) {
Serial.println("Authentication successful!");
// 写入数据到卡片(写入前确保已经认证成功)
byte dataWrite[16] = {0x01, 0x02, 0x03, 0x04, // 数据块内容(16个字节)
0x05, 0x06, 0x07, 0x08,
0x09, 0x0A, 0x0B, 0x0C,
0x0D, 0xE, 0x0F, 0x00};
rfid.PCD_Write(blockAddr, dataWrite);
Serial.println("Data written to card!");
// 从卡片读取数据(读取前确保已经认证成功)
byte dataRead[16];
if (rfid.PCD_Read(blockAddr, dataRead) == MFRC522::MI_OK) {
Serial.println("Data read from card:");
for (uint8_t i = 0; i < 16; i++) {
Serial.print(dataRead[i] < 0x10 ? " 0" : " ");
Serial.print(dataRead[i], HEX);
}
Serial.println("");
} else {
Serial.println("Error reading data from card!");
}
} else {
Serial.println("Authentication failed!");
}
}
rfid.PICC_HaltA(); // 停止与当前卡片的通信
}
delay(1000); // 等待一段时间再次检查卡片
}
*/
void loop() {
// 查找RFID卡片
if (rfid.PICC_IsNewCardPresent()) {
Serial.println("Card detected!");
// 验证RFID卡片并选择一张卡
if (rfid.PICC_ReadCardSerial()) {
Serial.print("Card UID:");
for (uint8_t 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(); // 停止加密操作(如果需要)
// rfid.PCD_Auth(rfid.PICC_AUTHENT1A, blockAddr, sectorKeyA, serNum); // 认证卡片扇区
// rfid.PCD_Write(blockAddr, data); // 写入数据到卡片
// rfid.PCD_Read(blockAddr, data); // 从卡片读取数据
}
rfid.PICC_HaltA(); // 停止与当前卡片的通信,以便其他卡片可以接近读卡器
}
delay(1000); // 等待一段时间再次检查卡片
}