一、了解基本概念

①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

MFRC522开发笔记的更多相关文章

  1. 【模块应用】MFRC522开发笔记

    一.了解基本概念 ①ISO-14443A协议:( 国际标准化组织:International Organization for Standardization)RFID协议的一种;   PICC:临近 ...

  2. [开发笔记]-未找到与约束ContractName Microsoft.VisualStudio.Text.ITextDocumentFactoryService...匹配的导出【转载自:酷小孩】

    原文地址:http://www.cnblogs.com/babycool/p/3199158.html 今天打算用VisualStudio2012做一个js效果页面测试的时候,打开VS2012新建项目 ...

  3. EasyUI 开发笔记(二)

    接上篇 :EasyUI 开发笔记(一)  (http://www.cnblogs.com/yiayi/p/3485258.html) 这期就简单介绍下, easyui 的 list 展示, 在easy ...

  4. EasyUI 开发笔记(一)

    由于某些原因,在公司做的后台需要改成类似于Ext.js 形式的后台,主要看好其中的 框架布局,以及tab开页面和弹出式内部窗体. 后来看看,改成EasyUI,较Ext.js 库小很多,也便于公司的初级 ...

  5. [Openwrt 项目开发笔记]:Openwrt平台搭建(一)

    [Openwrt项目开发笔记]系列文章传送门:http://www.cnblogs.com/double-win/p/3888399.html 正文: 最近开始着手进行Openwrt平台的物联网网关设 ...

  6. Android移动APP开发笔记——Cordova(PhoneGap)通过CordovaPlugin插件调用 Activity 实例

    引言 Cordova(PhoneGap)采用的是HTML5+JavaScript混合模式来开发移动手机APP,因此当页面需要获取手机内部某些信息时(例如:联系人信息,坐标定位,短信等),程序就需要调用 ...

  7. Android移动APP开发笔记——最新版Cordova 5.3.1(PhoneGap)搭建开发环境

    引言 简单介绍一下Cordova的来历,Cordova的前身叫PhoneGap,自被Adobe收购后交由Apache管理,并将其核心功能开源改名为Cordova.它能让你使用HTML5轻松调用本地AP ...

  8. 开发笔记:基于EntityFramework.Extended用EF实现指定字段的更新

    今天在将一个项目中使用存储过程的遗留代码迁移至新的架构时,遇到了一个问题——如何用EF实现数据库中指定字段的更新(根据UserId更新Users表中的FaceUrl与AvatarUrl字段)? 原先调 ...

  9. Lucene/Solr搜索引擎开发笔记 - 第1章 Solr安装与部署(Jetty篇)

    一.为何开博客写<Lucene/Solr搜索引擎开发笔记> 本人毕业于2011年,2011-2014的三年时间里,在深圳前50强企业工作,从事工业控制领域的机器视觉方向,主要使用语言为C/ ...

随机推荐

  1. js 中的 2 与 "2"

    case1: "15" * 2 结果:30 case2: 2 * "15" 结果:30 case3: "2" * "15" ...

  2. Google Tango service outdated谷歌Tango的服务过时了

    If you device showed "tango service outdated." It means that your Tango Core need to be up ...

  3. svn cleanup失败解决方法

    一般网上给出的解决方法是使用sqlite清空.svn\wc.db的工作队列表(work_queue) 后来发现都打不开wc.db 百度一下: 保留当前目录源码,删除 .svn(隐藏)文件夹,重新che ...

  4. 个人项目-数组求和(语言:C++)

    prog1详细要求: [第一版本程序Prog1要求:] + 给定一个数组,实现数组元素求和:,具体要求:实现对一维数组(a[100])的所有元素相加运算. + 数据准备:a)数组长度:100:b)数组 ...

  5. docker查看挂载目录命令

    docker inspect -f "{{.Mounts}}"  692691b7416 692691b7416为containerId

  6. c# 中 $符号的用法

    var names = new List<string> { "jason", "Ana", "Felipe" }; forea ...

  7. JS 浏览器对象

    1.window对象 1.1 window对象 window对象是BOM的核心.window对象指当前的浏览器窗口 所有JavaScript全局对象 .函数以及变量均自动成为window对象的成员 全 ...

  8. WPF定时刷新UI界面

    代码: using NHibernate.Criterion; using System; using System.Collections.Generic; using System.Collect ...

  9. Privacy Policy of ColorfulBroswer

    Personal information collection this app does not collect your data  and does not share your infomat ...

  10. django系列4.2--自定义标签, 自定义过滤器, inclusion_tag, 引入静态文件(css,js等)

    项目的目录为 在app中创建templates时,最好要再创建一个app名相同的文件夹,因为项目找文件时从第一个app开始遍历,不同app内的同名文件会有冲突,所以这样处理 一.自定义标签和过滤器 1 ...