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