📄 protocol.c.bak
字号:
readOneCfg((uint)loc);
pcdata[0] = 20;
pcdata[2] = 0x80;
pcdata[3] = OK;
p_cfg = &cfgdata[0] + loc*8;
for(i=0;i<14;i++)
{
if(i%2==0)pcdata[4+i] = (*p_cfg) >>8;
else {pcdata[4+i] = (*p_cfg)&0x00ff; p_cfg ++;}
}
if(pcdata[1] != 0xff)
{
pcdata[1] = deviceAddr;
wr_crc_resp();//广播地址不返回
}
}
}
else //cfg_adr命令不正确
{
if(pcdata[1] != 0xff)//广播地址不返回
{
pcdata[0] = 6;
pcdata[1] = deviceAddr;
pcdata[2] = 0x80;
pcdata[3] = 0x15; //read reserved configuration
wr_crc_resp();
}
}
}
/******************************************************/
void Write_Cfg_pro(void) //Write Configuration
{
uint *p_cfg;
uchar i;
uchar flag;
pcdata[3] &= 0x3f;
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) )//广播地址或者本机地址执行
{
flag = writeOneCfg((uint)pcdata[3]);
pcdata[0] = 6;
pcdata[2] = 0x81;
if(flag == 1)pcdata[3] = OK;
else {pcdata[3] = 0x10; bFlashError = 1;} //flash error
if(pcdata[1] != 0xff)
{
pcdata[1] = deviceAddr;
wr_crc_resp(); //广播地址不返回
}
}
}
else //cfg_adr命令不正确
{
if(pcdata[1] != 0xff) //广播地址不返回
{
pcdata[0] = 6;
pcdata[1] = deviceAddr;
pcdata[2] = 0x81;
pcdata[3] = 0x16; //reserved configuration
wr_crc_resp();
}
}
}
/******************************************************/
void para1def(void)
{
cfgdata[8] = 0xa800; cfgdata[9] = 0xfc00;
cfgdata[10] = 0x0000; cfgdata[11] = 0x0000;
cfgdata[12] = 0x0000; cfgdata[13] = 0x0000;
cfgdata[14] = 0x0000; cfgdata[15] = 0xC552;
}
void para2def(void)
{
cfgdata[16] = 0x0000; cfgdata[17] = 0x0801;
cfgdata[18] = 0x0800; cfgdata[19] = 0x0064;
cfgdata[20] = 0x0000; cfgdata[21] = 0x0000;
cfgdata[22] = 0x0000; cfgdata[23] = 0xffff;
}
void para3def(void)
{
cfgdata[24] = 0x000a; cfgdata[25] = 0x9000;
cfgdata[26] = 0x0100; cfgdata[27] = 0x0000;
cfgdata[28] = 0x0000; cfgdata[29] = 0x0000;
cfgdata[30] = 0x0000; cfgdata[31] = 0xffff;
}
void para5def(void)
{
cfgdata[40] = 0x0000; cfgdata[41] = 0x0000;
cfgdata[42] = 0x0000; cfgdata[43] = 0x1416;
cfgdata[44] = 0x1000; cfgdata[45] = 0x0000;
cfgdata[46] = 0x0000; cfgdata[47] = 0xffff;
}
void para8def(void)
{
cfgdata[64] = 0x0000; cfgdata[65] = 0x0000;
cfgdata[66] = 0x0000; cfgdata[67] = 0x0003;
cfgdata[68] = 0x0000; cfgdata[69] = 0x0000;
cfgdata[70] = 0x0000; cfgdata[71] = 0xffff;
}
void para10def(void)
{
cfgdata[80] = 0x0400; cfgdata[81] = 0x0000;
cfgdata[82] = 0x0000; cfgdata[83] = 0x0000;
cfgdata[84] = 0x0000; cfgdata[85] = 0x0000;
cfgdata[86] = 0x0000; cfgdata[87] = 0xffff;
}
void para11def(void)
{
cfgdata[88] = 0x2300; cfgdata[89] = 0x0280;
cfgdata[90] = 0x000a; cfgdata[91] = 0x8000;
cfgdata[92] = 0x03e8; cfgdata[93] = 0x0000;
cfgdata[94] = 0x0000; cfgdata[95] = 0xffff;
}
void para12def(void)
{
cfgdata[96] = 0x0200; cfgdata[97] = 0x0063;
cfgdata[98] = 0x0002; cfgdata[99] = 0x0064;
cfgdata[100] = 0x0002; cfgdata[101] = 0x2000;
cfgdata[102] = 0x0100; cfgdata[103] = 0xffff;
}
void para13def(void)
{
cfgdata[104] = 0x0000; cfgdata[105] = 0x0000;
cfgdata[106] = 0x0000; cfgdata[107] = 0x0000;
cfgdata[108] = 0x0000; cfgdata[109] = 0x0000;
cfgdata[110] = 0x0000; cfgdata[111] = 0xffff;
}
/******************************************************/
/***************************************************/
void Wr_Rtc_pro(void)
{
setCalendar();
wr_crc_resp();
}
/***************************************************/
void Rd_Rtc_pro(void)
{
getCalendar();
wr_crc_resp();
}
/***************************************************/
/*************************************/
void Sdefault_Cfg_pro(void)
{
uchar temp;
uint flag=0x55;//reserved configuration
temp = pcdata[3];
if( (temp&0x40) == 0x40 ) // all configuration
{
para1def(); para2def(); para3def(); para5def();
para8def(); para10def(); para11def(); para12def(); para13def();
flag = writeAllCfg( );
if(pcdata[1] != 0xff) //广播地址不返回
{
pcdata[0] = 6;
pcdata[1] = deviceAddr;
pcdata[2] = 0x83;
if(flag == 1)pcdata[3] = OK;
else {pcdata[3] = 0x10;bFlashError = 1;}//flash error
wr_crc_resp();
}
}
else // configuration block specifiedby cfg
{
temp = pcdata[3]&0x3f;
if( (pcdata[1] == 0xff) || (pcdata[1] == deviceAddr) )//广播地址或者本机地址执行
{
switch (temp)
{
case 1:{flag=writeOneDefaultCfg(1); break;}
case 2:{flag=writeOneDefaultCfg(2); break;}
case 3:{flag=writeOneDefaultCfg(3); break;}
case 5:{flag=writeOneDefaultCfg(5); break;}
case 8:{flag=writeOneDefaultCfg(8); break;}
case 10:{flag=writeOneDefaultCfg(10); break;}
case 11:{flag=writeOneDefaultCfg(11); break;}
case 12:{flag=writeOneDefaultCfg(12); break;}
case 13:{flag=writeOneDefaultCfg(13); break;}
default:{break;}
}
if(flag == 0)bFlashError = 1; //write failed,flash error
if(pcdata[1] != 0xff) //广播地址不返回
{
pcdata[0] = 6;
pcdata[1] = deviceAddr;
pcdata[2] = 0x83;
if(flag == 1)pcdata[3] = OK; //write successful
else if(flag == 0)pcdata[3] = 0x10;//write failed,flash error
else if(flag == 0x55)pcdata[3] = 0x16;//reserved configuration
wr_crc_resp();
}
}
}
}
/******************************************************/
void default_pro(void)
{
if( ! ((pcdata[1]==0xff) && (deviceAddr!=0)) ) //只有在广播方式下且地址不等于0时不响应
{
pcdata[0] = 0x06;
pcdata[1] = deviceAddr;
pcdata[3] = NO_CMD;
wr_crc_resp();
}
}
/*************************************/
void host_command_0xb1_return(uint type )
{
uint m;
pcdata[0] = 0x07;
pcdata[1] = deviceAddr;
pcdata[2] = 0xb1;
pcdata[3] = 0x07; //mfr
pcdata[4] = type;
m = ~crc16Calculate(pcdata,5);
pcdata[5] = m&0x00ff;
pcdata[6] = m>>8;
send_resp();
}
/************************************/
void wr_two_blk_pro(void)
{
uchar flags,addr,n_b,db_addr;
uchar i,j,ii,jj;
uchar f_resp;
uchar flag =0;
uchar db_adr_error_flag = 0;
addr = pcdata[1];
flags = pcdata[5]&0x07; //mode
if( (flags==0)||(flags==2) ) //不带uid
{
if(pcdata[6]>32){ flag = 1;}//不能超过32
if((pcdata[6]%2)!= 0){flag = 1;db_adr_error_flag=1;}//且必须为偶数
if(flags==0) { flags = ISOFlagsSys&0xcf;}
else { flags = ISOFlagsSys|0x10;} //select_flag
flags |= 0x40; //option_flag
ISOMode = ISOModeSys | 0x10; //write
viccdata[0] = 15;
viccdata[1] = flags;
viccdata[2] = 0xa2; //write 2 block
viccdata[3] = 0x07; //ti tag
viccdata[4] = pcdata[6]; //db_adr
for(i=0;i<8;i++)
{viccdata[5+i] = pcdata[8+i];} //copy block data
wr_crc_send();
f_resp = sendISOCmd();
CS_RAM_1;
}
else if(flags==1) //带uid
{
if(pcdata[14]>32){ flag = 1;}//不能超过32
if((pcdata[14]%2)!= 0){flag = 1;db_adr_error_flag=1;}//且必须为偶数
flags = ISOFlagsSys;
flags |= 0x20; //address_flag
flags |= 0x40; //option_flag
ISOMode = ISOModeSys | 0x10; //write
viccdata[0] = 23;
viccdata[1] = flags;
viccdata[2] = 0xa2; //write 2 block
viccdata[3] = 0x07; //ti tag
for(ii=4,jj=13;ii<12;ii++,jj--) { viccdata[ii] = pcdata[jj]; }//copy uid
viccdata[12] = pcdata[14];
for(j=0;j<8;j++)
viccdata[13+j] = pcdata[16+j]; //copy block data
wr_crc_send();
f_resp = sendISOCmd();
CS_RAM_1;
}
else { flag = 1;}
if( deviceAddr == pcdata[1] ) //本机执行
{
if(flag == 1) //块号参数超出标签允许值
{
if(db_adr_error_flag == 1)
host_command_0xb1_return(0xa2); //even addr error
else host_command_0xb1_return(0x11);//parameter error
}
else
{
if(f_resp == 0){host_command_0xb1_return(0x01);} // no tag
else if(viccdata[1]!=0)
{
pcdata[0] = 8;
pcdata[1] = deviceAddr;
pcdata[2] = 0xb1;
pcdata[3] = 0x07; //mfr
pcdata[4] = 0x95; //iso err
pcdata[5] = viccdata[2]; //iso err code
wr_crc_resp();
}
else
{
pcdata[0] = 7;
pcdata[1] = deviceAddr;
pcdata[2] = 0xb1;
pcdata[3] = 0x07; //mfr
pcdata[4] = OK; //OK
wr_crc_resp();
}
}
}
}
void lock_two_blk_pro(void)
{
uchar flags,addr,n_b,db_addr;
uchar i,j,ii,jj;
uchar f_resp;
uchar flag =0;
uchar db_adr_error_flag = 0;
addr = pcdata[1];
flags = pcdata[5]&0x07; //mode
if( (flags==0)||(flags==2) ) //不带uid
{
if(pcdata[6]>32){ flag = 1;}//不能超过32
if((pcdata[6]%2)!= 0){flag = 1;db_adr_error_flag=1;}//且必须为偶数
if(flags==0) { flags = ISOFlagsSys&0xcf;}
else { flags = ISOFlagsSys|0x10;} //select_flag
flags |= 0x40; //option_flag
ISOMode = ISOModeSys | 0x10; //write
viccdata[0] = 7;
viccdata[1] = flags;
viccdata[2] = 0xa3; //lock 2 block
viccdata[3] = 0x07; //ti tag
viccdata[4] = pcdata[6]; //db_adr
wr_crc_send();
f_resp = sendISOCmd();
CS_RAM_1;
}
else if(flags==1) //带uid
{
if(pcdata[14]>32){ flag = 1;}//不能超过32
if((pcdata[14]%2)!= 0){flag = 1;db_adr_error_flag=1;}//且必须为偶数
flags = ISOFlagsSys;
flags |= 0x20; //address_flag
flags |= 0x40; //option_flag
ISOMode = ISOModeSys | 0x10; //write
viccdata[0] = 15;
viccdata[1] = flags;
viccdata[2] = 0xa3; //lock 2 block
viccdata[3] = 0x07; //ti tag
for(ii=4,jj=13;ii<12;ii++,jj--) { viccdata[ii] = pcdata[jj]; }//copy uid
viccdata[12] = pcdata[14];
wr_crc_send();
f_resp = sendISOCmd();
CS_RAM_1;
}
else { flag = 1;}
if( deviceAddr == pcdata[1] ) //本机执行
{
if(flag == 1) //块号参数超出标签允许值
{
if(db_adr_error_flag == 1)
host_command_0xb1_return(0xa2); //even addr error
else host_command_0xb1_return(0x11);//parameter error
}
else
{
if(f_resp == 0){host_command_0xb1_return(0x01);} // no tag
else if(viccdata[1]!=0)
{
pcdata[0] = 8;
pcdata[1] = deviceAddr;
pcdata[2] = 0xb1;
pcdata[3] = 0x07; //mfr
pcdata[4] = 0x95; //iso err
pcdata[5] = viccdata[2]; //iso err code
wr_crc_resp();
}
else
{
pcdata[0] = 7;
pcdata[1] = deviceAddr;
pcdata[2] = 0xb1;
pcdata[3] = 0x07; //mfr
pcdata[4] = OK; //OK
wr_crc_resp();
}
}
}
}
void readIsoModeFalg()
{
if(pcdata[1] == deviceAddr)
{
pcdata[0] = 8;
pcdata[1] = deviceAddr;
pcdata[2] = 0x88;
pcdata[3] = OK;
pcdata[4] = ISOModeSys;
pcdata[5] = ISOFlagsSys;
wr_crc_resp();
}
}
void testExternRam()
{
uint i;
if(pcdata[1] == deviceAddr)
{
CS_RAM_0;
for(i=0;i<20;i++)
{
feedWatchDog();
*((uint *)(0xc000+i)) = i;
}
CS_RAM_1;
pcdata[0] = 26;
pcdata[1] = deviceAddr;
pcdata[2] = 0xaa;
pcdata[3] = OK;
CS_RAM_0;
for(i=0;i<20;i++)
{
feedWatchDog();
pcdata[4+i] = *((uint *)(0xc000+i));
}
CS_RAM_1;
wr_crc_resp();
}
}
void ISO15693cmd_cust_pro(void)
{
swit
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -