📄 m500auc.c
字号:
if (ReadIO(RegSecondaryStatus) & 0x07)
{
status = MI_BITCOUNTERR; /* 认证不成功,置比特计数标志 */
}
else
{
ResetInfo(MInfo);
MInfo.nBytesToSend = 0;
/* 上面为认证命令2的入口参数:相关流动信息,要发送的字节数 */
if ((status = M500PcdCmd(PCD_AUTHENT2,
SerBuffer,
&MInfo)) == MI_OK)
{
if ( ReadIO(RegControl) & 0x08 )
{
status = MI_OK; /* 认证成功,RC500会自动置CRYTON=1 */
}
else
{
status = MI_AUTHERR; /* 认证不成功,置认证错标志 */
}
}
}
}
}
return status; /* 返回状态值 */
}
////////////////////////////////////////////////////////////////
// Read the mifare card
/* 读卡,一次读出16字节(一整块BLOCK) */
////////////////////////////////////////////////////////////////
char M500PiccRead(unsigned char addr,unsigned char *_data)
{ /* addr=卡的EEROM数据块地址,_data=读出数据的存放区首址 */
char idata status = MI_OK;
char idata tmp = 0;
FlushFIFO(); /* 清缓冲区 */
M500PcdSetTmo(3);
WriteIO(RegChannelRedundancy,0x0F); /* 16比特CRC检测,奇校验 */
ResetInfo(MInfo);
SerBuffer[0] = PICC_READ;
SerBuffer[1] = addr;
MInfo.nBytesToSend = 2;
/* 上面为读卡命令的入口参数:读指令,块地址,发送字节数 */
status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&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); /* 执行不成功则返回00 */
}
else /* 读卡命令执行成功 */ // Response Processing
{
if (MInfo.nBytesReceived != 16) /* 如果返回的字节个数不是16 */
{
status = MI_BYTECOUNTERR; /* 则置字节计数错 */
memcpy(_data,"0000000000000000",16); /* 返回00 */
}
else /* 如果返回的字节个数是16 */
{
memcpy(_data,SerBuffer,16); /* 则将读出的数据送_DATA存储 */
}
}
M500PcdSetTmo(1); /* 延时(方式0) */
return status; /* 返回状态值 */
}
////////////////////////////////////////////////////////////////
// Write the mifare card
/* 写卡,下载密码到15区(1-15)的任意区的第四块(密钥块)*/
////////////////////////////////////////////////////////////////
char M500PiccWrite( unsigned char addr,unsigned char *_data)
{ /* addr=卡的EEROM数据块地址,_data=写入数据的存放区首址 */
char idata status = MI_OK;
ResetInfo(MInfo);
SerBuffer[0] = PICC_WRITE;
SerBuffer[1] = addr;
MInfo.nBytesToSend = 2;
/* 上面为写卡命令的入口参数:写指令,块地址,发送字节数 */
status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo);
if (status != MI_NOTAGERR) /* 如果不是出现无卡情况 */
{
if (MInfo.nBitsReceived != 4) /* 如果返回比特数不是4 */
{
status = MI_BITCOUNTERR; /* 则置比特计数错标志 */
}
else /* 如果返回比特数是4 */
{
SerBuffer[0] &= 0x0f;
if ((SerBuffer[0] & 0x0a) == 0)
{
status = MI_NOTAUTHERR; /* 没有通过授权(有些块是禁止读写的) */
}
else
{
if (SerBuffer[0] == 0x0a) /* 如果返回数据第一个字节最后四位是A */
{
status = MI_OK; /* 则写入命令执行成功 */
}
else
{
status = MI_CODEERR; /* 否则是数据校验出错 */
}
}
}
}
if ( status == MI_OK) /* 如果写入命令执行成功 */
{
M500PcdSetTmo(3);
ResetInfo(MInfo);
memcpy(SerBuffer,_data,16);
MInfo.nBytesToSend = 16;
/* 上面为写卡命令的入口参数:要写入的数据16字节 */
status = M500PcdCmd(PCD_TRANSCEIVE,SerBuffer,&MInfo); /* 开始写入 */
/* 要写卡,必须先送命令,再送数据 */
if (status & 0x80) /* 如果返回状态最高位为1 */
{
status = MI_NOTAGERR; /* 则是无卡在此场 */
}
else /* 如果返回状态最高位为0 */
{
if (MInfo.nBitsReceived != 4) /* 如果返回比特数不是4 */
{
status = MI_BITCOUNTERR; /* 则置比特计数错标志 */
}
else /* 如果返回比特数是4 */
{
SerBuffer[0] &= 0x0f;
if ((SerBuffer[0] & 0x0a) == 0) /* 如果返回数据第一个字节最后四位是0 */
{
status = MI_WRITEERR; /* 写卡失败标志 */
}
else /* 如果返回数据第一个字节最后四位不是0 */
{
if (SerBuffer[0] == 0x0a) /* 如果返回数据第一个字节最后四位是A,为什么? */
{
status = MI_OK; /* 则写卡成功 */
}
else
{
status = MI_CODEERR; /* 否则是数据校验出错 */
}
}
}
}
M500PcdSetTmo(1); /* 延时(方式1) */
}
return status; /* 返回状态值 */
}
///////////////////////////////////////////////////////////////////////
// Reset Rf Card
/* 重新配置RF 读卡器 */
///////////////////////////////////////////////////////////////////////
char M500PcdRfReset(unsigned char ms)
{
char idata status = MI_OK;
if(ms) /* 如果有重启信号1 */
{
ClearBitMask(RegTxControl,0x03); /* 全部清零,不再有输出 */
delay_1ms(2);
SetBitMask(RegTxControl,0x03); /* 让TX1/TX2脚都能输出 */
}
else /* 如果没有重启信号0 */
{
ClearBitMask(RegTxControl,0x03); /* 关闭输出 */
}
return status; /* 返回状态值 */
}
#pragma noaregs
/* 延时子程序集 */
///////////////////////////////////////////////////////////////////////
// Delay 50us
///////////////////////////////////////////////////////////////////////
void delay_50us(unsigned char _50us)
{
while(_50us--)
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
}
///////////////////////////////////////////////////////////////////////
// Delay 1ms
///////////////////////////////////////////////////////////////////////
void delay_1ms(unsigned char _1ms)
{
#ifndef NO_TIMER2
RCAP2LH = RCAP2_1ms;
T2LH = RCAP2_1ms;
TR2 = TRUE;
while (_1ms--)
{
while (!TF2);
TF2 = FALSE;
}
TR2 = FALSE;
#else
while (_1ms--)
{
delay_50us(20);
}
#endif
}
///////////////////////////////////////////////////////////////////////
// Delay 10ms
///////////////////////////////////////////////////////////////////////
void delay_10ms(unsigned int _10ms)
{
#ifndef NO_TIMER2
RCAP2LH = RCAP2_10ms;
T2LH = RCAP2_10ms;
TR2 = TRUE;
while (_10ms--)
{
while (!TF2);
TF2 = FALSE;
}
TR2 = FALSE;
#else
while (_10ms--)
{
delay_50us(19);
if (CmdValid)
return;
delay_50us(20);
if (CmdValid)
return;
delay_50us(20);
if (CmdValid)
return;
delay_50us(20);
if (CmdValid)
return;
delay_50us(20);
if (CmdValid )
return;
delay_50us(20);
if (CmdValid)
return;
delay_50us(20);
if (CmdValid)
return;
delay_50us(20);
if (CmdValid)
return;
delay_50us(20);
if (CmdValid)
return;
delay_50us(19);
if (CmdValid)
return;
}
#endif
}
///////////////////////////////////////////////////////////////////////
/* RC500中断处理总程序 */
///////////////////////////////////////////////////////////////////////
void RC500ISR (void) interrupt 0 using 1
{
static unsigned char idata irqBits;
static unsigned char idata irqMask;
static unsigned char idata nbytes;
static unsigned char idata cnt;
IE0 = 0; /* 用的是INT0脚 */
WriteRawIO(0,0x80);
if (MpIsrInfo && MpIsrOut)
{
while( ReadRawIO(RegPrimaryStatus) & 0x08) /* 第四位表示是否有中断请求(03H) */
{
irqMask = ReadRawIO(RegInterruptEn); /* IRQMASK=中断使能寄存器内容(06H) */
irqBits = ReadRawIO(RegInterruptRq) & irqMask; /* IRQBITS=中断使能+中断请求寄存器内容(07H) */
MpIsrInfo->irqSource |= irqBits;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -