单片机esp32 s3+RFID RC522读写标签


Esp32 S3接线:
RDID-RC522的SDA -> esp32-s3的引脚10
RDID-RC522的SCK -> esp32-s3的引脚12
RDID-RC522的MOSI -> esp32-s3的引脚11
RDID-RC522的MISO -> esp32-s3的引脚13
RDID-RC522的GUN -> esp32-s3的引脚GUN
RDID-RC522的RST -> esp32-s3的引脚46
RDID-RC522的3.3V -> esp32-s3的引脚3.3V
单片机esp32代码:
#include <MFRC522.h>
#include <SPI.h>
#define SS_PIN 10 //SDA引脚
#define RST_PIN 46 //RST(复位信号), 任意一个可用的引脚即可
#define SCK_PIN 12 //SCK(时钟接口)
#define MOSI_PIN 11 //MOSI(SPI 接口主出从入)
#define MISO_PIN 13 //MISO(SPI 接口主入从出)
MFRC522 mfrc522(SS_PIN, RST_PIN);
MFRC522::MIFARE_Key key;
void setup() {
Serial.begin(115200); //开启串口打印信息
while (!Serial); //等待串口打开
SPI.begin(SCK_PIN, MISO_PIN, MOSI_PIN, SS_PIN); //开启SPI总线通信
mfrc522.PCD_Init(); //初始化MFRC522模块
//设置密钥全部为0xFF,卡片默认全部是0xFF
for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF;
}
}
void loop() {
//等待串口发送消息
if (Serial.available() > 0) {
//读取一个字节
int command = Serial.read();
//检测是否有卡并且读取卡片
if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
Serial.println("no card!");
return;
}
//打印卡的UID
Serial.print(F("Card UID:"));
dump_byte_array(mfrc522.uid.uidByte, mfrc522.uid.size);
Serial.println();
//打印卡的类型
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("This sample only works with MIFARE Classic cards."));
return;
}
//读取第四个块的数据,每个扇区由 4 个数据块 组成
byte blockAddr = 4;
//认证第四个数据块
byte trailerBlock = 4;
MFRC522::StatusCode status;
//保存读取的数据
byte buffer[18];
byte size = sizeof(buffer);
//写入的数据
byte dataBlock[] = {
0x01, 0x02, 0x03, 0x04, // 1, 2, 3, 4,
0x05, 0x06, 0x07, 0x08, // 5, 6, 7, 8,
0x09, 0x0a, 0xff, 0x0b, // 9, 10, 255, 11,
0x0c, 0x0d, 0x0e, 0x0f // 12, 13, 14, 15
};
//认证Key A
status = (MFRC522::StatusCode)mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_A, trailerBlock, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed(A): "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
//读取数据库
status = (MFRC522::StatusCode)mfrc522.MIFARE_Read(blockAddr, buffer, &size);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Read() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
}
Serial.print(F("Read Data in block :"));
dump_byte_array(buffer, 16);
Serial.println();
//认证Key B
status = (MFRC522::StatusCode)mfrc522.PCD_Authenticate(MFRC522::PICC_CMD_MF_AUTH_KEY_B, trailerBlock, &key, &(mfrc522.uid));
if (status != MFRC522::STATUS_OK) {
Serial.print(F("PCD_Authenticate() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
return;
}
//打印写入数据
Serial.print(F("Write Data in block :"));
dump_byte_array(dataBlock, 16);
Serial.println();
//写入数据
status = (MFRC522::StatusCode)mfrc522.MIFARE_Write(blockAddr, dataBlock, 16);
if (status != MFRC522::STATUS_OK) {
Serial.print(F("MIFARE_Write() failed: "));
Serial.println(mfrc522.GetStatusCodeName(status));
}
//停止卡片通信
mfrc522.PICC_HaltA();
//停止卡片加密通信
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);
}
}
