概述

因为工作上有用到让板子与NFC标签进行通讯,所以研究了一下NFC技术中的ISO15693协议.

首先,我的使用场景是板子上有一个PN5180的NFC前端芯片,用做读卡器.与另一个设备做NFC通讯,这个设备使用ST25DV系列NFC标签芯片.

因为NFC技术本身有很多种协议,比如说ISO 14443,Felica也算是NFC技术.但是因为我的使用场景只需要支持这个设备上的ST25DV系列NFC标签芯片,所以下文中我提到NFC就代指ISO15693协议.

从底层来说

ISO15693的底层通讯的还是靠射频场,其编码使用脉冲位置调制(pulse position modulation,PPM).调制的数据包主要有两种,一种是请求命令包,一种是命令响应包.

请求命令包常见的格式如下:

SOF(1byte)Flags(1byte)Command CodeParametersDataCRCEOF(1byte)
帧开始标识命令代码参数数据CRC帧结束
表1-常见请求命令包格式

其中SOF(帧开始)作为包头,会决定通讯过程中的一些底层参数,比如说调制过程中的数据传送速率.这部分一般不需要固件的参与.

然后是请求命令包的Flags(标识),它的8bit各自的含义如下:

位(Bit)标志名称描述
Bit0副载波标志0=VICC应使用单个副载波频率.1=VICC应使用两个副载波
Bit1数据速率标志0=使用低数据速率.1=使用高数据速率
Bit2目录标志0=Bit4到Bit7的含义按下方的表3解读.1=Bit4到Bit7的含义按下方的表4解读
Bit3协议扩展标志0=无协议格式扩展.1=协议格式已扩展,保留供以后使用
表2-请求命令包中请求标志Bit0到Bit3的内容含义

位(Bit)标志名称描述
Bit4选择标志0=根据寻址标志设置,请求将由任何VICC执行.1=请求只由处于选择状态的VICC执行.寻址标志应设为0,UID域不应包含在请求中
Bit5寻址标志0=请求没有寻址,不包括UID域,可以由任何VICC执行.1=请求有寻址,`包括UID域,仅由那些自身UID与请求中规定的UID匹配的VICC才能执行
Bit6选项标志0=含义由命令描述定义,如果没有被命令定义,此Bit应设置为0.1:含义由命令描述定义.
Bit7RFU
表3-请求命令包中当目录标志为0时,请求标志Bit4到Bit7的内容含义

位(Bit)标志名称描述
Bit4AFI标志0=AFI域没有出现.1=AFI域有出现.
Bit5Nb_slots标志0=16 slots.1=1 slot
Bit6选择权标志0=含义由命令描述定义,如果没有被命令定义,此Bit应设置为0.1:含义由命令描述定义.
Bit7RFU
表4-请求命令包中当目录标志为1时,请求标志Bit4到Bit7的内容含义

Command Code(命令代码)根据ISO15693的命令代码分成强制的、可选的、自定义以及私有的四种类型。它们的定义如下:

  • 强制命令:命令代码(command code)取值范围为0x01~0x1F,所有标签(VICC)必须支持在该命令代码范围内的命令.
  • 可选命令:命令代码取值范围为0x20~0x9F.在该命令代码范围的命令,标签可能支持.如果标签支持可选命令,它的命令格式在后续会介绍.如果标签不支持可选命令,并且寻址标识(Address_flag)或者选择标识(Select_flag)都设置了,它可能会返回错误码或者不响应,保持沉默.如果标签不支持可选命令,并且寻址标识(Address_flag)或者选择标识(Select_flag)未设置,那么标签就不会响应,会保持沉默.
  • 自定义命令:命令代码取值范围为0xA0~0xDF,标签可以选择去支持它,自定义命令可以实现制造商的特殊功能.所有的自定义命令必须包含IC制作商编码.如果标签不支持自定义命令,那么给它发送自定义命令时,它应该返回错误码或者保持沉默.
  • 私有命令:命令代码取值范围是0xE0~0xFF,在该命令代码的范围内的命令可以用于制造商测试,系统信息编码等.私有命令要求必须包含IC制造商代码以及IC版本号.

其中一些常用的命令如下:

命令代码命令类型命令作用
0x01强制命令清查命令(查找所有在射频场中的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制造商决定
表5-常用的命令

命令响应包的常见的格式如下:

SOFFlagsParametersDataCRCEOF
帧开始标识参数数据CRC帧结束
表6-常见命令响应包格式

其中Flags的内容定义相对于请求命令包中的有所不同.定义如下:

位(Bit)标志名称描述
Bit0错误标志位0=没有错误.1=出现错误
Bit1RFU应设置为0
Bit2RFU应设置为0
Bit3协议扩展标志0=无协议格式扩展.1=协议格式已扩展,保留供以后使用
Bit4RFU应设置为0
Bit5RFU应设置为0
Bit6RFU应设置为0
Bit7RFU应设置为0
表7-命令响应包中标识内容的定义

如果Flags中的错误标志位为1,则一般情况下Flags后面跟着的就是具体的1byte长度的错误码(Error Code).其不同值的含义如下:

错误码(Error Code)含义
0x01不支持该命令,即无法识别请求代码
0x02命令无法识别,例如:出现格式错误
0x03不支持该选项
0x0F未知错误
0x10指定的块不可用(不存在)
0x11指定的块已经被锁定,因此不能再次锁定
0x12指定的块被锁定,其内容不能更改
0x13指定的块未成功编程
0x14指定的块未成功锁定
0xA0-0xDF自定义命令错误码
其他值RFU
表8-错误码说明

往上爬爬

举例一个读单个块的命令(Read single block):

读卡器需要向标签发送请求命令包:

SOFFlagsRead single block(0x20)UIDBlock numberCRC16EOF
1byte1byte8byte1byte2byte
表9-Read single block请求命令包结构示例

然后标签发送命令响应包:

  • 当命令执行出错时:
SOFFlagsError CodeCRC16EOF
1byte1byte2byte
表10-Read single block执行出错时的命令响应包结构示例
  • 当命令执行成功时:
SOFFlagsBlock security statusDataCRC16EOF
1byte1byteN byte2byte

再举例一个写单个块的命令(Write single block):

读卡器需要向标签发送请求命令包:

SOFFlagsWrite single block(0x21)UIDBlock numberDataCRC16EOF
1byte1byte8byte1byte块大小2byte
表9-Read single block请求命令包结构示例

然后标签发送命令响应包:

  • 当命令执行出错时:
SOFFlagsError CodeCRC16EOF
1byte1byte2byte
表10-Read single block执行出错时的命令响应包结构示例
  • 当命令执行成功时:
SOFFlagsCRC16EOF
1byte2byte

下期再会

至此.基础的通讯就到此为止了.下一篇博文再讲讲更上一层的数据封装.


一个电子工程师的自我修养