本篇文章只对高频RFID进行大体操作思想进行总结分析,代码部分没有附上,重点在理解!!!
认识 ISO 14443协议
该协议是非接触式IC卡标准协议(Contactless card standards)。
其英文介绍文档有四部分组成,分别为物理特性、频谱功率和信号接口、初始化和防冲突接口、通讯协议;只有第三本有帧格式描述
注意14443只规定了框架,但没有规定具体的读写细节,需根据不同产品的手册操作。
14443术语:
(电子标签)接近式卡 Proximity Card (PICC)
(阅读器)接近式耦合设备 Proximity Coapling device (PCD)
防冲突环 anticollision loop
比特冲突检测协议 bit collision detection protocol
冲突 collision
帧 frame
协议的框架
PICC的初始对话PCD和PICC之间的初始对话通过下列连续操作:
- PCD的RF工作场激活PICC
- PICC静待PCD的命令
- PCD传输命令
- PICC传输响应
这些操作使用下列条款中规定的视频功率和信号接口:
PCD应产生给予能量的RF场,为该RF场与PICC进行耦合,为了通信,该RF场应被调制。RF工作场频率(fc)应为13.56MHZ ± 7KHZ
请求和唤醒帧用来初始化通信并按以下次序组成:
- 通信开始
- 7个数据位发送
- LSB首先发送
- 标准REQA的数据内容是0x26,WAKE-UP请求的数据内容是0x52
- 通信结束,不加奇偶校验位
帧格式有三种:
短帧(1字节)、标准帧(n字节)、防冲突帧(在标准帧上进行扩展)
RC522没有自主编程能力,需通过MCU进行间接操作,并且发送的操作命令需满足所支持的帧格式。
基本Commands 框架为:
REQA:请求,对象:所有未睡眠的;短帧格式
WUPA:唤醒,对象:所有;短帧格式
ANTICOLLISION:防冲突;防冲突帧格式
SELECT:选择某个卡片;标准帧格式
HLTA:关机;标准帧格式
Commands相关数据的描述:
Cascade level:描述卡片ID的字节数,有三个level(1~3),分别代表4(single)、7(double)和10(triple)三种。
SEL:一个字节,用于设置Cascade level。
NVB:一个字节,用于统计接收数据Bit个数,包含SEL和NVB本身。有效数据是以位来传输,接收时用NVB(1B)的高4位描述总字节数 / 8,低4位描述余数的位数。例23位用NVB表示为27,两个字节+7位。
CRC_A:一个字节,用于校验
UID:卡片的ID号
防冲突命令使用的分析:
ANTICOLLISION:SEL + NVB + UID + CRC_A
防冲突由硬件完成,目的是为了拿到ID,在进行叫号,获取目标卡片
使用时只需发送 93 20起个头,然后由硬件自行叫号。(93表示SEL,level1;20表示NVB,2个字节)
基于14443-A命令的使用
请求卡:0x26,返回2B卡类型,例:(4,0)表示ID号4字节类型
唤醒所有卡:0x52,返回2B卡类型
防冲突:0x93,0x20,返回得到4B的卡ID + 1B校验(异或)
选择卡片:0x93,0x70,4B卡ID(ID1,ID2,ID3,ID4),1B的checksum,2B的CRC16,返回卡校验0x08
RC522芯片的概述
应用于13.56MHZ非接触式通信中高集成度读写卡系列芯片中的一员,是NXP公司针对“三表”应用推出的一款低电压、低成本、体积小的非接触式读写卡芯片,是智能仪表和便携式手持设备研发的较好选择。
读写器支持ISO 14443 / MIFARE,MFRC522内部发生器可驱动读写器天线与ISO 14443A / MIFARE卡和应答机的通信,无需其它的电路。可实现不同主机接口的功能:SPI、UART、I2C。
相关寄存器描述:
SPI接口
引脚包含:MOSO输出、MOSI输入、CSS片选、SCL时钟
对于SPI接口的RC522设备地址有一个特殊的要求:
第一个字节的第一个位MSB设置使用模式,1为读,0位写
第1~6位定义从设备地址,最后一位设置为0(RFU,这里必须为0,不能使用)。即需要将从设备地址左移一位,且将其低位设置为0
例读操作时额外对地址进行处理:
addr << 1
addr |= 0x80
addr &= 0xfe
RC522命令集
命令有两种:一种控制RC522本身,另一种控制非接触式IC卡
其中Transceive和MFAuthent为操作IC卡的,命令都是由MCU发送给RC522芯片。因为RFID通信需满足ISO 14443协议,所以这两条命令也需满足该协议进行操作。
例如要唤醒卡片,则需发送 Transceive’0x0c’ + 0x52。
防冲突获取卡片ID,则需发送 Transceive’0x0c’ + 0x93 + 0x20。
…
Transceive命令的概述:
MFAuthent命令的概述:
功能实现
- 请求唤醒:获取卡ID类型,得到ID号的字节数大小
1. 配置“Status2Reg”寄存器。清理指示MIFARECyptol单元接通以及所有卡的数据通信被加密的情况
2. 配置“BitFramingReg”寄存器。设置最后一个字节发送位数为七位
3. 配置“TxControlReg”寄存器。设置天线驱动器TX1,TX2管脚的输出信号传递经发送调制的13.56的能量载波信号
4. 配置“ComIEnReg”寄存器。IRqInv置位管脚IRQ与Status1Reg的IRq位的值相反 ,允许TxIEn RxIEn IdleIEn LoAlertIEn ErrIEn TimerIEn,(寻卡等待时候 查询接收中断标志位与 空闲中断标志位)
5. 配置“ComIrqReg”寄存器。中断屏蔽位清零
6. 配置“CommandReg”寄存器。写空闲命令
7. 配置“FIFOLevelReg”寄存器。置位FlushBuffer清除内部FIFO的读和写指针以及ErrReg的BufferOvfl标志位被清除
8. 配置“FIFODataReg”寄存器。写数据进FIFOdata,“0x26”或“0x52”,符合14443-A协议的REQ命令
9. 配置“CommandReg”寄存器。发送“0x0C”,PCD_TRANSCEIVE指令。
10. 配置“BitFramingReg”寄存器。StartSend置位启动数据发送 该位与收发命令使用时才有效
11. 循环等查询事件中断
do //认证 与寻卡等待时间
{
ucN = RC522_ReadByte ( ComIrqReg ); //查询事件中断
ul --;
} while ( ( ul != 0 ) && ( ! ( ucN & 0x01 ) ) && ( ! ( ucN & ucWaitFor ) ) );
//退出条件:ul=0,定时器中断,与写空闲命令
12. 配置“BitFramingReg”寄存器,清理允许StartSend位
13. 若为事件中断,则从FIFOLevelReg寄存器中读出IC卡回应的数据的字节数N,在从ControlReg寄存器中读出最后一字节的位数。
14. 计算所需接收数据总位数,用于校验:N个字节数减去1(最后一个字节)+最后一位的位数 读取到的数据总位数
15. 循环从FIFODataReg寄存器中读出所有数据,最后一个字节不用读。
16. 配置“ControlReg”寄存器。停止定时器
17. 配置“CommandReg”寄存器。使RC522位于空闲态
- 防冲突:获取到RF场范围内的某一个卡ID
1. 配置“Status2Reg”寄存器。清理指示MIFARECyptol单元接通以及所有卡的数据通信被加密的情况
2. (不同点)配置“BitFramingReg”寄存器。清理寄存器 停止收发
3. (不同点)配置“CollReg”寄存器。清ValuesAfterColl所有接收的位在冲突后被清除
4. 配置“ComIEnReg”寄存器。IRqInv置位管脚IRQ与Status1Reg的IRq位的值相反 ,允许TxIEn RxIEn IdleIEn LoAlertIEn ErrIEn TimerIEn,(寻卡等待时候 查询接收中断标志位与 空闲中断标志位)
5. 配置“ComIrqReg”寄存器。中断屏蔽位清零
6. 配置“CommandReg”寄存器。写空闲命令
7. 配置“FIFOLevelReg”寄存器。置位FlushBuffer清除内部FIFO的读和写指针以及ErrReg的BufferOvfl标志位被清除
8. (不同点)配置“FIFODataReg”寄存器。写数据进FIFOdata,“0x93
0x20”,符合14443-A协议的COLL命令
9. 配置“CommandReg”寄存器。发送“0x0C”,PCD_TRANSCEIVE指令。
10. 配置“BitFramingReg”寄存器。StartSend置位启动数据发送 该位与收发命令使用时才有效
11. 循环等查询事件中断
do //认证 与寻卡等待时间
{
ucN = RC522_ReadByte ( ComIrqReg ); //查询事件中断
ul --;
} while ( ( ul != 0 ) && ( ! ( ucN & 0x01 ) ) && ( ! ( ucN & ucWaitFor ) ) );
//退出条件:ul=0,定时器中断,与写空闲命令
12. 配置“BitFramingReg”寄存器,清理允许StartSend位
13. 若为事件中断,则从FIFOLevelReg寄存器中读出IC卡回应的数据的字节数N,在从ControlReg寄存器中读出最后一字节的位数。
14. 计算所需接收数据总位数,用于校验:N个字节数减去1(最后一个字节)+最后一位的位数 读取到的数据总位数
15. (不同点)循环从FIFODataReg寄存器中读出所有数据,最后一个字节不用读,数据接收的校验为除最后一个字节之外,其他字节异或得到。
16. (不同点)校验位判断:将异或所得的数 与 ID卡后一个字节CRC_A进行比较
17. 配置“ControlReg”寄存器。停止定时器
18. 配置“CommandReg”寄存器。使RC522位于空闲态
19. (不同点)配置“CollReg”寄存器。在冲突后所有接收的位均还存在
- SELECT:根据ID号来触发指定的IC卡
通过上面的寄存器操作,我们发现RC522与IC卡的数据通信,
1.要先设置相关标志位,初始化FIFOLevelReg寄存器,
2.将14443-A命令写入FIFODataReg,通过CommandReg寄存器写入对应的RC522操作指令“TRANRECIVE”和使能StartSend来发送一个完整的指令
3.MCU通过TRANRECIVE指令操作RC522,RC522通过FIFODatareg数据与IC卡进交互。
相信已经对其工作的配置原理有了一定认识,下面将不再复述太多寄存器相关的讲解。
14443-A指令:0x93 + 0x70 + 4B卡ID(ID1,ID2,ID3,ID4) + 1B的checksum + 2B的CRC16
RC522的TRANRECIVE指令:0x0C
其中:
4B卡ID:源于防冲撞中所获取的ID卡号
checksum:为4B ID卡异或而得
CRC16:将 0x93 + 0x70 + 4B卡ID(ID1,ID2,ID3,ID4) + 1B的checksum ,一共7个字节的数据写入FIFODataReg寄存器,
发送RC522的PCD_CALCCRC指令,通过判断DivIrqReg寄存器中的第4位是否被置位
若为1则CRC16数据准备好,在从CRCResultReg的两个高低位寄存器中获取CRC16。
- 密码认证(这部分需要结合下面讲解非接触卡的密码设置来理解)
Authentication操作的卡应答以AE位给出,在PCD中由Status2Reg寄存器第4位标志,0为失败,1为成功
使用格式:1B模式 + 1B块地址 + 6B密码 + 4B卡片序列号
块地址:指定非接触卡存储中某一个KEYSET
模式:分A密码和B密码认证,A命令用0x60,B命令用0X61
密码:需要视非接触卡情况而定,一般初始使用时密码均为F
卡序列号:从防冲突中获取
返回值:认证成功status寄存器对应位置1。
- 为了一条龙学习,这里将关于读写等操作放在后面
S50电子标签(高频)
内部采用M1芯片,是指菲利普下属子公司恩智浦出品的芯片缩写,全称为NXP Mifare1系列,常用的有S50及S70两种型号,工作中13.56MHZ,属于非接触式IC卡,又称射频卡,成功地解决了无源(卡内)和免接触这一难题,是电子器件领域的一大突破。主要用于公交、轮渡、地铁的自动收费系统。
优点:可读可写的多功能卡
缺点:价格稍贵且感应距离短,适合非定额消费系统、停车场系统、门禁考勤系统等
特征:
- MIFARE RF接口 ISO/IEC 14443A
- 无限传送数据和能量 不需要电池
- 真正的反冲突(硬件完成)
- CRC校验
- EEPROM存储
- 保密性,唯一的序列号,3轮确认,每个区有两套独立的密匙,支持带密匙层次的多应用,访问EEPROM有传输密匙保护
- 通信速率:106 KBPS
- 读写距离:10 cm以内(与读写器有关)
M1卡的存储结构:
M1中设有专用的密码存储器(KEY-RAM),用于存储3个密码集KEYSET0,KEYSET1,KEYSET2。
每一个KEYSET又包含了各个扇区的KEYSETA 、ACCESS_COND及KEYSETB,即每个扇区有独立的一组密码及访问控制,一共有16个扇区,每个扇区有4个Block,每块16个字节,以块为存取单位。
KEY-RAM容量 = 16区 * 4块 * 16字节 = 1024字节。
每个扇区block0、block1、block2存放数据块,block3有特殊用途(位控制块,包含了密码A、存取控制、密码B),扇区0较特殊,厂商段放于扇区0的block0 ,已经固化,不可更改,为32位(4Bytes)。
数据块可作两种应用:
★ 用作一般的数据保存,可以进行读、写操作。
★ 用作数据值,可以进行初始化值、加值、减值、读值操作。
块存取条件
扇区中的每个块(包括数据块和控制块)的存取条件是由BLOCK3中的密码和存取控制共同决定。
block0-2与block3的存取条件有一些差异,下面放一下手册中的图:
never:无论密码是否正确都无法对某扇区的某块进行操作
KEYA | KEYB:只有密码A或密码B其一正确,即可操作
如何理解呢?
我们看到Block0-2中,含有以下几个功能选择(read\write\incr…),而右边则是C1XY C2XY C3XY表示存取控制,根据存取控制的值得到某扇区某块的权限定义,即某一行,对于某个操作需要满足什么密码认证才能操作。
读写器与卡的Authentication操作
将KEY-RAM中的密码与发出的密码进行三次相互认证。
AE=1,密码出错,未能通过认证;
AE=0,密码正确,通过认证
操作流程:
请求、防冲突、选卡、密码认证、读写操作
续上读写操作的讲解
- 读M1卡
分两步: 1.向IC卡发出读操作; 2.从RC522FIFO中读出数据
第一步:
RC522指令:Transceive 0x0C
14443-A指令:0x30 + 1B块地址 + 2BCRC_A
判断:一般读写操作都是按块操作,16字节,根据FIFOLevelReg寄存器中读出IC卡回应的数据的字节数N,
在从ControlReg寄存器中读出最后一字节的位数。计算所需接收数据总位数,若为 16字节+8 大小则操作成功,否则失败
若成功进入第二步:
循环从FIFODataReg寄存器中读出16B的数据
- 写M1卡:
分两步: 1.向IC卡发出写操作; 2.将1块的16B数据写入RC522的FIFODataReg
第一步:
RC522指令:Transceive 0x0C
14443-A指令:0xA0 + 1B块地址 + 2BCRC_A
判断:返回4B字节且最高B为0x0A,否则失败。
若成功进入第二步:
RC522指令:Transceive 0x0C
M1指令:16B数据 + 2BCRC_A
判断:返回4B字节且最高B为0x0A,否则失败。