📄 mf_rc500.c
字号:
RC_SetTmod(tmod_6ms);
ResetInfo(MInfo);
memcpy(SerBuffer,_data,16);
MInfo.nBytesToSend = 16;
status = RC_Command(PCD_TRANSCEIVE,
SerBuffer,
&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;
}
}
}
}
RC_SetTmod(tmod_1ms);
}
return status;
}
void MF_RfReset(unsigned char ms)
{
if(ms)
{
RC_ClearBit(RegTxControl,0x03);
delay_1ms(4);
RC_SetBit(RegTxControl,0x03);
}
else
RC_ClearBit(RegTxControl,0x03);
}
void delay_50us(unsigned char _50us)
{
while(_50us--)
{
WDG=!WDG;
_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_();
}
}
void delay_1ms(uchar _1ms)
{
while (_1ms--)
{
WDG=!WDG;
delay_50us(25);
}
}
void delay_10ms(uchar _10ms)
{
while (_10ms--)
{
WDG=!WDG;
delay_1ms(10);
}
}
//RC500 operation interrupt server rount
void RC_Interrupt(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;
RC_WriteRawData(0,0x80);
if (MpIsrInfo && MpIsrOut)
{
while( RC_ReadRawData(RegPrimaryStatus) & 0x08)
{
irqMask = RC_ReadRawData(RegInterruptEn);
irqBits = RC_ReadRawData(RegInterruptRq) & irqMask;
MpIsrInfo->irqSource |= irqBits;
if (irqBits & 0x01)
{
nbytes = 64 - RC_ReadRawData(RegFIFOLength);
if ((MpIsrInfo->nBytesToSend - MpIsrInfo->nBytesSent) <= nbytes)
{
nbytes = MpIsrInfo->nBytesToSend - MpIsrInfo->nBytesSent;
RC_WriteRawData(RegInterruptEn,0x01);
}
for ( cnt = 0;cnt < nbytes;cnt++)
{
RC_WriteRawData(RegFIFOData,MpIsrOut[MpIsrInfo->nBytesSent]);
MpIsrInfo->nBytesSent++;
}
RC_WriteRawData(RegInterruptRq,0x01);
}
if (irqBits & 0x10)
{
RC_WriteRawData(RegInterruptRq,0x10);
RC_WriteRawData(RegInterruptEn,0x82);
if (MpIsrInfo->cmd == PICC_ANTICOLL1)
{
RC_WriteRC(RegChannelRedundancy,0x02);
RC_WriteRawData(0,0x80);
}
}
if (irqBits & 0x0E)
{
nbytes = RC_ReadRawData(RegFIFOLength);
for ( cnt = 0; cnt < nbytes; cnt++)
{
MpIsrOut[MpIsrInfo->nBytesReceived] = RC_ReadRawData(RegFIFOData);
MpIsrInfo->nBytesReceived++;
}
RC_WriteRawData(RegInterruptRq,0x0A & irqBits);
}
if (irqBits & 0x04)
{
RC_WriteRawData(RegInterruptEn,0x20);
RC_WriteRawData(RegInterruptRq,0x20);
irqBits &= ~0x20;
MpIsrInfo->irqSource &= ~0x20;
RC_WriteRawData(RegInterruptRq,0x04);
}
if (irqBits & 0x20)
{
RC_WriteRawData(RegInterruptRq,0x20);
MpIsrInfo->status = MI_NOTAGERR;
}
}
}
}
//com interrupt server route frandy
void serial_interrupt() interrupt 4 using 1
{
if(RI)
{
RI=0;
com_tmr_rx=5;
com_r_busy=1;
datas[com_r_index++]=SBUF;
if(com_r_index>=34)
com_r_index=0;
if(datas[0]!='B')
com_r_index=0;
}
if(TI)
{
TI=0;
TX_RX=0;
if(com_t_index<com_t_length)
{
TX_RX=1;
SBUF=datas[com_t_index++];
}
else
{
com_t_index=com_t_length=0;
TX_RX=0;
}
}
}
void Sys_Init(void)
{
RC500CS = 0;
RC500RST=0;
IE=0x00;
PCON &= ~0x80;
SCON = 0x50; //mode 1,ren=1
TMOD=0x21; //timer 0 is 16 bit
TH1 = BAUD_9600;
TL1 = BAUD_9600;
TR1 = 1;
TH0 = TH0_20ms; //0x2800 time is 60ms
TL0 = TL0_20ms;
TR0 = 1; //timer 1 run
ET0 = 1;
ET1 = 0;
ES = 1;
EX0=1;
IT0 = 1;
size=0;
sec_num=block_num/4;
EA=1;
TX_RX=0;
}
void timer0_int(void) interrupt 1 using 2
{
TR0=0;
TH0=TH0_20ms;
TL0=TL0_20ms;
if(com_tmr_rx) com_tmr_rx--;
TR0=1;
}
void watch_dog()
{
WDG=~WDG;
}
void sound(uchar n)
{
uchar i,j;
watch_dog();
for(i=0;i<n;i++)
{
watch_dog();
SPK=0; /* enable sound */
/* the 'OK' LED display */
for(j=0;j<5;j++)
{
GLED=0;
RLED=1;
delay_10ms(8); /*delay for 0.5s*/
watch_dog();
}
SPK=1; /* disable sound */
for(j=0;j<5;j++)
{
GLED=1;
RLED=0;
delay_10ms(8);
watch_dog();
}
}
}
uchar exec_cmd(uchar cmd_code)
{
uchar i;
switch(cmd_code)
{
case CMD_READ_SN:
for (i=0;i<5;i++)
{
watch_dog();
if (MF_Request(ALL, tt)!=0) continue;
if (MF_Conflict(0,card_snr)!=0) continue;
break;
}
if (i==5) return 0xff; //不成功
send(cmd_code);
break;
case CMD_READ_BLOCK:
for (i=0;i<10;i++)
{
watch_dog();
if (MF_Request(ALL, tt)!=0) continue;
if (MF_Conflict(0,card_snr)!=0) continue;
if (MF_Select(card_snr,&size)!=0) continue;
if (MF_AuthKey(KEYA,card_snr,&datas[3],datas[2])!=0) continue;
if (MF_ReadCard(datas[2], datas)!=0) continue;
MF_Halt();
break;
}
if (i==10) return 0xff;
send(cmd_code);
break;
case CMD_WRITE_BLOCK:
case CMD_WRITE_PASSWD:
for (i=0;i<5;i++)
{
if (MF_Request(ALL, tt)!=0) continue;
if (MF_Conflict(0,card_snr)!=0) continue;
if (MF_Select(card_snr,&size)!=0) continue;
if (MF_AuthKey(KEYA,card_snr,&datas[3],datas[2])!=0) continue;
if (MF_WriteCard(datas[2], &datas[15])!=0) continue;
MF_Halt();
break;
}
if (i==5) return 0xff;
send(cmd_code);
break;
default: break;
}
return 0;
}
void send(uchar cmd_code)
{
uchar sum=0,i;
watch_dog();
switch(cmd_code)
{
case CMD_READ_SN:
{
datas[0]='B';
datas[1]=5;
datas[2]=card_snr[0];
datas[3]=card_snr[1];
datas[4]=card_snr[2];
datas[5]=card_snr[3];
for (i=2,sum=0;i<6;i++)
sum += datas[i];
datas[6]=sum;
com_t_index=0;
com_t_length=7;
TX_RX=1;
TI=1;
break;
}
case CMD_READ_BLOCK:
{
SPK=0;
for (i=16,sum=0;i>0;i--)
{
watch_dog();
datas[i+1]=datas[i-1];
sum += datas[i-1];
}
datas[0]='B';
datas[1]=17;
datas[18]=sum%256;
com_t_index=0;
com_t_length=19;
TX_RX=1;
watch_dog();
TI=1;
break;
}
case CMD_WRITE_BLOCK:
case CMD_WRITE_PASSWD:
{
datas[0]='B';
datas[1]=1;
datas[2]='Y';
com_t_index=0;
com_t_length=3;
TX_RX=1;
TI=1;
break;
}
default: break;
}
}
void main(void)
{
uchar i;
uchar idata cs_sum;
RLED=1;
GLED=1;
WP=1;
SPK=1;
WDG = 0;
WDG = 1;
RC500CS=0;
block_num=BLOCK_NUM_SET;
sec_num=BLOCK_NUM_SET/4; /*block_num/4;*/
Sys_Init();
watch_dog();
MF_Config();
SPK=0;
delay_10ms(10);
SPK=1;
for (i=0;i<5;i++)
datas[i]=0x10+i;
com_t_index=0;
com_t_length=5;
TI=1;
while (1)
{
watch_dog();
if(com_r_busy&&!com_tmr_rx)
{
com_r_busy=com_r_index=0;
if (datas[1]==1&&datas[2]=='Y')
cmd_code=CMD_READ_SN;
else if(datas[1]==14||datas[1]==30||datas[1]==26)
{
for(i=2,cs_sum=0;i<datas[1]+1;i++)
cs_sum+=datas[i];
if(datas[datas[1]+1]==cs_sum%256)
{
if(datas[1]==14) cmd_code=CMD_READ_BLOCK;
if(datas[1]==30) cmd_code=CMD_WRITE_BLOCK;
if(datas[1]==26) cmd_code=CMD_WRITE_PASSWD;
}
else
{
cmd_code=0;
sound(2);
}
}
}
if (cmd_code)
{
if (exec_cmd(cmd_code)==0)
sound(1);
cmd_code=0;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -