RFID_RC522例程分析+学习笔记

2019-07-20 23:32发布

       RFID_RC522例程分析+学习笔记 在学习RFID_RC522时花了很长时间,期间搜集了很多的例程、资料和帖子,总感觉有点散,现今将其按照我的方式整理如下如有错误,还望指正。1.首先先来说MF_RC522非接触式(最大通信速率13.56MHz)读写卡芯片。 MF_RC522能干什么? MF_RC522的内部发送器部分可驱动读写器天线与ISO 14443A/MIFARE卡和应答机的通信。ISO 14443A/MIFARE卡是什么? 即支持ISO 14443A通信协议的MIFARE卡(如RFID_RC522模块附带的M1卡)。 注释如下: ISO是国际化标准组织。IEC是国际电工委员会。ISO/IEC 14443协议是非接触式IC标准协议。这种协议又可分为TYPE ATYPE B两个标准,具体可以参考ISO/IEC 14443协议浅谈:TYPE ATYPE Bhttps://blog.csdn.net/luoqindong/article/details/54705862在这里ISO/IEC14443A==ISO14443A换个方式说MF_RC522读写卡芯片符合ISO/IEC14443A 通信协议,ISO/IEC14443A协议支持MIFARE S50S70UltraLightMIFARE ProFM11RF08等兼容卡片。说道这里再说一下非接触式IC卡的国际标准: 图片1.png 显然我们所用的M1卡就属于PICC,属于近耦合型的,作用距离在0~100mm(与读卡器有关),RC522读写器就是PCD 单片机怎样驱动MF_RC522MF_RC522支持的主机接口类型有串行UARTI2CSPI,常见的RFID_RC522块都是SPI(串行外设接口)的,在使用时需要注意SPI接口的速率不能超过10bit/s2.非接触式IC在刚开始学习时看别人的例程或帖子时会看见Mifare_One卡、S50卡、M1_S50卡在这里我们统称为M1卡。M1卡的核心是飞利浦的下属子公司恩智浦出品的Mifare 1 IC S50系列微模块,毫无疑问它确定了卡片的特性以及卡片读写器的诸多性能。M1 IC S50内建有高速的CMOSEEPROMMCU等。卡片上除了IC微晶片及一副高效率的天线外,无任何其他元器件,卡片上无源(无任何电池),可以打开手电筒紧贴在卡的背面,观看卡的前面。读写器怎么和无源的非接触式IC卡通信?读写器(例如MF_RC522)向 M1 卡发一组固定频率的电磁波,卡片内有一个 LC 串联谐振电路,其频率与读写器发射的频率相同,在电磁波的激励下,LC 谐振电路产生共振,从而使电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内储存,当所积累的电荷达到 2V 时,此电容可做为电源为其它电路提供工作电压,将卡内数据发射出去或接取读写器的数据。 例程分析:底层驱动代码是店家给的例程,经过了解后发现所有的RC522代码几乎一样。给的例程是用IO口模拟的,因为STM32自带有SPI外设,所以程序稍微改动就好。这里只对函数的调用进行分析,具体寄存器的操作,个人没有完全搞懂。STM32F103ZET6SPI2工作在主模式下,波特率不大于10Mbps。因为SPI2挂载在APB1下所以输入时钟为36MHz,所以波特率预分频值不小于4MISOMOIS上传输字节时都是高位在前,空闲态时钟为低电平,在时钟上升沿同步接收和发送数据,在下降沿数据转换RST复位端低电平复位。了解M1卡与读写器的通讯流程:MF_RC522初始化—寻卡—防冲突—选卡—对要操作的块所在的扇区进行密码验证—操作卡(读、写、加值、减值、转移、恢复)。 图片2.png 如果想做一个简单的门禁控制读卡器,前三步就够了,能够实现对M1卡的UID读取和防冲突功能。再深入一点就是用于一卡通系统的读卡设备和发卡设备。实现对卡内EEPROM中的数据进行读、写、加值、减值、转移、恢复高层操作。1.RC522初始化    图片3.png   对卡进行操作时,主要用到两类命令:    图片4.png     图片5.png   PICC是接近式卡。PCD是接近式耦合设备。在通信过程中实际上是使用PCD命令控制RC522发出PICC命令与卡进行交互。2.寻卡函数    图片6.png 需要输入寻卡方式和一个用于存放卡片类型代码的数组,寻卡成功后,函数返回MI_OK0)并将返回两字节的卡片类型数据放入数组。即卡的类型=(pTagType[0]<<8)|pTagType[1];寻卡的命令有两个分别是上图Mifare_One卡片命令字 (M1)的前两个。3.防冲突函数  如果有多张Mifare 1卡片处在读写器的天线的工作范围之内时,防冲功能启用时,读写器会根据卡片的序列号来选定一张卡片。被选中的卡片将直接与读写器进行数据交换,未被选择的卡片处于等待状态,准备与读写器进行通信。       图片7.png   调用此函数需要输入一个4字节的用来存放卡片序列号数组。成功后函数返回MI_OK,并将得到的序列号放进数组。4.选卡函数       图片8.png 调用此函数需要卡片的序列号,选卡成功后返回MI_OK。  到此为止我们就将M1的卡片序列号(ID)读出来了。下面就是对卡片内部的EEPROM操作的函数了,在此之前先来了解卡片的存储器组织结构和读写控制M1的主要指标:  1容量为 8K EEPROM  2分为 16 个扇区,每个扇区为4块,每块16个字节,以块为存取单位  3每个扇区有独立的一组密码及访问控制  4每张卡有唯一序列号,为32 位,没有重复的两张Mifare  5具有防冲突机制,支持多卡操作  6工作频率:13.56MHZ  7通信速率:106KBPS  8读写距离:10cm以内(与读写器有关) M1卡中的EEPROM的存储结构与访问权限:   M1卡中集成了1024个字节的EEPROM,这1024个字节分成了16个扇区,每个扇区有4个块,每个块都有16个字节。  M1卡中的这64个块在访问的时候是按绝对地址(块0)来操作的,即块地址=扇区编号×4+扇区内的块编号,其中扇区编号是0~15,扇区内的块编号是0~3所有扇区的第3块都是控制块,第0个扇区中的第0块是存放产品代码的,这个块是64个块中唯一一个只能读不能写的块,存放的是固化在其中的32bit的世界唯一的卡片序列号。其余15个扇区的第0块到第2块都是数据块。          图片9.png     控制块包含了存取数据所需要的KeyA(密码A)可选的KeyB(密码B)以及本扇区内四个块的存储条件,当不需要KeyB时,这个块的最后6个字节可以被当做数据字节来使用。M1卡出厂控制块默认值(初始值)为下图所示:         图片10.png   每个扇区的密码和存取控制都是独立的,可以根据实际需求设定各自的密码以及存取控制。存取控制为四个字节,共32位,扇区中的每个块(包括数据块和控制块)的存取条件是有密码和存取控制共同决定的,中在存取控制的每个块都有相应的三个控制位,定义如下:  块0C10 C20 C30    块1C11 C21 C31  块2C12 C22 C32  块3C13 C23 C33  例如:C1(该块的第几个控制位)0(块),块0的三位控制位中的第1位。  三个控制位以正和反两种形式存在于存取控制字节中,决定了该块的访问权。  存取控制(4字节,其中字节9为备用字节)结构如下所示:          图片11.png     从图上可以看出:0三位存取控制位分别为 C10 C20 C30=0 0 0。反码位C10_b C20_b C30_b=1 1 1将反码取反得到000,继续向下看。          图片12.png   由刚才得到的块03位存取控制位的值可以看出,知道KeyAKeyB验证成功后就可以对块0进行读、写、加值、减值、转移、恢复操作。在这里要说的是,对于一个新卡来说KeyAKeyB都是默认的(FF FF FF FF FF FF),并且所有的数据块的三位存取控制位都是000  需要注意的是,这里的存取条件查询表只适合数据块,而控制块的存取条件如下图:  如果keyB可以读取,那么KeyB的空间就会用于存储数据,不能用来进行验证(这个地方自己去体会,想用KEYB就要修改KEYB的存储控制位),因为此时所有的进一步的存储区存取操作都将失败。一张新卡也不能用KeyB来验证(厂家设置的存取条件为001)。此外还有一个需要注意的地方就是,所有的控制块都禁止加值、减值、转移、恢复操作。             图片13.png 控制块的三位存取控制位的初始值为C13 C23 C33=0 0 1。结合上表可知 密码A:不可读,验证KeyAKeyB正确后,可写(更改)。 存取控制:验证KeyAKeyB正确后,可写可读。 密码B:验证KeyAKeyB正确后,可写可读。
   
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
35条回答
momo最可爱
1楼-- · 2019-07-23 19:38
 精彩回答 2  元偷偷看……
螃蟹爱虫
2楼-- · 2019-07-23 20:26
 精彩回答 2  元偷偷看……
sd4555
3楼-- · 2019-07-24 01:24
楼主麻烦问一下,为什么每张卡读出来的卡号都是一样的536870914??、是要对卡进行什么操作吗??
我是直接寻卡、防冲撞、选卡然后输出卡号的,可是每次卡号都一样呀这是串口调试助手输出的
PcdRequest_MI_OK
PcdAnticoll_MI_OK
PcdSelect_MI_OK
PcdAuthState_MI_OK
536870914
轱辘t309065
4楼-- · 2019-07-24 04:41
sd4555 发表于 2018-11-24 18:01
楼主麻烦问一下,为什么每张卡读出来的卡号都是一样的536870914??、是要对卡进行什么操作吗??
我是直 ...

读的是第0扇区的第0块的数据吗?
lacha
5楼-- · 2019-07-24 05:40
谢谢分享
轱辘t309065
6楼-- · 2019-07-24 07:46
补充两个链接:
https://blog.csdn.net/yxtxiaotian/article/details/62217926
//射频识别技术漫谈(14)——Mifare S50与S70的存取控制
https://blog.csdn.net/robinson_911/article/details/12783897
//关于S50卡密钥A和密钥B

一周热门 更多>