📄 protocol.c.bak
字号:
pcdata[5] = viccdata[3];
pcdata[6] = viccdata[4];
pcdata[7] = viccdata[5];
}
wr_crc_resp();
}
else //标签执行指令ISO错误
{
resp_iso_err();
}
}
}
}
}
/***************************************************/
void wr_sgl_blk_pro(void) //Write Single Block
{
uchar flags,addr;
uchar i,j;
uchar flag =0;
addr = pcdata[1];
flags = pcdata[4]&0x07;
if( (flags==0)||(flags==2) )
{
if(flags==0) { flags = ISOFlagsSys&0xcf;}
else { flags = ISOFlagsSys|0x10;} //select_flag
flags |= 0x40; //option_flag
if(pcdata[5] >64) { flag = 1;}
else
{
viccdata[0] = 10;
viccdata[1] = flags;
viccdata[2] = 0x21;
viccdata[3] = pcdata[5] ;
viccdata[4] = pcdata[7];
viccdata[5] = pcdata[8];
viccdata[6] = pcdata[9];
viccdata[7] = pcdata[10];
wr_crc_send();
}
}
else if(flags==1)
{
flags = ISOFlagsSys|0x20; //address_flag
flags |= 0x40; //option_flag
if(pcdata[13] >64) { flag = 1;}
else
{
viccdata[0] = 18;
viccdata[1] = flags;
viccdata[2] = 0x21;
for(i=3,j=12;i<11;i++,j--) { viccdata[i]= pcdata[j]; }
viccdata[11] = pcdata[13] ;
viccdata[12] = pcdata[15];
viccdata[13] = pcdata[16];
viccdata[14] = pcdata[17];
viccdata[15] = pcdata[18];
wr_crc_send();
}
}
else { flag = 1;}//mode error
if(flag == 1) //块号参数超出标签允许值
{
if( deviceAddr == pcdata[1] ) //本机响应
{
resp_para_err();
}
}
else
{
ISOMode = ISOModeSys | 0x10; //write
i = sendISOCmd();
CS_RAM_1;
if( deviceAddr == pcdata[1] ) //本机响应
{
if(i==0)
{
resp_no_trns();
}
else
{
if(viccdata[1] == 0)
{
pcdata[0] = 6;
pcdata[1] = deviceAddr;
pcdata[2] = ISO_MANDATORY_CMD;
pcdata[3] = OK;
wr_crc_resp();
}
else
{
resp_iso_err();
}
}
}
}
}
/***************************************************/
void lock_mul_blk_pro(void)
{
uchar flags,addr,n_b;
uchar i,j,l;
uchar flag = 0;
addr = pcdata[1];
flags = pcdata[4]&0x07;
if( (flags==0)||(flags==2) ) //不带uid
{
if(flags==0) { flags = ISOFlagsSys&0xcf;}
else { flags = ISOFlagsSys|0x10;} //select_flag
flags |= 0x40; //option_flag
n_b = pcdata[6] ; //db_n
if(pcdata[5] >63) { flag = 1;} //db_adr ,首地址不能超过63
if(n_b > 32) { flag = 1;} //一次锁定的块数不能超过32
if(flag == 0)
{
ISOMode = ISOModeSys | 0x10; // write
for(l=0;l<(n_b+1);l++)
{
viccdata[0] = 6;
viccdata[1] = flags;
viccdata[2] = 0x22;
viccdata[3] = pcdata[5];
wr_crc_send();
j = sendISOCmd();
CS_RAM_1;
if((j==0)||(viccdata[1]!=0)) {break;} //跳出循环并返回错误地址
else { pcdata[5] ++ ; }
mutiBlockWrDelay();
}
if( deviceAddr == pcdata[1] ) //本机地址返回
{
if(j==0) //无返
{
pcdata[0] = 7;
pcdata[1] = deviceAddr;
pcdata[2] = 0xb0;
pcdata[3] = 0x03; //no response
pcdata[4] = pcdata[5];
wr_crc_resp();
}
else if(viccdata[1]!=0)
{
pcdata[0] = 8;
pcdata[1] = deviceAddr;
pcdata[2] = ISO_MANDATORY_CMD;
pcdata[3] = ISO_ERR; //iso err 0x95
pcdata[4] = viccdata[2]; //iso err code
pcdata[5] = pcdata[5]; //err block addr
wr_crc_resp();
}
else
{
pcdata[0] = 6;
pcdata[1] = deviceAddr;
pcdata[2] = ISO_MANDATORY_CMD;
pcdata[3] = OK; // OK
wr_crc_resp();
}
}
}
else
{
if( deviceAddr == pcdata[1]) ////本机地址返回 块数和地址错误
resp_para_err();
}
}
else if(flags==1) //带uid模式
{
n_b = pcdata[14]; //块长度
flags = ISOFlagsSys|0x20; // address_flag
flags |= 0x40; // option_flag
if(pcdata[13] >63) { flag = 1;} //首地址不能超过63
if(n_b >32) { flag = 1; } //一次锁定的块数不能超过32
if(flag == 0)
{
for(l=0;l<(n_b+1);l++)
{
viccdata[0] = 14;
viccdata[1] = flags;
viccdata[2] = 0x22;
ISOMode = ISOModeSys | 0x10; // write
for(i=3,j=12;i<11;i++,j--) { viccdata[i] = pcdata[j];}
viccdata[11] = pcdata[13]; //block number
wr_crc_send();
j = sendISOCmd();
CS_RAM_1;
if((j==0)||(viccdata[1]!=0)) {break;} //跳出循环并返回错误地址/
else { pcdata[13] ++ ; }
}
if( deviceAddr == pcdata[1] ) //本机执行返回
{
if(j==0) //无返
{
pcdata[0] = 7;
pcdata[1] = deviceAddr;
pcdata[2] = ISO_MANDATORY_CMD;
pcdata[3] = 0x03; //no response
pcdata[4] = pcdata[13];
wr_crc_resp();
}
else if(viccdata[1]!=0)
{
pcdata[0] = 8;
pcdata[1] = deviceAddr;
pcdata[2] = ISO_MANDATORY_CMD;
pcdata[3] = ISO_ERR; //iso err
pcdata[4] = viccdata[2]; //iso err code
pcdata[5] = pcdata[13]; //err block addr
wr_crc_resp();
}
else
{
pcdata[0] = 6;
pcdata[1] = deviceAddr;
pcdata[2] = ISO_MANDATORY_CMD;
pcdata[3] = OK; // OK
wr_crc_resp();
}
}
}
else
{
if( deviceAddr == pcdata[1] ) //块数和地址错误
resp_para_err();
}
}
else //mode错误
{
if( deviceAddr == pcdata[1] )
resp_para_err();
}
}
/***************************************************/
void rd_mul_blk_pro(void)
{
uchar flags,len,n_b,addr;
uchar i,j,k;
uchar flag = 0;
addr = pcdata[1];
flags = pcdata[4]&0x07;
if( (flags==0)||(flags==2) ) //不带uid
{
if(pcdata[5] >63) { flag = 1;} // 块地址不超过64
if(pcdata[6] >32) { flag = 1;} // 最多一次读取32个块
if(flag == 0)
{
n_b = pcdata[6]; //块长度
if(flags==0) { flags = ISOFlagsSys&0xcf;}
else { flags = ISOFlagsSys|0x10;} //select_flag
if((ISOModeSys & 0x04) == 0x04) { flags |= 0x40; } //option_flag
viccdata[0] = 7;
viccdata[1] = flags;
viccdata[2] = Rd_multiB_cmd;
viccdata[3] = pcdata[5];
viccdata[4] = pcdata[6];
}
}
else if(flags==1) //带uid
{
if(pcdata[13] >63) { flag = 1;} // 块地址不超过64
if(pcdata[14] >32) { flag = 1;} // 最多一次读取32个块
if(flag == 0)
{
n_b = pcdata[14];
flags = ISOFlagsSys | 0x20; //address_flag
if((ISOModeSys & 0x04) == 0x04) { flags |= 0x40; }// option_flag,TI卡为1才能操作
viccdata[0] = 15;
viccdata[1] = flags;
viccdata[2] = Rd_multiB_cmd;
for(i=3,j=12;i<11;i++,j--) {viccdata[i] = pcdata[j];}
viccdata[11] = pcdata[13];
viccdata[12] = pcdata[14];
}
}
else { flag = 1;} //mode error
if( deviceAddr == pcdata[1] ) //本机执行返回
{
if(flag ==1) { resp_para_err(); }
else
{
wr_crc_send();
ISOMode = ISOModeSys;
i = sendISOCmd();
CS_RAM_1;
if(i==0) { resp_no_trns(); }
else
{
if(viccdata[1] ==0)
{
if((ISOModeSys & 0x04) == 0x04) //含有块状态信息
{
pcdata[0]=6+(n_b+1)*5+2;
pcdata[1]=deviceAddr;
pcdata[2]=ISO_MANDATORY_CMD;
pcdata[3]=OK;
if( (pcdata[4]&0x07) == 0x01)pcdata[4]=pcdata[14];//uid
else pcdata[4]=pcdata[6]; // no uid
pcdata[5]=0x04;
for(i=0;i<(n_b+1)*5;i++)
pcdata[6+i] = viccdata[2+i];//读取db_n+1块,
}
else //不含有块状态信息
{
pcdata[0]=6+(n_b+1)*4+2;
pcdata[1]=deviceAddr;
pcdata[2]=ISO_MANDATORY_CMD;
pcdata[3]=OK;
if( (pcdata[4]&0x07) == 0x01)pcdata[4]=pcdata[14];//uid
else pcdata[4]=pcdata[6]; // no uid
pcdata[5]=0x04;
for(i=0;i<(n_b+1)*4;i++)
pcdata[6+i] = viccdata[2+i];//读取db_n+1块,
}
wr_crc_resp();
}
else
resp_iso_err();
}
}
}
}
/***************************************************/
void wr_mul_blk_pro(void)
{
uchar flags,addr,n_b,db_addr;
uchar i,j,ii,jj;
uchar f_resp;
uchar flag =0;
addr = pcdata[1];
flags = pcdata[4]&0x07; //mode
if( (flags==0)||(flags==2) ) //不带uid
{
if(pcdata[5] >63) { flag = 1;}
if(pcdata[6] >32) { flag = 1;}
if(flag == 0)
{
db_addr = pcdata[5];
n_b = pcdata[6];
if(flags==0) { flags = ISOFlagsSys&0xcf;}
else { flags = ISOFlagsSys|0x10;} //select_flag
flags |= 0x40; //option_flag
for(i=0;i<(n_b+1);i++)
{
viccdata[0] = 10;
viccdata[1] = flags;
viccdata[2] = 0x21;
viccdata[3] = db_addr;
for(j=0;j<4;j++)
viccdata[4+j] = pcdata[8+4*i+j]; //copy block data
wr_crc_send();
ISOMode = ISOModeSys | 0x10; //write
f_resp = sendISOCmd();
CS_RAM_1;
if((f_resp==0)||(viccdata[1]!=0)){ break;}
else { db_addr ++; }
mutiBlockWrDelay();
feedWatchDog();
}
}
}
else if(flags==1) //带uid
{
if(pcdata[13] >63) { flag = 1;}
if(pcdata[14] >32) { flag = 1;} //040311
db_addr = pcdata[13];
n_b = pcdata[14];
flags = ISOFlagsSys|0x20; // address_flag
flags |= 0x40; //option_flag
ISOMode = ISOModeSys | 0x10; //write
for(i=0;i<(n_b+1);i++)
{
viccdata[0] = 18;
viccdata[1] = flags;
viccdata[2] = 0x21; //write a single block
for(ii=3,jj=12;ii<11;ii++,jj--) { viccdata[ii] = pcdata[jj]; }//copy uid
viccdata[11] = db_addr;
for(j=0;j<4;j++)
{
viccdata[12+j] = pcdata[16+4*i+j]; //copy block data
}
wr_crc_send();
ISOMode = ISOModeSys | 0x10; //write
f_resp = sendISOCmd();
CS_RAM_1;
db_addr ++;
if((f_resp==0)||(viccdata[1]!=0)){ break;}
mutiBlockWrDelay();
feedWatchDog();
}
}
else { flag = 1;}
if( deviceAddr == pcdata[1] ) //本机执行
{
if(flag == 1) //块号参数超出标签允许值
resp_para_err();
else
{
if(f_resp==0) //无返
{
pcdata[0] = 7;
pcdata[1] = deviceAddr;
pcdata[2] = ISO_MANDATORY_CMD;
pcdata[3] = 0x03; //no response
pcdata[4] = db_addr;
wr_crc_resp();
}
else if(viccdata[1]!=0)
{
pcdata[0] = 8;
pcdata[1] = deviceAddr;
pcdata[2] = ISO_MANDATORY_CMD;
pcdata[3] = ISO_ERR; //iso err
pcdata[4] = viccdata[2]; //iso err code
pcdata[5] = db_addr; //err block addr
wr_crc_resp();
}
else
{
pcdata[0] = 6;
pcdata[1] = deviceAddr;
pcdata[2] = ISO_MANDATORY_CMD;
pcdata[3] = OK; //OK
wr_crc_resp();
}
}
}
}
/***************************************************/
void sel_tag_pro(void)
{
uchar flags,addr;
uchar i,j;
addr = pcdata[1];
flags = pcdata[4]&0x07;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -