首页 > 代码库 > 射频识别技术漫谈(24)——ISO15693的防冲突与传输协议

射频识别技术漫谈(24)——ISO15693的防冲突与传输协议

遵守ISO15693协议的电子标签都有一个8字节共64bit的全球唯一序列号(UID),这个UID一方面可以使全球范围内的标签互相区别,更重要的是可以在多标签同时读写时用于防冲突。8字节UID按权重从高到低标记为UID7--UID0,其中UID7固定为16进制的E0H,UID6是标签制造商的代码,例如NXP的代码为04H,TI的代码为07H;UID5为产品类别代码,比如ICODE SL2 ICS20是01H,Tag-it HF-I Plus Chip为80H,Tag-it HF-I Plus Inlay为00H。剩下的UID4-UID0为制造商内部分配的号码。

    电子标签数量众多,应用范围极为广泛。为了区分不同行业中的电子标签,ISO用一个字节的AFI (Application family identifier)来区分不同行业中的电子标签。AFI的高半字节表示主要行业,低半字节表示主要行业中的细分行业。其中AFI=00H表示所有行业。需要注意的是并不强制要求电子标签支持AFI,电子标签是否支持AFI是可选的,在收到"Inventory"清点命令后,如果标签不支持AFI,则标签必须立刻做出应答;如果支持AFI,则只有收到的AFI与标签存储的AFI一致才做出应答。

    15693国际标准还规定了一个字节的可选的数据存储格式识别符(DSFID),用来区分标签中不同的数据存储格式。如果标签支持DSFID,在清点命令中标签将返回一个非零的DSFID,读写器可据此判断射频场中的标签是否具有期望的数据格式。

    电子标签的内存最大可达8K字节,以数据块(Block)为单位进行管理,标签内最多可以有256个数据块,每个数据块最大可以有32字节。数据块的内容可以锁定以防止修改。

    读写器与标签之间的数据交流使用"命令-应答"的方式,如下所示:   

        命令:标志(Flags)+命令码(Command code)+参数(parameters)+数据(Application data)+校验(CRC16)

        应答:标志(Flags)                     +参数(parameters)+数据(Application data)+校验(CRC16)

    可见应答除了没有应答码之外,结构与命令码类似。每一条命令及其应答都使用CRC校验以保证数据的完整性。读写器可以发出一条请求后让射频场内的所有电子标签同时应答(Addressed mode),也可以指定一个电子标签应答(Non-addressed mode)。在Non-addressed模式下,可以使用两种方法指定一个电子标签,一种是命令中给出电子标签的唯一序列号UID,另一种是命令中不给出 UID,而是在之前的步骤中先选中一个标签,使其处于选中(select)状态,然后命令中指明仅要求处于选中状态的标签做出应答。

    ISO15693电子标签的防冲突与ISO14443A中基于位的防冲突类似。其最根本的一点就是基于标签有一个全球唯一的序列号。因为序列号的唯一性,所以全球范围内的任意两个标签,其64bit的序列号中总有一个bit的值是不一样的,也就是说任意两个标签的序列号总有一个bit上一个是“0”,另一个是“1”。防冲突的过程可以1位1位的进行,也可以4位4位的进行。具体的原理参见位和时隙相结合的防冲突机制。

    电子标签支持的命令可以分为强制(Mandatory)命令、可选(Optional)命令和用户(Custom)命令三种。强制命令和可选命令的功能和格式在标准中都有明确而详细的定义,用户命令则由标签制造商制定。

    强制命令有两个:清点(Inventory)和保持静默(Stay quiet),标签必须支持。标签最基本的功能是可以通过防冲突送出一个标签识别号,这两个命令就是实现这个功能的。如果磁场中有多个标签,使用清点命令可以得到一个标签UID,然后使用保持静默命令使其休眠;然后再使用清点命令可以得到下一个标签UID,依次类推,从而实现对射频场中的所有标签实现清点轮询。

    可选命令是否支持由标签制造商决定,可以分为以下4类:

    1.对整个标签操作:选择(Select)、复位(Reset to ready)、读取系统信息(Get system information);

    2.对标签数据块操作:读单块(Read single block)、写单块(Write single block)、锁数据块(Lock block)、读多块(Read multiple blocks)、写多块(Write multiple blocks)、读多块安全状态(Get multiple block security status);

    3.对AFI操作:写AFI(Write AFI)、锁定AFI(Lock AFI);

    4.对DSFID操作:写DSFID(Write DSFID)、锁定DSFID(Lock DSFID)。