⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mfr500.c

📁 程序实现了mfr500对IC卡的读写操作
💻 C
📖 第 1 页 / 共 2 页
字号:

	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 + -