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

📄 reader.c

📁 很强的射频卡reader源代码
💻 C
📖 第 1 页 / 共 5 页
字号:
		datas++;
	}
	CheckControlCode(TxCheckSum);
}

//设定用户信息
unsigned char SetUserInfo(unsigned char *add)
{ 
	if (write_Flash(USERINFO,add,32)==0) 	return 0 ;
	else return 1 ;
}


//保存数据
unsigned char Save_Data()
{	unsigned char leg;
	unsigned int address;
	address=(u_ram.host.RxBuffer[5]*256+u_ram.host.RxBuffer[6]);//+0XE800;
	if (address>0xfe00)  return 1;
	leg=u_ram.host.RxBuffer[3]-3;
	if(write_Flash(address,&u_ram.host.RxBuffer[7],leg)==0) return 0;
	else return 1; 
}
//读取数据
void R_Flash()
{	unsigned char leg,CMD_status;
	unsigned int address;		
	address=(u_ram.host.RxBuffer[5]*256+u_ram.host.RxBuffer[6]);//+0XE800;
	leg=u_ram.host.RxBuffer[7];
	if (leg>90) {ReturnStatus(OutRange); return;} 
	CMD_status=read_Flash(address,&u_ram.host.RxBuffer[5],leg);
	if(CMD_status) ReturnStatus(OutRange);
		else TxOut(leg,CMD_status,&u_ram.host.RxBuffer[5]);	
}

// 设定读卡器地址
unsigned char SetAddress()
{
	unsigned char i[3];

	if(u_ram.host.RxBuffer[5] != 0x00)
//DATA[0]: Enable Serial Number Checking
//0x00 – Don’t check the Serial Number.
//0x01 – Check the Serial Number.
	{
		if(u_ram.host.RxBuffer[7]  !=  read_byte_Flash(SERIALNUM))     	return(OutRange); 
     	else if(u_ram.host.RxBuffer[8] != read_byte_Flash(SERIALNUM+1)) 	return(OutRange); 
		else if(u_ram.host.RxBuffer[9] != read_byte_Flash(SERIALNUM+2)) 	return(OutRange);
     	else if(u_ram.host.RxBuffer[10] != read_byte_Flash(SERIALNUM+3))	return(OutRange);
		else if(u_ram.host.RxBuffer[11] != read_byte_Flash(SERIALNUM+4))	return(OutRange);
		else if(u_ram.host.RxBuffer[12] != read_byte_Flash(SERIALNUM+5))	return(OutRange); 
		else if(u_ram.host.RxBuffer[13] != read_byte_Flash(SERIALNUM+6))	return(OutRange);
     	else if(u_ram.host.RxBuffer[14] != read_byte_Flash(SERIALNUM+7))	return(OutRange);
 	}	
//	write_Flash(MADDRESSMCU,&u_ram.host.RxBuffer[6],1);//DATA[1]: The new Device ( Reader ) Address to be set
	//SlaveADR=read_byte_Flash(MADDRESSMCU);
	i[2]=u_ram.host.RxBuffer[6];
	i[1]=0xaa;
	i[0]=0x55;
	write_Flash(BCCA,i,3);
	
	SlaveADR=u_ram.host.RxBuffer[6];
	//write_byte_Flash(MADDRESSMCU,SlaveADR);
	return(0);     
}

//设定通讯波特率
unsigned char SetBaudrateMCU(unsigned char Baudrate)
{
	unsigned char i[2];
	i[0]=SlaveADR;
	i[1]=Baudrate;
	if(Baudrate <= 0x05)
	{ 
		//write_Flash(MADDRESSMCU,i,2);
		write_Flash(bauderate,&i[1],1);
		return(0);
	} 
	return(OutRange);
}

/*Flash 内部数据效验
unsigned char CaulaBCC(void)
{ unsigned char i;
	i=   read_byte_Flash(mAddressMCU);
	i^=  read_byte_Flash(mAddressMCU+1);
	i^=  read_byte_Flash(mAddressMCU+2);
	i^=  read_byte_Flash(mAddressMCU+3);
	return (i);
}
*/

//  系统默认参数设置
void InitialSetup(void)
{
	u_ram.host.RxBuffer[0]=0X55;
	u_ram.host.RxBuffer[1]=0XAA;
	u_ram.host.RxBuffer[2]=0X00;				
	u_ram.host.RxBuffer[3]=0X5;
	u_ram.host.RxBuffer[4]=0X1;
	u_ram.host.RxBuffer[5]=0X00;
	write_Flash(BCCA,&u_ram.host.RxBuffer[0],6);	
}

void DecodeCMD_Buzzer(unsigned char mode,unsigned char *buffer)
{
	switch(mode)
	{
		case 0:Buzzer=ON; //OFF
    		break;
    
		case 1:Buzzer=OFF; //ON
		break;
    
		case 4:
     		Buz_T1=buffer[0];
     		Buz_T2=buffer[1];
     		Buz_T3=buffer[2];
     		Buz_T4=buffer[3];
     		Buz_Period=buffer[4];
     		Buz_CNT=0xFF;
     		Buz_Step=0;
     		BuzFlag=1;
	}
}

/********************************************************************************************************/
/*unsigned char getrc500EEPROM(unsigned short Address)
{
	unsigned char Buffer;
	PcdReadE2(Address,1,&Buffer);
	return(Buffer);
}
*/
//*******************************************************
//高阶操作,完成对卡的14443 操作,序列号比较。密码校验

unsigned char MF_HL_Auth(unsigned char mode, unsigned char *snr, unsigned char Blk_Add)
{
	unsigned char ReqMode,temp[5],KeyA_B,CMD_status;
		 
	if(mode & 0x01) ReqMode = 0x52;
	else ReqMode =0x26; 
	
	CMD_status=Mf500PiccCommonRequest(ReqMode,temp);
	if(CMD_status !=0x00)
		CMD_status=Mf500PiccCommonRequest(ReqMode,temp);

	if(CMD_status) // Request Error
	{
		if(CMD_status == MI_NOTAGERR)	return (inf_nCard);
		else if (CMD_status == MI_ACCESSTIMEOUT) return (TMO_ERR);
		else if (CMD_status == MI_PARITYERR) return (PARITY_ERR);
		else if (CMD_status == MI_BITCOUNTERR) return (BITCNT_ERR);
		else return (inf_NACK);
	}                

	CMD_status=Mf500PiccCascAnticoll(PICC_ANTICOLL1,temp);
	if(CMD_status)          	
	{
		if(CMD_status == MI_NOTAGERR)	return (inf_nCard);
		else if(CMD_status == MI_SERNRERR) return (MF_SERNRERR);//
		else if (CMD_status == MI_ACCESSTIMEOUT) return (TMO_ERR);
		else if (CMD_status == MI_PARITYERR) return (PARITY_ERR);
		else if (CMD_status == MI_BITCOUNTERR) return (BITCNT_ERR);
		else return (inf_NACK);
	}       
	
	CMD_status=Mf500PiccCascSelect(PICC_ANTICOLL1,temp);
 	
	if(CMD_status)          	
	{
		if(CMD_status == MI_NOTAGERR)	return (inf_nCard);
		else if(CMD_status == MI_CRCERR) return (CRC_ERR);
		else if (CMD_status == MI_ACCESSTIMEOUT) return (TMO_ERR);
		else if (CMD_status == MI_PARITYERR) return (PARITY_ERR);
		else if (CMD_status == MI_BITCOUNTERR) return (BITCNT_ERR);
		else return (inf_NACK);
	}       

	if(mode & 0x04) KeyA_B = 0x61;	//Check use KEYA or B
	else KeyA_B =0x60; 

	CMD_status=MRC500LoadKey2(KeyA_B,Blk_Add >> 2);	//Blk Address
 	if(CMD_status)          	
	{
		if(CMD_status == MI_NOTAGERR)	return (inf_nCard);
		else if (CMD_status == MI_ACCESSTIMEOUT) return (TMO_ERR);
		else return (inf_NACK);
	} 
  
	CMD_status=MRC500PiccAuthentication(KeyA_B,temp,Blk_Add);             
 	if(CMD_status)          	
	{
		if(CMD_status == MI_NOTAGERR)	return (inf_nCard);
		else if(CMD_status == MI_AUTHERR) return (MF_AUTHERR);
		else if (CMD_status == MI_ACCESSTIMEOUT) return (TMO_ERR);
		else if (CMD_status == MI_BITCOUNTERR) return (BITCNT_ERR);
		else return (inf_NACK);
	}

	if(mode & 0x02)
	{	
		CMD_status=snr[0]^temp[3]|snr[1]^temp[2]|snr[2]^temp[1]|snr[3]^temp[0];	/*比较序列号*/
      	if(CMD_status)  return(inf_nCard);
     	else; 	
	}
	{
		snr[0]=temp[0];snr[1]=temp[1];snr[2]=temp[2];snr[3]=temp[3];
		return CMD_status;
	}  
	   		 
}



void return_nodata_ack(status)
{
	unsigned char i;

	cmd_buffer[0]=SEQ;
	cmd_buffer[1]=SlaveADR;
	cmd_buffer[2]=1;
	cmd_buffer[3]=status;
	make_xor(cmd_buffer,4);

	TxFlag=1;
	STX_Pointer=0; 
	ETX_Pointer=5;
   
	for(i=0;i<5;i++)
	{
		u_ram.host.TxBuffer[i]=cmd_buffer[i];

	}
	RS485=1;
	SBUF=2;	
}

void return_guid(void)
{
	unsigned char i;

	cmd_buffer[0]=SEQ;
	cmd_buffer[1]=SlaveADR;
	cmd_buffer[2]=8;
	cmd_buffer[3]=0;
	memcpy(&cmd_buffer[4],&card_desuid[1],7);
	make_xor(cmd_buffer,11);
	TxFlag=1;
	STX_Pointer=0; 
	ETX_Pointer=12;
   
	for(i=0;i<12;i++)
	{
		u_ram.host.TxBuffer[i]=cmd_buffer[i];

	}
	RS485=1;
	SBUF=2;	
}


/*****************************************************************************************/
void funtions()
{
	unsigned char CMD_status;
	unsigned short HostBuffer;
	unsigned char application_no[3];
	unsigned char file_no;
	unsigned char offset[3];
	unsigned char data_len;
	int deskey_address;
	unsigned char status;
//	unsigned char i;
	EA=0;
	weigandFlag=0;

	switch(u_ram.host.RxBuffer[2]) //decode command code
	{  
// desfire 
	    case CMD_DES_get_uid:
			
			status =get_desfire_uid();			

			if (status)
				return_nodata_ack(1);
			else
			    return_guid();


		break;

		case CMD_DES_read:

			application_no[0]=u_ram.host.RxBuffer[5];
			application_no[1]=u_ram.host.RxBuffer[6];
			application_no[2]=u_ram.host.RxBuffer[7];
			file_no=u_ram.host.RxBuffer[8];
			offset[0]=u_ram.host.RxBuffer[9];
			offset[1]=u_ram.host.RxBuffer[10];
			offset[2]=u_ram.host.RxBuffer[11];
			data_len=u_ram.host.RxBuffer[12];
//			deskey_address=key_buffer+u_ram.host.RxBuffer[13]*32;
//			read_Flash(deskey_address,select_key,17);
//            LED_R=1;
			status=read(application_no,file_no,offset,data_len);   //application_no
//			LED_R=0;

			if (status)
				return_nodata_ack(status);
			//read(0,3,1,0,0,10);

		break;

		case CMD_DES_savekey:						//保存DESFIRE 密码
			deskey_address=key_buffer+u_ram.host.RxBuffer[5]*32;
			memcpy(cmd_buffer,&u_ram.host.RxBuffer[6],17);
			memcpy(select_key,cmd_buffer,17);
			status=write_Flash(deskey_address,cmd_buffer,17);
			if (status)
			   return_nodata_ack(1);
			else
			   return_nodata_ack(0);
		break;

		case CMD_DES_getkey:
			deskey_address=key_buffer+u_ram.host.RxBuffer[5]*32;
			read_Flash(deskey_address,select_key,17);
			memcpy(&cmd_buffer[4],select_key,17);
			cmd_buffer[0]=SEQ;
			cmd_buffer[1]=SlaveADR;
			cmd_buffer[2]=18;
			cmd_buffer[3]=0;
			make_xor(cmd_buffer,21);
			memcpy(u_ram.host.TxBuffer,cmd_buffer,22);

			TxFlag=1;
			STX_Pointer=0; 
			ETX_Pointer=22;
			RS485=1;
			SBUF=2;
			
		break;



		case CMD_DES_setpara:
			des_app_no[0]=u_ram.host.RxBuffer[5];
			des_app_no[1]=u_ram.host.RxBuffer[6];
			des_app_no[2]=u_ram.host.RxBuffer[7];
			des_file_no=u_ram.host.RxBuffer[8];			
			des_offset[0]=u_ram.host.RxBuffer[9];
			des_offset[1]=u_ram.host.RxBuffer[10];
			des_offset[2]=u_ram.host.RxBuffer[11];
			des_read_len=u_ram.host.RxBuffer[12];
			//des_key_index=u_ram.host.RxBuffer[15];

			write_Flash(des_read_parameter,&u_ram.host.RxBuffer[5],9);

			deskey_address=key_buffer+u_ram.host.RxBuffer[13]*32;
			read_Flash(deskey_address,select_key,17);
//			des_key_no=select_key[16];
		    return_nodata_ack(0);
		break;				

    	case CMD_ActivePort: //command code for active IO point forever
			if(!SetPortActive(u_ram.host.RxBuffer[5]))
			ReturnStatus(inf_ACK);
			else ReturnStatus(OutRange); 
		break;

		case CMD_GetPortStat: //command code for get I/O status.
		 	u_ram.host.RxBuffer[6]=GetPortStatus(u_ram.host.RxBuffer[5]);
			TxOut(1,0,&u_ram.host.RxBuffer[6]);
		break;

		case CMD_ToggleLED:   //command code for toggle LED ON/OFF
		 	CMD_status=DecodeToggleLED(&u_ram.host.RxBuffer[5]);
			if (CMD_status==inf_ACK)  ReturnStatus(inf_ACK);
			else ReturnStatus(OutRange);
     	break;

		case CMD_ActiveLED:   //command code for ON LED forever
			CMD_status=SetLED_Active(u_ram.host.RxBuffer[5]);
			if (CMD_status==inf_ACK)  ReturnStatus(inf_ACK);
			else ReturnStatus(OutRange);		
		break;

		case CMD_Buzzer:   //Buzzer 
        		if(u_ram.host.RxBuffer[5] < 5)
			{
				DecodeCMD_Buzzer(u_ram.host.RxBuffer[5],&u_ram.host.RxBuffer[6]);
				ReturnStatus(inf_ACK);
			}
		else ReturnStatus(OutRange);
		break;
        
		case CMD_C_Ext:
			CMD_status=C_Ext(u_ram.host.RxBuffer[5]);
			if (CMD_status==inf_ACK)  ReturnStatus(inf_ACK);
			else ReturnStatus(OutRange);					
		break;

		case CMD_LoadProgram:     //程序下载
			EA=1;
			ReturnStatus(inf_ACK);  
			while(TxFlag);
			u_ram.host.TxBuffer[0]=0x55;
			u_ram.host.TxBuffer[1]=0xAA;
			u_ram.host.TxBuffer[2]=10;
			while(1);
		break;

		case CMD_SetAddress:           //Set reader address
			CMD_status=SetAddress();
			TxOut(1,CMD_status,&SlaveADR);
		break;

		case CMD_SetBaudrate:          //Set reader baudrate//
			EA=1;
			CMD_status=SetBaudrateMCU(u_ram.host.RxBuffer[5]);
//			u_ram.host.RxBuffer[5]=read_byte_Flash(bauderate);
			TxOut(1,CMD_status,&u_ram.host.RxBuffer[5]);
//			return_nodata_ack(CMD_status);
			while(TxFlag);  //wait the txout command complete;
			if(CMD_status == 0x00)
			{
				delay(3);
				InitialUART(read_byte_Flash(bauderate));  //for 22.1184MHz 
			}
		break;
		
		case CMD_SetSerialNum:         //Set reader serial number
		 	if(write_Flash(SERIALNUM,&u_ram.host.RxBuffer[5],8) ==0x00) ReturnStatus(inf_ACK);  
			else ReturnStatus(Fail);  
		break;
		
		case CMD_GetSerialNum:         //Get reader serial number
			CMD_status=read_Flash(SERIALNUM,&u_ram.host.RxBuffer[6],8);
			u_ram.host.RxBuffer[14]=0;
			u_ram.host.RxBuffer[15]=SlaveADR;
			if (CMD_status) ReturnStatus(Fail);	
			else TxOut(10,CMD_status,&u_ram.host.RxBuffer[6]);	
		break;

		case CMD_Weigand:            //Weigand 控制
			weigandFlag=u_ram.host.RxBuffer[5];
			CMD_status=write_Flash(WEIGAND26,&u_ram.host.RxBuffer[5],1) ;   
			if(CMD_status==0)
				ReturnStatus(inf_ACK);
			else ReturnStatus(Fail); 
		break;
				
		case CMD_WeigandActive:            //Weigand 控制
			weigandFlag=u_ram.host.RxBuffer[5];
			ReturnStatus(inf_ACK);
		break;


		case CMD_Set_User_Info:    //设定用户信息

⌨️ 快捷键说明

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