RFID:ISO14443A
这是篇几年前总结的文档,现在重新整理一下。
首先建议看下《看得懂的 RFID 原理》这篇文章,当初找了不少资料就这篇让我明白了些 RFID 是怎么通信的。
ISO14443A 是常见的协议标准,大致如下:
载波频率 f:13.56MHz
数据传输率:13.56MHz/128 = 106Kbit/s
普通卡 PICC UID:
- 4 个字节 32 位数据
- 7 个字节
- 10 个字节
各部分协议内容:
- ISO/IEC 14443-1 制定了 PICC 的物理特性
- ISO/IEC 14443-2 制定了射频功率及信号界面特性
- ISO/IEC 14443-3 PICC 初始化和防冲突机制
- ISO/IEC 14443-4 有关交易的协定
以下通过读卡器读卡来理解该协议,其中缩写表示如下:
PICC:普通卡(M1 卡)
PCD:读卡器(PN512)
选卡
PICC -> Power Off
PICC 静止状态周围没有可激活的 PCD 有效场
PICC -> Idle
PICC 进入 PCD 有效场,进入 Idle 状态(t<=5ms),Idle 态可接受命令
REQA <- PCD
PCD 发送 REQA,检测是否有 PICC,0x26 7-bit 数据
Ps:两个连续 REQA 间隔 7000 / f (> 0.516ms)
1 |
|
PN512 简单测试用例脚本
PICC -> ATQA
PICC 向 PCD 发送自身信息
其中 b7b8 可以知道该卡 UID 字节数,一般定义如下:
b5-b1 一般只有 1bit 为 1,如果有 2bit 为 1 则冲突了
1 |
|
PCD 读到的数据是 0x0004,通过芯片官方文档(见下)可知该卡是 Mifare Plus 4 Byte UID 型号
Anticollision <- PCD
防冲突没有实践过,所以可能理解有误。
下图是防冲突流程图:
由上图可以看出 PCD 发送的命令有 SEL
NVB
UID CLn
等部分组成:
SEL
:Select code 值可能是 0x93 0x95 0x97,表示不同的冲突阶段
防冲突等级区分如下(感觉和 UID 大小有关):NVB
:Number of Valid Bits 冲突发生的位置(第几个字节第几个位置)
官方文档有个防冲突例子,感觉还挺清楚的:
我的理解 PCD 防冲突检测第一阶段,要求所有 PICC 返回自己的 UID,
读卡器发送:0x93 0x20
,
当冲突发生时,PCD 接收不完整的 UID,截止在冲突处(不是很明白 PCD 怎么知道冲突了?),
下次 PCD 发送收到不完整 UID,PICC 接着响应直到没有冲突。
PICC -> UID
PICC 返回自己的 UID(记不清 PCD 是不是要先发送 0x93 0x20
了)
UID 格式如下:
1 |
|
BCC 为校验码,所以上面例子卡的 UID = 7A4E3948
SEL <- PCD
PCD 选择一张卡,发送 0x93 0x70 UID BCC CRC
有的芯片设置需要打开 CRC 校验
1 |
|
PICC -> SAK
PICC 确认 PCD 的选择
回复格式:SAK + CRC16 (2-byte)
1 |
|
例子中 SAK 回复 0x08,查看芯片手册为 Mifare Classic 1K 卡
读写 EEPROM
Mifare1 Card
Mifare 1 卡片采用 EEPROM 作为存储介质,容量为 1K × 8 位 ,分为 16 个扇区(015),每个扇区有 4 个块(03),每块有 16 字节。一个扇区共 16Byte × 4 = 64Byte。扇区的第四块称作尾块,包含了该扇区的密码 A(6个字节)、存取控制(4个字节)、密码 B(6个字节),是控制块。其余三块是数据块。
扇区 0 的块 0 固化了厂商代码信息,不可改写。
其中:
- 第 0~4 字节为卡片的序列号
- 第 5 字节为序列号的校验码
- 第 6 字节为卡片的容量「SIZE」
- 第 7,8 字节为卡片的类型号(Tagtype)
- 其他字节由厂商另加定义
如下图所示:
Control blocks
即每个扇区最后一块
存储格式如下:
- KeyA/B: 读取时返回 0(对 Key 的一种保护吧,默认 Key 一般是 0xFFFFFFFFFFFF),KeyB 不用可做数据字节( 9 字节亦然)
- Access Bit: 控制位,表示扇区各块属性
- Byte9:没有实际意义,可当作数据块
控制块读写权限表如下:
图中灰色区域 keyB 可以当作数据区使用
修改 access bit 后最好重新认证一下
Data blocks
数据块,一般分两类:
- read/write blocks
一般用在非接触门禁管理,好像没有特殊格式要求 - value blocks
其实应该是 read/write blocks 的特殊类型,一般用在电子钱包,有增值/减值(单独操作命令)
存储格式如下图:可操作命令包括 read,write,increment(增值),decrement(减值),restore(恢复),transfer(转移)
Vaule 值需要先按照上述格式 write 到存储数据,才能使用增减值等特殊指令操作
Adr 是进行备份管理时,用于保存块地址,只能通过 write 命令更改
数据块操作权限表如下:
在用于非充值卡的一种情况(001)下,只能够读和减值
在另一种情况(110)下,可以用 keyB 充值
终极权限下(111)扇区再也不能修改,keyA/B 需要保管好
Command
M1 卡控制命令,上面都有提到,具体列表如下:
Authentication
M1 卡手册中认证需要如下过程:
命令表示如下:
不过这部分其实还是要看读卡器怎么设置,PN512 手册里面要求如下:
即在 FIFO 写入 60/61 + addr + keyA/B(6byte) + UID(4byte)
+ CRC
判断认证结果:
- 成功:
Status2 Reg[3]=1
- 失败:
Status2 Reg[3]=0
Read
时序图:
PN512:
发送:30 + addr
+ CRC
接收:data(16byte)
+ CRC
Write
时序图:
PN512:
发送: A0 + addr
+ CRC
接收: ACK(A0)/NAK/timeout(5ms)
+ NO CRC
发送: data(16byte)
+ CRC
接收: ACK(A0)/NAK/timeout(10ms)
+ NO CRC
Other
Increment & Decrement & Restore & Transfer 这些命令也像上面一样对照着 M1 卡手册和 PN512 手册查看,这里不再赘述了。
总结
当初看 RFID 怎么读写时特别困惑,因为读卡器手册上只有寄存器表示什么,没有说里面值要填什么值。
后来看了 M1 手册和例子才知道,哦,原来这个协议就是这么规定的。
所以有时理解标准协议不如看看相关芯片手册,也许会有惊喜。