SIGIN SIGOUT AUX1/2 带施密特触发器的输入 输出 输出 MIFARE 接口输入 MIFARE 接口输出 辅助输出:用于测试 ●串行接口
名称 D1 ? D7 类型 I/O 功能 不同接口的数据线 (测试脚、I2C、SPI、UART ) SDA I2C EA
由于本次设计中MFRC522与MCU之间最终选择了SPI接口,在此特将各引脚在SPI接口模式下的定义列出:
引脚名称 SDA I2C EA D7 D6 D5 SPI 方式 NSS L H MISO MOSI SCK I/O 输入 输入 串行数据线 I2C使能 地址:提供I2C的地址 6
5 MFRC522的功能实现
为了通过编程实现MFRC522的读写卡功能,我们的第一步就是把要用的命令字和地址进行定义。我们通过查找芯片手册,得到详尽的MFRC522命令字、MifareOne卡片命令字以及MFRC522各寄存器的功能与定义。
接下来,打开Keil uVision4并在工程中添加rc522.h文件,用这个文件定义所有射频识别过程中可能用到的命令字与地址:
通过上图大家可以看到,整个522.h文件中基本全都是#define 我们只需要将芯片手册中的信息仔细录入,并写好注释。而且,为了便于管理,rc522.h里的语句被我分成了四类,分别是:①MFRC522命令字
②MifareOne卡片命令字 ③ MFRC522寄存器 ④MF522通讯错误的处理代码
接下来,我们就要开始编程实现MFRC522的一些具体功能了。在工程中新建rc522.c文件,在该文件中编写MFRC5222读写卡过程中需要的指令。
RC522完整的读写卡流程框图:
开始
端口初始化 RC522复位 7
寻卡 N 是否有卡 Y 防冲撞,选卡 Y N 扇区改变? 能否通过密码验证 N Y 读卡或写卡 根据上面的读写卡流程框图,我们按照每个框的内容编写与之相对应的程序。
●寻卡请求
读写卡模块向外发射激励信号,一旦有Mifare卡进入读写器天线工作范围,读写模块发送命令。Mifare卡收到命令后会将卡上的储存单元中的卡片类型号(TagType)信息即2个字节数据发给读写器。从而建立Mifare卡与RC522通信的第一步。
寻卡请求函数:
char PcdRequest(unsigned char req_code,unsigned char *pTagType) 说明:
8
req_code[IN]:寻卡方式
0x52 = 寻感应区内所有符合14443A标准的卡 0x26 = 寻未进入休眠状态的卡 pTagType[OUT]:卡片类型代码 0x4400 = Mifare_UltraLight 0x0400 = Mifare_One(S50) 0x0200 = Mifare_One(S70) 0x0800 = Mifare_Pro(X) 0x4403 = Mifare_DESFire
操作成功返回值为0 即完成整个的寻卡请求。
●防冲撞+选定Mifare卡
由于RC522在同一时间内只能与一个Mifare卡进行通信,因此在完成寻卡请求之后,为了防止有多个Mifare卡同时处于读写卡模块天线工作范围而造成冲撞,需进行防冲撞操作,即读写卡模块与一张Mifare卡建立联络,取得其全球唯一的序列号。
防冲撞函数:
char PcdAnticoll(unsigned char *pSnr)
说明: pSnr[OUT]:用于卡片序列号,4字节
操作成功时函数返回值为0.
在获得Mifare卡的序列号之后,我们需要做的就是对指定的序列号的Mifare卡进行选定,只有被选中的卡才能与RC522建立进一步的通信,其它的Mifare卡将全部回到初始状态。
选定Mifar卡函数:
char PcdSelect(unsigned char *pSnr)
9
说明:pSnr[IN]:之前防冲撞操作中获得的Mifare卡序列号,4字节
操作成功时函数返回值为0.
●验证Mifare密码
为了访问Mifare卡中的某个扇区里存放的数据,必须进行密码的验证。用户首先要通过编程将已经设定好的密钥存入RC522内部的密钥存储区中,然后再比对Mifare卡中存放的密钥与RC522密钥存储区中的密钥是否相同,只有确认二者相同之后才可以对当前Mifare卡的这个扇区进行下一步操作。
密码验证函数:
char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr)
说明:
auth_mode[IN]: 密码验证模式 0x60 = 验证A密钥 0x61 = 验证B密钥 addr[IN]:块地址 pKey[IN]:密码
pSnr[IN]:卡片序列号,4字节
操作正确时返回 0.
●读操作
完成了密码认证,我们就可以从Mifare卡中的扇区中读出数据,每次读出数据的大小为16字节。
读操作函数:
char PcdRead(unsigned char addr,unsigned char *pData) 说明:
addr[IN]:块地址,取值范围0—63
10