📄 protocol.c.bak
字号:
#include "typedef.h"
#include "f2407regs_c.h"
#include "global.h"
void mutiBlockWrDelay(void);
void rfDelay20ms(void);
extern uchar status_rx;
extern uchar pcdata[Len];
extern uchar viccdata[256];
extern uint cfgdata[128];
extern uchar labeldata[350];
extern uchar ISOModeSys;
extern uchar ISOFlagsSys;
extern uchar ISOMode;
extern uchar bFlashError;
extern uchar deviceAddr;
/**具体命令解析***/
uchar initRfPara(void)
{
uint temp,iso_option;
uint level;
temp = cfgdata[66] >> 8;
iso_option = (cfgdata[67]>>10)&0x03;
level = cfgdata[25] >> 8;
ISOModeSys = 0;
ISOFlagsSys = 0;
if(temp&0x01) ISOModeSys |= 0x01; // '1':fast mode; '0':normal mode;
if(temp&0x02) ISOModeSys |= 0x02; // '1':10% modulation; '0':100% modulation;
if(temp&0x04) {ISOFlagsSys |= 0x01;ISOModeSys |= 0x20;} // '1':fsk,two subcarriers; '0':ask,a single subcarriers
if(temp&0x08) ISOFlagsSys |= 0x02; // '1':high data rate '0':low data rate
if(iso_option == 0x02){ISOModeSys &= 0xfb;}
else {ISOModeSys |= 0x04;}
//将高速模式屏蔽
if( (temp&0x04) == 0x04 ) //fsk
{
ISOFlagsSys |= 0x01;
ISOModeSys &= 0xfe;
ISOFlagsSys &= 0xfd;
}
else //ask
{
ISOModeSys &= 0xfe;
ISOModeSys &= 0xfd;
ISOFlagsSys &= 0xfd;
} //20051205
if( (level>=0x0c) && (level<= 0x29) )
adjustX9c503(1,level); //向上调节
else
adjustX9c503(1,0x0c); //默认为0.5W
}
/***********************************************************/
void resp_no_trns(void) //没有标签的存在
{
uint m;
pcdata[0] = 0x06;
pcdata[1] = deviceAddr;
pcdata[2] = ISO_MANDATORY_CMD;
pcdata[3] = NO_TRNS;
m = ~crc16Calculate(pcdata,4);
pcdata[4] = m&0x00ff;
pcdata[5] = m>>8;
send_resp();
}
/***********************************************************/
void resp_iso_err(void) //标签执行ISO错误
{
uint m;
pcdata[0] = 0x07;
pcdata[1] = deviceAddr;
pcdata[2] = ISO_MANDATORY_CMD;
pcdata[3] = ISO_ERR; //0x95
pcdata[4] = viccdata[2];
m = ~crc16Calculate(pcdata,5);
pcdata[5] = m&0x00ff;
pcdata[6] = m>>8;
send_resp();
}
/***********************************************************/
void resp_para_err(void)
{
uint m;
pcdata[0] = 0x06;
pcdata[1] = deviceAddr;
pcdata[2] = ISO_MANDATORY_CMD;
pcdata[3] = PARA_OV;
m = ~crc16Calculate(pcdata,4);
pcdata[4] = m&0x00ff;
pcdata[5] = m>>8;
send_resp();
}
/***********************************************************/
void wr_crc_resp(void)
{
uint m;
uchar len;
len = pcdata[0];
len -= 2;
m = ~crc16Calculate(pcdata,len);
pcdata[len++] = m&0x00ff;
pcdata[len] = m>>8;
send_resp();
}
/***********************************************************/
void wr_crc_send(void)
{
uint m;
uchar len;
len = viccdata[0];
len -= 3;
m = crc16Calculate(viccdata+1,len); //
len ++;
viccdata[len++] = m&0x00ff; //crc_low
viccdata[len] = m>>8; //crc_high
}
/***********************************************************/
static ulong curSlot[16] = {0};
static ulong curSlot1[16] = {0};
static uchar invUid[145];
static uchar collFlag0[16]={0};
static uchar collFlag1[16]={0};
/*
static uchar collFlag2[16]={0};
static uchar collFlag3[16]={0};
static uchar collFlag4[16]={0};
static uchar collFlag5[16]={0};
static uchar collFlag6[16]={0};
static uchar collFlag7[16]={0};
*/
void invStayQuiet()
{
uchar flags = 0;
uchar i,m,num;
num = invUid[0];
if(num>0) //keep quiet
{
for(m=0;m<num;m++)
{
flags = ISOFlagsSys|0x0020; //address_flag
viccdata[0] = 0x0d; //len
viccdata[1] = flags; //flags
viccdata[2] = Stay_quit_cmd; //cmd
for(i=0;i<8;i++) { viccdata[3+i] = invUid[m*8+8-i]; }//copy uid
wr_crc_send();
ISOMode = ISOModeSys;
sendISOCmd();
CS_RAM_1;
}
}
for(i=0;i<145;i++)
invUid[i] = 0; // clr to 0
}
uchar globalErrFlag = 0;
void myInvOut()
{
int i,ii,m,j,slotCounter,num_card;
uchar flags =0;
labeldata[0]=0;
invUid[0] = 0;
/////////////////////////////1///////////////////////////////
for(slotCounter=0;slotCounter<16;slotCounter++)
{
flags = ISOFlagsSys | 0x0004; //inventory_flag
viccdata[0] = 0x06; //len
viccdata[1] = flags; //flags
viccdata[2] = 0x01; //cmd
viccdata[3] = 0; //mask length
wr_crc_send(); //without optional afi
ISOMode = ISOModeSys&0xe7; //read all,read,wr_op
if(slotCounter!=0)ISOMode |= 0x80; //next slot
m = sendISOCmd();
CS_RAM_1;
if(viccdata[0] == 1)globalErrFlag = 0xff; // iso error
if(m==2) {collFlag0[slotCounter]=0xaa;} //collision flag
else if(m==1)
{
labeldata[0] += 1;
invUid[0] += 1;
labeldata[ (labeldata[0]-1)*10 + 1 ] = 0x03; //tr-type
labeldata[ (labeldata[0]-1)*10 + 2 ] = viccdata[2];//dsfid
for(j=0;j<8;j++)
{
labeldata[ (labeldata[0]-1)*10+3+j ] = viccdata[10-j];//uid
invUid[ (invUid[0]-1)*8+1+j ] = viccdata[10-j];
}
}
}
invStayQuiet();
/////////////////////////////2//////////////////////////////////////
for(i=0;i<16;i++)
{
if(collFlag0[i] == 0xaa)
{
collFlag0[i] = 0x0; // clr collision flag
for(slotCounter=0;slotCounter<16;slotCounter++)
{
flags = ISOFlagsSys|0x04; //inventory_flag
viccdata[0] = 0x07; //len
viccdata[1] = flags; //flags
viccdata[2] = 0x01; //cmd
viccdata[3] = 0x04; //mask length
viccdata[4] = i; //mask value
wr_crc_send(); //without optional afi
ISOMode = ISOModeSys&0xe7; //read all,read,wr_op
if(slotCounter!=0)ISOMode |= 0x80; //next slot
m = sendISOCmd();
CS_RAM_1;
if(viccdata[0] == 1)globalErrFlag = 0xff; // iso error
if(m==2){collFlag1[i] = 0xaa;curSlot[slotCounter] = (slotCounter<<4) | i;}
else if(m==1)
{
labeldata[0] += 1;
invUid[0] += 1;
labeldata[ (labeldata[0]-1)*10 + 1 ] = 0x03; //tr-type
labeldata[ (labeldata[0]-1)*10 + 2 ] = viccdata[2];//dsfid
for(j=0;j<8;j++)
{
labeldata[ (labeldata[0]-1)*10+3+j ] = viccdata[10-j];//uid
invUid[ (invUid[0]-1)*8+1+j ] = viccdata[10-j];
}
}
else {;}
}
invStayQuiet();
/////////////////////////3/////////////////////////////////////////////////
for(ii=0;ii<16;ii++)
{
if(collFlag1[ii] == 0xaa)
{
collFlag1[ii] = 0x0;
for(slotCounter=0;slotCounter<16;slotCounter++)
{
flags = ISOFlagsSys | 0x0004; //inventory_flag
viccdata[0] = 0x07; //len
viccdata[1] = flags; //flags
viccdata[2] = 0x01; //cmd
viccdata[3] = 0x04; //mask length
viccdata[4] = curSlot[ii]; //mask value
wr_crc_send(); //without optional afi
ISOMode = ISOModeSys&0xe7; //read all,read,wr_op
if(slotCounter!=0)ISOMode |= 0x80; //next slot
m = sendISOCmd();
CS_RAM_1;
if(viccdata[0] == 1)globalErrFlag = 0xff; // iso error
if(m==2){collFlag1[i] = 0xaa;curSlot1[slotCounter] = (ii<<8) | curSlot[ii];}
else if(m==1)
{
labeldata[0] += 1;
invUid[0] += 1;
labeldata[ (labeldata[0]-1)*10 + 1 ] = 0x03; //tr-type
labeldata[ (labeldata[0]-1)*10 + 2 ] = viccdata[2];//dsfid
for(j=0;j<8;j++)
{
labeldata[ (labeldata[0]-1)*10+3+j ] = viccdata[10-j];//uid
invUid[ (invUid[0]-1)*8+1+j ] = viccdata[10-j];
}
}
else {;}
}
//invStayQuiet();
}
}
///////////////////////////////////4//////////////////////////////////////////////////////
}
}
/////////////////////////////////////
viccdata[0] = 5;
viccdata[1] = ISOFlagsSys;
viccdata[2] = Reset_rdy_cmd;
wr_crc_send();
ISOMode = ISOModeSys;
sendISOCmd(); // active all cards
CS_RAM_1;
}
void inventory_pro(void)
{
uchar i,j;
uchar addr,num_card;
uint m;
addr = pcdata[1];
if(pcdata[1] == deviceAddr) //本机地址执行
{
myInvOut();
if(m==0){resp_no_trns(); } //没有标签返回
else
{
if( labeldata[0]!=0 )
{
num_card = labeldata[0];
pcdata[0] = 5+num_card*10+2;
pcdata[1] = deviceAddr;
pcdata[2] = 0xb0;
if(pcdata[0]<=0xff)pcdata[3] = OK;
else pcdata[3] = 0x94; //more data
pcdata[4] = num_card;
for(i=0;i<num_card;i++)
{
pcdata[10*i+5] = labeldata[10*i+1];
pcdata[10*i+6] = labeldata[10*i+2];
for(j=0;j<8;j++)
{
pcdata[10*i+7+j] = labeldata[10*i+3+j];
}
}
wr_crc_resp(); //返回ISO执行数据
}
else if(viccdata[0]==1)resp_iso_err(); //ISO错误返回
else resp_no_trns(); //没有标签返回
}
}
}
/***************************************************/
void stay_quiet_pro(void)
{
uchar i,j,addr;
uchar flags;
i = pcdata[4] & 0x07;
if(i == 0x01) //ADDRED 模式
{
flags = ISOFlagsSys|0x0020; //address_flag
viccdata[0] = 0x0d; //len
viccdata[1] = flags; //flags
viccdata[2] = Stay_quit_cmd; //cmd
for(i=3,j=12;i<11;) { viccdata[i++] = pcdata[j--]; }
wr_crc_send();
ISOMode = ISOModeSys;
sendISOCmd(); //本机地址执行
CS_RAM_1;
if(pcdata[1] == deviceAddr) //本机地址返回
{
pcdata[0] = 6;
pcdata[1] = deviceAddr;
pcdata[2] = 0xb0;
pcdata[3] = OK;
wr_crc_resp();
}
}
else // 错误参数模式
{
if( pcdata[1] == deviceAddr ) //只有本机地址响应
resp_para_err();
}
}
/***************************************************/
void rd_sgl_blk_pro(void)
{
uchar flags,addr;
uchar flag=0;
uchar i,j;
addr = pcdata[1];
flags = pcdata[4]&0x07;
if( (flags==0)||(flags==2) )
{
if(flags==0) { flags = ISOFlagsSys&0xcf;}
else { flags = ISOFlagsSys|0x10;} //select_flag
if((ISOModeSys & 0x04) == 0x04) { flags |= 0x40; } //option_flag
if(pcdata[5] >64) { flag = 1; } //目前先调试64块以内数据
else
{
viccdata[0] = 6;
viccdata[1] = flags;
viccdata[2] = 0x20;
viccdata[3] = pcdata[5];
wr_crc_send();
}
}
else if(flags==1)
{
if(pcdata[13] >63) { flag = 1;}
else
{
flags = ISOFlagsSys|0x20; //address_flag
if((ISOModeSys & 0x04) == 0x04) {flags |= 0x40;} //option_flag
viccdata[0] = 14;
viccdata[1] = flags;
viccdata[2] = 0x20;
for(i=3,j=12;i<11;i++,j--) { viccdata[i] = pcdata[j];}
viccdata[11] = pcdata[13] ;
wr_crc_send();
}
}
else { flag = 1;}
if( deviceAddr == pcdata[1] ) //本机响应
{
if(flag == 1) //块号参数超出标签允许值
{
resp_para_err();
}
else
{
ISOMode = ISOModeSys;
i = sendISOCmd();
CS_RAM_1;
if(i==0) //没有标签的存在
{
resp_no_trns();
}
else
{
if(viccdata[1]==0) //标签正确执行ISO指令
{
if((ISOModeSys & 0x04) == 0x04) //含有块状态信息
{
pcdata[0] = 11;
pcdata[1] = deviceAddr;
pcdata[2] = 0xb0;
pcdata[3] = OK;
pcdata[4] = viccdata[2];
pcdata[5] = viccdata[3];
pcdata[6] = viccdata[4];
pcdata[7] = viccdata[5];
pcdata[8] = viccdata[6];
}
else //不含有块状态信息
{
pcdata[0] = 10;
pcdata[1] = deviceAddr;
pcdata[2] = 0xb0;
pcdata[3] = OK;
pcdata[4] = viccdata[2];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -