📄 protocol.c.bak
字号:
{
pcdata[0] = n_b+1+7;
pcdata[1] = deviceAddr;
pcdata[2] = ISO_MANDATORY_CMD;
pcdata[3] = OK;
pcdata[4] = n_b;
for(i=0;i<(n_b+1);i++) {pcdata[i+5] = viccdata[i+2];}
wr_crc_resp();
}
else
resp_iso_err();
}
}
}
}
void invReadMulBlock() //冲撞读取多块
{
uchar i,j,k,l;
uchar addr,num_card;
uchar flags =0;
uint m;
uint db_n,db_adr;
addr = pcdata[1];
db_adr = pcdata[5];
db_n = pcdata[6];
myInvOut();
if( labeldata[0] != 0 )
{
num_card = labeldata[0];
pcdata[0] = 5+num_card*(1+8+5*(db_n+1))+2;
pcdata[1] = deviceAddr;
pcdata[2] = 0xb0;
pcdata[3] = OK;
pcdata[4] = num_card;
flags = ISOFlagsSys&0xfb; // not inventory
flags |= 0x20; // address_flag ,no security
if((ISOModeSys & 0x04) == 0x04) { flags |= 0x40; }// option_flag,TI卡为1才能操作
for(i=0;i<num_card;i++) // read multiple blocks
{
viccdata[0] = 15; //len
viccdata[1] = flags; //flags
viccdata[2] = 0x23; //cmd
for(j=0;j<8;j++) // copy uid
viccdata[3+j] = labeldata[i*10+10-j];
viccdata[11] = db_adr; //start addr
viccdata[12] = (db_n+1);// length
wr_crc_send();
ISOMode = ISOModeSys&0xe7; //read ,all
m = sendISOCmd();
CS_RAM_1;
pcdata[i*((db_n+1)*5+9)+5] = 0x04; //db-size;
for(k=0;k<8;k++)
{
pcdata[i*((db_n+1)*5+9)+6+k] = labeldata[i*10+3+k];//copy uid
}
for(k=0;k<(db_n+1)*5;k++) //copy block data
pcdata[i*((db_n+1)*5+9)+14+k] = viccdata[2+k];
}
if( deviceAddr == addr )wr_crc_resp(); //本机地址执行返回数据
}
else if( labeldata[0] == 0 )
resp_no_trns(); //没有标签返回
else if(globalErrFlag == 0xff) // iso error
resp_iso_err();
}
void invGetSysInfor() //冲撞读取系统信息
{
uchar i,j,k;
uchar addr,num_card;
uchar flags =0;
uint m;
addr = pcdata[1];
myInvOut();
if( labeldata[0] != 0 )
{
num_card = labeldata[0];
pcdata[0] = 5+num_card*13+2;//length
pcdata[1] = deviceAddr;
pcdata[2] = 0xb0; //inv get sys infor
pcdata[3] = OK;
pcdata[4] = num_card;
flags = ISOFlagsSys&0xfb; // not inventory
flags |= 0x20; // address_flag ,no security
for(i=0;i<num_card;i++) // read multiple cards system
{
viccdata[0] = 13; //len
viccdata[1] = flags; //flags
viccdata[2] = 0x2b; //get sys infor
for(j=0;j<8;j++) // copy uid
{
viccdata[3+j] = labeldata[i*10+10-j];
}
wr_crc_send();
mutiBlockWrDelay();
ISOMode = ISOModeSys&0xe7; //read ,all
m = sendISOCmd();
CS_RAM_1;
if(viccdata[0] == 0x01)break; //iso error
pcdata[i*13+5] = viccdata[11]; //dsfid
for(j=0;j<8;j++) // copy uid
pcdata[i*13+6+j] = viccdata[10-j];
pcdata[i*13+14] = viccdata[12]; //afi
pcdata[i*13+15] = viccdata[13]+1; //mem_size
pcdata[i*13+16] = viccdata[14]+1; //mem_size
pcdata[i*13+17] = viccdata[15]; //ic-ref
}
if( deviceAddr == addr )
{
if(viccdata[0] == 0x01){resp_iso_err();return;} // iso error
wr_crc_resp();
}
}
else if( labeldata[0] == 0 )
resp_no_trns(); //没有标签返回
else if(globalErrFlag == 0xff) // iso error
resp_iso_err();
}
void invGetMulBloSec() //冲撞读取块状态
{
uchar i,j,k,l;
uchar addr,num_card;
uchar flags =0;
uint m;
uint db_n,db_adr;
addr = pcdata[1];
db_adr = pcdata[5];
db_n = pcdata[6];
myInvOut();
if( labeldata[0] != 0 )
{
num_card = labeldata[0];
pcdata[0] = 5+num_card*(8+db_n+1)+2;
pcdata[1] = deviceAddr;
pcdata[2] = 0xb0; //inv read mutiple block
pcdata[3] = OK;
pcdata[4] = num_card;
flags = ISOFlagsSys&0xfb; // not inventory
flags |= 0x20; // address_flag ,no security
for(i=0;i<num_card;i++) // read multiple blocks status
{
viccdata[0] = 15; //len
viccdata[1] = flags; //flags
viccdata[2] = 0x2c; //get multiple block security status
for(j=0;j<8;j++) // copy uid
viccdata[3+j] = labeldata[i*10+10-j];
viccdata[11] = db_adr; //start addr
viccdata[12] = db_n; // length
wr_crc_send();
mutiBlockWrDelay();
ISOMode = ISOModeSys&0xe7; //read ,all
m = sendISOCmd();
CS_RAM_1;
if(viccdata[0] == 0x01){break;} // iso error
for(k=0;k<8;k++)
pcdata[i*(8+db_n+1)+5+k] = labeldata[i*10+3+k];//copy uid
for(k=0;k<(db_n+1);k++) //copy block security status
pcdata[i*(8+db_n+1)+13+k] = viccdata[2+k];
}
if( deviceAddr == addr )
{
if(viccdata[0] == 0x01){resp_iso_err();return;} // iso error
wr_crc_resp();
}
}
else if( labeldata[0] == 0 )
resp_no_trns(); //没有标签返回
else if(globalErrFlag == 0xff) // iso error
resp_iso_err();
}
/***************************************************/
void CPU_reset( )
{
uchar crc;
pcdata[0] = 0x06;
pcdata[1] = deviceAddr;
pcdata[2] = 0x63; //cpu reset
pcdata[3] = OK;
crc = crc16Calculate(pcdata,pcdata[0]-2);
pcdata[4] = crc&0xff;
pcdata[4] = crc>>8;
if(pcdata[1] == deviceAddr)//本机地址执行返回
{
for(crc=0;crc<pcdata[0];crc++)
serialPortOutput1byte(pcdata[crc]);
}
LedOutput5(1);
for(crc=0;crc<6;crc++)
{
Delay_100_Milli_Seconds();
} //亮600ms
LedOutput5(0);
WDCR &= 0xbf;
WDCR |= 0x38; // write error check bit ,to reset
}
/********************************************************/
/*******************************************************/
void Detec_Baud_pro(void)
{
if(pcdata[1] == deviceAddr)//本机地址执行返回
{
pcdata[0] = 6;
pcdata[1] = deviceAddr;
pcdata[2] = DETE_BAUDRATE_CMD;
pcdata[3] = 0;
wr_crc_resp();
}
}
/*******************************************************/
void Get_DevInf_pro(void)
{
uchar i ;
i = pcdata[1];
pcdata[0] = 13;
pcdata[1] = deviceAddr;
pcdata[2] = GET_DEVINFO_CMD;
pcdata[3] = 0;
pcdata[4] = 0;
pcdata[5] = 00;
pcdata[6] = 5;
pcdata[7] = 0x0f;
pcdata[8] = 0x41; //PRR8036
pcdata[9] = 0;
pcdata[10] = 0x08; //支持iso15693卡片
if(pcdata[1] == deviceAddr)wr_crc_resp(); //本机地址执行返回
}
/****************************************************/
void getNoiseLevel()
{
#define NOISE 30
uint i,j,data = 0;
uint max,min,aver;
uint result[NOISE];
uint sum = 0;
for(j=0;j<5;j++)
{
ADCCTRL1 = 0x0030;
asm(" nop");
ADCCTRL2 = 0x6000;
CHSELSEQ1 = 0x0C;
MAXCONV = 0x00;
asm(" CLRC SXM");
data = RESULT0;
data = data >> 6;
result[j] = data;
} //清除开机产生的误差数据
for(j=0;j<NOISE;j++)
{
ADCCTRL1 = 0x0030;
asm(" nop");
ADCCTRL2 = 0x6000;
CHSELSEQ1 = 0x0C;
MAXCONV = 0x00;
asm(" CLRC SXM");
data = RESULT0;
data = data >> 6;
result[j] = data;
}
max = min = result[0];
for(i=0;i<NOISE;i++)
{
if(result[i]>=max)max=result[i]; //找最大值
if(result[i]<=min)min=result[i]; //找最小值
sum += result[i];
}
aver = sum/NOISE;
if(pcdata[1] == deviceAddr)
{
pcdata[0] = 0x0c;
pcdata[1] = deviceAddr;
pcdata[2] = 0x6d;
pcdata[3] = OK;
pcdata[4] = (min>>8)&0x03;
pcdata[5] = min&0xff;
pcdata[6] = (aver>>8)&0x03;
pcdata[7] = aver&0xff;;
pcdata[8] = (max>>8)&0x03;;
pcdata[9] = max&0xff;;
wr_crc_resp(); //本机地址执行返回
}
}
void Reset_RF_pro(void)
{
uchar i;
uint level;
level = cfgdata[25] >> 8;
setX9c503ToLowest(); //关闭RF
rfDelay20ms(); //20ms
adjustX9c503(1,level); //打开RF
if( pcdata[1]==deviceAddr ) //本机地址执行返回
{
pcdata[0] = 0x06;
pcdata[1] = deviceAddr;
pcdata[2] = RST_RF_CMD;
pcdata[3] = 0x00;
wr_crc_resp();
}
}
/****************************************************/
void RF_OnOff_pro(void)
{
uchar status=0;
uint level;
level = cfgdata[25] >> 8;
if (pcdata[3] == 0x00) { setX9c503ToLowest();status = 0;}
else if(pcdata[3] == 0x01)
{
setX9c503ToLowest();
adjustX9c503(1,level);
status = 0;
}
else status = 0x11; //参数值超出变化范围
if( pcdata[1]==deviceAddr ) //本机地址执行返回
{
pcdata[0] = 0x06;
pcdata[1] = deviceAddr;
pcdata[2] = CTL_RF_CMD;
pcdata[3] = status;
wr_crc_resp();
}
}
/*****************************************************/
void readerDiagnostic()
{
uchar j;
uchar mode;
uint level;
uint result[5],data;
mode = pcdata[3]&0x03;
level = (cfgdata[25]>>8)&0x3f;
if( pcdata[1]==deviceAddr ) //本机地址执行返回
{
if(mode == 0x01)
{
//read detailed information
}
else if(mode == 0x02)
{
for(j=0;j<2;j++) //剔出开机误差
{
ADCCTRL1 = 0x0030;
asm(" nop");
ADCCTRL2 = 0x6000;
CHSELSEQ1 = 0x0d; //温度输入
MAXCONV = 0x00;
asm(" CLRC SXM");
data = RESULT0;
data = data >> 6;
result[j] = data;
}
for(j=0;j<5;j++)
{
ADCCTRL1 = 0x0030;
asm(" nop");
ADCCTRL2 = 0x6000;
CHSELSEQ1 = 0x0d; //温度输入
MAXCONV = 0x00;
asm(" CLRC SXM");
data = RESULT0;
data = data >> 6;
result[j] = data;
}
data = (result[0]+result[1]+result[2]+result[3]+result[4])/5;
pcdata[0]=0x09;
pcdata[1]=deviceAddr;
pcdata[2]=0x6e;
pcdata[3]=OK;
pcdata[4]=level;
pcdata[5]=0x14; //20%
pcdata[6]=data;
}
else
{
pcdata[0]=0x06;
pcdata[1]=deviceAddr;
pcdata[2]=0x6e;
pcdata[3]=0x11; //parameter error
}
wr_crc_resp();
}
}
void setOutput()
{
}
void getInput()
{
uint in,temp;
uchar inputs = 0;
in = (cfgdata[10]>>8) & 0x07;
inputs |= in;
temp = (deviceAddr<<4)&0xf0;
inputs |= temp;
if( pcdata[1]==deviceAddr ) //本机地址执行返回
{
pcdata[0] = 7;
pcdata[1] = deviceAddr;
pcdata[2] = 0x74;
pcdata[3] = OK;
pcdata[4] = inputs;
wr_crc_resp();
}
}
/******************************************************/
void Read_Cfg_pro(void)
{
uint *p_cfg;
uchar i;
uchar loc;
pcdata[3] &= 0x3f;
loc = pcdata[3];
if( (pcdata[3]==0x01)||(pcdata[3]==0x02)||(pcdata[3]==0x03)
||(pcdata[3]==0x05)||(pcdata[3]==0x08)||(pcdata[3]==0x0a)
||(pcdata[3]==0x0b)||(pcdata[3]==0x0c)||(pcdata[3]==0x0d)
) //cfg_adr命令正确
{
if( (pcdata[1] == 0xff) || (pcdata[1] == deviceAddr) )//广播地址或者本机地址执行
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -