RC522射频识别IC卡感应模块
近场通信(NEAR FIELD COMMUNICATION, NFC),又称近距离无线通信,是一种短距离的高频无线通信技术,允许电子设备之间进行非接触式点对点数据传输(在十厘米内)交换数据。这个技术由免接触式射频识别(RFID)演变而来,并向下兼容RFID,最早由SONY和PHILIPS各自开发成功,主要用于手机等手持设备中提供M2M(MACHINE TO MACHINE)的通信。由于近场通讯具有天然的安全性,因此,NFC技术被认为在手机支付等领域具有很大的应用前景。同时,NFC也因为其相比于其他无线通讯技术较好的安全性被中国物联网校企联盟比作机器之间的“安全对话”。
模块来源
规格参数
工作电压:3.3V
工作电流:10-26mA
模块尺寸:40mm×60mm
支持的卡类型:mifare1 S50、mifare1 S70、mifare UltraLight、mifare Pro、mifare Desfire
控制方式:SPI
硬件连接
c
RC522模块 开发板
SDA 10
SCK 13
MOSI 11
MISO 12
IRQ 未连接(不是必须)
GND GND
RST 9
3.3V 3.3V
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
使用方法
安装库
- 在你的Arduino IDE中,你需要安装MFRC522库。你可以通过“工具 > 管理库…”菜单项来查找并安装MFRC522库。
编写代码
c
/******************************************************************************
* 测试硬件:ColorEasyDuino开发板
* 版 本 号: V1.0
* 修改作者: www.lckfb.com
* 修改日期: 2024年04月11日
* 功能介绍:
*****************************************************************************
* 开发板软硬件资料与相关项目软硬件资料官网全部开源
* 开发板官网:www.lckfb.com
* 技术支持常驻论坛,任何技术问题欢迎随时交流学习
* 立创论坛:club.szlcsc.com
* 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
* 不靠卖板赚钱,以培养中国工程师为己任
******************************************************************************/
#include <SPI.h>
#include <MFRC522.h>
#define RST_PIN 9 // 配置RST引脚
#define SS_PIN 10 // 配置SS引脚
MFRC522 mfrc522(SS_PIN, RST_PIN); // 创建MFRC522类的实例
// 标签的默认密码为FF FF FF FF FF FF
MFRC522::MIFARE_Key key;
void setup() {
Serial.begin(9600); // 初始化串口通信
SPI.begin(); // 初始化SPI总线
mfrc522.PCD_Init(); // 初始化MFRC522卡
// 初始化MIFARE标签的密码
for (byte i = 0; i < 6; i++) {
key.keyByte[] = 0xFF;
}
Serial.println("Ready to read/write card");
}
void loop() {
// 寻找新的卡片
if (!mfrc522.PICC_IsNewCardPresent() || !mfrc522.PICC_ReadCardSerial()) {
delay(50);
return;
}
// 显示卡片的UID
Serial.print("Card UID:");
for (byte i = 0; i < mfrc522.uid.size; i++) {
Serial.print(mfrc522.uid.uidByte[] < 0x10 ? " 0" : " ");
Serial.print(mfrc522.uid.uidByte[], HEX);
}
Serial.println();
// 写入数据到标签的一个扇区块
byte blockAddr = 4; // 块地址可以在1到15之间选择,但是不要写入制造块(块 0)
byte writeData[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}; // 要写入的数据
writeBlock(blockAddr, writeData);
// 读取相同扇区块的数据
byte buffer[]; // 数据读取缓冲区
readBlock(blockAddr, buffer);
printBlock(buffer);
// 结束卡片通信
mfrc522.PICC_HaltA();
delay(1000);
}
void readBlock(byte blockAddr, byte *buffer) {
byte size = sizeof(buffer);
MFRC522::StatusCode status = mfrc522.MIFARE_Read(blockAddr, buffer, &size);
if (status != MFRC522::STATUS_OK) {
Serial.print("Reading failed: ");
Serial.println(mfrc522.GetStatusCodeName(status));
}
}
void writeBlock(byte blockAddr, byte *buffer) {
MFRC522::StatusCode status = mfrc522.MIFARE_Write(blockAddr, buffer, 16);
if (status != MFRC522::STATUS_OK) {
Serial.print("Writing failed: ");
Serial.println(mfrc522.GetStatusCodeName(status));
} else {
Serial.println("Data written to block successfully");
}
}
void printBlock(byte *buffer) {
Serial.print("Read block: ");
for (byte i = 0; i < 16; i++) {
Serial.print(buffer[] < 0x10 ? " 0" : " ");
Serial.print(buffer[], HEX);
}
Serial.println();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
注意!记得,任何时候在写入RFID标签之前,你需要先进行身份验证(使用MIFARE_Key
),代码中已经定义了默认密钥FF FF FF FF FF FF
来进行操作。不过,在真实应用中,你需要确保使用正确的密钥,且要避免覆盖重要的数据块。另外,要注意,不同类型的标签和标签的不同部分可能需要不同的认证方式。