一、介绍
本博文介绍了符合ISO15693标准的标签类型的检测以及防碰撞过程。
二、协议简介
(2.1)ISO15693介绍了三种模式,它们之间的关系如下所示:
![]()
(2.2)请求命令格式:
SOF Flags Command Code Parameters Data CRC EOF 帧开始 标识 命令代码 参数 数据 CRC 帧结束 (A)标识(Flags)总共占一个字节大小,它的定义如下图所示:
![]()
![]()
![]()
(B)根据ISO15693的命令代码分成强制的、可选的、自定义以及私有的四种类型。它们的定义如下:
强制命令:强制命令的命令代码(command code)取值范围为0x01~0x1F,所有标签(VICC)必须支持在该命令代码范围内的命令。
可选命令:
可选命令的命令代码取值范围为0x20~0x9F。在该命令代码范围的命令,标签可能支持;如果标签支持可选命令,它的命令格式在后续会介绍。;如果标签不支持可选命令,并且寻址标识(Address_flag)或者选择标识(Select_flag)都设置了,它可能会返回错误码或者不响应,保持沉默;如果标签不支持可选命令,并且寻址标识(Address_flag)或者选择标识(Select_flag)未设置,那么标签就不会响应,会保持沉默。
自定义命令:
自定义的命令代码取值范围为0xA0~0xDF,标签可以选择去支持它,自定义命令可以实现制造商的特殊功能。所有的自定义命令必须包含IC制作商编码。如果标签不支持自定义命令,那么给它发送自定义命令时,它应该返回错误码或者保持沉默。
私有命令:
私有命令的命令代码取值范围是0xE0~0xFF,在该命令代码的范围内的命令可以用于制造商测试,系统信息编码等。私有命令要求必须包含IC制造商代码以及IC版本号。
ISO15693的命令代码如下表:
命令代码 | 命令类型 | 命令作用 |
---|---|---|
0x01 | 强制命令 | 清查命令(查找所有在RF场中的标签VICC) |
0x02 | 强制命令 | 保持安静命令(指定某个标签不再响应清查命令) |
0x03~0x1F | 强制命令 | 预留给未来使用 |
0x20 | 可选命令 | 读取标签指定单块内容信息 |
0x21 | 可选命令 | 将指定信息写入标签指定单块位置 |
0x22 | 可选命令 | 将标签指定块进行锁定 |
0x23 | 可选命令 | 读取标签指定多块的信息 |
0x24 | 可选命令 | 将信息写入到标签多块位置 |
0x25 | 可选命令 | 选择某一个标签(选中被发送了保持安静命令的标签) |
0x26 | 可选命令 | 重新准备(重置被发送了保持安静命令的标签) |
0x27 | 可选命令 | 写入AFI(Application Family Identifier) |
0x28 | 可选命令 | 锁定AFI |
0x29 | 可选命令 | 写入DSFID(Data Storage Format Identifier) |
0x2A | 可选命令 | 锁定DSFID |
0x2B | 可选命令 | 获取标签系统信息 |
0x2C | 可选命令 | 获取多块的安全状态 |
0x2D~0x9F | 可选命令 | 预留给未来使用 |
0xA0~0xDF | 自定义命令 | 由IC制造商决定 |
0xE0~0xFF | 私有命令 | 由IC制造商决定 |
(2.3)命令响应格式:
SOF Flags Parameters Data CRC EOF 帧开始 标识 参数 数据 CRC 帧结束 (A)标识(Flags)占一个字节,它的定义如下表所示:
![]()
(B)如果错误码(Error_flag)的值为1,则错误码定义如下:
三、命令
3.1 清查命令(Inventory)【命令码:0x01】
当所有的标签(VICC)接收到了该命令,那么都应该做出相应的响应。
3.1.1 格式
![]()
注:标识(Flags)参考前面的请求命令中标识,第二个字节为Inventory,在此处对应它的命令代码0x01。AFI的定义如下表:
![]()
掩码长度(Mask Length)指示了需要的比较的字节数,范围为[0x00,0x40];掩码值(Mask Value)代表需要比较的比特数。如:发送无AFI命令为 26 01 01 00,表示第一个字节Flags的值为0x26;第二个命令代码为0x01,代表inventory命令;掩码长度(Mask Length)值为0x01,表示需要比较在RF场中的标签ID(UID)的第一个字节;掩码值为0x00。
3.1.2 响应
![]()
如果RF场中有多张标签响应,则就会发生碰撞情况,此时响应中的CRC就会计算错误,由此我们可以判断是否要进行防碰撞过程。
3.2 保持安静命令(Stay quiet)【命令码:0x02】
当标签接收到该命令时,它就会进入安静状态(quiet state),并且不会有响应返回。
当标签在安静状态时:它将不会响应任何带有清查标识(inventory_flag)的请求
它将响应带有寻址标识的请求如下情况标签将退出安静状态:
1)重启
2)接收到选择(select)请求,并且进入选择状态。如果支持的话,将响应;如果不支持,则返回错误码
3)接收到重置到准备(reset to ready)请求,并且进入准备状态(ready state)
3.2.1 命令格式
注意:(A)保持安静(Stay Quiet)命令必须执行在寻址模式下,及选择标识(Select_flag)设置成0并且寻址标志(Address_flag)设置成1。
(B)该命令没有响应返回
3.3 读单块命令(Read single block)【命令码:0x20】
当标签(VICC)接收到读单块命令时,它应该响应该命令,并且将指定单块的值返回在响应里。
如果在该请求里设置了可选标识(Option_flag),标签应该返回该块的安全状态,然后是该块的值;如果没有设置可选标识,则仅仅返回块信息。
3.3.1 命令格式
3.3.2 命令响应
3.4 写单块命令(Write single block)【命令码:0x21】
当标签接收到写单块的命令时,信息应当写入对应的块中,并且在返回值应该显示写入成功与否。
当可选标志没有设置时,从完成信息写入开始,在规定时间,应当会返回响应。
如果可选标志已经设置了,标签应当等待完全调制的帧结束标识(EOF),并且返回响应给VCD。
3.4.1 命令格式
3.4.2 命令响应
3.5 锁块命令(Lock block)【命令码:0x22】
当标签接收到锁块命令时,标签应当永久的锁定所请求的块。
如果可选标志没有被设置,当完成锁块操作时,标签应当在规定时间返回它的响应。
如果可选标志设置了,标签应当等到帧结束标识(EOF),并返回它的响应。
3.5.1 命令格式
3.5.2 命令响应
3.6 读多块命令(Read multiple blocks)【命令码:0x23】
当标签接收到读多块的命令时,标签应当将块的信息在返回的响应中表示出来。
如果设置了可选标志,标签应当返回块的安全状态,随后跟着一块接着一块的值
如果可选标志没有被设置,标签只返回块的值。
块的序号从0x00到0xFF。当块的值为0x06时,表示的是第7块。
3.6.1 命令格式
3.6.2 命令响应
3.7 写多块(Write multiple blocks)【命令码:0x24】
当标签接收到写多块的命令时,标签应当将数据写入到对应的块中,并且将写入是否成功的的状态报告给读卡设备(VCD)
如果可选标志没有被设置,当完成写操作时,在规定时间应当返回它的响应
如果设置了可选标志,标签应当等到VCD发送的帧结束标识再返回响应。
块的序列号范围是0x00到0xFF。
3.7.1 命令格式
3.7.2 命令响应
3.8 选择命令(Select)【命令码:0x25】
当标签接收到选择命令时,如果UID等于标签的UID,那么该标签就如选择状态(selected state)并发送一个响应;如果UID不等于标签UID时,标签返回准备状态(ready state)并不予响应。
选择命令总是执行在寻址模式(寻址标志为1,选择标识为0)
3.8.1 命令格式
3.8.2 命令响应
3.9 重置到准备(Reset to ready)【命令码:0x26】
当标签VICC接收到重置到准备命令时,标签应当返回到准备状态(Ready state)
3.9.1 命令格式
3.9.2 命令响应
3.10 写AFI命令(write AFI)【命令码:0x27】
当接收到写AFI命令时,标签应当将AFI的值写入到标签的内存中。
如果可选标志没有设置,当完成写AFI操作时,标签应当在规定的时间内返回响应。
如果设置了可选标志,标签应当等待帧结束标识才返回它的响应。
3.10.1 命令格式
3.10.1 命令响应
3.11 锁AFI命令(Lock AFI)【命令码:0x28】
当接收到锁AFI命令时,标签应当永久的锁定AFI值到它的内存。
如果没有设置可选标志,当完成锁AFI操作时,标签应当在规定的时间返回它的响应。
如果设置了可选标志,标签应当等到帧结束标识并且返回它的响应。
3.11.1 命令格式
3.11.2 命令响应
3.12 写DSFID命令(Write DSFID command)【命令码:0x29】
当标签接收到写DSFID命令时,标签应当将DSFID的值写入到它的内存。
如果没有设置可选标志,当完成写DSFID操作时,标签应当在规定的时间内返回它的响应。
如果设置了可选标志,标签应当等到帧结束标识并随后返回他的响应。
3.12.1 命令格式
3.12.2 命令响应
3.13 锁DSFID命令(Lock DSFID)【命令码:0x2A】
当标签接收到锁DSFID命令时,标签应当将DSFID的值永久锁定到内存。
如果可选标志没有被设置,当完成锁DSFID操作时,标签应当在规定时间返回它的响应。
如果设置了可选标志,那么标签应当等到帧结束标志后才返回它的响应。
3.13.1 命令格式
3.13.2 命令响应
3.14 获取标签系统信息命令(Get system information)【命令码:0x2B】
该命令用于获取标签系统的信息,包含各种属性。
3.14.1 命令格式
Get system info的定义如下表:
3.14.2 响应命令
3.15 获取多块的安全状态命令(Get multiple block security status)【命令码:0x2C】
当标签接收到获取多块安全状态命令时,标签应当返回块的安全状态。
块的序号从0x00到0xFF。
3.15.1 命令格式
3.15.2 命令响应
3.16 自定义命令
3.16.1 命令格式
3.16.2 命令响应
四、防碰撞
ISO15693的防碰撞有两种方式,一种是单时隙,一种是十六时隙。其中单时隙是一种面向比特位的的算法,它和ISO14443A的防碰撞算法类似,而十六时隙算法则是基于时隙,类似于ISO14443B的防碰撞算法。以后有时间介绍。待续……