简介
RC522是由恩智浦NXP公司推出的一款RFID芯片. 其支持MIFARE Mini, MIFARE 1K, MIFARE 4K, MIFARE Ultralight, MIFARE DESFire EV1 和 MIFARE Plus RF identification protocols. [1] 其中一共支持三种通讯方式 SPI, I2C, UART. 因为通信速率关系, 所以目前市面上常见的通信方式大多数是基于SPI.
通讯速率对比, (数据来源于RC522数据手册)
l SPI up to 10 Mbit/s u
l I2C-bus interface up to 400 kBd in Fast mode, up to 3400 kBd in High-speed mode
l RS232 Serial UART up to 1228.8 kBd, with voltage levels dependant on pin voltage supply
MIFARE 1K 卡介绍
对于一个MIFARE 1K卡而言, 其中共具备1KB(1024 bytes)的存储空间. 其中被分成了16个扇区, 每个扇区为四个块, 每个块为16bytes
(16 * 16 * 64 = 1024 bytes). 对于每个扇区,其组成结构如下所示 [2]
Sector 0:
Block 0: [UID + 厂商信息] (不要写)
Block 1: 用户数据
Block 2: 用户数据
Block 3: [Key A + Access Bits + Key B]
Sector 1:
Block 4: 用户数据
Block 5: 用户数据
Block 6: 用户数据
Block 7: [Key A + Access Bits + Key B]
....
Sector 15:
Block 60: 用户数据
Block 61: 用户数据
Block 62: 用户数据
Block 63: [Key A + Access Bits + Key B]
其中扇区0的Block0被用于存储厂商的制造信息比如说UID等. 如下所示
对于每一个扇区中的最后一个块,其记录的为当前扇区访问的访问权限信息. 其余之外,其他的扇区皆可被用于存储用户数据. 在本文中我们讲使用ESP-IDF结合abobija/rc522 库对M1卡进行读取和写入.
ESP-IDF读取和写入RC522(M1卡)
1- 首先创建一个新的project
2- 在main文件夹内创建一个文件为idf_component.yml 用来管理IDF的组件
3- 将下述文件内容拷贝到idf_component.yml中, 用于管理abobija/rc522 库
dependencies: abobija/rc522: version: '*'
4- 编译项目, 此时IDF会自动将依赖的组件下载到本地
5- 打开https://github.com/abobija/esp-idf-rc522 仓库, 在https://github.com/abobija/esp-idf-rc522/blob/main/examples/read_write/main/read_write.c 下找到读写的测试demo, 并且拷贝到main.c中
6- 根据自己的连接线来修改PIN定义
6- 在原本的代码上做一点小小的修改, 使其可以读取所有的块数据.
uint8_t read_buffer[RC522_MIFARE_BLOCK_SIZE]; uint8_t write_buffer[RC522_MIFARE_BLOCK_SIZE]; for (size_t i = 0; i < 64; i++) { //检查分区的权限信息 ESP_RETURN_ON_ERROR(rc522_mifare_auth(scanner, picc, i, &key), TAG, "auth fail"); // 读取开始 ESP_LOGI(TAG, "Reading data from the block %d", i); ESP_RETURN_ON_ERROR(rc522_mifare_read(scanner, picc, i, read_buffer), TAG, "read fail"); ESP_LOGI(TAG, "Current data:"); dump_block(read_buffer); // ~读取结束 }
7- 烧录程序并且验证现象
此时如果我们将一个M1卡靠近到RC522模块上的话, 那么RC522将开始读取数据. 实际测试下来和额外串口打印, 读取64个扇区还是需要大改两秒时间的. 也有可能是串口的打印占用了时间. 可想而知如果使用I2C或者uart,这个速度将会更慢. 不过实际的使用环境中也不会使用全部的扇区.
总结
本文对RFID, M1卡和RC522进行了简要介绍, 并且手把手的基于IDF驱动RC522对M1的卡进行了读取和写入测试. 可能这个步骤在IDF上有一点繁琐,如果使用Arduino的话.会变的更加轻松!
引用:
[1] RC522 数据手册 https://www.nxp.com/docs/en/data-sheet/MFRC522.pdf
[2] MIFARE Classic® EV1 1K - 4K https://www.nxp.com/products/rfid-nfc/mifare-hf/mifare-classic/mifare-classic-ev1-1k-4k:MF1S50YYX_V1
附件: