基于ISO 14443-A协议的RFID高频频段实战

浪尽此生 提交于 2020-01-23 04:57:11

本篇文章只对高频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之间的初始对话通过下列连续操作:

  1. PCD的RF工作场激活PICC
  2. PICC静待PCD的命令
  3. PCD传输命令
  4. PICC传输响应

这些操作使用下列条款中规定的视频功率和信号接口:
PCD应产生给予能量的RF场,为该RF场与PICC进行耦合,为了通信,该RF场应被调制。RF工作场频率(fc)应为13.56MHZ ± 7KHZ

请求和唤醒帧用来初始化通信并按以下次序组成:

  1. 通信开始
  2. 7个数据位发送
  3. LSB首先发送
  4. 标准REQA的数据内容是0x26,WAKE-UP请求的数据内容是0x52
  5. 通信结束,不加奇偶校验位

帧格式有三种:
短帧(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卡
IDLE命令:MFRC522处于空闲模式,该命令
其中Transceive和MFAuthent为操作IC卡的,命令都是由MCU发送给RC522芯片。因为RFID通信需满足ISO 14443协议,所以这两条命令也需满足该协议进行操作。
例如要唤醒卡片,则需发送 Transceive’0x0c’ + 0x52。
防冲突获取卡片ID,则需发送 Transceive’0x0c’ + 0x93 + 0x20。

Transceive命令的概述:
在这里插入图片描述
MFAuthent命令的概述:
在这里插入图片描述
在这里插入图片描述

功能实现

  1. 请求唤醒:获取卡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位于空闲态
  1. 防冲突:获取到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”寄存器。在冲突后所有接收的位均还存在
  1. 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。
  1. 密码认证(这部分需要结合下面讲解非接触卡的密码设置来理解)
Authentication操作的卡应答以AE位给出,在PCD中由Status2Reg寄存器第4位标志,0为失败,1为成功
   
使用格式:1B模式 + 1B块地址 + 6B密码 + 4B卡片序列号
		块地址:指定非接触卡存储中某一个KEYSET
		模式:分A密码和B密码认证,A命令用0x60,B命令用0X61
		密码:需要视非接触卡情况而定,一般初始使用时密码均为F
		卡序列号:从防冲突中获取
		返回值:认证成功status寄存器对应位置1。
  1. 为了一条龙学习,这里将关于读写等操作放在后面

S50电子标签(高频)

内部采用M1芯片,是指菲利普下属子公司恩智浦出品的芯片缩写,全称为NXP Mifare1系列,常用的有S50及S70两种型号,工作中13.56MHZ,属于非接触式IC卡,又称射频卡,成功地解决了无源(卡内)和免接触这一难题,是电子器件领域的一大突破。主要用于公交、轮渡、地铁的自动收费系统。

优点:可读可写的多功能卡
缺点:价格稍贵且感应距离短,适合非定额消费系统、停车场系统、门禁考勤系统等

特征:

  1. MIFARE RF接口 ISO/IEC 14443A
  2. 无限传送数据和能量 不需要电池
  3. 真正的反冲突(硬件完成)
  4. CRC校验
  5. EEPROM存储
  6. 保密性,唯一的序列号,3轮确认,每个区有两套独立的密匙,支持带密匙层次的多应用,访问EEPROM有传输密匙保护
  7. 通信速率:106 KBPS
  8. 读写距离: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,密码正确,通过认证

操作流程:
请求、防冲突、选卡、密码认证、读写操作

续上读写操作的讲解

  1. 读M1卡
分两步: 1.向IC卡发出读操作; 2.从RC522FIFO中读出数据

第一步:
	RC522指令:Transceive 0x0C
	14443-A指令:0x30 + 1B块地址 + 2BCRC_A
	
	判断:一般读写操作都是按块操作,16字节,根据FIFOLevelReg寄存器中读出IC卡回应的数据的字节数N,
			在从ControlReg寄存器中读出最后一字节的位数。计算所需接收数据总位数,若为 16字节+8 大小则操作成功,否则失败
		
若成功进入第二步:
	循环从FIFODataReg寄存器中读出16B的数据
  1. 写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,否则失败。
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!