感知节点@8@ ESP32+arduino+ 第六个程序 读取射频卡卡号
一、硬件与接线
1.1 RFID RC552

MFRC522简化功能框图:
先从RC522功能框图入手,可以从大方向上理解通讯原理。

上述主机一般指的就是手上的开发板,通信接口对应天线,MFRC522与主机通讯支持UART、SPI以及IIC,本人采用SPI通讯方式。
MFRC522与主机SPI通讯引脚配置:

1.2 NodeMCU-32S 引脚图( 基于ESP32-32S 模组设计的一款较为经典的ESP32开发板)

1.3 ESP32-WROOM-32 引脚图

1.4 引脚接线
// 接线 // ESP32开发板 RC522模块 // GPIO15 SDA // GPIO18 SCK // GPIO23 MOSI // GPIO19 MISO // 无 IRQ // GND GND // GPIO4 RST // VCC 3.3V
二、电子标签的存储数据及操作程序
2.1 MIFARE Classic 1K 基本规格
S50卡,又称Mifare 1K,是NXP公司基于MF1 IC S50芯片研发的非接触智能卡,属于MIFARE Classic EV1系列产品。该卡符合ISO14443A标准,工作频率为13.56MHz,存储容量为1K Bytes(8Kbit),支持4或7字节唯一UID识别,主要应用于门禁、公共交通代币卡、电子门票及物流管理等领域。
M1卡存储器,分为16个扇区,每个扇区对应4块(块0-块3),共64块,编号为0-63。

第0扇区的第0块用于存放厂商代码,已经固化无法更改。其余区的第0-2块用于存放数据,块3为控制块用于存放密码A、存取控制、密码B。
块3结构举例如下:
A0 A1 A2 A3 A4 A5 FF 07 80 69 B0 B1 B2 B3 B4 B5
(密码A 6字节) (存储控制 4字节) (密码B 6字节)
举例如下:

2.2 读取S50卡(Mifare 1K)内的存储数据
2.2.1 安装 arduino的库

2.2.2 文件-示例-MFRC522-DumpInfo程序-修改-执行

程序运行,串口打印 S50卡信息。

2.2.3 复杂程序,读取并打印卡序列号
#include <SPI.h> #include <MFRC522.h> // 接线 // ESP32开发板 RC522模块 // GPIO15 SDA // GPIO18 SCK // GPIO23 MOSI // GPIO19 MISO // 无 IRQ // GND GND // GPIO4 RST // VCC 3.3V #define RST_PIN 4 // D1 #define SS_PIN 15 // D2 MFRC522 mfrc522(SS_PIN, RST_PIN); // 创建新的RFID实例 MFRC522::MIFARE_Key key; void setup() { Serial.begin(115200); // 设置串口波特率为9600 SPI.begin(); // SPI开始 mfrc522.PCD_Init(); // 初始化MFRC522卡 Serial.println("初始化完成..."); // 初始化密钥 for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; } } void loop() { // 寻找新卡 if (!mfrc522.PICC_IsNewCardPresent()) { //Serial.println("没有找到卡"); return; } // 选择一张卡 if (!mfrc522.PICC_ReadCardSerial()) { Serial.println("没有卡可选"); return; } // 显示卡片的详细信息 Serial.print(F("卡片 UID(十六进制):")); dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size); String uidStr = ""; Serial.println(); for (int i = 0; i < sizeof(mfrc522.uid.uidByte); i++) { // 将每个16进制数转换为两位数的字符串 char hexStr[3]; sprintf(hexStr, "%02X", mfrc522.uid.uidByte[i]); uidStr += hexStr; } Serial.print(F("卡片字符串:")); Serial.println(uidStr); Serial.print(F("卡片 UID(十进制):")); // dump_byte_array_dec(mfrc522.uid.uidByte, mfrc522.uid.size); Serial.println(); Serial.print(F("卡片类型: ")); MFRC522::PICC_Type piccType = mfrc522.PICC_GetType(mfrc522.uid.sak); // Serial.println(mfrc522.PICC_GetTypeName(piccType)); // 检查兼容性 if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI && piccType != MFRC522::PICC_TYPE_MIFARE_1K && piccType != MFRC522::PICC_TYPE_MIFARE_4K) { Serial.println(F("仅仅适合Mifare Classic卡的读写")); return; } // 进行身份验证 byte blockAddr = 1; // 选择要读取的块地址 MFRC522::StatusCode status = mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, blockAddr, &key, &(mfrc522.uid)); if (status != MFRC522::STATUS_OK) { Serial.print(F("身份验证失败?或者是卡链接失败: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } // 读取数据 byte buffer[18]; byte size = sizeof(buffer); status = mfrc522.MIFARE_Read(blockAddr, buffer, &size); if (status != MFRC522::STATUS_OK) { Serial.print(F("读取失败: ")); Serial.println(mfrc522.GetStatusCodeName(status)); return; } // 停止 PICC mfrc522.PICC_HaltA(); // 停止加密 PCD mfrc522.PCD_StopCrypto1(); } /** 将字节数组转储为串行的十六进制值 */ void dump_byte_array(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer[i] < 0x10 ? " 0" : " "); Serial.print(buffer[i], HEX); } } /** 将字节数组转储为串行的十进制值 */ void dump_byte_array_dec(byte *buffer, byte bufferSize) { for (byte i = 0; i < bufferSize; i++) { Serial.print(buffer[i] < 10 ? " 0" : " "); Serial.print(buffer[i], DEC); } }
2.2.4 简化程序,读取并打印卡序列号
#include <SPI.h> #include <MFRC522.h> #define RST_PIN 4 // 复位引脚 #define SS_PIN 15 // 片选引脚 // 初始化 MFRC522 mfrc522(SS_PIN, RST_PIN); void setup() { Serial.begin(115200); SPI.begin(); mfrc522.PCD_Init(); Serial.println("RFID读卡器初始化完成,请刷卡..."); } // 无限循环 void loop() { // 检测新卡 if (!mfrc522.PICC_IsNewCardPresent()) return; // 读取卡序列号 if (!mfrc522.PICC_ReadCardSerial()) return; // 打印卡号(十六进制)长度是4个bytes Serial.print("CardID(HEX): "); for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); } Serial.println(); // 停止操作 mfrc522.PICC_HaltA(); mfrc522.PCD_StopCrypto1(); }

浙公网安备 33010602011771号