什么是时隙计数啊?下面代码中十六进制数字都是什么含义啊?
#include "include.h"
//*************************************************************************************************
// 功能描述 : 时隙计数使能
// 输入参数 : 无
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void EnableSlotCounter(void)
{
unsigned char command[2];
command[1] = IRQMask;
command[0] = IRQMask;
ReadSingle(&command[1], 1);
command[1] |= 0x01; //En_irq_noresp
WriteSingle(&command[0], 2);
}
//*************************************************************************************************
// 功能描述 : 禁止时隙计数
// 输入参数 : 无
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void DisableSlotCounter(void)
{
unsigned char buff[2];
buff[1] = IRQMask;
buff[0] = IRQMask;
ReadSingle(&buff[1], 1);
buff[1] &= 0xfe;
WriteSingle(&buff[0], 2);
}
//*************************************************************************************************
// 功能描述 : 读UID号
// 输入参数 : 无
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void ReadUID()
{
unsigned char i = 1,command, found = 0,a=0,j=0,b;
unsigned int size; // 请求命令数据帧大小
unsigned char NoSlots = 2; // 时隙总数,默认1 时隙(NoSlots = 时隙数 + 1)
unsigned int n = 0;
if((flags & BIT5) == 0x00) // 判断时隙类型
{
NoSlots = 17; // 16 时隙
EnableSlotCounter();
}
size = 3; //长度 = flag + command + lenght
buf[0] = 0x8f; // 复位
buf[1] = 0x91; // 传送带CRC
buf[2] = 0x3d; // 连续写,从1D开始
buf[3] = (char) (size >> 8); // 发送的长度
buf[4] = (char) (size << 4); // 按15693命令格式写入FIFO
buf[5] = flags; // 写FIFO ISO15693 flags
buf[6] = 0x01; // 15693 之清点命令
buf[7] = 0x00; // 掩码长度
command = IRQStatus;
ReadSingle(&command, 1);
CounterSet(); // TimerA设置
countValue = count1ms * 20; // 20ms
RAWwrite(&buf[0], 8); // 写 FIFO
irqCLR; // 清除已经存在的IRQ中断标志
irqON;
i_reg = 0x01; // 当前状态为RX状态
startCounter; //开启时钟A,增计数模式
LPM0; //等待发送完成
for(i = 1; i < NoSlots; i ++) // 1 或 16 时隙
{
RXTXstate = 1; // 接收数据保存从buf[1]开始
CounterSet(); // TimerA设置
countValue = count1ms * 20; //20ms
startCounter; // start timer up mode
n = 0;
LPM0;
while(i_reg == 0x01) // 等待RX完成
{
n++;
if(n == 0xFFF0)
{
i_reg = 0x00;
RXErrorFlag = NOERROR;
break;
}
}
if(i_reg == 0xFF)
{ //接收到 UID
found = 1;
b=0;
for(a=j;a
{
UU[a]=buf[10-b];
b++;
}
j=j+8;
}
command = Reset; // FIFO 在下个时隙前必须复位
DirectCommand(&command);
if((NoSlots == 17) && (i < 16)) // 发送EOF(next slot)
{
command = StopDecoders;
DirectCommand(&command);
command = RunDecoders;
DirectCommand(&command);
command = TransmitNextSlot;
DirectCommand(&command);
}
else if((NoSlots == 17) && (i == 16)) // 所以时隙发送完成,停止时隙计数
{
DisableSlotCounter();
}
else if(NoSlots == 2)
break;
}
if(found)
{
LED15693ON;
for(char i = 0;i < 8;i++) //提取接收缓存中的数据
{
UID = buf[10 - i];
}
}
else
{
LED15693OFF;
for(char i = 0;i < 8;i++)
{
UID = 0;
}
}
irqOFF;
}
//*************************************************************************************************
// 功能描述 : 获取UID
// 输入参数 : 无
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void GetUID()
{
unsigned char command[10];
command[0] = ChipStateControl; // 打开 RF 发射和接收
command[1] = 0x21; // RFID模块RF场始能,接收始能
command[2] = ISOControl; // ISO15693
command[3] = 0x02; // ISO15693 高速, 单载波, 4出1
WriteSingle(command, 4);
DelayMs(5);
command[0] = ChipStateControl;
ReadSingle(command, 1); // 清除 IRQs
command[0] = ISOControl;
ReadSingle(command, 1); // 清除 IRQs
flags = 0x06; //选择16个时隙
ReadUID(); // 发送清点命令
delay(10);
command[0] = ChipStateControl; // 关闭 RF 发射
command[1] = 0x01;
WriteSingle(command, 2);
DelayMs(1);
command[0] = IRQStatus;
ReadSingle(command, 1); // 清除 IRQs
}
//*************************************************************************************************
// 功能描述 : 获取单块数据,无地址的读
// 输入参数 : 起始块
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void ReadSingleBlock(unsigned char Block)
{
unsigned char command, found = 0;
unsigned int size; // 请求命令数据帧大小
//unsigned char cBuf[20]; // 时隙总数,默认1 时隙(NoSlots = 时隙数 + 1)
size=3; //长度 = flag + command + lenght
cBuf[0] = 0x8f; // Reset FIFO command
cBuf[1] = 0x91; // send with CRC
cBuf[2] = 0x3d; // write continuous from register 1D
cBuf[3] = (char)(size>>8);// Data for register 1D, data length
cBuf[4] = (char)(size<<4);// Data for register 1E
cBuf[5] = 0x00;// ISO15693 flag with Option flag set
cBuf[6] = 0x20; // Read mul Blocks command code
cBuf[7] = Block; // First Block Number
RAWwrite(&cBuf[0], 8); // 写 FIFO
CounterSet(); // TimerA设置
countValue = count1ms * 10; // 20ms
i_reg = 0x01; // 当前状态为RX状态
startCounter; //开启时钟A,增计数模式
irqCLR; // 清除已经存在的IRQ中断标志
irqON;
LPM0; //等待发送完成
RXTXstate = 1; // 接收数据保存从buf[1]开始
while(i_reg == 0x01)
{
}
i_reg = 0x01;
CounterSet();
countValue = 0x2000; /* 10ms for TIMEOUT */
//startCounter; /* start timer up mode */
while(i_reg == 0x01)
{
}
if(i_reg == 0xFF)
{ //接收到 UID
found = 1;
}
command = Reset; // FIFO 在下个时隙前必须复位
DirectCommand(&command);
if(found)
{
LED15693ON;
for(char i = 0;i <4;i++) //提取接收缓存中的数据
{
Data = buf[5-i];
}
}
else
{
LED15693OFF;
for(char i = 0;i < 8;i++)
{
Data = 0x01;
}
}
irqOFF;
}
//*************************************************************************************************
// 功能描述 : 获取单块数据,有地址的读
// 输入参数 : 起始块
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void ReadSingleBlockWithAdd(unsigned char Block)
{
unsigned char command, found = 0;
unsigned int size,i; // 请求命令数据帧大小
//unsigned char cBuf[20]; // 时隙总数,默认1 时隙(NoSlots = 时隙数 + 1)
size=11;
cBuf[0] = 0x8f; // Reset FIFO command
cBuf[1] = 0x91; // send with CRC
cBuf[2] = 0x3d; // write continuous from register 1D
cBuf[3] = (char)(size>>8);// Data for register 1D, data length
cBuf[4] = (char)(size<<4);// Data for register 1E
cBuf[5] = 0x20;// ISO15693 flag with Option flag set
cBuf[6] = 0x20; // Read mul Blocks command code
for(i=1;i<9;i++)
{
cBuf[15-i] = RevBuffer[i+6];
}
/*cBuf[7] =0x6D;
cBuf[8] =0x46;
cBuf[9] =0xEB;
cBuf[10] =0x5D;
cBuf[11] =0x12;
cBuf[12] =0x80;
cBuf[13] =0x07;
cBuf[14] =0xE0;*/
cBuf[15] =Block;// First Block Number
RAWwrite(&cBuf[0], 16); // 写 FIFO
CounterSet(); // TimerA设置
countValue = count1ms * 10; // 20ms
i_reg = 0x01; // 当前状态为RX状态
startCounter; //开启时钟A,增计数模式
irqCLR; // 清除已经存在的IRQ中断标志
irqON;
LPM0; //等待发送完成
RXTXstate = 1; // 接收数据保存从buf[1]开始
while(i_reg == 0x01)
{
}
i_reg = 0x01;
CounterSet();
countValue = 0x2000; /* 10ms for TIMEOUT */
startCounter; /* start timer up mode */
while(i_reg == 0x01)
{
}
if(i_reg == 0xFF)
{ //接收到 UID
found = 1;
}
command = Reset; // FIFO 在下个时隙前必须复位
DirectCommand(&command);
if(found)
{
LED15693ON;
for(char i = 0;i <4;i++) //提取接收缓存中的数据
{
Data = buf[5-i];
}
}
else
{
LED15693OFF;
for(char i = 0;i < 8;i++)
{
Data = 0x01;
}
}
irqOFF;
}
//*************************************************************************************************
// 功能描述 : 写单块数据
// 输入参数 : 起始块
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void WriteSingleBlock(unsigned char Block)
{
unsigned char i;
unsigned char command;
unsigned int size; // 请求命令数据帧大小
//unsigned char cBuf[20];
size=7;
cBuf[0] = 0x8f;//Reset FIFO command
cBuf[1] = 0x91;//send with CRC
cBuf[2] = 0x3d;//write continuous from register 1D
cBuf[3] = (char)(size>>8);//Data for register 1D
cBuf[4] = (char)(size<<4);//Data for register 1E
cBuf[5] = 0x42;// ISO15693 flag with Option flag set
cBuf[6] = 0x21;// Write Single Blocks command code
cBuf[7] = Block;
for(i=2;i<6;i++)
{
cBuf[6+i] = RevBuffer[i+1];
}
command = IRQStatus;
ReadSingle(&command, 1);
RAWwrite(&cBuf[0], 12); // 写 FIFO
CounterSet(); // TimerA设置
countValue = count1ms * 20; // 20ms
i_reg = 0x01; // 当前状态为RX状态
startCounter; //开启时钟A,增计数模式
irqCLR; // 清除已经存在的IRQ中断标志
irqON;
LPM0; //等待发送完成
RXTXstate = 1; // 接收数据保存从buf[1]开始
while(i_reg == 0x01)
{
}
i_reg = 0x01;
CounterSet();
countValue = 0x2000; /* 10ms for TIMEOUT */
startCounter; /* start timer up mode */
irqCLR; // 清除已经存在的IRQ中断标志
while(i_reg == 0x01)
{
}
irqOFF;
}
//*************************************************************************************************
// 功能描述 : 读多块数据
// 输入参数 : 起始块,块数量
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void ReadMultipleBlock(unsigned char Block,unsigned char Bsize)
{
unsigned char command, found = 0;
unsigned int size; // 请求命令数据帧大小
// unsigned char cBuf[20]; // 时隙总数,默认1 时隙(NoSlots = 时隙数 + 1)
size=4;
cBuf[0] = 0x8f; // Reset FIFO command
cBuf[1] = 0x91; // send with CRC
cBuf[2] = 0x3d; // write continuous from register 1D
cBuf[3] = (char)(size>>8);// Data for register 1D, data length
cBuf[4] = (char)(size<<4);// Data for register 1E
cBuf[5] = 0x02;// ISO15693 flag with Option flag set
cBuf[6] = 0x23; // Read mul Blocks command code
cBuf[7] = Block;// First Block Number
cBuf[8] = Bsize;// Block Number
command = IRQStatus;
ReadSingle(&command, 1);
RAWwrite(&cBuf[0], 9); // 写 FIFO
CounterSet(); // TimerA设置
countValue = count1ms * 10; // 20ms
i_reg = 0x01; // 当前状态为RX状态
startCounter; //开启时钟A,增计数模式
irqCLR; // 清除已经存在的IRQ中断标志
irqON;
LPM0; //等待发送完成
RXTXstate = 1; // 接收数据保存从buf[1]开始
while(i_reg == 0x01)
{
}
i_reg = 0x01;
CounterSet();
countValue = 0x2000; /* 10ms for TIMEOUT */
startCounter; /* start timer up mode */
while(i_reg == 0x01)
{
}
if(i_reg == 0xFF)
{ //接收到 UID
found = 1;
}
command = Reset; // FIFO 在下个时隙前必须复位
DirectCommand(&command);
if(found)
{
LED15693ON;
for(char i = 0;i < 8;i++) //提取接收缓存中的数据
{
Data = buf[9-i];
}
}
else
{
LED15693OFF;
for(char i = 0;i < 16;i++)
{
Data = 0x01;
}
}
irqOFF;
}
//*************************************************************************************************
// 功能描述 : 写多块数据
// 输入参数 : 起始块,块数量
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void WriteMultipleBlock(unsigned char Block,unsigned char Bsize)
{
unsigned char i;
for(i=0;i
{
WriteSingleBlock(Block);
Block++;
}
}
//*************************************************************************************************
// 功能描述 : 复位标签
// 输入参数 :
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void ResetToReday()
{
unsigned int size; // 请求命令数据帧大小
//unsigned char cBuf[20];
size=2; //长度 = flag + command + lenght
cBuf[0] = 0x8f;//Reset FIFO command
cBuf[1] = 0x91;//send with CRC
cBuf[2] = 0x3d;//write continuous from register 1D
cBuf[3] = (char)(size>>8);//Data for register 1D
cBuf[4] = (char)(size<<4);//Data for register 1E
cBuf[5] = 0x00;// ISO15693 flag with Option flag set
cBuf[6] = 0x26;// Write Single Blocks command code
RAWwrite(&cBuf[0], 7); // 写 FIFO
CounterSet(); // TimerA设置
countValue = count1ms * 20; // 20ms
i_reg = 0x01; // 当前状态为RX状态
startCounter; //开启时钟A,增计数模式
irqCLR; // 清除已经存在的IRQ中断标志
irqON;
LPM0; //等待发送完成
RXTXstate = 1; // 接收数据保存从buf[1]开始
while(i_reg == 0x01)
{
}
i_reg = 0x01;
CounterSet();
countValue = 0x2000; /* 10ms for TIMEOUT */
startCounter; /* start timer up mode */
irqCLR; // 清除已经存在的IRQ中断标志
while(i_reg == 0x01)
{
}
irqOFF;
}
//*************************************************************************************************
// 功能描述 : 写AFI,应用族识别符,应用的卡预选准则
// 输入参数 : 无
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void WriteAFI(unsigned AFI)
{
unsigned int size; // 请求命令数据帧大小
//unsigned char cBuf[20];
size=3; //长度 = flag + command + lenght
cBuf[0] = 0x8f;//Reset FIFO command
cBuf[1] = 0x91;//send with CRC
cBuf[2] = 0x3d;//write continuous from register 1D
cBuf[3] = (char)(size>>8);//Data for register 1D
cBuf[4] = (char)(size<<4);//Data for register 1E
cBuf[5] = 0x42;// ISO15693 flag with Option flag set
cBuf[6] = 0x27;// Write Single Blocks command code
cBuf[7] = AFI;
RAWwrite(&cBuf[0], 8); // 写 FIFO
CounterSet(); // TimerA设置
countValue = count1ms * 20; // 20ms
i_reg = 0x01; // 当前状态为RX状态
startCounter; //开启时钟A,增计数模式
irqCLR; // 清除已经存在的IRQ中断标志
irqON;
LPM0; //等待发送完成
RXTXstate = 1; // 接收数据保存从buf[1]开始
while(i_reg == 0x01)
{
}
i_reg = 0x01;
CounterSet();
countValue = 0x2000; /* 10ms for TIMEOUT */
startCounter; /* start timer up mode */
irqCLR; // 清除已经存在的IRQ中断标志
while(i_reg == 0x01)
{
}
irqOFF;
}
//*************************************************************************************************
// 功能描述 : 写DSFID,应用族识别符,应用的卡预选准则
// 输入参数 : 无
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void WriteDSFID(unsigned char DSFID)
{
unsigned int size; // 请求命令数据帧大小
//unsigned char cBuf[20];
size=3;
cBuf[0] = 0x8f;//Reset FIFO command
cBuf[1] = 0x91;//send with CRC
cBuf[2] = 0x3d;//write continuous from register 1D
cBuf[3] = (char)(size>>8);//Data for register 1D
cBuf[4] = (char)(size<<4);//Data for register 1E
cBuf[5] = 0x42;// ISO15693 flag with Option flag set
cBuf[6] = 0x29;// Write Single Blocks command code
cBuf[7] = DSFID;
RAWwrite(&cBuf[0], 8); // 写 FIFO
CounterSet(); // TimerA设置
countValue = count1ms * 20; // 20ms
i_reg = 0x01; // 当前状态为RX状态
startCounter; //开启时钟A,增计数模式
irqCLR; // 清除已经存在的IRQ中断标志
irqON;
LPM0; //等待发送完成
RXTXstate = 1; // 接收数据保存从buf[1]开始
while(i_reg == 0x01)
{
}
i_reg = 0x01;
CounterSet();
countValue = 0x2000; /* 10ms for TIMEOUT */
startCounter; /* start timer up mode */
irqCLR; // 清除已经存在的IRQ中断标志
while(i_reg == 0x01)
{
}
irqOFF;
}
//*************************************************************************************************
// 功能描述 : 获取系统信息
// 输入参数 : 无
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void GetSystemInfo()
{
unsigned char command,length,found;
unsigned int size; // 请求命令数据帧大小
//unsigned char cBuf[20],;
size = 2;
cBuf[0] = 0x8f; // Reset FIFO command
cBuf[1] = 0x91; // send with CRC
cBuf[2] = 0x3d; // write continuous from register 1D
cBuf[3] = (char)size>>8; // Data for register 1D, data length
cBuf[4] = (char)size<<4; // Data for register 1E
cBuf[5] = 0x02; //0x02; // ISO15693 flag with Option flag set
cBuf[6] = 0x2B; // GetSystemInfo
length = 7;
RAWwrite(&cBuf[0],length);
CounterSet(); // TimerA设置
countValue = count1ms * 10; // 20ms
i_reg = 0x01; // 当前状态为RX状态
startCounter; //开启时钟A,增计数模式
irqCLR; // 清除已经存在的IRQ中断标志
irqON;
LPM0; //等待发送完成
RXTXstate = 1; // 接收数据保存从buf[1]开始
while(i_reg == 0x01)
{
}
i_reg = 0x01;
CounterSet();
countValue = 0x2000; /* 10ms for TIMEOUT */
startCounter; /* start timer up mode */
while(i_reg == 0x01)
{
}
if(i_reg == 0xFF)
{ //接收到 UID
found = 1;
}
command = Reset; // FIFO 在下个时隙前必须复位
DirectCommand(&command);
if(found)
{
LED15693ON;
for(char i = 0;i < 15;i++) //提取接收缓存中的数据
{
Data = buf[i+1];
}
}
else
{
LED15693OFF;
for(char i = 0;i < 16;i++)
{
Data = 0x01;
}
}
irqOFF;
}
//*************************************************************************************************
// 功能描述 : 获取多个块的安全状态
// 输入参数 : 无
// 返回参数 : 无
// 说 明 :
//*************************************************************************************************
void GetMult_BlkSelStatus(unsigned char Block,unsigned char Bsize)
{
unsigned char found,command;
unsigned int size; // 请求命令数据帧大小
//unsigned char cBuf[20];
size=4; //长度 = flag + command + lenght
cBuf[0] = 0x8f;//Reset FIFO command
cBuf[1] = 0x91;//send with CRC
cBuf[2] = 0x3d;//write continuous from register 1D
cBuf[3] = (char)(size>>8);//Data for register 1D
cBuf[4] = (char)(size<<4);//Data for register 1E
cBuf[5] = 0x02;// ISO15693 flag with Option flag set
cBuf[6] = 0x2c;// Write Single Blocks command code
cBuf[7] = Block;
cBuf[8] = Bsize;
RAWwrite(&cBuf[0], 9); // 写 FIFO
CounterSet(); // TimerA设置
countValue = count1ms * 10; // 20ms
i_reg = 0x01; // 当前状态为RX状态
startCounter; //开启时钟A,增计数模式
irqCLR; // 清除已经存在的IRQ中断标志
irqON;
LPM0; //等待发送完成
RXTXstate = 1; // 接收数据保存从buf[1]开始
while(i_reg == 0x01)
{
}
i_reg = 0x01;
CounterSet();
countValue = 0x2000; /* 10ms for TIMEOUT */
startCounter; /* start timer up mode */
while(i_reg == 0x01)
{
}
if(i_reg == 0xFF)
{ //接收到 UID
found = 1;
}
command = Reset; // FIFO 在下个时隙前必须复位
DirectCommand(&command);
if(found)
{
LED15693ON;
for(char i = 0;i < Bsize+1;i++) //提取接收缓存中的数据
{
Data = buf;
}
}
else
{
LED15693OFF;
for(char i = 0;i < 16;i++)
{
Data = 0x01;
}
}
irqOFF;
}