跳到主要内容

13.56M IC 卡 32 位 UID 读取

一、基本概念介绍

Core 通过外接恩智浦半导体公司的RC522 IC卡读卡模块来实现对工作频率为13.56MHz的IC卡的各种操作。RC522支持对Mifare One类型的IC卡操作,例如M1-S20,M1-S50,M1-S70卡等,20,50,70系列的区别主要在存储容量大小,其他的操作基本完全一样。

本篇章为了简单,只涉及IC卡的UID读取操作。因为如果您对IC卡认证的安全性不是太在乎,您可以考虑把IC卡的UID作为认证信息,这种操作有点类似于ID卡,但还是要比ID卡强一点,因为ID卡的的ID号还是比较容易"撞衫"的,而IC卡的UID信息有32位长度,在唯一性上更强一些。

安全性考虑:市面上有一种卡叫UID卡可以用来复制IC卡,因为它的第0扇区的第0块(一般用来存储UID等信息)可以任意被修改。所以如果您想避免别人用复制的UID卡来入侵,这里有个技巧,就是每次读取IC卡的UID后再故意往该IC卡上第0扇区的第0块写任意的16字节数据,如果正常的IC卡是无法成功写入的。本篇章不涉及对IC块数据的读写操作,所以相关的读写操作教程请看《读写IC卡的数据及密码下载》。

二、实现功能描述

本例要实现的功能为Core控制RC522读卡模块不停的搜寻周围的IC卡,当有效的IC卡靠近之后,即可检测出其UID(32位唯一识别码),以及IC卡型号(比如S50,S70卡等)。

三、接线图

layout

四、材料清单

名称推荐购买链接(或者你可以自己制作)模块/芯片硬件资料下载
RC522读卡模块RC522模块购买链接下载地址
声明:这里推荐的购买链接仅供参考,您完全可以去其他商家或渠道购买,只要功能相似即可,如果需要更低的成本建议自己开发硬件模块或定制。

module_photo

五、完整代码

--配置Core的USB口以虚拟串口模式工作,波特率115200
LIB_UsbConfig("CDC")
--配置D8为普通输出,控制Core电路板上的LED1
LIB_GpioOutputConfig("D8","STANDARD")
LIB_GpioWrite("D8",1) --LED1灭
--初始化RC522读卡模块后,将会一直自动寻找有效的IC卡出现
LIB_RC522Config("D7")
--开始大循环
while(GC(1) == true)
do
--如果发现IC卡,就输出其卡类型以及卡的32位ID号
CardFoundFlag,Type,UID = LIB_RC522CardFind()
if CardFoundFlag == 1 then
print(string.format("Card Type:%s\r\nCard UID:%02x %02x %02x %02x",Type,UID[1],UID[2],UID[3],UID[4]))
--LED1闪烁一下
LIB_GpioWrite("D8",0)
LIB_DelayMs(200)
LIB_GpioWrite("D8",1)
end
end
如果感兴趣,上面代码中出现的LIB开头的库函数可以在 API文档 中通过Ctrl+F查询。

六、代码运行结果

在电脑端运行的调试助手上,我们可以看到如下打印输出信息:

rd_uid