📄 mfr500.c
字号:
M500PcdSetTmo(106);
memcpy(snr_in, snr, 4);
WriteIO(RegDecoderControl, 0x28);
ClearBitMask(RegControl, 0x08);
complete = 0;
while (!complete && (status == MI_OK)) {
ResetInfo(MInfo);
WriteIO(RegChannelRedundancy, 0x03);
nbits = bcnt % 8;
if (nbits) {
WriteIO(RegBitFraming, nbits << 4 | nbits);
nbytes = bcnt / 8 + 1;
if (nbits == 7) {
MInfo.cmd = PICC_ANTICOLL1;
WriteIO(RegBitFraming, nbits);
}
} else {
nbytes = bcnt / 8;
}
SerBuffer[0] = 0x93;
SerBuffer[1] = 0x20 + ((bcnt / 8) << 4) + nbits;
for (i = 0; i < nbytes; i++) {
SerBuffer[i + 2] = snr_in[i];
}
MInfo.nBytesToSend = 2 + nbytes;
status = M500PcdCmd(PCD_TRANSCEIVE, SerBuffer, &MInfo);
if (nbits == 7) {
dummyShift1 = 0x00;
for (i = 0; i < MInfo.nBytesReceived; i++) {
dummyShift2 = SerBuffer[i];
SerBuffer[i] = (dummyShift1 >> (i + 1)) |
(SerBuffer[i] << (7 - i));
dummyShift1 = dummyShift2;
}
MInfo.nBitsReceived -= MInfo.nBytesReceived;
if (MInfo.collPos)
MInfo.collPos += 7 - (MInfo.collPos + 6) / 9;
}
if (status == MI_OK || status == MI_COLLERR) {
if (MInfo.nBitsReceived != (40 - bcnt)) {
status = MI_BITCOUNTERR;
} else {
byteOffset = 0;
if (nbits != 0) {
snr_in[nbytes - 1] = snr_in[nbytes - 1] | SerBuffer[0];
byteOffset = 1;
}
for (i = 0; i < (4 - nbytes); i++) {
snr_in[nbytes + i] = SerBuffer[i + byteOffset];
}
if (status != MI_COLLERR) {
dummyShift2 = snr_in[0] ^ snr_in[1] ^ snr_in[2] ^ snr_in[3];
dummyShift1 = SerBuffer[MInfo.nBytesReceived - 1];
if (dummyShift2 != dummyShift1) {
status = MI_SERNRERR;
} else {
complete = 1;
}
} else {
bcnt = bcnt + MInfo.collPos - nbits;
status = MI_OK;
}
}
}
}
if (status == MI_OK) {
memcpy(snr, snr_in, 4);
} else {
memcpy(snr, "0000", 4);
}
ClearBitMask(RegDecoderControl, 0x20);
return status;
}
///////////////////////////////////////////////////////////////////////
// Reset Rf Card
///////////////////////////////////////////////////////////////////////
char M500PcdRfReset(unsigned char ms)
{
char idata status = MI_OK;
if (ms) {
ClearBitMask(RegTxControl, 0x03);
delay_1ms(2);
SetBitMask(RegTxControl, 0x03);
} else {
ClearBitMask(RegTxControl, 0x03);
}
return status;
}
///////////////////////////////////////////////////////////////////////
// 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
}
*/
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
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;
WriteRawIO(0, 0x80);
if (MpIsrInfo && MpIsrOut) {
while (ReadRawIO(RegPrimaryStatus) & 0x08) {
irqMask = ReadRawIO(RegInterruptEn);
irqBits = ReadRawIO(RegInterruptRq) & irqMask;
MpIsrInfo->irqSource |= irqBits;
if (irqBits & 0x01) {
nbytes = 64 - ReadRawIO(RegFIFOLength);
if ((MpIsrInfo->nBytesToSend - MpIsrInfo->nBytesSent) <=
nbytes) {
nbytes = MpIsrInfo->nBytesToSend - MpIsrInfo->nBytesSent;
WriteRawIO(RegInterruptEn, 0x01);
}
for (cnt = 0; cnt < nbytes; cnt++) {
WriteRawIO(RegFIFOData, MpIsrOut[MpIsrInfo->nBytesSent]);
MpIsrInfo->nBytesSent++;
}
WriteRawIO(RegInterruptRq, 0x01);
}
if (irqBits & 0x10) {
WriteRawIO(RegInterruptRq, 0x10);
WriteRawIO(RegInterruptEn, 0x82);
if (MpIsrInfo->cmd == PICC_ANTICOLL1) {
WriteIO(RegChannelRedundancy, 0x02);
WriteRawIO(0, 0x80);
}
}
if (irqBits & 0x0E) {
nbytes = ReadRawIO(RegFIFOLength);
for (cnt = 0; cnt < nbytes; cnt++) {
MpIsrOut[MpIsrInfo->nBytesReceived] = ReadRawIO(RegFIFOData);
MpIsrInfo->nBytesReceived++;
}
WriteRawIO(RegInterruptRq, 0x0A & irqBits);
}
if (irqBits & 0x04) {
WriteRawIO(RegInterruptEn, 0x20);
WriteRawIO(RegInterruptRq, 0x20);
irqBits &= ~0x20;
MpIsrInfo->irqSource &= ~0x20;
WriteRawIO(RegInterruptRq, 0x04);
}
if (irqBits & 0x20) {
WriteRawIO(RegInterruptRq, 0x20);
MpIsrInfo->status = MI_NOTAGERR;
}
}
}
}
///////////////////////////////////////////////////////////////////////
// MF RC500 Config
///////////////////////////////////////////////////////////////////////
char MfConfig(void)
{
char status = MI_OK;
M500PcdConfig();
M500PcdMfOutSelect(2);
return status;
}
///////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////
// IC卡处理函数
///////////////////////////////////////////////////////////////////////
void cmd_execution(void)
{
unsigned char cmd;
unsigned char status;
cmd = RevBuffer[0];
switch (cmd) {
/* case 1: // Halt the card //终止卡的操作
status=M500PiccHalt();
RevBuffer[0]=1;
RevBuffer[1]=status;
break; */
case 2:
// Request,Anticoll,Select,return CardType(2 bytes)+CardSerialNo(4 bytes)
// 寻卡,防冲突,选择卡 返回卡类型(2 bytes)+ 卡系列号(4 bytes)
status = M500PiccCommonRequest(RevBuffer[1], &RevBuffer[2]);
Scan_Key(); //按键扫描程序
if (status != 0) {
status = M500PiccCommonRequest(RevBuffer[1], &RevBuffer[2]);
Scan_Key(); //按键扫描程序
if (status != 0) {
RevBuffer[0] = 1;
RevBuffer[1] = status;
break;
}
}
if (RevBuffer[2] == 2)
cardtype = mifarepro; // Mifare Pro 卡
else if (RevBuffer[2] == 4)
cardtype = mifare1; // Mifare One 卡
else if (RevBuffer[2] == 16)
cardtype = mifarelight; // Mifare Light 卡
else
cardtype = unknowncard;
RevBuffer[0] = 3;
RevBuffer[1] = status;
break;
case 3:
// 防冲突 读卡的系列号 MLastSelectedSnr
status = M500PiccCascAnticoll(0, &RevBuffer[2]);
if (status != 0) {
RevBuffer[0] = 1;
RevBuffer[1] = status;
break;
}
memcpy(MLastSelectedSnr, &RevBuffer[2], 4);
RevBuffer[0] = 5;
RevBuffer[1] = status;
break;
case 12:
// 参数设置
RevBuffer[0] = 1; //contact
RevBuffer[1] = 0;
break;
}
}
//////////////////////////////////////////////////////////////////////
// 主函数
///////////////////////////////////////////////////////////////////////
void main(void)
{
//unsigned char baud;
unsigned char data i=0;
RC500_CS = 0;
init();
while (1) {
cmd_execution(); // 进入IC卡处理程序
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -