← 返回传感器图鉴

RC522 RFID/NFC 读卡模块

最后更新 2026-06-20
⏱ 约 9 分钟 🟡 涉接线/强电
🛒 器材清单
器材数量参考
RC522 RFID 模块(含白卡+钥匙扣)1

价格随渠道波动,以购买页实时为准。

想给工作室做个刷卡开门:每个人发一张卡,往门口一贴门就开,谁来过、几点来的还能记下来当考勤。不想自己造轮子去算射频协议,只想要一颗"卡一靠近就把卡号读出来"的现成件——RC522 就是这件事最便宜、资料最多的入门选择。一个模块通常配一张白卡、一个钥匙扣卡,十几块钱,插上 SPI 就能开始刷。

RC522 用的是恩智浦(NXP)的 MFRC522 芯片,工作在 13.56MHz 频段,专门读这个频段的 IC 卡(最常见的就是 Mifare 系列:公交卡、门禁卡、酒店房卡那一类)。它最常用、最简单的功能,就是读出每张卡独一无二的 UID(卡号),拿这个卡号去比对名单,就能判断"这是谁、放不放行"。

工作原理

刷卡这件事,本质是读卡器和卡片之间一次无线对话,全过程没有电池:

  1. 读卡器发射电磁场:RC522 板上那圈方形铜线就是天线,通电后以 13.56MHz 的频率持续往外发射交变电磁场。
  2. 卡片被激活(无源取电):门禁卡里其实也有一圈线圈和一颗小芯片,但卡里没有电池。当卡靠近读卡器(几厘米内),卡片线圈被电磁场感应出电流——这就是"无源取电",靠的就是读卡器发出的那个电磁场给卡供电,卡芯片这才被唤醒。
  3. 卡片回传数据(负载调制):醒来的卡芯片把存在里面的数据(首先是 UID)发回去。它的发法很巧妙:不是自己发射信号,而是通过改变自己线圈对电磁场的"吸收量"(负载调制),让读卡器侧检测到电磁场的细微强弱变化,从而解出卡传回来的 0 和 1。
  4. 读卡器解码:RC522 把这串变化还原成数据,UID 等内容就拿到了。

这套机制叫 RFID(射频识别)。卡不用电、不用接触、隔着钱包就能读,靠的全是"读卡器供电 + 卡片反射回传"这一来一回。读 UID 是其中最轻量的一步,不需要任何密钥,卡一进场就能拿到。

接线

RC522 走 SPI 接口,线比 I2C 多——除了电源地,还有 SCK/MOSI/MISO 三根数据线加一根片选 SDA(SS) 和一根复位 RST。模块标的 SDA 脚在 SPI 里其实是片选 SS:

RC522 ESP32(VSPI 默认) 说明
3.3V 3.3V 只能 3.3V,绝不接 5V
GND GND 公共地
SDA(SS) GPIO5 片选,选中这颗芯片
SCK GPIO18 SPI 时钟
MOSI GPIO23 主机发给模块
MISO GPIO19 模块发回主机
RST GPIO22 复位脚,给个普通 GPIO 即可
IRQ 不接 中断输出,一般用不到

ESP32 默认的硬件 SPI(VSPI)就是 SCK=18 / MISO=19 / MOSI=23 / SS=5 这组,照这个接最省事。SPI 五六根线很容易接错一根,接完务必逐根核对,尤其别把 MOSI 和 MISO 调反。想搞懂 SPI 这几根线各自干什么、为什么要片选,参考 /principle/digital-analog/

🚧 避坑

VCC 只能接 3.3V,接 5V 会烧芯片:MFRC522 是 3.3V 器件,模块上也没有 5V 转 3.3V 的稳压。很多人按超声波、继电器那种"5V 随便接"的习惯把它怼到 5V,结果一上电芯片就废。注意 RC522 的电源脚和 Arduino UNO 的 5V 是天生不兼容的——UNO 上要用 3.3V 脚供电,逻辑电平的事见 /principle/level-shift/

完整代码

用社区最流行的 MFRC522 库(Arduino 库管理器搜 "MFRC522" by GithubCommunity,即 miguelbalboa/rfid)。下面这段开机初始化,循环里检测有没有卡、有就把 UID 以十六进制打印出来:

#include <SPI.h>
#include <MFRC522.h>

#define SS_PIN   5    // SDA/SS 片选
#define RST_PIN  22   // 复位脚

MFRC522 rfid(SS_PIN, RST_PIN);

void setup() {
  Serial.begin(115200);
  SPI.begin();          // ESP32 默认 SCK18/MISO19/MOSI23
  rfid.PCD_Init();      // 初始化 RC522
  Serial.println("把卡贴近模块试试……");
}

void loop() {
  // 没有新卡就直接返回,省得空转
  if (!rfid.PICC_IsNewCardPresent()) return;
  // 读不到卡的序列号也返回
  if (!rfid.PICC_ReadCardSerial())   return;

  Serial.print("卡 UID: ");
  for (byte i = 0; i < rfid.uid.size; i++) {
    if (rfid.uid.uidByte[i] < 0x10) Serial.print("0"); // 补前导零
    Serial.print(rfid.uid.uidByte[i], HEX);            // 十六进制打印
    Serial.print(" ");
  }
  Serial.println();

  rfid.PICC_HaltA();        // 让卡休眠,避免同一张卡被反复读
}

PICC_IsNewCardPresent() 检测电磁场里有没有进来一张卡,PICC_ReadCardSerial() 把这张卡的 UID 读进 rfid.uid 结构里。uid.uidByte[] 就是卡号的每一个字节,uid.size 是字节数(Mifare Classic 通常 4 字节)。最后 PICC_HaltA() 让卡进入休眠,否则同一张卡贴着不动会被一秒钟读上百次。

你应该看到什么

打开串口监视器(115200 波特率),把白卡或钥匙扣卡贴到模块那圈天线上,正常会每贴一次打印一行十六进制卡号:

把卡贴近模块试试……
卡 UID: A3 7F 21 5C        ← 贴上白卡
卡 UID: A3 7F 21 5C        ← 同一张再贴一次,号一样
卡 UID: 04 B9 1E 8A        ← 换钥匙扣卡,号不同

同一张卡多次读出来的 UID 完全一致,换一张卡号就变——这说明它在正常工作。卡要贴近才行,13.56MHz 这类模块读距通常只有几厘米,离远了就什么都不打印。隔着薄手机壳、薄钱包一般还能读,金属贴着卡背会屏蔽掉信号。

读数解读

  • UID:卡的唯一序列号,出厂烧死、不可改(普通卡),是识别"这是哪张卡"的核心,做门禁/考勤读这个就够了。
  • 扇区 / 块(进阶):Mifare Classic 卡的存储被分成若干扇区、每扇区若干块,可以往里写数据(比如余额、积分、姓名)。但读写这些数据块必须先用密钥(Key A/Key B)做认证——出厂默认密钥常是全 FF,认证通过才能读写对应块。这一步比读 UID 复杂得多,初学先把读 UID 跑通即可。

简单记:读身份 = 读 UID(免密钥、最简单);存数据 = 读写扇区块(要密钥认证、属于进阶)

选型 / 避坑

不同频段的卡、不同玩法,对应的模块完全不一样,买之前先认准频段:

需求 选谁 理由
读 13.56MHz IC 卡(门禁卡/Mifare/公交卡) RC522 最便宜、库最全的入门款,本页讲的就是它
读 125kHz ID 卡(老式门禁工牌、宠物芯片) RDM6300 等 125kHz 模块 频段不同,RC522 读不了 125k 卡,要另买
要和手机 NFC 互相通信 支持完整 NFC 协议的模块(如 PN532) RC522 只能当读卡器读卡,手机 NFC 双向交互更复杂
🚧 避坑

认准频段别买错:13.56MHz 和 125kHz 是两套互不相通的体系,RC522 只吃 13.56M 的卡。手上的卡是哪种,看卡或问发卡方。

SPI 接线多、易接反:六根线只要错一根就读不到卡,最常见是 MOSI/MISO 反、SS 接错脚。先核对再上电。

卡要贴近:读距只有几厘米,没反应时先把卡直接贴到天线圈上再判断是不是真的读不到。

进阶 / 变体

把读到的 UID 拿去比对白名单,就从"打印卡号"升级成了"刷卡开锁":

// 简化示意:把已授权的卡号写进数组
const char* whitelist[] = {"A37F215C"};  // 授权卡的 UID 拼成字符串

// 读到卡后,把 uid 拼成同样格式的字符串再逐个比对
// 命中 → digitalWrite(RELAY_PIN, HIGH) 吸合继电器,电磁锁通电开门,延时几秒再断开
// 未命中 → 蜂鸣器响一声,拒绝

实际工程里把卡号存到代码数组、SD 卡或后端数据库都行;继电器/电磁锁怎么驱动、怎么用低电平触发、怎么加续流保护,参考 /guide/l2-relay/。再往上,把"刷卡 → 比对 → 开门 → 记考勤"做成带 AI 辅助开发的完整项目,参考 /guide/l4-sensor-ai/

典型应用

  • 门禁开锁(刷卡 → 比对名单 → 继电器开电磁锁)
  • 考勤打卡(刷卡记录 UID + 时间,导出统计)
  • 刷卡开锁的储物柜、设备使用授权
  • 积分卡 / 会员卡识别(读 UID 关联账户)
  • 教学演示:理解 RFID 无源取电与无线识别原理
⚠️ 安全

仅读 UID 做的门禁,安全性很弱:UID 是明文、不加密的,市面上的读卡-复制设备几分钟就能把一张卡的 UID 克隆到空白卡上,刷克隆卡照样开门。所以自制的 RC522 门禁只适合学习、家里玩、低风险场景,绝不要用在真正需要安防的门(公司机要室、仓库、入户大门)。真正安全的门禁要用扇区加密 + 密钥认证、甚至带挑战应答的 CPU 卡,那是另一个量级的工程,不在本页范围。

小结 · 相关

RC522 的核心价值是"用 13.56MHz 射频把卡号读出来":读卡器发电磁场给无源卡供电,卡靠负载调制把 UID 回传,芯片解码——这就是 RFID 的全过程。接线走 SPI 六根线(ESP32 用 VSPI 默认脚 SCK18/MISO19/MOSI23/SS5),电源只能 3.3V;代码用 MFRC522 库 PCD_Init()PICC_ReadCardSerial() 十几行就能把 UID 以十六进制打印出来。读 UID 免密钥、最简单,读写扇区块要密钥认证属于进阶。要读 13.56M 的门禁卡、做门禁/考勤入门项目,它就是首选;但记住仅读 UID 易被复制,自制门禁只供学习。

相关阅读:/principle/level-shift/(3.3V/5V 电平的事)、/principle/digital-analog//guide/l2-relay/(用继电器驱动电磁锁)、/guide/l4-sensor-ai/,更多器件见 /sensor//principle//guide/

参数以 datasheet 为准;本页公开资料整理,接线与代码请结合实物验证。

📄 来源 / 自校链接

本文为公开资料整理,非亲测。关键参数与代码请结合实物与下列官方来源验证。

内容有错、看不懂、或想看下一期?告诉我们 →

本文为公开资料的学习整理,非亲测。涉接线/花钱/合规的步骤请结合实物与官方最新资料验证,风险自负。见免责声明