RFID:ISO14443A

这是篇几年前总结的文档,现在重新整理一下。
首先建议看下《看得懂的 RFID 原理》这篇文章,当初找了不少资料就这篇让我明白了些 RFID 是怎么通信的。

ISO14443A 是常见的协议标准,大致如下:

载波频率 f:13.56MHz
数据传输率:13.56MHz/128 = 106Kbit/s
普通卡 PICC UID:

  • 4 个字节 32 位数据
  • 7 个字节
  • 10 个字节

各部分协议内容:

  1. ISO/IEC 14443-1 制定了 PICC 的物理特性
  2. ISO/IEC 14443-2 制定了射频功率及信号界面特性
  3. ISO/IEC 14443-3 PICC 初始化和防冲突机制
  4. 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 数据
REQA

Ps:两个连续 REQA 间隔 7000 / f (> 0.516ms)

1
2
3
4
//> Mifare Request:
SR 0A 80 // flush FIFO
SR 09 26 // FIFO - Request code
SR 0D 87 // BitframingReg - StartSend, TxLastBits

PN512 简单测试用例脚本

PICC -> ATQA

PICC 向 PCD 发送自身信息
ATQA
其中 b7b8 可以知道该卡 UID 字节数,一般定义如下:
UID
b5-b1 一般只有 1bit 为 1,如果有 2bit 为 1 则冲突了

1
2
3
4
5
//> Response ATQ:
GR 06 // Read ErrReg
RE 0A 02 // Read FIFOLevel
GR 09 // ATQ LSB // data=04
GR 09 // ATQ MSB // data=00 -> Mifare Plus

PCD 读到的数据是 0x0004,通过芯片官方文档(见下)可知该卡是 Mifare Plus 4 Byte UID 型号
NXP

Anticollision <- PCD

防冲突没有实践过,所以可能理解有误。
下图是防冲突流程图:
anticollision
由上图可以看出 PCD 发送的命令有 SEL NVB UID CLn 等部分组成:

  • SEL:Select code 值可能是 0x93 0x95 0x97,表示不同的冲突阶段
    sel
    防冲突等级区分如下(感觉和 UID 大小有关):
    sel-level
  • NVB:Number of Valid Bits 冲突发生的位置(第几个字节第几个位置)
    nvb

官方文档有个防冲突例子,感觉还挺清楚的:
eg

我的理解 PCD 防冲突检测第一阶段,要求所有 PICC 返回自己的 UID,
读卡器发送:0x93 0x20
当冲突发生时,PCD 接收不完整的 UID,截止在冲突处(不是很明白 PCD 怎么知道冲突了?),
下次 PCD 发送收到不完整 UID,PICC 接着响应直到没有冲突。

PICC -> UID

PICC 返回自己的 UID(记不清 PCD 是不是要先发送 0x93 0x20 了)
UID 格式如下:
uid-bcc

1
2
3
4
5
6
7
8
//>         Response SNR:
GR 06 // Read ErrReg
RE 0A 05 // Read FIFOLevel
GR 09 // Read SNR 0 // data=7A
GR 09 // Read SNR 1 // data=4E
GR 09 // Read SNR 2 // data=39
GR 09 // Read SNR 3 // data=48
GR 09 // Read SNR 4 (check byte) // data=45

BCC 为校验码,所以上面例子卡的 UID = 7A4E3948

SEL <- PCD

PCD 选择一张卡,发送 0x93 0x70 UID BCC CRC

有的芯片设置需要打开 CRC 校验

1
2
3
4
5
6
7
8
9
10
11
12
//> Mifare Select:
SR 0a 80 // flush FIFO
SR 12 80 // TxMode: activate CRC
SR 13 80 // RxMode: activate CRC
SR 09 93 // fast activation of Mifare
SR 09 70 // NVB byte
SR 09 7A // Write SNR 0
SR 09 4E // Write SNR 1
SR 09 39 // Write SNR 2
SR 09 48 // Write SNR 3
SR 09 45 // Write SNR 4 (check byte)
SR 0d 80 // BitframingReg - StartSend, TxLastBits

PICC -> SAK

PICC 确认 PCD 的选择
回复格式:SAK + CRC16 (2-byte)
sak

1
2
3
4
//>         Response SAK:
GR 06 // Read ErrReg
RE 0A 01 // Read FIFOLevel
GR 09 // Read SAK // data=08 Mifare Classic 1K

例子中 SAK 回复 0x08,查看芯片手册为 Mifare Classic 1K 卡
sak-nxp

读写 EEPROM

Mifare1 Card

Mifare 1 卡片采用 EEPROM 作为存储介质,容量为 1K × 8 位 ,分为 16 个扇区(015),每个扇区有 4 个块(03),每块有 16 字节。一个扇区共 16Byte × 4 = 64Byte。扇区的第四块称作尾块,包含了该扇区的密码 A(6个字节)、存取控制(4个字节)、密码 B(6个字节),是控制块。其余三块是数据块。
m1
扇区 0 的块 0 固化了厂商代码信息,不可改写。
其中:

  • 第 0~4 字节为卡片的序列号
  • 第 5 字节为序列号的校验码
  • 第 6 字节为卡片的容量「SIZE」
  • 第 7,8 字节为卡片的类型号(Tagtype)
  • 其他字节由厂商另加定义

如下图所示:
m1-disk

Control blocks

即每个扇区最后一块
存储格式如下:
ctrl-block

  • KeyA/B: 读取时返回 0(对 Key 的一种保护吧,默认 Key 一般是 0xFFFFFFFFFFFF),KeyB 不用可做数据字节( 9 字节亦然)
  • Access Bit: 控制位,表示扇区各块属性
    access-bit
    access-bit-2
  • Byte9:没有实际意义,可当作数据块

控制块读写权限表如下:
access

图中灰色区域 keyB 可以当作数据区使用
修改 access bit 后最好重新认证一下

Data blocks

数据块,一般分两类:

  1. read/write blocks
    一般用在非接触门禁管理,好像没有特殊格式要求
  2. value blocks
    其实应该是 read/write blocks 的特殊类型,一般用在电子钱包,有增值/减值(单独操作命令)
    存储格式如下图:
    val

    可操作命令包括 read,write,increment(增值),decrement(减值),restore(恢复),transfer(转移)
    Vaule 值需要先按照上述格式 write 到存储数据,才能使用增减值等特殊指令操作
    Adr 是进行备份管理时,用于保存块地址,只能通过 write 命令更改

数据块操作权限表如下:
access-data

在用于非充值卡的一种情况(001)下,只能够读和减值
在另一种情况(110)下,可以用 keyB 充值
终极权限下(111)扇区再也不能修改,keyA/B 需要保管好

Command

M1 卡控制命令,上面都有提到,具体列表如下:
cmd

Authentication

M1 卡手册中认证需要如下过程:
auth-1
auth-2
命令表示如下:
auth-cmd
不过这部分其实还是要看读卡器怎么设置,PN512 手册里面要求如下:
auth
即在 FIFO 写入 60/61 + addr + keyA/B(6byte) + UID(4byte) + CRC
判断认证结果:

  • 成功:Status2 Reg[3]=1
  • 失败:Status2 Reg[3]=0

Read

时序图:
read
PN512:
发送:30 + addr + CRC
接收:data(16byte) + CRC

Write

时序图:
write-1
write-2
write-3
write-4
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 手册和例子才知道,哦,原来这个协议就是这么规定的。
所以有时理解标准协议不如看看相关芯片手册,也许会有惊喜。


RFID:ISO14443A
https://wishlily.github.io/article/bus/2018/05/18/rfid-iso14443a/
作者
Wishlily
发布于
2018年5月18日
许可协议