NFC 之 RC522 PICC 识别过程

6/19/2024 12:47:36 PM
440
0

状态图:

POWER-OFF状态
在 POWER-OFF 状态中,由于缺少载波能量,PICC 不能被激励并且应不发射副载波。

IDLF状态
在最大延迟内激活工作场后,PICC 应进入其IDLE 状态。在这种状态中,PICC 被加电,并且能够解调和识别从PCD 来的有效REQA 和WAKE-UP 命令。

READY状态
一旦收到有效REQA 或WAKE-UP 报文则立即进入该状态,用其UID 选择了PICC 时则退出该状态。在这种状态中,比特帧防冲突或其他任选的防冲突方法都可以使用。所有串联级别都在这一状态内处理以取得所有UID CLn。

ACTIVE状态
通过使用其完整UID 选择PICC 来进入该状态。

HALT状态
该状态通过7.2.3.4 中定义的HALT 命令或本部分中未定义的应用特定命令来进入。在这种状态中,PICC 应仅响应使PICC 转换为READY 状态的WAKE-UP 命令。注:处于HALT 状态的PICC 将不参与任何进一步的通信,除非使用了WAKE-UP 命令。

PCD 用来管理与几个PICC 通信的命令是:

  • REQA
  • WAKE-UP
  • ANTICOLLISION
  • SELECT
  • HALT

REQA命令
REQA 命令由PCD 发出,以探测用于类型A PICC 的工作场。

WAKE-UP命令
WAKE-UP 命令由PCD 发出,使已经进入HALT 状态的PICC 回到READY 状态。它们
应当参与进一步的防冲突和选择规程。

ANTICOLLISION命令和SELECT命令
这些命令在防冲突环期间使用。ANTICOLLISION 和SELECT 命令由下列内容组成:

  • 选择代码SEL(1 个字节)
  • 有效位的数目NVB(1 个字节)
  • 根据NVB 的值,UID CLn 的0 到40 个数据位
  • SEL 规定了串联级别CLn。
  • NVB 规定了PCD 所发送的CLn 的有效位的数目。
  • 注:只要NVB 没有规定40 个有效位,若PICC 保持在READY 状态中,该命令就被称为ANTICOLLISION命令。
  • 如果NVB 规定了UID CLn 的40 个数据位(NVB=‘70’),则应添加CRC_A。该命令称
  • 为SELECT 命令。如果PICC 已发送了完整的UID,则它从READY 状态转换到ACTIVE
  • 状态并在其SAK-响应中指出UID 完整。否则,PICC 保持在READY 状态中并且该PCD 应
  • 以递增串联级别启动一个新的防冲突环。

 

识别过程:寻卡-->防冲突-->选卡-->操作卡

PCD 是接近式卡,PICC 是接近式耦合设备。

 

1、寻卡

有两个寻卡的命令:

#definePICC_REQIDL           0x26               // 寻天线区内未进入休眠状态
#definePICC_REQALL           0x52               // 寻天线区内全部卡

0x26 命令是读取完卡后还会再次读取,除非在某次读取完成后系统进入休眠(Halt)。

0x52 命令是读取完卡后会等待卡离开开线作用范围,直到再次进入。

如果寻卡成功后,程序将进入防冲突操作。

在通信过程中实际上是使用 PCD 命令控制 RC522 发出 PICC 命令与卡进行交互。

  • 对刚进入磁场得到电复位处于休闲状态(idle)的卡片,卡请求(REQA,0x26);
  • 对于已进行过读写操作并进入休眠状态的卡片,卡唤醒(WAKE-UP,0x52)。

其中卡请求(REQA)只能呼叫处于休闲(Idle)状态的卡片,卡唤醒(WAKE-UP)可以呼叫所有卡片,包括处于休眠(Halt)和休闲状态的卡片。

收到卡呼叫命令后,卡片将对命令做出应答(Answer To Request,ATQA), 读写器以特定的协议与它通讯,从而确定该卡是否为 M1 射频卡,即验证卡片的卡型。ATQA 有两个字节,第一个字节的值没有规定(RFU),第二个字节的高两位 b7、b6 表示卡序列号长度 (00为4字节,01为7字节,10为10字节), b5位的值没有规定(RFU),b4-b0表示是否遵守面向比特的防冲突机制,如果遵守,b4-b0必须有且仅有1位为1。通常情况下,Mifare S50 的 ATQA 是 0004H,Mifare S70 的 ATQA 是 0002H。

2、防冲突

防冲突操作就是将防冲突命令通过 PcdComMF522 函数与 PICC 卡进行交互。

防冲突命令是两个字节,其中第一字节为 Mifare_One 卡的防冲突命令字 PICC_ANTICOLL1 (0x93),第二个字节为 0x20。

在防冲突环节使用的命令由连个字节组成:

选择代码SEL(1个字节),SEL规定了串联级别CLn。

有效位的数目 NVB(1个字节),NVB 规定了 PCD 所发送的 CLn 的有效位的数目。 

注:只要 NVB 没有规定 40 个有效位,若 PICC 保持在 READY 状态中,该命令就被称为 ANTICOLLISION 命令。

如果 NVB 规定了 UID CLn 的 40 个数据位(NVB=‘70’),则应添加 CRC_A。该命令称为 SELECT 命令。

如果 PICC 已发送了完整的 UID,则它从 READY 状态转换到 ACTIVE 状态并在其 SAK-响应中指出 UID(唯一标识符)完整。

否则,PICC 保持在 READY 状态中并且该 PCD 应以递增串联级别启动一个新的防冲突环。

3、选卡

在 ISO14443 中整个防冲突和选择环节的过程为:

步骤 1:PCD 为选择的防冲突类型和串联级别分配了带有编码的 SEL;

步骤 2:PCD 分配了带有值为 ‘20’ 的 NVB;

步骤 3:PCD 发送 SEL 和 NVB;

步骤 4:工作场内的所有 PICC 应使用它们的完整的 UID CLn 响应;

步骤 5:假设场内的 PICC 拥有唯一序列号,那么,如果一个以上的 PICC 响应,则冲突发生。如果没有冲突发生,则步骤 6 到步骤 10 可被跳过。

步骤 6:PCD 应识别出第一个冲突的位置;

步骤 7:PCD 分配了带有值的 NVB,该值规定了 UID CLn 有效比特数。这些有效位应是PCD所决定的冲突发生之前被接收到的 UID CLn 的一部分再加上(0)b 或 (1)b。典型的实现是增加 (1)b。

步骤 8:PCD 发送 SEL 和 NVB,后随有效位本身;

步骤 9:只有 PICC 的 UID CLn 中的一部分等于 PCD 所发送的有效位时,PICC 才应发送其 UID CLn 的其余部分;

步骤 10:如果出现进一步的冲突,则重复步骤 6~9。最大的环数目是 32;

步骤 11:如果不出现进一步的冲突,则 PCD 分配带有值为 ‘70’ 的 NVB;

步骤 12:PCD 发送 SEL 和 NVB,后随 UID CLn 的所有 40 个位,后面又紧跟 CRC_A 校验和;

步骤 13:它的 UID CLn 与 40 个比特匹配,则该 PICC 以其 SAK 表示响应;

步骤 14:如果 UID 完整,则 PICC 应发送带有清空的串联级别位的 SAK,并从 READY 状态转换到 ACTIVE 状态;

步骤15:PCD 应检验 SAK(选择确认)的串联比特是否被设置,以决定带有递增串联级别的进一步防冲突环是否应继续进行。

如果 PICC 的 UID 是已知的,则 PCD 可以跳过步骤 2~10 来选择该 PICC,而无需执行防冲突环。

 

参考文档:

http://article.iotxfd.cn/RFID/IEEE14443

https://blog.csdn.net/wowocpp/article/details/79910800

 

全部评论

长脑子了
作者
6/20/2024 12:29:50 PM


提问