cataloguephp
0. 引言 1. RC522芯片(读卡器)简介 2. FM1702SL芯片(读卡器)简介 3. RFID M1卡简介 4. 读取ID/序列号(arduino uno、MFRC522芯片 Based On MF522-AN模块) 5. 读取ID/序列号(arduino uno、FM1702SL) 6. arduino uno、RC522向mifare卡写入数据
0. 引言html
须要明白的一点是,一张卡可否hack取决于如下几点算法
1. 卡自己的硬件结构和内部实现: 例如若是一张卡的电路设置了只读逻辑,且没有EPPROM这种存储结构,则这张卡就只能被读取数据(数据泄漏),可是若是一张卡具有可檫写EPPROM, 且内部具有read/write逻辑电路,则咱们能够尝试向指定的扇区写入新数据,以此达到伪造卡的目的 2. 卡的类型: 不一样的卡类型对应了不一样的通讯频率、通讯方式,市面上能买到的RFID读卡器型号是有限的,若是咱们要hack的那张卡超出了咱们的读卡器的支持范围,则 读卡器的API也没法正常工做,由于对RFID卡的hack并非直接修改卡自己的物理特性,而是经过卡内置的微性单片机电驴对卡中的存储区域进行操做
1. RC522芯片(读卡器)简介编程
MF RC522是应用于13.56MHz非接触式通讯中高集成度的读写卡芯片,是NXP公司针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读写卡芯片,是智能仪表和便携式手持设备研发的较好选择。 MF RC522利用了先进的调制和解调概念,彻底集成了在13.56MHz下全部类型的被动非接触式通讯方式和协议。支持14443A兼容应答器信号。数字部分处理ISO14443A帧和错误检测。此外,还支持快速CRYPTO1加密算法,用语验证MIFARE系列产品。MFRC522支持MIFARE系列更高速的非接触式通讯,双向数据传输速率高达424kbit/s。 做为13.56MHz高集成度读写卡系列芯片家族的新成员,MF RC522与MF RC500和MF RC530有很多类似之处,同时也具有许多特色和差别。它与主机间通讯采用SPI模式,有利于减小连线,缩小PCB板体积,下降成本数组
NXP RC522微控制器是该单片机的核心
MF522-AN模块采用Philips MFRC522原装芯片设计读卡电路,使用方便,成本低廉,适用于设备开发、读卡器开发等高级应用的用户、须要进行射频卡终端设计/生产的用户。本模块可 直接装入各类读卡器模具。模块采用电压为3.3V,经过SPI接口简单的几条线就能够直接与用户任何CPU主板相链接通讯,能够保证模块稳定可靠的工做、 读卡距离远安全
0x1: 电气参数简介架构
工做电流: 13—26mA/直流3.3V 空闲电流: 10-13mA/直流3.3V 休眠电流: <80uA 峰值电流: <30mA 工做频率: 13.56MHz 支持的卡类型 1. mifare1 S50 2. mifare1 S70 3. mifare UltraLight 4. mifare Pro 5. mifare Desfire 产品物理特性: 尺寸: 40mm×60mm 环境工做温度: 摄氏-20~80度 环境储存温度: 摄氏-40~85度 环境相对湿度: 相对湿度5%~95%
0x2: 模块原理图并发
0x3: MFRC522数据手册less
MFRC522 是一个用来读写/操做RFID卡的外接模组,咱们对卡的全部的操做,都必须借助MFRC522封装并向外提供的API接口进行,MFRC522做为 RFID读卡器,须要将上位机发送的二进制数据封装为指定格式(相似TCP/IP的封装),同时也要解析来自RFID卡发送的封装好的数据,这个过程对 RFID卡来讲也是同样的
oop
the MFRC522 is a highly intergrated reader/writer for contactless communication at 13.56MHz. the MFRC522 reader supports ISO 14443A/MIFARE Mode,这意味着它能够操做两种制式类型的卡
1. Features
1. Highly integrated analog circuity to demodulate and decode response 2. Bufferd output drivers to connect an antenna with minimum number of external components 3. Supports ISO/IEC 14443A/MIFARE 4. Typical operating distance in Reader/Writer mode for communication to a ISO/IEC 14443A/MIFARE up to 50 mm depending on the antenna size and turning 5. Supports MIFARE Classic encryption in Reader/Writer mode 6. Supports of the MFIN/MFOUT 7. Additional power supply to directly supply the smart card IC connected via MFIN/MFOUT 8. Supports host interfaces 1) SPI interface up to 10Mbit/s 2) I2C interface up to 400kbit/s in Fast mode, up to 3400 kbit/s in High-speed mode 3) serial UART in different transfer speeds up to 1228.8 kbit/s, framing according to the RS232 interface with voltage levels according pad voltage supply 9. Comfortable 64 byte send and receive FIFO-buffer 10. Flexible interrupt modes 11. Hard reset with low power function 12. Power-down mode per software 13. Programmable timer 14. internal oscillator to connect 27.12 MHz quartz 15. 2.5 ~ 3.3V power supply 16. CRC Co-processor 17. Free programmable I/O pins 18. internal self test
2. Block diagram(封包协议)
Block diagram相似于TCP/IP协议栈中的数据链路层,上层的RFID标签数据通过硬件层的封装以后,造成1/0 bit流,经过DA转换器造成模拟射频波信号,经过空气介质在标签和阅读器之间传播
1. the analog interface handles the modulation and demodulation of the analog signals 2. the contactless UART handles the protocol requirements for the communication schemes in co-operation with the host. the comfortable FIFO buffer allows a fast and convenient data transfer from the host to the contactless UART and vice versa 3. various host interfaces are implemented to fulfill different customer requirements
RFID标签产生的电感信号是一种模拟信号,由于标签和阅读器之间是无链接的,数据的传输必须依靠射频波从空气中传播,所以必须是一连串的模拟波信号,在到达阅读器以前必须经过AD转换为数字信号
3. Functional description
MFRC522 transmission module supports the Reader/Writer mode for ISO/IEC 1444三、MIFARE with different transfer speeds and modulation schemes
the contactless UART of MFRC522 and a dedicated external host are required to handle the complete MIFARE、ISO/IEC 14443A、MIFARE protocol
the internal CRC co-processor calculates the CRC value according the definition given in the ISO/IEC 14443A
4. MFRC522 Register SET
//Page 0:Command and Status Reserved00: Reserved for future use CommandReg: Starts and stops commands execution CommIEnReg: Controls bits to enable and disable the passing of interrupt Requests DivlEnReg: Controls bits to enable and disable the passing of interrupt Requests CommIrqReg: Contains interrupt Request bits DivIrqReg: Contains interrupt Request bits ErrorReg: Error bits showing the error status of the last command executed Status1Reg: Contains status bits for communication Status2Reg: Contains status bits of the receiver and transmitter FIFODataReg: in and output of 64 byte FIFO buffer FIFOLevelReg: indicates the number of bytes stored in the FIFO WaterLevelReg: Defines the level for FIFO under and overflow warning ControlReg: Contains miscellaneous Control Registers BitFramingReg: Adjustments for bit oriented frames CollReg: Bit position of the first bit collision detected on the RF-interface Reserved01: Reserved for future use //Page 1:Command Reserved10: Reserved for future use ModeReg: Defined general modes for transmitting and receiving TxModeReg: Defines the transmission data rate and framing RxModeReg: Defines the receive data rate and framing TxControlReg: Control the logical behavior of the antenna driver pins TX1 and TX2 TxAutoReg TxSelReg: Selects the internal sources for the antenna driver RxSelReg: Selects internal receiver setttings RxThresholdReg: Selects threadholds for the bit decoder DemodReg: Defines demodulator settings Reserved11: Reserved for future use Reserved12: Reserved for future use MifareReg Reserved13: Reserved for future use Reserved14: Reserved for future use SerialSpeedReg: Selects the speed of the serial UART interface //Page 2:CFG Reserved20: Reserved for future use CRCResultRegM: Shows the actual MSB values of the CRC calcalation CRCResultRegL: Shows the actual LSB values of the CRC calcalation Reserved21: Reserved for future use ModWidthReg: Controls the settting of the ModWidth Reserved22: Reserved for future use RFCfgReg: Configures the receiver gain GsNReg: Selects the conductance of the antenna driver pins TX1 and TX2 for modulation CWGsPReg ModGsPReg TModeReg: Defines settings for the internal timer TPrescalerReg TReloadRegH: Describes the 16 bit timer reload value TReloadRegL TCounterValueRegH: Shows the 16 bit actual timer value TCounterValueRegL //Page 3:TestRegister Reserved30: Reserved for future use #define TestSel1Reg 0x31 #define TestSel2Reg 0x32 #define TestPinEnReg 0x33 #define TestPinValueReg 0x34 #define TestBusReg 0x35 #define AutoTestReg 0x36 #define VersionReg 0x37 #define AnalogTestReg 0x38 #define TestDAC1Reg 0x39 #define TestDAC2Reg 0x3A #define TestADCReg 0x3B #define Reserved31 0x3C #define Reserved32 0x3D #define Reserved33 0x3E #define Reserved34 0x3F
5. DIGITAL Interfaces
SPI Compatible interface
A serial peripheral interface(SPI compatible)is supported to enable high speed communication to the host. the SPI interface can handle data speed of up to 10Mbit/s, in the communication with a host MFRC522 acts as a slave receiving data from the external host(能够是arduino uno)for register settings and to send and receive data relevant for the communication on the RF interface
UART Interface
the internal UART interface is compatible to an RS232 serial interface
I2C Bus interface
I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于链接微控制器及其外围设备。是微电子通讯控制领域普遍采用的一种总线标准。它是同 步通讯的一种特殊形式,具备接口线少,控制方式简单,器件封装形式小,通讯速率较高等优势。I2C 总线支持任何IC 生产过程(CMOS、双极性)。经过串行数据(SDA)线和串行时钟 (SCL)线在链接到总线的器件间传递信息。每一个器件都有一个惟一的地址识别(不管是微控制器——MCU、LCD 驱动器、存储器或键盘接口),并且均可以做为一个发送器或接收器(由器件的功能决定)。LCD 驱动器只能做为接收器,而存储器则既能够接收又能够发送数据。除了发送器和接收器外,器件在执行数据传输时也能够被看做是主机或从机(见表1)。主机是初 始化总线的数据传输并产生容许传输的时钟信号的器件。此时,任何被寻址的器件都被认为是从机
6. MFRC522 Command Set
the behavior is determined by a state machine capable to perform a certain set of commands, by writing the according command-code to register CommandReg the command is executed
Arguments and/or data necessary to process a command are exchanged via the FIFO buffer
上位机(能够是arduino uno)经过MFRC522预设的指令集来间接的操做RFID射频卡(读写指定扇区数据)
1. each command, that needs a data stream(or data byte stream) as input will immediately process the data it finds in the FIFO buffer 2. each command that needs a certain number of arguments will start processing only when it has received the correct number of arguments via the FIFO buffer 3. the FIFO buffer is not cleared automatically at command start, therefore, it is also possible to write the command arguments and/or the data bytes into the FIFO buffer and start the command afterwards 4. each command may be interrupted by the host by writing a new command code into register CommandReg
MFRC522 Commands Overview
MFRC522的指令都是双字节的,即咱们要操做MFRC522就须要按照必定的时序向它发送一系列的双字节指令码,为了方便编程,咱们封装了一些程序库
//MF522 command bits #define PCD_IDLE 0x00 //NO action; cancel current commands #define PCD_AUTHENT 0x0E //verify password key #define PCD_RECEIVE 0x08 //receive data #define PCD_TRANSMIT 0x04 //send data #define PCD_TRANSCEIVE 0x0C //send and receive data #define PCD_RESETPHASE 0x0F //reset #define PCD_CALCCRC 0x03 //CRC check and caculation
arduino向MFRC522发送指令本质上就是arduino向MFRC522的指令寄存器写入2字节的指令,等待MFRC522读取并执行、响应
Authentication 认证操做
1. MCM中设有专用的密码存储器(KEY-RAM),用于存储3个密码集KEYSET0,KEYSET1,KEYSET2,每个KEYSET又包含了各个扇区的KEY A 及KEY B 2. Authentication操做就是将KEY-RAM中的密码与卡中对应的密码进行三次相互认证 3. Authentication操做的卡应答以AE位给出 1) AE=1: 密码出错,未能经过认证 2) AE=0: 密码正确,经过认证
READ/WRITE操做
1. READ/WRITE均需整块操做 2. READ 1) 发送命令码30H+块地址(0~63) 2) 接收指定块的数据(16B) 3) 一般用2次读并比较是否一致来校验是否正确读 3. WRITE 1) 发送命令码A0H+块地址(0~63) 2) 接收ACK/NAK应答来校验是否正确接收命令 3) 发送块数据(16B) 4) 接收ACK/NAK应答来校验是否正确写入EEPROM
Value Operate 值操做
1. MIFARE卡专门为公交/地铁等行业的定额收费系统设有值操做命令,包括 1) INCREAMENT 2) DECREAMENT 3) TRANSFER 4) RESTORE 2. 对某块进行值操做的前提是该块已被初始化为"值块"(Value Block)而且Access Bits容许值操做
Relevant Link:
https://detail.tmall.com/item.htm?id=526342615313
2. FM1702SL芯片(读卡器)简介
FM1702SL是复旦微电子股份有限公司设计的基于ISO14443标准的非接触卡读卡机专用芯片,采用0.6毫米CMOS EEPROM工艺,支持13.56MHz频率下的typeA非接触通讯协议,支持多种加密算法,兼容Philips的MFRC530(SPI接口)读卡机芯片
1. 高集成度的模拟电路,只需最少许的外围电路 2. 操做距离可达10cm 3. 支持ISO14443 typeA协议 4. 内部带有加密单元 5. 支持SPI接口模式 6. 包含515byte的EEPROM 7. 包含64byte的FIFO 8. 数字电路具备TTL/CMOS两种工做模式 9. 软件控制的power down模式 10. 一个可编程计时器 11. 一个中断处理器 12. 一个串行输出输入口 13. 启动配置可编程 14. 数字、模拟和发射模块都有独立的电源供电,电压范围从3V到5V 15. 封装形式为SOP24小型封装
0x1: 结构图
0x2: 管脚信息
1. 管脚配置
2. 管脚描述
0x3: 数字接口
1. 支持的微处理器接口概述
FM1702SL支持SPI微处理器接口,在SPI通讯方式下,FM1702SL只能做为slave端,SCK时钟需由master端提供
2. 自动侦测微处理器接口类型
在每一次上电或硬件复位后,FM1702SL会复位微处理器接口处理模块,而且经过检测控制管脚上的电平来设置SPI接口
0x4: 寄存器组
FM1702SL的内部寄存器按功能不一样分红8组,每组为一页,包含8个寄存器
1. Page0: 指令和状态寄存器组 2. Page1: 控制和状态寄存器组 3. Page2: 发射及编码控制寄存器组 4. Page3: 接收及接码控制寄存器组 5. Page4: 时间及校验寄存器组 6. Page5: FIFO、Timer、IRQ控制寄存器组 7. Page6: 预留寄存器组 8. 预留寄存器组
每个寄存器里的每一位按其功能都有不一样的读写权限
0x5: FIFO
FM1702SL包含一个8 * 64的并行FIFO,保存微处理器和FM1702SL之间通讯的数据
1. 访问规则
FIFO经过FIFOData寄存器输入和输出数据,向这个寄存器里写一byte数据即向FIFO里添加一byte数据,同时FIFO写指针加一。从这个寄存器读一byte数据即从FIFO里读出一byte数据,同时FIFO读指针加一。FIFOLength寄存器记录读/写指针之间的长度
当FM1702SL执行一条指令时,内部状态机可能会对FIFO进行内部读/写操做,因此除了指令自己要求外,微处理器在FM1702SL指令执行过程当中不要对FIFO执行不正确的访问
2. 控制FIFO
除了读写FIFO外,用户能够经过设置FlushFIFO位来复位FIFO指针,在这种状况下,FIFO被清空,FIFOLength置0,FIFOOvfl标志位被清除,FIFO内原有的数据再也不有效
3. FIFO状态信息
微处理器能够经过下列寄存器得到FIFO状态
1. FIFO中数据长度: FIFOLength 2. FIFO渐满警告: HiAlert 3. FIFO渐空警告: LoAlert 4. FIFO溢出: FOFOOvfl
FIFO能够产生两个中断请求
1. 若是LoAlertRq置1,且LoAlert变为1,会激活IRQ管脚 2. 若是HiAlertRq置1,且HiAlert变为1,会激活IRQ管脚
0x6: 中断请求系统
若是有中断请求事件发生,FM1702SL会将PrimaryStatus寄存器里的IRQ位置1,同时激活IRQ管脚,IRQ上的信号能够用来向微控制器发出中断请求
0x7: 启动过程
1. Hard Power Down阶段
在下列状况会进入Hard Power Down阶段
1. 因为DVDD管脚上加电引发的上电复位 2. 因为AVDD管脚上加电引发的上电复位 3. 在RSTPD管脚上加高电平
2. 初始化阶段
初始化阶段自动跟随复位阶段,须要128个时钟周期,在初始化阶段,EEPROM的第一、第2扇区内容被复制到10hex至2Fhex寄存器
3. 初始化SPI接口方式
芯片复位后,必须进行一次初始化程序以便初始化SPI接口模式,并且能够同步微处理器和FM1702SL的启动工做
在整个启动过程当中,Command寄存器的值始终为3Fhex,在初始阶段结束后,FM1702SL自动进入Idel状态,Command寄存器的值随之变成00hex
执行下列程序确保初始化SPI接口
1. 读Command寄存器,直到6bit值变成00hex,此时内部初始化阶段已经结束,芯片准备好接收外部指令 2. 往Page寄存器写80hex初始化SPI接口 3. 读Command寄存器,若是它的值为00hex,则SPI接口已经初始化成功 4. 往Page寄存器写0hex,开始使用SPI接口 5. 完成接口初始化以后,能够经过往Page寄存器写00hex切换到线性寻址方式
0x8: 串行信号开关
FM1702SL包括两个主要模块
1. 数字模块 1) 状态机 2) 编码器 3) 接码逻辑 2. 模拟模块 1) 调制器 2) 天线驱动器 3) 接收机 4) 放大电路 //这两模块的接口设计能够将接口信号送入MFIN
0x9: FM1702SL指令集
FM1702SL的行为由一个内部状态机决定,该状态机可执行一组专门的指令集,将某条指令代码写入指令寄存器可启动一个相应的命令的执行
某些指令执行需携带参数和(或)数据,这些参数和数据主要经过FIFO进行交换
0x10: 认证及数据加密传输
FM1702SL使用的认证算法称为三重认证,它基于密钥长度为48bit的私有加密数据流。当一张卡按照ISO14443协议被选中后,用户能够按照标准协议继续操做,这种状况下,必须执行卡片认证,这一过程在执行Authen1和Authen2指令时自动完成,在卡认证的过程当中,加密算法被初始化,在成功认证以后与卡的通信处于加密状态
1. 密钥处理
在认证指令执行过程当中,FM1702SL从内部密钥缓冲器中读取密钥,密码老是从密钥缓冲器中获取,所以认证指令无需指明密钥存储地址,固然,在认证指令开始以前,用户必须保证在密钥缓冲器中已经准备好了密钥
密钥缓冲器能够经过以下方式加载
1. 用LoadKeyE2指令从EEPROM中加载 2. 直接由外部处理器经过LoadKey指令从FIFO中加载
2. 操做三重认证指令
三重加密算法被用于执行标准认证,在密钥缓冲器中必须存储准确的密钥以便可以进行成功的认证操做
1. 经过LoadKeyE2或者LoadKey加载密钥到内部密钥缓冲器 2. 启动Authen1指令,结束以后,检查错误标志来判断执行结果 3. 启动Authen2指令,结束以后,检查错误标志以及CryptoOn标志来判断执行结果
FM1702SL分别支持MIFARE三重认证算法
Relevant Link:
http://wenku.baidu.com/link?url=dyarxoceft-GVg8PXQHBfcWotBWJWzZrG876bhy-TpAgIdIHbP5aomZl7KskuMM1emHn9WCt4G5d6F11JfOXwhIzCyL_s6DGmKjr4fPQiJ3 file:///C:/Users/zhenghan.zh/Desktop/FM1702SL%E4%B8%AD%E6%96%87%E8%AF%B4%E6%98%8E%E4%B9%A6.pd
3. RFID M1卡简介
0x1: 主要指标
1. 容量为 8K 位 EEPROM(这意味着M1卡支持数据的读写修改) 2. 分为 16 个扇区,每一个扇区为 4 块,每块 16 个字节,以块为存取单位(这意味着M1卡能够承载多功能的IC卡,在不一样的扇区分别存储不一样目的的数据) 3. 每一个扇区有独立的一组密码及访问控制 4. 每张卡有惟一序列号,为 32 位 5. 具备防冲突机制,支持多卡操做 6. 无电源,自带天线,内含加密控制逻辑和通信逻辑电路 7. 数据保存期为 10 年,可改写 10 万次,读无限次 8. 工做温度" -20℃~50℃(湿度为 90%) 9. 工做频率: 13.56MHZ 10. 通讯速率: 106 KBPS 11. 读写距离: 10 cm 之内(与读写器有关)
0x2: 存储结构
M1 卡分为 16 个扇区,每一个扇区由 4 块(块0、块一、块二、块3)组成,(咱们也将 16 个扇区的 64 个块按绝对地址编号为 0~63)
每张M1卡必定都有16个扇区
0 扇区的块 0(即绝对地址 0 块),它用于存放厂商代码,已经固化,不可更改(前4字节是卡序列号,第5字节是卡容量,六、7字节是卡类型、剩下是厂商定义的信息)。每一个扇区的块0、块一、块2为数据块,可用于存贮数据,数据块可做两种应用
1. 用做通常的数据保存,能够进行读、写操做 2. 用做数据值,能够进行初始化值、加值、减值、读值操做
每一个扇区的块 3 为控制块,包括了密码 A、存取控制、密码 B。具体结构以下
//从3区块读出的数据 KeyA 0 0 0 0 0 0 存取控制 255 7 128 105 KeyB 255 255 255 255 255 255
每一个扇区的密码和存取控制都是独立的,能够根据实际须要设定各自的密码及存取控制。存取控制为 4 个字节,共 32 位,扇区中的每一个块(包括数据块和控制块)的存取条件是由密码和存取控制共同决定的(相似于x86的内存读写管理r/w/rw),在存取控制中每一个块都有相应的三个控制位,定义以下
三个控制位以正和反两种形式存在于存取控制字节中,决定了该块的访问权限(如进行减值操做必须验证 KEY A,进行加值操做必须验证 KEY B,等等)
块0的存取控制位C10 C20 C30=1 0 0时,验证密码A或密码B正确后可读;验证密码B正确后可写;不能进行加值、减值操做
例如:当块3的存取控制位C13 C23 C33=1 0 0时,表示
1. 密码A: 不可读,验证KEYA或KEYB正确后,可写(更改) 2. 存取控制: 验证KEYA或KEYB正确后,可读、可写 3. 密码B: 验证KEYA或KEYB正确后,可读、可写
也就是说,对任何一张M1卡,要想对它进行读写操做,须要KeyA、KeyB、存储控制位这3者综合判断的结果,并且大多数状况下存储控制位所在区块是不容许写操做的,这就像一个保险柜的钥匙放在保险柜里并加锁了,只提供外面的一些仅有的界面提供操做,没法直接拿到里面的钥匙
0x3: 三次握手密钥认证过程
这实际上是一种典型的认证双方预分配(协商)好一对相同的密钥,经过各自生成的随机种子,并使用该密钥加密并发送给对方,向对方证实本身是可信的
0x3: 工做原理
卡片的电气部分只由一个天线和 ASIC 组成
1. 天线: 卡片的天线是只有几组绕线的线圈,很适于封装到 IS0 卡片中 2. ASIC: 卡片的 ASIC 由一个高速(106KB 波特率)的 RF 接口,一个控制单元和一个 8K 位 EEPROM 组成 //RFID卡自己也能够看做是一个微型的单片机
读写器向 M1 卡发一组固定频率的电磁波,卡片内有一个 LC 串联谐振电路,其频率与读写器发射的频率相同,在电磁波的激励下,LC 谐振电路产生共振,从而使电容内有了电荷,在这个电容的另外一端,接有一个单向导通的电子泵,将电容内的电荷送到另外一个电容内储存,当所积累的电荷达到 2V 时,此电容可作为电源为其它电路提供工做电压,将卡内数据发射出去或接取读写器的数据
1. 复位应答(Answer to request) M1 射频卡的通信协议(相似于TCP/IP在不一样的bit区间内保存不一样目的的数据)和通信波特率是定义好的,当有卡片进入读写器的操做范围时,读写器以特定的协议与它通信,从而肯定该卡是否为 M1 射频卡,即验证卡片的卡型 2. 防冲突机制(Anticollision Loop) 当有多张卡进入读写器操做范围时,防冲突机制会从其中选择一张进行操做,未选中的则处于空闲模式等待下一次选卡,该过程会返回被选卡的序列号 3. 选择卡片(Select Tag) 选择被选中的卡的序列号,并同时返回卡的容量代码 4. 三次互相确认(3 Pass Authentication) 选定要处理的卡片以后,读写器就肯定要访问的扇区号,并对该扇区密码进行密码校验,在三次相互认证以后就能够经过加密流进行通信(在选择另外一扇区时,则必须进行另外一扇区密码校验) //这里必须明白的,RFID卡不是二维码,不是随便谁都能读取到卡中的数据,读卡器只能经过协议发送指令码,通过验证后,RFID卡会根据读写控制位决定是否返回指定区块的数据(RFID自己是一个单片机) 5. 对数据块的操做 1) 读 (Read): 读一个块 2) 写 (Write): 写一个块 3) 加 (Increment): 对数值块进行加值 4) 减 (Decrement): 对数值块进行减值 5) 存储 (Restore): 将块中的内容存到数据寄存器中 6) 传输 (Transfer): 将数据寄存器中的内容写入块中 6. 停止(Halt): 将卡置于暂停工做状态
0x4: MIFARE卡的读写操做步骤
1. 激活MCM 2. MCM软复位 3. 向MCM下载密码(LOAD KEY),校验传输密码正确后可向MCM的KEY-RAM写入用户本身设定的密码 //以上操做与卡无关 4. 请求应答(ANSWER TO REQUEST): 寻卡 5. 防冲突(ANTICOLLISION): 选择惟一一张卡 6. 选择标记(SELECT): 激活所选择的卡 7. 认证(AUTHENTICATION): 安全性 8. 读写操做(读、写、加值、减值): 交换数据(READ/WRITE/INCREAMENT/DECREMENT) 9. 中止(HALT): 置卡为中止模式,防止重复操做
读写器与M1卡交换数据的过程
1. 由读写器MCU(微控制器)发送指令给MCM 2. MCM执行指令并将其转换为射频信号发送给卡 3. 卡接收到来自MCM的指令后,按指令完成其内部的各类处理,并回送应答信号/数据给MCM 4. MCM接收卡回送的射频信号并将其转换为数字信号输出给MCU,读写器MCU读取MCM接收到的应答/数据,便可完成与M1卡的数据交换
0x5: 指令时序
每一个指令由7个基本步骤组成,必须按此时序编程才能完成该指令,这是MFRC522硬件对上位机发送指令的时序要求
1. 初始化,设置各寄存器,特别是BCNTS和BCNTR 2. 送指令码到DATA,由MCM发送指令 3. 设置TOC,MCM准备接收来自卡的应答或数据 4. 检查DV标志,查询数据接收是否完成 1) DV标志为"1"代表MCM与MIFARE卡片之间的传输已经完成,而且主处理机可能已经从MCM中收到数据,能够进行下一步操做 2) DV=0表示数据接收还没有完成或未能接收到数据,则程序循环检测DV标志直至DV=1。有一种状况例外,既当定时器溢出时,不管接收是否完成DV都将被设置为1,一样将进行下一步操做 5. 清零TOC 6. 检查出错标志(相似于x86架构的错误处理机制) 1) 如有标志被设置,则进行相应的出错处理,例如设置出错标志等,并返回主程序 2) 若没有标志被设置,表示接收正确,将进行下一步操做 7. MCU从DATA读出MCM接收到的应答或数据
0x6: SerialNumberRead
http://files.cnblogs.com/files/LittleHann/M1_read.rar
Relevant Link:
http://wenku.baidu.com/link?url=seLu40bcRSJkNx4w62XULQAnvZp0NUx6TdBPwauyrgWZgVZElLD_FMnp_sM7YfOA3mDn2r_256LyL7y48OJ1Wr7PC7534gF46IXFrzcZLaS http://file.yfrobot.com/RFID.zip http://www.freebuf.com/fevents/110534.html http://blog.chinaunix.net/uid-23686726-id-3444925.html http://baike.baidu.com/link?url=IWEAgJEzFFecldhpuIemkFzPXE3tmgsSnlCoFNpDsqg-d1Fl4k-1TL95CEn02Xpwy8pLlwpI8PwINefETmafdK file:///D:/%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99/RFID/TJDZ-RC522%E5%B0%84%E9%A2%91%E5%8D%A1%E7%94%A8%E6%88%B7%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C%E8%B5%84%E6%96%99Ver_1.0/%E7%9B%B8%E5%85%B3%E6%95%B0%E6%8D%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE/MFRC522%E6%95%B0%E6%8D%AE%E6%89%8B%E5%86%8C.pdf file:///D:/%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99/RFID/TJDZ-RC522%E5%B0%84%E9%A2%91%E5%8D%A1%E7%94%A8%E6%88%B7%E4%BD%BF%E7%94%A8%E6%89%8B%E5%86%8C%E8%B5%84%E6%96%99Ver_1.0/%E7%9B%B8%E5%85%B3%E6%95%B0%E6%8D%AE%E6%89%8B%E5%86%8C%E5%92%8C%E5%8F%82%E8%80%83%E6%96%87%E7%8C%AE/Mifare%E5%8D%A1%E8%AF%B4%E6%98%8E/Mifare1%20S50IC%E5%8D%A1%E4%B8%AD%E6%96%87%E8%AF%B4%E6%98%8E%E4%B9%A6.pdf
4. 读取ID/序列号(arduino uno、MFRC522芯片 Based On MF522-AN模块)
0x1: 接线方式
模块采用MF RC522芯片,模块与Arduino通信方式为SPI(同步串行外设接口总线)通讯,Arduino工做在主模式下,RC522工做在从模式下,模块与Arduino控制板链接方式以下
Arduino RC522 (工做电压3.3V)
D5 <-------------> RST D10 <-------------> SDA D11 <-------------> MOSI D12 <-------------> MISO D13 <-------------> SCK
0x2: RFID库文件
Arduino SPI 库文件官方软件自带,咱们须要下载一个RFID库文件,将库文件放到指定文件夹,从新打开IDE便可调用该库文件
0x3: Code
#include <SPI.h> #include <RFID.h> //D10 - 读卡器CS引脚、D5 - 读卡器RST引脚 RFID rfid(10,5); unsigned char status; unsigned char str[MAX_LEN]; //MAX_LEN为16,数组最大长度 void setup() { Serial.begin(9600); SPI.begin(); rfid.init(); //初始化 Serial.print("init "); } void loop() { //Search card, return card types if (rfid.findCard(PICC_REQIDL, str) == MI_OK) { Serial.println("Find the card!"); // Show card type ShowCardType(str); //防冲突检测,读取卡序列号 if (rfid.anticoll(str) == MI_OK) { Serial.print("The card's number is : "); //显示卡序列号 for(int i = 0; i < 4; i++){ Serial.print(0x0F & (str[i] >> 4),HEX); Serial.print(0x0F & str[i],HEX); } Serial.println(""); } //选卡(锁定卡片,防止多数读取,去掉本行将连续读卡) rfid.selectTag(str); } rfid.halt(); //命令卡片进入休眠状态 } void ShowCardType(unsigned char * type) { Serial.print("Card type: "); if(type[0]==0x04&&type[1]==0x00) Serial.println("MFOne-S50"); else if(type[0]==0x02&&type[1]==0x00) Serial.println("MFOne-S70"); else if(type[0]==0x44&&type[1]==0x00) Serial.println("MF-UltraLight"); else if(type[0]==0x08&&type[1]==0x00) Serial.println("MF-Pro"); else if(type[0]==0x44&&type[1]==0x03) Serial.println("MF Desire"); else Serial.println("Unknown"); }
Relevant Link:
http://www.openedv.com/thread-44628-1-1.html http://www.arduino.cn/forum.php?mod=viewthread&tid=4560&extra=&highlight=rfid&page=1 http://www.yfrobot.com/forum.php?mod=viewthread&tid=2377&extra= http://www.yfrobot.com/forum.php?mod=viewthread&tid=2375&highlight=rfid
5. 读取ID/序列号(arduino uno、FM1702SL)
Relevant Link:
http://v.youku.com/v_show/id_XMzI0MjYxNDc2.html
6. arduino uno、RC522向mifare卡写入数据
寻卡→防冲突→选卡→读/写卡
在编写向M1卡写入数据的代码以前须要首先明白的是,M1卡的每一个扇区都有独立的验证密码,在写入数据以前以前须要先经过密码验证,方可进行进行后续的指令操做,相似于WEB的login界面。M1卡总共有16个扇x区,每一个扇区的默认密码都是6 bytes 的0xFF
http://files.cnblogs.com/files/LittleHann/m1.rar
Relevant Link:
http://blog.sina.com.cn/s/blog_6754612e0101c0pe.html http://wenku.baidu.com/link?url=nHSqrV_vxk7zj_3rQqN8an3i262yShVdKLpdKKUOI69XTslH9wrOjAAQp_d3ee1qxulyuCvgmj21Cn5h2_DZo9AJhi7ICBEBMl-YeP9GahS http://blog.csdn.net/zitech/article/details/24135893/ http://www.geek-workshop.com/thread-4564-1-1.html http://www.geek-workshop.com/thread-4564-1-1.html http://wenku.baidu.com/link?url=IlOrYuXwtn8nHsgc_BbMihMuw-czCSKNbAwuirAut6JLzB9kGnlTFs8j1T90mGGfAAqcbyXUWLK9-BJ74lBMfkarpDAC0KFraZ7NWmp7CIy
Copyright (c) 2016 LittleHann All rights reserved