读写器通信协议开发者指南
协议简介
计算机(主机)和读写器之间的串行通信基于请求/回复机制。每当主机向读写器发送消息时,在没有收到回复之前不应发送下一个命令。
注意:一帧通信数据的总字节数不得超过255。

Host-to-Reader通信框架

主机到读写器通信按照下表进行打包。读写器一次只能接受一个命令,并且命令是串行执行的,因此主机在发出另一个命令之前应等待读写器到主机的响应。
Header Data Length Command Code Data CRC-16
1字节,必须是 0xFF 1字节, 数据字段的字节数 1字节 数据字段,高字节在前 2字节循环冗余码,高字节在前

Reader-to-Host通信框架

下表定义了从读写器到主机的响应数据包的格式。
Header Data Length Command Code Status Code Data CRC-16
1字节,必须是 0xFF 1字节, 数据字段的字节数 1字节 2个字节,状态码,0表示操作成功,非零值表示操作失败 数据字段,高字节在前 2字节循环冗余码,高字节在前
CRC-16 C语言示例
#define MSG_CRC_INIT 0xFFFF #define MSG_CCITT_CRC_POLY 0x1021 void CRC_calcCrc8(uint16 *crcReg, uint16 poly, uint16 u8Data) { uint16 i; uint16 xorFlag; uint16 bit; uint16 dcdBitMask = 0x80; for(i=0; i<8; i++) { xorFlag = *crcReg & 0x8000; *crcReg <<= 1; bit = ((u8Data & dcdBitMask) == dcdBitMask); *crcReg |= bit; if(xorFlag) { *crcReg = *crcReg ^ poly; } dcdBitMask >>= 1; } } uint16 CalcCRC(uint8 *msgbuf,uint8 msglen) { uint16 calcCrc = MSG_CRC_INIT; uint8 i; for (i = 1; i < msglen; ++i) CRC_calcCrc8(&calcCrc, MSG_CCITT_CRC_POLY, msgbuf[i]); return calcCrc; }
通过调用函数uint16 CalcCRC(uint8 * msgbuf,uint8 msglen)获得的返回数据是CRC-16,其中参数* msgbuf是除CRC-16之外的通信协议字节数据,msglen是除CRC-16外所有通信协议的总字节数。

命令分类和工作流程

命令分类
由于命令很多,为了方便地讲解每个命令,命令根据其功能分为四类: Bootloader命令标签盘存命令标签访问命令设置命令获取命令
命令集概述
命令集名称 描述
Bootloader命令 读写器Bootloader阶段时可以执行的任何命令都称为Bootloader命令
标签盘存命令 与盘存操作相关的命令
标签访问命令 与标签访问操作相关的命令
设置命令 设置相关的命令
获取命令 获取相关的命令
此外,当读写器处于Bootloader层和App Firmware层时,分别可以执行一些命令。当我们详细描述每个命令时,会说明该命令是否具有 Bootloader命令和App Firmware命令的属性。
命令流程
读写器上电时自动 启动Bootloader。读写器的所有标签操作只能在App Firmware层中使用,因此您必须首先执行Boot Firmware命令(0x04)让读写器进入App Firmware层,然后您可以执行 设置命令获取命令标签盘存命令标签访问命令

特别提示

每个命令的功能和用法将在后面的章节中详细介绍。在介绍每个命令时将遵循以下顺序:
命令概述
|
命令属性
|
Host to Reader(Data字段格式)
|
Reader to Host(Data字段格式)
|
举例
|
备注
如果host-to-reader命令不包含Data字段,则没有Host to Reader部分章节。如果数据字段未包含在reader-to-host命令中,则没有Reader to Host部分章节。类似地在示例部分中,如果命令不包含数据字段,则没有相关的子示例。
命令中的多字节整数采用MSB字节顺序。
Baidu
map