【NFC系列之NFC-V (ISO/IEC15693) 防冲突机制】
此文档是对NFC-V (ISO/IEC15693) 防冲突机制相关技术的学习总结,仅供参考。
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 包括:
• 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个时隙的模式
命令编码: 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的防冲突。
如此反复的循环,直至所有的冲突解决完,原则上时间允许的话能把所有的卡都读出来。
更多推荐



所有评论(0)