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

📄 mfslave.c

📁 MIFARE读卡器源程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <string.h>
#include <stdio.h>
#include <main.h>
#include <m500a.h>
#include <p89c51rx.h>
#include <Mfreg500.h>
#include <RdIo.h>

#define LED	P3_5

void SetBitMask(unsigned char reg,unsigned char mask);
void ClearBitMask(unsigned char reg,unsigned char mask);

#define Request_ALL 0x52
#define Request_IDLE 0x26
#define Write_M1 0xA0

#define ReceiveDataTimeOut 0x0112				//定义错误代码//
#define IllegalPurview  0x5004
#define VerifyError 0x4300
#define SlaveReceiveTimeOut 0x0115

unsigned char Bps=4,Parity='N',idata ReadBuf[40],idata snr[4];//PY

unsigned char idata Key[6]={0xff,0xff,0xff,0xff,0xff,0xff}; 
unsigned int Trans_Rec_Length;

char  M500PcdCmd(unsigned char cmd,
               volatile unsigned char* send, 
               volatile unsigned char* rcv,
               volatile MfCmdInfo *info);

void init(void);
void delay_50us(unsigned int _50us);
void Com_Initial(void);
void ComErrTreat(void);
void ChangeBPSandParity(void);
void TreatM1Cmd(void);
void Treat14443Cmd(void);
void StopComunication(void);
void ProtocolCodeErr(void);
int  MF_Slave_Receive(	unsigned int *RecLength,
						unsigned char *RecBuffer,
						unsigned int ByteTimeOut);
void MF_Slave_Transmit(	unsigned int TranLength,
						unsigned char *TranBuffer);					

void SystemReset(void);
void RequestALL(void);
void RequestIDLE(void);
void Snrcollision(	unsigned char idata *snr);
void Select_MF(unsigned char idata *snr);
void Authentication(unsigned char Auth_mode,
						unsigned char Block_addr,
						unsigned char *snr,
						unsigned char *Keys);
void AuthenE2(unsigned char Auth_mode,
						unsigned char Block_addr,
						unsigned char  *snr,
						unsigned int Keyaddr);
void LoadE2Keys(unsigned int Keyaddr,
						unsigned char idata *Keys);	
void ReadE2(unsigned int startaddr,unsigned char length,unsigned char * data1);
void WriteE2(unsigned int startaddr,unsigned char length,unsigned char* data1);
void ReadM1(unsigned char Block_addr);
void WriteM1(unsigned char Block_addr,
					unsigned char  * Write_buffer);										
void main(void)
{
//	char temp;
	unsigned char idata WriteBuf[16]={0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x00,0x01,0x02,0x03,0x04,0x05,0x06};
	init();
	
	while(M500PcdReset() != MI_OK);
	M500PcdConfig();
	M500PcdRfReset(10);
	delay_50us(1000);
//	WriteE2(0x30,5,WriteBuf);
//	ReadE2(0x30,5,ReadBuf+20);
	
	while(1)
		{
			Com_Initial();			
			RequestALL();
			if(ReadBuf[6])  continue;			
			Snrcollision(snr);
			if(ReadBuf[6])  continue;			
			Select_MF(snr);
			if(ReadBuf[6])  continue;			
//			LoadE2Keys(0x80,Key);	
//			if(ReadBuf[6])  continue;			
//			AuthenE2(0x60,6,snr,0x80);
//			if(ReadBuf[6])  continue;	
		}					

}

void init(void)
{
	P2_7 = 0;	// Enable the CS for RC500
    IT0 = 1;    // Config ext0 as edge trigger for RC500
	EX0 = 1; 	// Enable ext0 interrupt for RC500
    EA = 1;		// Enable global interrupt	
}
void RequestALL(void)
{
	ReadBuf[0]=0x04;
	ReadBuf[1]=0x00;
	ReadBuf[2]=0x30;
	ReadBuf[3]=0x11;
	ReadBuf[4]=0x00;
	ReadBuf[5]=0x52;
	TreatM1Cmd();		
}

void RequestIDLE(void)
{
	ReadBuf[0]=0x04;
	ReadBuf[1]=0x00;
	ReadBuf[2]=0x30;
	ReadBuf[3]=0x11;
	ReadBuf[4]=0x00;
	ReadBuf[5]=0x26;
	TreatM1Cmd();		
}	

void Snrcollision(	unsigned char idata *snr)
{
	ReadBuf[0]=0x09;
	ReadBuf[1]=0x00;
	ReadBuf[2]=0x30;
	ReadBuf[3]=0x11;
	ReadBuf[4]=0x00;
	ReadBuf[5]=0x93;
	ReadBuf[6]=0x00;
	memcpy(ReadBuf+7,snr,4);	
	TreatM1Cmd();
	memcpy(snr,ReadBuf+7,4);	
	
}
void Select_MF(unsigned char idata *snr)
{
	ReadBuf[0]=0x0a;
	ReadBuf[1]=0x00;
	ReadBuf[2]=0x30;
	ReadBuf[3]=0x11;
	ReadBuf[4]=0x00;
	ReadBuf[5]=0x93;
	ReadBuf[6]=0x70;
	memcpy(ReadBuf+7,snr,4);
	ReadBuf[11]=snr[0]^snr[1]^snr[2]^snr[3];
	TreatM1Cmd();
}
//下载密码到RC500的E2PROM

void LoadE2Keys(unsigned int Keyaddr,
						unsigned char idata *Keys)
{
	unsigned char i;

	ReadBuf[0]=0x11;
	ReadBuf[1]=0x00;
	ReadBuf[2]=0x30;
	ReadBuf[3]=0x11;
	ReadBuf[4]=0x04;
	ReadBuf[5]=(unsigned char)Keyaddr;
	ReadBuf[6]=(unsigned char)(Keyaddr>>8);
	for(i=0;i<6;i++)
	{
		ReadBuf[2*i+7]=((~Keys[i])&0xf0)|((Keys[i]>>4)&0x0f);
		ReadBuf[2*i+8]=(Keys[i]&0x0f)|((~Keys[i]<<4)&0xf0);
	}	
	TreatM1Cmd();
}						

//通过E2PROM进行密码认证
void AuthenE2(unsigned char Auth_mode,
						unsigned char Block_addr,
						unsigned char  *snr,
						unsigned int Keyaddr)
{
	ReadBuf[0]=0x0b;
	ReadBuf[1]=0x00;
	ReadBuf[2]=0x30;
	ReadBuf[3]=0x11;
	ReadBuf[4]=0x02;
	ReadBuf[5]=Auth_mode;
	ReadBuf[6]=Block_addr;
	memcpy(ReadBuf+7,snr,4);
	ReadBuf[11]=(unsigned char)Keyaddr;
	ReadBuf[12]=(unsigned char)(Keyaddr>>8);
	TreatM1Cmd();
}
void Authentication(unsigned char Auth_mode,
						unsigned char Block_addr,
						unsigned char *snr,
						unsigned char *Keys)
{
	unsigned char i;
	ReadBuf[0]=0x15;
	ReadBuf[1]=0x00;
	ReadBuf[2]=0x30;
	ReadBuf[3]=0x11;
	ReadBuf[4]=0x00;
	ReadBuf[5]=Auth_mode;
	ReadBuf[6]=Block_addr;
	memcpy(ReadBuf+7,snr,4);
	for(i=0;i<6;i++)
	{
		ReadBuf[2*i+11]=((~Keys[i])&0xf0)|((Keys[i]>>4)&0x0f);
		ReadBuf[2*i+12]=(Keys[i]&0x0f)|((~Keys[i]<<4)&0xf0);
	}	
	TreatM1Cmd();
}

void ReadM1(unsigned char Block_addr)
{
	ReadBuf[0]=0x05;
	ReadBuf[1]=0x00;
	ReadBuf[2]=0x30;
	ReadBuf[3]=0x11;
	ReadBuf[4]=0x00;
	ReadBuf[5]=0x30;
	ReadBuf[6]=Block_addr;
	TreatM1Cmd();
}

//写数据
void WriteM1(unsigned char Block_addr,
					unsigned char  * Write_buffer)
{
	ReadBuf[0]=0x15;
	ReadBuf[1]=0x00;
	ReadBuf[2]=0x30;
	ReadBuf[3]=0x11;
	ReadBuf[4]=0x00;
	ReadBuf[5]=0xa0;
	ReadBuf[6]=Block_addr;
	memcpy(ReadBuf+7,Write_buffer,16);
	TreatM1Cmd();
}

void ComErrTreat(void)
{
	ReadBuf[0]=4;
	ReadBuf[1]=0;
	ReadBuf[2]=0;
	ReadBuf[3]=0x3f;
	ReadBuf[4]=(char)VerifyError;
	ReadBuf[5]=(char)(VerifyError>>8);
}	

void ChangeBPSandParity(void)
{
	Bps=ReadBuf[4];
	Parity=ReadBuf[5];
	ReadBuf[0]=6;
	ReadBuf[1]=0;
	ReadBuf[2]=0x30;
	ReadBuf[3]=0x10;
	ReadBuf[4]=0;
	ReadBuf[5]=0;
	ReadBuf[6]=Bps;
	ReadBuf[7]=Parity;	
}

void ProtocolCodeErr(void)
{
	ReadBuf[0]=4;
	ReadBuf[1]=0;
	ReadBuf[2]=0;
	ReadBuf[3]=0x3f;
	ReadBuf[4]=(char)IllegalPurview;
	ReadBuf[5]=(char)(IllegalPurview>>8);
}

void StopComunication(void)
{
	ReadBuf[0]=4;
	ReadBuf[1]=0;
	ReadBuf[2]=0x30;
	ReadBuf[3]=0x0f;
	ReadBuf[4]=0;
	ReadBuf[5]=0;
}


void PrepareTransmitUpBlock(char status)
{
	ReadBuf[0]+=5;
	ReadBuf[1]=0;
	ReadBuf[2]=0x30;
	ReadBuf[3]=0x11;
	ReadBuf[4]=0;
	ReadBuf[5]=0;
	ReadBuf[6]=status;
}

void TreatM1Cmd(void)
{
	char status = MI_OK;

//	ClearBitMask(RegControl,0x08);    // disable crypto 1 unit
// long timeout (9.6 ms)
    WriteIO(RegTimerClock,0x09); // TAutoRestart=0,TPrescale=4*128 
    WriteIO(RegTimerReload,0xff);// TReloadVal = 'hff =255(dec)
	if(ReadBuf[4]&1) 
   		WriteIO(RegChannelRedundancy,0x03); // RxCRC,TxCRC disable, Parity enable
	else	
   		WriteIO(RegChannelRedundancy,0x0F); // RxCRC,TxCRC, Parity enable
   	ReadBuf[0]-=3;

	if(ReadBuf[4]&4)
	{
		status=M500PiccExchangeBlock(PCD_WRITEE2,ReadBuf+5,ReadBuf[0],ReadBuf+7,ReadBuf);
	}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -