0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

ESP32驱动MFRC522 RFID模块读写IC卡数据

jf_88434166 来源:jf_88434166 作者:jf_88434166 2025-05-28 15:52 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

前言

RFID是Radio-Fequency Identification射频识别的缩写。RFID使用电磁场在短距离内传输数据,它可用于人员识别、刷卡交易,商品的电子标签等。工作原理为,ID磁卡进入到磁场后,接受读写器发出的射频信号,凭借感应电流所获得的能量发送出存储在芯片中的产品信息,读写器读取到信息并解码后,送至处理单元进行数据处理。

MFRC522是高度集成的非接触式( 13.56MHz)读写卡芯片。此发送模块利用调制和解调的原理,并将它们完全集成到各种非接触式通信方法和协议中(13.56MHz)。

MFRC522的内部发送器部分可驱动读写器天线与ISO 14443A/MIFARE卡和应答机的通信,无需其它的电路。接收器部分提供一个功能强大和高效的解调和译码电路,用来处理兼容ISO 14443A/MIFARE的卡和应答机的信号。通信距离可达50mm,取决于天线的长度和调谐。数字电路部分处理完整的ISO 14443A帧和错误检测(奇偶&CRC)。

  • 支持MIFARE标准器件,如S50、S70,UID卡,
  • 支持MIFARE Classic加密。
  • 支持MIFARE更高速的非接触式通信,双向数据传输速率高达424kbit/s。
  • 内部64字节的发送和接收FIFO缓冲区。
  • 10Mbit/s的SPI接口
  • I2C接口,快速模式的速率为400kbit/s,高速模式的速率为3400kbit/s
  • 串行UART,传输速率高达1228.8kbit/s, 帧取决于RS232接口,电压电平取决于提供的管脚电压

本文将介绍ESP32开发板驱动MFRC522 RFID模块,读取RFID卡原始数据、获取RFID卡的UID,并将个人数据添加到RFID卡中。

ESP32开发板与MFRC522模块接线

下图为SPI通信接线图
在这里插入图片描述

ESP32MFRC522
GPIO5SDA引脚作为SPI通信时的CS片选
GPIO18SCK
GPIO23MOSI
GPIO19MISO
不接IRQ
GNDGND
GPIO21RST
3V33.3V

读取S50 IC白卡与S50 IC钥匙卡扣原始数据

Arduino IDE中安装RFID_MFRCC522驱动库
在这里插入图片描述

#include < MFRC522v2.h >
#include < MFRC522DriverSPI.h >
//#include < MFRC522DriverI2C.h >
#include < MFRC522DriverPinSimple.h >
#include < MFRC522Debug.h >

// Learn more about using SPI/I2C or check the pin assigment for your board: https://github.com/OSSLibraries/Arduino_MFRC522v2#pin-layout
MFRC522DriverPinSimple ss_pin(5);

MFRC522DriverSPI driver{ss_pin}; // Create SPI driver
//MFRC522DriverI2C driver{};     // Create I2C driver
MFRC522 mfrc522{driver};         // Create MFRC522 instance

void setup() {
  Serial.begin(115200);  // Initialize serial communication
  while (!Serial);       // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4).
  
  mfrc522.PCD_Init();    // Init MFRC522 board.
  MFRC522Debug::PCD_DumpVersionToSerial(mfrc522, Serial);	// 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.
  MFRC522Debug::PICC_DumpToSerial(mfrc522, Serial, &(mfrc522.uid));

  delay(2000);
}

程序中PICC表示IC卡(proximity integrated circuit cards)
PCD表示读写模块MFRC522(proximity coupling device)
编译上传程序到ESP32开发板 ,打开串口打印,把IC卡靠近MFRC522读写模块,可在串口上打印出IC内存储的数据
在这里插入图片描述
在这里插入图片描述
从串口打印出的信息可知道
IC卡的存储分布结构划分为16个(0-15)扇区,每个扇区包含4个(0-3)存储块,每个存储块包含16个字节的存储(0-15)

扇区0上的存储块0存储着IC卡的出厂信息,第0-4字节为UUID(如43 17 EE 05),一个校验字节,剩余的为出厂写入的数据。存储块0为只读模式,一般不可更改(部分克隆卡可修改)。

每个扇区的前3个存储块可用于存储数据,每个扇区的最后一个存储块为扇区尾块Sector Trailer。
每个扇区尾块固定为 16字节,其数据结构如下:

0~5 Key A(6字节),扇区的第一个访问密钥(默认通常为 FF FF FF FF FF FF 或厂商预设值)。

6~8 Access Bits(4字节),存储该扇区的访问权限控制位(实际只用了3字节,第9字节为备用)。

10~15 Key B(6字节),扇区的第二个访问密钥(可选,部分应用可能不用或与Key A相同)。

每个扇区的最后一个块是安全核心,决定了该扇区的访问规则。操作时务必谨慎,建议先读取并备份原始数据(需密钥验证),再尝试修改。

IC卡的类型为MIFARE 1KB 用户可用的净存储容量为:
16扇区 X 3存储块 X 16字节 - 16字节=752字节

UID为 43 17 EE 05 不同的卡的UID会不一样

读写用户数据到指定的存储块

#include < MFRC522v2.h >
#include < MFRC522DriverSPI.h >
//#include < MFRC522DriverI2C.h >
#include < MFRC522DriverPinSimple.h >
#include < MFRC522Debug.h >

// Learn more about using SPI/I2C or check the pin assigment for your board: https://github.com/OSSLibraries/Arduino_MFRC522v2#pin-layout
MFRC522DriverPinSimple ss_pin(5);

MFRC522DriverSPI driver{ss_pin}; // Create SPI driver
//MFRC522DriverI2C driver{};     // Create I2C driver
MFRC522 mfrc522{driver};         // Create MFRC522 instance

MFRC522::MIFARE_Key key;

byte blockAddress = 2;
byte newBlockData[17] = {"www.yourcee.com"};
//byte newBlockData[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};   // CLEAR DATA
byte bufferblocksize = 18;
byte blockDataRead[18];

void setup() {
  Serial.begin(115200);  // Initialize serial communication
  while (!Serial);       // Do nothing if no serial port is opened (added for Arduinos based on ATMEGA32U4).
  
  mfrc522.PCD_Init();    // Init MFRC522 board.
  Serial.println(F("Warning: this example overwrites a block in your card, use with care!"));
 
  // Prepare key - all keys are set to FFFFFFFFFFFF at chip delivery from the factory.
  for (byte i = 0; i < 6; i++) {
    key.keyByte[i] = 0xFF;
  }
}

void loop() {
  // Check if a new card is present
  if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
    delay(500);
    return;
  }

  // Display card UID
  Serial.print("----------------nCard UID: ");
  MFRC522Debug::PrintUID(Serial, (mfrc522.uid));
  Serial.println();

  // Authenticate the specified block using KEY_A = 0x60
  if (mfrc522.PCD_Authenticate(0x60, blockAddress, &key, &(mfrc522.uid)) != 0) {
    Serial.println("Authentication failed.");
    return;
  }
  
  // Write data to the specified block
  if (mfrc522.MIFARE_Write(blockAddress, newBlockData, 16) != 0) {
    Serial.println("Write failed.");
  } else {
    Serial.print("Data written successfully in block: ");
    Serial.println(blockAddress);
  }

  // Authenticate the specified block using KEY_A = 0x60
  if (mfrc522.PCD_Authenticate(0x60, blockAddress, &key, &(mfrc522.uid)) != 0) {
    Serial.println("Authentication failed.");
    return;
  }

  // Read data from the specified block
  if (mfrc522.MIFARE_Read(blockAddress, blockDataRead, &bufferblocksize) != 0) {
    Serial.println("Read failed.");
  } else {
    Serial.println("Read successfully!");
    Serial.print("Data in block ");
    Serial.print(blockAddress);
    Serial.print(": ");
    for (byte i = 0; i < 16; i++) {
      Serial.print((char)blockDataRead[i]);  // Print as character
    }
    Serial.println();
  }
  
  // Halt communication with the card
  mfrc522.PICC_HaltA();
  mfrc522.PCD_StopCrypto1();

  delay(2000);  // Delay for readability
}

byte blockAddress = 2;
定义了一个名为blockAddress的变量。这个变量指定了IC卡内将要写入或读取数据的块。blockAddress被设置为2,将与卡片内存的第2个块进行交互。如果你想写入不同的块,你可以更改这个值。

byte newBlockData[17] = {"www.yourcee.com"};
保存您想要写入卡中的数据,不超过16个字节

byte newBlockData[16] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
如果您想清除块数据,取消注释这行代码

for (byte i = 0; i < 6; i++) {
key.keyByte[i] = 0xFF;
}
IC卡的默认密钥也在以上行中设置。默认情况下,工厂密钥的所有字节都是0xFF。这个密钥允许访问卡的数据块。

if (mfrc522.PCD_Authenticate(0x60, blockAddress, &key, &(mfrc522.uid)) != 0) {
Serial.println("Authentication failed.");
return;
}
代码尝试使用默认密钥(在本例中为块2)对卡片上的特定块进行认证。0x60是一个指定使用KEY_A进行认证的命令。KEY_A是RFID卡上可用的两个密钥(KEY_A和KEY_B)之一,每个密钥提供不同的权限。使用0x60意味着代码正在尝试用KEY_A进行认证,而默认情况下,在MIFARE RFID卡上KEY_A是0xFF 0xFF 0xFF 0xFF 0xFF。

编译上传程序到ESP32开发板 ,打开串口监视器,并把IC卡 靠近MFRC522读写模块,串口显示出写入并读取到指定存储块的数据
在这里插入图片描述

总结

本实验只是对空白的MIFARE Classic IC卡进行简单的读写验证,由于IC卡大都有秘钥,至于破解IC卡,复制C卡需要大家进一步探索研究了。

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • RFID
    +关注

    关注

    392

    文章

    7030

    浏览量

    249375
  • MFRC522
    +关注

    关注

    2

    文章

    32

    浏览量

    18066
  • ESP32
    +关注

    关注

    27

    文章

    1231

    浏览量

    22598
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    乐鑫科技新品ESP32-H4亮点速递!

    的技术潜力。产品主要规格产品特性与适用场景1超低功耗ESP32-H4内部集成的DC-DC模块可高效管理电源,降低系统功耗,延长设备续航时间。同时,该设计使芯片能够
    的头像 发表于 04-16 18:05 576次阅读
    乐鑫科技新品<b class='flag-5'>ESP32</b>-H4亮点速递!

    ESP32/ESP8266开发板单向一对多ESP-NOW无线通信

    通过ESP-NOW无线通信协议实现ESP32开发板向多个ESP32/ESP 8266开发板发送数据
    的头像 发表于 03-13 09:23 349次阅读
    <b class='flag-5'>ESP32</b>/<b class='flag-5'>ESP</b>8266开发板单向一对多<b class='flag-5'>ESP</b>-NOW无线通信

    ESP32驱动TFmini-S红外激光测距ToF模块进行测距

    本文介绍了TFmini-S红外激光测距ToF模块的基本特性,然后用ESP32开发板驱动TFmini-S模块进行测距,并在串口助手上显示出测距数据
    的头像 发表于 03-06 14:43 419次阅读
    <b class='flag-5'>ESP32</b><b class='flag-5'>驱动</b>TFmini-S红外激光测距ToF<b class='flag-5'>模块</b>进行测距

    极速入门:AirRC522_1000方案实现RFID读卡功能的一键集成

    还在为复杂的SPI通信协议和繁琐的寄存器配置而头疼吗?AirRC522_1000方案旨在彻底简化嵌入式RFID开发流程。该方案提供全开源的底层驱动与高层应用接口,开发者无需深究MFRC522
    的头像 发表于 02-28 17:30 751次阅读
    极速入门:AirRC<b class='flag-5'>522</b>_1000方案实现<b class='flag-5'>RFID</b>读卡功能的一键集成

    恩智浦MFRC522与SI522的性能功耗对比

    接触式读写器芯片,阅读器支持ISO/IEC 14443 A/MIFARE。无需外围其他电路,Si522 的内部发送器可驱动读写器天线与ISO/IEC 14443A/MIFARE
    发表于 02-28 16:43

    电动车NFC一键启动(仪表总成、电源锁)_Ci522

    于智能门锁、手机模拟(NFC)解锁等应用。它为一些需要低成本和小PCB尺寸的产品提供了可靠的选择。Ci522不同于si522/mfrc522封装(si
    发表于 02-28 15:11

    ESP32 驱动瀚海微SD NAND 完整方案 + FAT/FAT32 驱动核心区别

    ESP32 驱动 SD NAND 的核心是基于SDIO 接口(SD NAND 主流通信方式,兼容 SPI 但速率更高),借助乐鑫官方esp-idf框架的SDMMC 驱动库实现,无需额外
    的头像 发表于 02-02 11:38 968次阅读
    <b class='flag-5'>ESP32</b> <b class='flag-5'>驱动</b>瀚海微SD NAND 完整方案 + FAT/FAT32 <b class='flag-5'>驱动</b>核心区别

    NXP MFRC520/522/523 键合线直径变更通知解读

    为201405006A,这里跟各位电子工程师分享下关于Digi - Key从NXP购买的产品相关的重要信息。 文件下载: MFRC52302HN1,157.pdf 变更内容 NXP计划将MFRC520、MFRC522
    的头像 发表于 01-29 16:35 668次阅读

    探秘MFRC522:高效非接触式读写IC的全方位解析

    探秘MFRC522:高效非接触式读写IC的全方位解析 在当今的电子设备领域,非接触式通信技术正发挥着越来越重要的作用。作为一名电子工程师,我最近深入研究了NXP Semiconductors推出
    的头像 发表于 01-19 16:55 967次阅读

    深度解析MFRC522:高性能非接触式读写IC的设计与应用

    深度解析MFRC522:高性能非接触式读写IC的设计与应用 在电子工程师的设计世界里,非接触式通信技术一直是备受关注的领域。NXP的MFRC522作为一款标准性能的MIFARE和NT
    的头像 发表于 12-29 16:55 1334次阅读

    ESP32蓝牙驱动MAX98357对音频音乐播放

    本文介绍了MAX98357音频模块的基本特性,并利用ESP32的蓝牙功能程序驱动模块,最后用手机蓝牙连接ESP32播放手机音乐
    的头像 发表于 12-19 19:55 3404次阅读
    <b class='flag-5'>ESP32</b>蓝牙<b class='flag-5'>驱动</b>MAX98357对音频音乐播放

    SI522与恩智浦 RC522 13.56MHZ的刷卡问题

    13.56MHz 的非接触式读写器芯片,阅读器支持ISO/IEC 14443 A/MIFARE。无需外围其他电路,Si522 的内部发送器可驱动读写器天线与ISO/IEC 14443A
    发表于 12-01 10:16

    NXP MFRC520/522/523 芯片键合线直径变更通知解读

    MFRC520、MFRC522MFRC523 芯片键合线直径变更的通知。 文件下载: MFRC52302HN1,157.pdf 变更内容概述 NXP 计划将
    的头像 发表于 11-26 15:12 862次阅读

    SI522A芯片选型指南:低功耗RFID读写器解决方案

    部发送器可直接驱动读写器天线与ISO/IEC 14443 A/MIFARE和应答机进行通信。接收器模块提供强大而可靠的解调解码电路,数字模块
    的头像 发表于 09-16 17:42 1136次阅读

    ESP32开发板元件资料

    ESP32开发板元件
    发表于 07-21 14:47 17次下载