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

    文章

    6747

    浏览量

    246759
  • MFRC522
    +关注

    关注

    2

    文章

    30

    浏览量

    17963
  • ESP32
    +关注

    关注

    24

    文章

    1083

    浏览量

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

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    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 205次阅读

    ESP8266和ESP32开发板常见的2种下载方式

    ESP32ESP8266是性价比很高而且使用较为广泛的的Wi-Fi模块,在物联网(IoT)领域的DIY项目中可以首先考虑这2款产品。 两款芯片都属于32位处理器。ESP32是低功耗
    的头像 发表于 11-10 20:30 335次阅读
    <b class='flag-5'>ESP</b>8266和<b class='flag-5'>ESP32</b>开发板常见的2种下载方式

    什么是超高频rfid读写设备,RFID读写器远距离读取能达到15米吗?

    在物联网技术飞速发展的当下,RFID读写器作为数据采集的核心设备,已广泛渗透到生产生活的多个领域。其中,超高频rfid读写器凭借独特的性能优
    的头像 发表于 11-06 15:08 233次阅读
    什么是超高频<b class='flag-5'>rfid</b><b class='flag-5'>读写</b>设备,<b class='flag-5'>RFID</b><b class='flag-5'>读写</b>器远距离读取能达到15米吗?

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

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

    内置UHF RFID和外置UHF RFID模块RFID手持读写器5大区别

    本文深入对比内置UHF RFID模块与外置UHF RFID模块的PDA手持终端,从便携性、续航、读写性能到适用场景,全面解析两者的区别。无论
    的头像 发表于 09-08 17:35 711次阅读
    内置UHF <b class='flag-5'>RFID</b>和外置UHF <b class='flag-5'>RFID</b><b class='flag-5'>模块</b>的<b class='flag-5'>RFID</b>手持<b class='flag-5'>读写</b>器5大区别

    ESP32开发板元件资料

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

    MFRC522非接触式读卡器IC中文手册

    电子发烧友网站提供《MFRC522非接触式读卡器IC中文手册.pdf》资料免费下载
    发表于 05-12 18:11 9次下载

    别再用钥匙啦!树莓派Pico教你用RFID“刷”门禁~

    获得读卡器,再搭配4美元的树莓派Pico,即可读取卡片/标签的ID信息。在本教程中,我们将学习如何使用MFRC522读卡器和树莓派Pico读取RFID标签和卡片。
    的头像 发表于 04-23 16:03 1150次阅读
    别再用钥匙啦!树莓派Pico教你用<b class='flag-5'>RFID</b>“刷”门禁~

    RFID纸质芯片的应用

    RFID是一种通过无线电波进行数据读写和物体识别的技术。它由电子标签、读写器和天线组成,能够实现非接触式的数据交互。相比传统的条形码技术,
    的头像 发表于 04-18 16:22 669次阅读
    <b class='flag-5'>RFID</b>纸质芯片<b class='flag-5'>卡</b>的应用

    用于LEGIC Advant UID/序列号的NFC读卡器,为什么无法读取这些的UID/序列号?

    我目前正在开发一个小展示柜,其中 LEGIC Advant (CTC) 的 UID/序列号应由 NFC 阅读器读取。在当前的设置中,我有一个使用 MFRC522 芯片的 ESP32。不幸
    发表于 04-02 08:07

    SI522A 低功耗寻与多款13.56MHZ 兼容开发资料

    /IEC 14443 B),支持自动载波侦测功能(ACD)。 无需外围其他电路,Si522A的内部发送器可驱动读写器天线与 ISO/IEC 14443 A/MIFARE 和应答机通信
    发表于 02-27 13:53

    SI522这款13.56MHz芯片能兼容这么多款同行芯片

    &CRC)。此外,它还支持快速CRYPTO1 加密算法,用于验证MIFARE 系列产品。MFRC522 支持MIFARE?更高速的非接触式通信,双向数据传输速率高达424kbit/s
    发表于 02-27 10:22

    esp32如何接入豆包

    要在 ESP32 上接入豆包工具,本质上是让 ESP32 设备与豆包的 API 进行通信,以获取相关服务
    的头像 发表于 02-05 13:40 2848次阅读
    <b class='flag-5'>esp32</b>如何接入豆包

    原来ESP32竟可《一“芯”两用》既做人体检测传感器也做Wi-Fi数据传输

    今天将介绍ESP32如何"一芯两用",既做人体检测传感器也做Wi-Fi数据传输模块;对于使用ESP32做Wi-Fi数据通讯,相信玩
    的头像 发表于 12-18 18:12 5357次阅读
    原来<b class='flag-5'>ESP32</b>竟可《一“芯”两用》既做人体检测传感器也做Wi-Fi<b class='flag-5'>数据</b>传输