📄 rc500.c
字号:
return M500PcdLoadKeyE2(0x60,bank/4,password);
}
/****************************************************************************
* 名 称:SelectTag
* 功 能:选技卡
* 入口参数:snr 卡序列号
返回值
* 出口参数:0正常,其它错误码
****************************************************************************/
char SelectTag(unsigned char *snr, unsigned char *sak)
{
char status;
snr=snr;
status=M500PiccCascSelect(snr,sak);
return status;
}
/****************************************************************************
* 名 称:CascAnticoll
* 功 能:防碰撞
* 入口参数:bcnt 0
snr 卡序列号
* 出口参数:0正常,其它错误码
****************************************************************************/
char CascAnticoll(unsigned char bcnt,unsigned char *snr)
{
unsigned char status;
status=M500PiccCascAnticoll(bcnt,snr);
memcpy((void *)MLastSelectedSnr,(void *)snr,4);
return status;
}
/****************************************************************************
* 名 称:M500PiccRead
* 功 能:读卡实体函数
* 入口参数:_data 卡数据
addr 块号
* 出口参数:0正常,其它错误码
****************************************************************************/
char M500PiccRead(unsigned char addr,unsigned char *_data)
{
char status = MI_OK;
FlushFIFO();
M500PcdSetTmo(1);
WriteIO(RegChannelRedundancy,0x0F);
ResetInfo(MInfo);
SerBuffer[0] = PICC_READ;
SerBuffer[1] = addr;
MInfo.nBytesToSend = 2;
// MpIsrInfo
status = M500PcdCmd(PCD_TRANSCEIVE,(unsigned char *)SerBuffer,(MfCmdInfo *)&MInfo);
if (status != MI_OK)
{
if (status != MI_NOTAGERR )
{
if (MInfo.nBitsReceived == 4)
{
SerBuffer[0] &= 0x0f;
if ((SerBuffer[0] & 0x0a) == 0)
{
status = MI_NOTAUTHERR;
}
else
{
status = MI_CODEERR;
}
}
}
memcpy(_data,"0000000000000000",16);
}
else // Response Processing
{
if (MInfo.nBytesReceived != 16)
{
status = MI_BYTECOUNTERR;
memcpy(_data,"0000000000000000",16);
}
else
{
memcpy(_data,(void *)SerBuffer,16);
}
}
M500PcdSetTmo(1);
return status;
}
/****************************************************************************
* 名 称:M500PiccWrite
* 功 能:写卡实体函数
* 入口参数:ReadData 卡数据
bank 块号
* 出口参数:0正常,其它错误码
****************************************************************************/
char M500PiccWrite( unsigned char addr,unsigned char *_data)
{
char status = MI_OK;
ResetInfo(MInfo);
SerBuffer[0] = PICC_WRITE;
SerBuffer[1] = addr;
MInfo.nBytesToSend = 2;
status = M500PcdCmd(PCD_TRANSCEIVE,(unsigned char *)SerBuffer,(MfCmdInfo *)&MInfo);
if (status != MI_NOTAGERR)
{
if (MInfo.nBitsReceived != 4)
{
status = MI_BITCOUNTERR;
}
else
{
SerBuffer[0] &= 0x0f;
if ((SerBuffer[0] & 0x0a) == 0)
{
status = MI_NOTAUTHERR;
}
else
{
if (SerBuffer[0] == 0x0a)
{
status = MI_OK;
}
else
{
status = MI_CODEERR;
}
}
}
}
if ( status == MI_OK)
{
M500PcdSetTmo(3);
ResetInfo(MInfo);
memcpy((unsigned char *)SerBuffer,_data,16);
MInfo.nBytesToSend = 16;
status = M500PcdCmd(PCD_TRANSCEIVE,(unsigned char *)SerBuffer,(MfCmdInfo *)&MInfo);
if (status & 0x80)
{
status = MI_NOTAGERR;
}
else
{
if (MInfo.nBitsReceived != 4)
{
status = MI_BITCOUNTERR;
}
else
{
SerBuffer[0] &= 0x0f;
if ((SerBuffer[0] & 0x0a) == 0)
{
status = MI_WRITEERR;
}
else
{
if (SerBuffer[0] == 0x0a)
{
status = MI_OK;
}
else
{
status = MI_CODEERR;
}
}
}
}
M500PcdSetTmo(1);
}
return status;
}
/****************************************************************************
* 名 称:ReadCard
* 功 能:读卡
* 入口参数:ReadData 卡数据
bank 块号
* 出口参数:0正常,其它错误码
****************************************************************************/
unsigned char ReadCard( unsigned char *ReadData,unsigned char bank)
{
return M500PiccRead(bank,ReadData);
}
/****************************************************************************
* 名 称:WriteCard
* 功 能:写卡
* 入口参数:WriteData 卡数据
bank 块号
* 出口参数:0正常,其它错误码
****************************************************************************/
unsigned char WriteCard(unsigned char *WriteData,unsigned char bank)
{
return M500PiccWrite(bank,WriteData);
}
/****************************************************************************
* 名 称:fine
* 功 能:寻卡
* 入口参数:req_code 寻卡指令 request code ALL = 0x52 or IDLE = 0x26
agq 返回卡类型
* 出口参数:0正常,其它错误码
****************************************************************************/
char fine(unsigned char req_code,unsigned char *atq)
{
unsigned char status;
status=M500PiccCommonRequest(req_code,atq);
if(status!=0)
{
status=M500PiccCommonRequest(req_code,atq);
if(status!=0)
{
}
}
return status;
}
/****************************************************************************
* 名 称:M500PiccHalt
* 功 能:终止卡的操作
* 入口参数:无
* 出口参数:0正常,其它错误码
****************************************************************************/
char M500PiccHalt(void)
{
char status = MI_CODEERR;
// ************* Cmd Sequence **********************************
ResetInfo(MInfo);
SerBuffer[0] = PICC_HALT ; // Halt command code
SerBuffer[1] = 0x00; // dummy address
MInfo.nBytesToSend = 2;
status = M500PcdCmd(PCD_TRANSCEIVE,(unsigned char *)SerBuffer,(MfCmdInfo *)&MInfo);
if (status)
{
// timeout error ==> no NAK received ==> OK
if (status == MI_NOTAGERR || status == MI_ACCESSTIMEOUT)
{
status = MI_OK;
}
}
//reset command register - no response from tag
WriteIO(RegCommand,PCD_IDLE);
return status;
}
/****************************************************************************
* 名 称:Fine_Card
* 功 能:寻卡,碰撞,选卡
* 入口参数:CardSN 卡序列号
cardtype 返回卡类型
* 出口参数:0正常
0x10,无卡,
0x11,碰撞失败
0x12,选卡失败
****************************************************************************/
unsigned char Fine_Card(unsigned char *CardSN,unsigned char *cardtype)
{
unsigned char dat[4],sak[4];
if(fine(0x26,dat)==0)
{
*cardtype = dat[0];
if(CascAnticoll(0,dat)==0)
{
CardSN[0]=dat[0];
CardSN[1]=dat[1];
CardSN[2]=dat[2];
CardSN[3]=dat[3];
if(SelectTag(dat,sak)==0)
{
return 0;
}
else return 0x12;
}
else return 0x11;
}
else return 0x10;
}
/****************************************************************************
* 名 称:PiccCMD14443_4
* 功 能:14443-4指令的发送与接收
* 入口参数:senddata 发送的数据
readdata 接收的数据
sendlen 发送的字节数
readlen 接收到的字节数
* 出口参数:0正常,,其它错误码
****************************************************************************/
char PiccCMD14443_4(unsigned char *senddata,unsigned char *readdata,unsigned char sendlen,unsigned char *readlen)
{
char status = MI_OK;
FlushFIFO();
M500PcdSetTmo(106);
WriteIO(RegChannelRedundancy,0x0F);
ResetInfo(MInfo);
memcpy((void *)SerBuffer,senddata,sendlen);
MInfo.nBytesToSend = sendlen;
status = M500PcdCmd(PCD_TRANSCEIVE,(unsigned char *)SerBuffer,(MfCmdInfo *)&MInfo);
if (status != MI_OK)
{
if (status != MI_NOTAGERR ) //
{
if (MInfo.nBitsReceived == 4)
{
SerBuffer[0] &= 0x0f;
if ((SerBuffer[0] & 0x0a) == 0)
{
status = MI_NOTAUTHERR;
}
else
{
status = MI_CODEERR;
}
}
}
//memcpy(_data,r_data,16); //超时
*readlen = 0;
}
else // Response Processing
{
*readlen=MInfo.nBytesReceived;
memcpy(readdata,(void *)SerBuffer,*readlen);
}
M500PcdSetTmo(1);
return status;
}
/****************************************************************************
* 名 称:Select_3f02()
* 功 能:外部中断EINT3服务函数,取反B1控制口。
* 入口参数:指令执行状态
* 出口参数:0正常,,其它错误码
****************************************************************************/
unsigned char Select_3f02(unsigned char *p)
{
unsigned char cmd[]={0x0a,0x00,0x00,0xa4,0x00,0x00,0x02,0x3f,0x02};
unsigned char len;
unsigned short st;
if(PiccCMD14443_4(cmd,p,9,&len)==0)
{
st = p[len-2]*0x100+p[len-1];
if(st==0x9000)
{
memcpy(p,&p[0],len);
return 0;
}
else
{
return 2;
}
}
return 1;
}
/****************************************************************************
* 名 称:read_ls()
* 功 能:读历吏字节。
* 入口参数:olddata 历吏字节
* 出口参数:0正常,,其它错误码
****************************************************************************/
unsigned char read_ls(unsigned char *olddata)//ratq读历吏07 77 F7 80 02 47 65
{
unsigned char b[4];
unsigned char len;
unsigned char bak;
b[0]=0xe0;
b[1]=0x50;
bak = PiccCMD14443_4(b,olddata,2,&len);
return bak;
}
/****************************************************************************
* 名 称:GetCardSN()
* 功 能:取卡序列号* 入口参数:SN 卡序列号
* 出口参数:0正常,,其它错误码
****************************************************************************/
unsigned char GetCardSN(unsigned char *SN)
{
unsigned char cmd[]={0x0b,0x00,0x00,0xb0,0x95,0x00,0x1c};//0a,0a
unsigned char buff[32];
unsigned char bak,i,len;
unsigned short st;
bak = PiccCMD14443_4(cmd,buff,7,&len);
if(bak==0)
{
st = buff[len-2]*0x100+buff[len-1];
if(st==0x9000)
{
memcpy(SN,&buff[14],8);
memcpy(&SN[24],&buff[22],8);
memcpy(&SN[8],&buff[2],2);
for( i = 2 ; i < 8 ; i++ )
{
SN[8+i] = 0xff;
}
SN[16]=buff[4];
SN[17]=buff[5]|0x0f;
for( i = 2 ; i < 8 ; i++ )
{
SN[16+i] = 0xff;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -