1.技术概述

NFC-V(又称 Vicinity Cards)常见于工业与资产管理场景,读写距离比 A/B/F 模式更远,适合仓储、物流等需要批量读取的应用。

核心优势:

  • 远距离通信:工作距离显著大于 NFC-A/B/F。
  • 大规模读取:可一次管理大量标签。
  • UID 精准识别:64 bit 唯一标识,保证数据可靠。

ISO15693的放冲突机制设计的比其它几种技术相对复杂一些,核心思想是UID + Slot 组合的形式:

在正式讲解防冲突我们需要一些关于ISO15693的规范了解(参照ISO15693-卷3部分)

2.规范解读

2.1 唯一标识符(UID)

VICC 由一个 64 位(bits)的唯一标识符唯一标识
UID格式
UID 包括:
• 8 位(bits)MSB 应为’E0’;
• 根据 ISO/IEC 7816-6: 1996/Amd.1,IC 制造商编码为 8 位(bits);
• 由制造商制定的 48 位(bits)唯一流水号。

2.2 请求格式

请求指令格式

2.3 响应格式

响应指令格式
在防冲突阶段我们暂时只关注和防冲突相关的命令:

防冲突的指令格式

防冲突指令
其中:
INV_FLAG的值:
“1 slot mode” :0x26 单个时隙模式
“16 slot mode”:0x06 16个时隙的模式
INV_FLAG结构

命令编码: 0x01代码防冲突指令类型
MASK_LEN: 代表的是没有冲突的指令的有效长度
MASK_value: 代表的是没有冲突的有效数据

1 slot 和 16 slot 的区别:

0x26不携带MASK信息,所有的卡收到之后都会在规范时间内响应。
0x06可以携带MASK的信息,MASK信息根据上次的防冲突结果决定

卡端回UID响应的原则:

0x26不带MASK信息的命令,所有的卡都会响应。
0x06带MASK信息的命令,只有MASK的有效值跟自己的UID匹配后,卡会在对应的时隙才会响应。

如何判断卡在哪个时隙回响应

不带MASK的命令,默认UID的低半个字节(范围刚好是0-F)作为自己的slot
带MASK的命令,MASK_VAL值匹配的话,在匹配的下一个低半个字节作为自己的slot

冲突产生的原因和判断方法:

16个时隙刚好对应的0-F之间的值,如果发送的命令不携带MASK,每一个卡根据自己UID的最低位作为自己的时隙,卡会在对应的时隙发送响应。

当发送的命令包含MASK信息时,系统会先校验MASK信息与自身UID的匹配情况。若匹配成功,则从下一个字节的最低位开始作为发送时隙。

若多张卡片在同一时隙发送不同UID信息,硬件在解调时会产生冲突(collision)。

● MASK_LEN与MASK_VALUE(重点)

MASK_LEN:代表的是没有冲突的指令的有效长度
MASK_value:代表的是没有冲突的有效数据

下面的示例帮助你理解MASK_LEN 、MASK_VALUE这个概念:
case1:
比如我现在有两张卡:

0xE0 0x04 0x33 0x11 0x11 0x11 0x11 0x11

0xE0 0x04 0x33 0x22 0x22 0x22 0x22 0x22

系统默认先发16个slot的命令, 即 06(标志)+ 01(命令)+ 00(MASK_LEN)+ CRC这时候在响应接收中,我们收到的就是0xE0 0x04 0x33,后面就会产生BIT位的冲突,对应的 MASK_LEN = 0x03 MASK_VALUE = 0xE0 0x04 0x33

case2:
比如我现在有两张卡:

0xE0 0x04 0x33 0x11 0x11 0x11 0x11 0x11
0xE0 0x04 0x33 0x21 0x22 0x22 0x22 0x22

注意:这种情况下,半个字节没有冲突的情况需要保留(硬件支持):
MASK_LEN = 0x04 MASK_VALUE = 0xE0 0x04 0x33 0x01(低4位保留、高4位置0)

核心的解决思路:
读卡器VCD先发一条单个时隙的命令,
如果只有一个卡VICC的话,肯定就是没有冲突的情况,这时候能正确获取UID信息
如果有多张UID的话,说明此时存在多张卡

4.整个防冲突流程

步骤1:先发 单个 1 slot 的命令(探卡),如果无响应就结束,有响应且无冲突就拿到UID结束,有响应且有冲突的话执行步骤2

步骤2:产生的冲突的话,按照前面得讲解从硬件中获取MASK_LEN 、MASK_VALUE并重新组织下一条命令。
假设两张卡的UID:

UID1: 0xE0 0x04 0x33 0x11 0x11 0x11 0x11 0x11 UID2: 0xE0 0x04 0x33
0x22 0x22 0x22 0x22 0x22

防冲突阶段发16 slot 命令:
06(16个时隙) + 01(flag) + 0x03(MASK_LEN) + 0xE0 0x04 0x33(MASK_VALUE) + CRC

按照时隙+UID的策略,UID1会在第1个slot给响应,UID2 会在第2个slot给响应,但是读卡器会一直发完16slot保证把卡都检测出来。

如果 后续剩下的slot发完如果没有冲突,那就可以得出卡已经全部识别,流程结束。

如果后续的slot中有冲突,假设存在第3张卡的UID:

UID3:UID2: 0xE0 0x04 0x33 0x32 0x33 0x33 0x33 0x33

那在第三个时隙就产生了冲突(UID2 和 UID3 的高4位),此时需要保存的MASK_VALUE 为0xE0 0x04 0x33 0x02
继续把剩下的slot 执行完!!!

因为卡3的存在,导致一轮下来仍然存在冲突,接下来的操作就是把第一轮更新后的新产生的冲突MASK_VALUE 和 MASK_LEN组织成新的命令,进行下一轮16slot的防冲突

如此反复的循环,直至所有的冲突解决完,原则上时间允许的话能把所有的卡都读出来。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐