MFRC522开发笔记
一、了解基本概念
①ISO-14443A协议:( 国际标准化组织:International Organization for Standardization)RFID协议的一种;
PICC:临近卡(分为A型和B型)、PCD:临近耦合设备--指MFRC522模块、
ATQ:对请求的应答、ATQA 对A型卡请求的应答、ATQB 对B型卡请求的应答
REQA:对A型卡的请求、REQB:对B型卡的请求、WUPA:A型卡的唤醒命令(更多缩写意思百度:ISO14443)
ASK:选择确认
②MIFARE: 恩智浦半导体(NXP Semiconductors)拥有的商标之一;
③MIFARE卡(M1卡):兼具读写功能,主要是非接触式,有快速防冲突机制 – 处理多卡同时进入感应区的机制,其特殊的存储结构适合一卡多用,目前主要芯片philip mifare1 S50、 S70等;
④官方网站:http://www.cn.nxp.com/ 网站中可以下载MFRC522芯片手册和各种智能卡的使用手册。
⑤MFRC522特性:
非接触式读写卡芯片、最大通信速率13.56MHz、
支持接口:UART、SPI(Speed_max=10Mbit/s)、IIC(快速:400Kbit/s,高速:3400Kbit/s)
通信协议:ISO-14443A 或者叫 MIFARE
收发缓冲:64字节
支持中断模式、可编程定时器、CRC协处理器
二、MFRC522与M1卡通信
在学习RFID打卡模块时,需要涉及的操作原理主要有两方面。一方面是MFRC522模块的操作原理,即主机要怎样才能操作控制这个模块的问题。另一方面是MFRC522与M1卡之间的通信原理。只有两方面都正确进行了,主机才能通过MFRC522模块和M1卡进行通信。
①MFRC522基本原理实现
其SPI接口通信原理:主机负责产生(控制)SCK信号-主从机通信时钟,以下是SPI线上操作的时序。
读字节数据:主机写地址---先发要读的数据字节地址的MSB位放到MOSI引脚,直到LSB位发完,SCK=1时RC522模块获取MOSI引脚值作为其中一地址位,SCK=0时RC522准备读下一位地址;
主机读数据---写完地址之后即可开始读MISO引脚数据,先从这个引脚读取电平当做数据的MSB位,SCK = 1时,MISO数据保持不变,SCK = 0时,MISO切换到下一位的值。
写字节数据:也是先串行写目的地址到MOSI引脚,然后同样再串行写数据到MOSI引脚,MSB位为起始发送位。
(通常在51类型的单片机中是用软件来实现SPI的通信时序,我们常把这种方法称为软件模拟SPI方式,但是在ARM这类比较高端的SOC处理器中是集成了SPI硬件控制器的,通常读写SPI外设只需要把地址/数据放到指定的寄存器即可,硬件会自动完成发送)
FIFO工作原理:64字节的FIFO负责缓冲RC522接收(来自主机)和发送的数据。访问FIFO缓冲区主要通过其内部FIFODataReg寄存器,由于主机一次操作只能是读或者是写,FIFO缓冲区中数据要么就是主机写进去的内容,要不就是主机即将读出来的内容—IC卡片发送给RC522模块的数据。相关操作:
FIFO清除----操作FIFOLevelReg寄存器的bit7-FlushBuffer
查看FIFO中数据量----访问FIFOLevelReg寄存器的FIFOLevel段,主机往FIFODataReg写数据时,FIFOLevel自动加1,相反,减1.
主要状态:
空状态警告----FIFO数据空间小于等于WaterLevelReg的WaterLevel值时,Status1Reg的LoAlert置1
满状态警告----FIFO剩余空间小于等于WaterLevelReg的WaterLevel值时,Status1Reg的HiAlert置1
(硬件的巧妙设计:一个WaterLevel值起到两个作用)
②M1-IC-S50卡工作原理/操作流程:
M1卡结构:
共16个扇区,每个扇区4块(块0~3),共64块,按块号编址为0~63。
第0扇区的块0(即绝对地址0块)用于存放厂商代码,已经固化,不可更改。
其他各扇区:
块0、块1、块2为数据块,用于存贮数据;
块3为控制块,存放密码A、存取控制、密码B。
【对块3中蕴藏的原理的理解是操作RFID模块的关键所在】
每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制。
注:加密是针对一个扇区来进行的,千万不要理解成对每一个数据块进行加密!!!
MFRC522模块与MF-IC卡通信流程:详情得看MF1S50XX的手册第八章
(1)M1卡得电复位(RPO:Power-On Restset),是MFRC522天线发出电磁波导致,意味着有命令REQA过来,称为标准的请求,这种情况是M1卡进入感应区后首次与MFRC522通信。其他情况,M1卡进入休眠状态或之前的操作已经终止,Halt之后被WUPA命令再次唤醒,称为获得所有的请求。获得请求之后M1卡发送回应ATQA码。ATQA是卡的类型码:S50的类型码是0x04,S70的类型码是0x02。
(2)M1卡获得请求后再次获得防冲突命令执行防冲突机制。情景分析:有这么一种情况,一个时刻多张卡同时出现在MFRC522感应区,这时候RC522必须要专一,同时和几张卡发生关系早晚都是要出事的,那么RC522必须要认定其中一张卡。当然事情还要讲究两厢情愿是吧,522问人家了,这就要求M1卡能够主动告知RC522“我就是你的唯一的标识”。于是,事情就变成了这样:RC522获得最先主动告诉它的M1卡的UID,即卡的SN(4Bytes)+校验(1Byte) ,作为下一步选择通信卡的依据,这个SN需要主机从MFRC522中读出来暂时保存。
(3)选卡:在主机控制下MFRC522需要把选卡的命令和上一步获取的卡SN依次发送给M1卡,卡收到信息之后很老实,是选自己的信息就主动返回SAK信息,1Byte,实际上就是卡片的容量。
(4)验证密码:这是极其关键的一步了,里面涉及比较多比较复杂的协议。在PCD选中卡之后,接着主机控制他指出将要访问的存储器位置,然后连同验证密码命令、验证秘钥A|B一起发送给卡,三次密码确认(硬件)成功之后,MFRC522的Status2Reg的Bit_4置位,之后的数据传输都是经过加密的。(对一个扇区一次验证密码成功之后根据控制字的设置可以对该扇区的数据块进行相应读写操作直到执行Halt终止或验证其他扇区的密码,在选择另一扇区时,需要先进行这一扇区密码校验。细心观察上面那幅流程图的箭头也可以发现这个要求)
此外,有一点必须要说明的就是:默认控制下FF07806时A秘钥:不可读出,具有所有权限;B秘钥:可读出,没有任何权限。控制字和秘钥之间的联系,推荐使用这个软件:http://pan.baidu.com/s/1eQuCCvw
(5)存储器操作:最终目的。
数据块写、数据块读:通过向M1卡发送WRITE、READ命令,分别是0xA0、0x30;
数据块增值、数据块减值:通过发M1卡的INCREMENT、DECREMENT指令,分别是0xC1、0xC0;
(写数据块时命令连同数据值一块发送。)
(6)终止卡操作:HALT指令进入终止休眠模式。
(7)数据完整性措施:PCD和PICC之间的数据传输
每个块16位CRC校验、每个字节都有奇偶校验位、位计数检查、位编码区别“1”“0”“无信息”、信道监控。
CRC16校验: MFRC522内部有CRC16协处理器,主机通过软件设置CRC初始值,然后把要发送的数据发送给MFRC522,激活CRC16协处理器后,等待一小会读取CRCResultReg寄存器值即CRC16校验值,然后把这个16位的校验值附加到数据值后再通过MFRC522发送给M1卡片。至于其他校验是硬件自动完成的,我们只需要自己去读取MFRC522的Status1Reg寄存器看检验完成情况,读ErrorReg寄存器就可知道成功与否。
三、问题解决
问1.各个扇区的默认秘钥是多少?
答1.S50卡的初始密码A和B是12个F。
问2.如何对加密扇区的某一数据块进行读写数据?
答2.选中卡之后,首先要知道这个扇区的控制字,标准MF卡的控制字缺省值是0xFF078069,然后根据控制字要求验证扇区的密码A或密码B,验证成功之后就可以进行读写数据块操作了。
问3.如何修改扇区的秘钥?写出具体编程步骤。
答3.扇区的秘钥AB存放在该扇区的数据块3,因此要修改扇区的密码事先就要先知道这个扇区的控制字和原先的秘钥A或B,根据控制字的要求验证秘钥A或B成功之后即可对存放在数据块3的秘钥AB进行修改。
编程步骤:就是MFRC522模块与M1卡的通信流程。
问4.控制字有什么作用,如何进行修改?
答4.作用:是该扇区的各个数据块的读写权限控制中心。控制字的修改和修改秘钥的方法步骤一样,只要根据控制字的需要密码验证成功之后即可对数据块3的控制字域的值进行修改。这里先推测,修改密码和控制字时,都是一起进行写操作的,因为他们在同一个数据区。
四、程序设计思路
模块化编程:
1.基本操作函数
主机的SPI接口的配置函数、收发函数,读写RFID模块寄存器的函数等主机与模块的操作函数。
2.主机与M1卡通信函数——封装基本操作函数做成标准接口。
最快的方法就是找一份51的程序通读一遍,理解后直接移植到自己的平台,贼快了。
下雨天做什么好呢?吃个早餐先,再计划计划^_^
08:09:53