📄 1507op1104_avr.c
字号:
SendLPT(BCNR,0x10);//接收bit数
SendLPT(TOC,0x0a);//超时计数器,超时长度=151us*TOC
SendLPT(DATAREG,0x26);//寻卡指令
status = DVStatus();//等待dv弹起
SendLPT(TOC,0x00);//停止toc
if(status & TE_1507) return TE_1507;//超时
if(status & BE_1507) return BE_1507;//数据长度
outbuf[0] = RcvLPT(DATAREG);
outbuf[1] = RcvLPT(DATAREG);
return OK;
}
/******************************************/
//函数:Wupa_04
//说明:卡片唤醒指令,返回2字节寻卡返回值
/******************************************/
uchar Wupa_04(uchar *outbuf)
{
uchar status;
SendLPT(GAINCTR,0x07);//接收增益
SendLPT(TRANS0L,0x00);//设为100%调制模式
SendLPT(TRANS0H,0x00);
SendLPT(TRANS1L,0xff);
SendLPT(TRANS1H,0xff);
SendLPT(RFSEL,0x0);//使能数字和模拟部分
SendLPT(BAUDRAT,0x0e);//设置速率106kbps
SendLPT(MODE,0xc1);//设置nPause宽度
SendLPT(RCODE,0x03);//设置解码
SendLPT(STACON,0x8c);//复位CDM,选择TYPEA模式
SendLPT(STACON,0x0c);
Delay_1ms(1);
SendLPT(ENABLE,0xc1);//复位各错误标识
SendLPT(BCNS,0x07);//发送bit数
SendLPT(BCNR,0x10);//接收bit数
SendLPT(TOC,0x0a);//超时计数器,超时长度=151us*TOC
SendLPT(DATAREG,0x52);//卡片唤醒指令
status = DVStatus();//等待dv弹起
SendLPT(TOC,0x00);//停止toc
if(status & TE_1507) return TE_1507;//超时
if(status & BE_1507) return BE_1507;//数据长度
outbuf[0] = RcvLPT(DATAREG);
outbuf[1] = RcvLPT(DATAREG);
return OK;
}
/******************************************/
//函数:Antcollision_04
//说明:抗冲突指令,返回4字节卡号及1字节XOR
/******************************************/
uchar Antcollision_04(uchar *outbuf)
{
uchar status,xor,i;
SendLPT(STACON,0x8c);//复位CDM,选择TYPEA模式,
SendLPT(STACON,0x0d);//打开抗冲突
SendLPT(ENABLE,0xc1);//复位各错误标识
SendLPT(BCNS,0x10);//发送bit数
SendLPT(TOC,0x0a);//超时计数器,超时长度=151us*TOC
SendLPT(DATAREG,0x93);//抗冲突指令
SendLPT(DATAREG,0x20);
status = DVStatus();//等待dv弹起
SendLPT(TOC,0x00);//停止toc
SendLPT(STACON,0x0c);//关闭抗冲突
if(status & TE_1507) return TE_1507;//超时
if(status & BE_1507) return BE_1507;//数据长度
for(i=0,xor=0;i<5;i++){
outbuf[i] = RcvLPT(DATAREG);
xor ^= outbuf[i];
}
if(xor) return XE_1507;
return OK;
}
/******************************************/
//函数:SelectCard_04
//说明:选卡指令,sn为卡号及xor,返回1字节SAK
/******************************************/
uchar SelectCard_04(uchar *sn, uchar *outbuf)
{
uchar status;
SendLPT(STACON,0x8c);//复位CDM
SendLPT(STACON,0x0d);//打开抗冲突
SendLPT(ENABLE,0xf1);//复位各错误标识,打开crc校验
SendLPT(BCNS,0x38);//发送bit数
SendLPT(BCNR,0x08);//接收bit数
SendLPT(TOC,0x0a);//超时计数器,超时长度=151us*TOC
SendLPT(DATAREG,0x93);//选卡指令
SendLPT(DATAREG,0x70);
SendLPT(DATAREG,sn[0]);
SendLPT(DATAREG,sn[1]);
SendLPT(DATAREG,sn[2]);
SendLPT(DATAREG,sn[3]);
SendLPT(DATAREG,sn[4]);
status = DVStatus();//等待dv弹起
SendLPT(TOC,0x00);//停止toc
SendLPT(STACON,0x0c);//关闭抗冲突
if(status & TE_1507) return TE_1507;//超时
if(status & BE_1507) return BE_1507;//数据长度错误
if(status & CE_1507) return CE_1507;//CRC错误
outbuf[0] = RcvLPT(DATAREG);
return OK;
}
/******************************************/
//函数:LoadKey_04
//说明:加载密钥指令
//参数:keytype:0指定keyA,1指定keyB
// key:6字节密钥
/******************************************/
uchar LoadKey_04(uchar keytype,uchar *key)
{
uchar i,temp;
if(keytype) keytype = 0x01;//保证keytype的值仅为0/1
SendLPT(KEYSTAC,0x40);//以SHC1101方式加载密钥
SendLPT(KEYADR,(keytype<<6));//设定密钥加载地址
for(i=0;i<6;i++){
memcpy_P(&temp,TransKey1507,6);
SendLPT(KEYDATA,temp);//加载SHC1507传输密钥
}
for(i=0;i<6;i++) SendLPT(KEYDATA,key[i]);//加载卡密钥
if( RcvLPT(STACON) & AE_1507 ) return AE_1507;//认证错
return OK;
}
/******************************************/
//函数:Authen_04
//说明:认证指令
//参数:keytype:0指定keyA,1指定keyB
// blknum:被认证块号
/******************************************/
uchar Authen_04(uchar keytype,uchar blknum)
{
uchar status;
if(keytype) keytype = 0x01;//保证keytype仅为0/1
SendLPT(STACON,0x8c);//复位CDM
SendLPT(STACON,0x0c);
SendLPT(ENABLE,0xf1);//复位各错误标识,打开crc校验
SendLPT(KEYSTAC,0xc0);//以SHC1101方式加载密钥
SendLPT(KEYADR,(keytype<<6));//取卡密钥
SendLPT(BCNS,0x10);//发送bit数
SendLPT(BCNR,0x08);//接收bit数
SendLPT(TOC,0x30);//超时计数器,超时长度=151us*TOC
SendLPT(DATAREG,0x60|keytype);//认证指令
SendLPT(DATAREG,blknum);//块地址
status = DVStatus();//等待dv弹起
SendLPT(TOC,0x00);//停止toc
if(status & TE_1507) return TE_1507;//超时
if(status & BE_1507) return BE_1507;//数据长度错误
if(status & AE_1507) return AE_1507;//认证错误
if(status & PE_1507) return PE_1507;//奇偶校验错误
return OK;
}
/******************************************/
//函数:Read_04
//说明:读卡指令
//参数:blknum:块号
// outbuf:保存16字节返回值
/******************************************/
uchar Read_04(uchar blknum, uchar *outbuf)
{
uchar i,status;
SendLPT(BCNS,0x10);//发送bit数
SendLPT(BCNR,0x80);//接收bit数
SendLPT(TOC,0x30);//超时计数器,超时长度=151us*TOC
SendLPT(DATAREG,0x30);//读卡指令
SendLPT(DATAREG,blknum);//块地址
status = DVStatus();//等待dv弹起
SendLPT(TOC,0x00);//停止toc
if(status & TE_1507) return TE_1507;//超时
if(status & BE_1507) return BE_1507;//数据长度错误
if(status & CE_1507) return CE_1507;//认证错误
if(status & PE_1507) return PE_1507;//奇偶校验错误
for(i=0;i<0x10;i++) outbuf[i] = RcvLPT(DATAREG);
return OK;
}
/******************************************/
//函数:Write_04
//说明:写卡指令
//参数:blknum:块号
/******************************************/
uchar Write_04(uchar blknum, uchar *inbuf)
{
uchar i,status;
SendLPT(BCNS,0x10);//发送bit数
SendLPT(BCNR,0x04);//接收bit数
SendLPT(TOC,0x1f);//超时计数器,超时长度=151us*TOC
SendLPT(DATAREG,0xa0);//写卡指令
SendLPT(DATAREG,blknum);//块地址
status = DVStatus();//等待dv弹起
SendLPT(TOC,0x00);//停止toc
if(status & TE_1507) return TE_1507;//超时
if(status & BE_1507) return BE_1507;//数据长度错误
if( (RcvLPT(DATAREG)|0x0f) != 0x0a ) return RE_1507;
//-------------//
SendLPT(BCNS,0x80);//发送bit数
SendLPT(BCNR,0x04);//接收bit数
SendLPT(TOC,0x5f);//超时计数器,超时长度=151us*TOC
for(i=0;i<0x10;i++) SendLPT(DATAREG,inbuf[i]);//写数据
status = DVStatus();//等待dv弹起
SendLPT(TOC,0x00);//停止toc
if(status & TE_1507) return TE_1507;//超时
if(status & BE_1507) return BE_1507;//数据长度错误
if( (RcvLPT(DATAREG)|0x0f) != 0x0a ) return RE_1507;
return OK;
}
/******************************************/
//函数:Halt_04
//说明:停卡指令
/******************************************/
uchar Halt_04(void)
{
uchar status;
SendLPT(BCNS,0x10);//发送bit数
SendLPT(BCNR,0x04);//接收bit数
SendLPT(TOC,0x0a);//超时计数器,超时长度=151us*TOC
SendLPT(DATAREG,0x50);//停卡指令
SendLPT(DATAREG,0x00);
status = DVStatus();//等待dv弹起
SendLPT(TOC,0x00);//停止toc
if(status & TE_1507) return OK;//卡片无返回,指令成功
return RE_1507;//返回错误
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -