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

📄 fm1702.c

📁 复旦RF1702读写卡应用
💻 C
📖 第 1 页 / 共 3 页
字号:
	case 0x05:	return(FM1715_PARITYERR);
	default:	return(FM1715_TRANSERR);
	}
}

#if 0
/****************************************************************/
/*名称: HL_Active */
/*功能: 该函数实现高级MIFARE卡激活命令*/
/*输入: Secnr: 扇区号*/
/* Block_Adr: 块地址*/
/*输出: 操作状态码*/
/* 读出数据存于buffer中*/
/****************************************************************/
uchar HL_Active(uchar Block_Adr, uchar Mode)
{
	/*~~~~~~~~~*/
	uchar	temp;
	/*~~~~~~~~~*/

	Secnr = Block_Adr / 4;
	MIF_Halt();	                        /* Halt */
	
	temp = Request(RF_CMD_REQUEST_STD);	/* Request */
	
	if(temp != FM1715_OK)
	{
		return(FM1715_REQERR);
	}

	temp = AntiColl();				    /* AntiCol */
	if(temp != FM1715_OK)
	{
		return(FM1715_ANTICOLLERR);
	}

	temp = Select_Card();				/* Select */
	if(temp != FM1715_OK)
	{
		return(FM1715_SELERR);
	}

	temp = Load_keyE2_CPY((Secnr % 16), Mode);		    /* LoadKey */
	if(temp != TRUE)
	{
        return(FM1715_AUTHERR);
	}
	temp = Authentication(UID, Secnr, Mode);	/* Authentication */
	if(temp != FM1715_OK)
	{
		return(FM1715_AUTHERR);
	}

	return FM1715_OK;
}

/****************************************************************/
/*名称: MIF_Initival */
/*功能: 该函数实现MIFARE卡初始化值操作*/
/*输入: buff: 四个字节初始化数值起始地址*/
/* Block_Adr: 块地址*/
/*输出: FM1715_NOTAGERR: 无卡*/
/* FM1715_BYTECOUNTERR: 接收字节错误*/
/* FM1715_NOTAUTHERR: 未经权威认证*/
/* FM1715_EMPTY: 数据溢出错误*/
/* FM1715_CRCERR: CRC校验错*/
/* FM1715_PARITYERR: 奇偶校验错*/
/* FM1715_WRITEERR: 写卡块数据出错*/
/* FM1715_OK: 应答正确*/
/****************************************************************/
uchar MIF_Initival(uchar idata *buff, uchar Block_Adr)
{
	/*~~~~~~~~~~~~~~~~~*/
	uchar idata	temp;
	uchar		i;
	/*~~~~~~~~~~~~~~~~~*/

	for(i = 0; i < 4; i++)
	{
		*(buff + 4 + i) = ~(*(buff + i));
	}

	for(i = 0; i < 4; i++)
	{
		*(buff + 8 + i) = *(buff + i);
	}

	*(buff + 12) = Block_Adr;
	*(buff + 13) = ~Block_Adr;
	*(buff + 14) = Block_Adr;
	*(buff + 15) = ~Block_Adr;
	temp = MIF_Write(buff, Block_Adr);
	return temp;
}

/****************************************************************/
/*名称: HL_Read */
/*功能: 该函数实现高级读命令*/
/*输入: Secnr: 扇区号*/
/* Block_Adr: 块地址*/
/*输出: 操作状态码*/
/* 读出数据存于buffer中*/
/****************************************************************/
uchar HL_Read(uchar idata *buff, uchar Block_Adr, uchar Mode)
{
	/*~~~~~~~~~*/
	uchar	temp;
	/*~~~~~~~~~*/

	temp = HL_Active(Block_Adr, Mode);
	if(temp != FM1715_OK)
	{
		return temp;
	}

	/* Read */
	temp = MIF_READ(buff, Block_Adr);
	if(temp != FM1715_OK)
	{
		return temp;
	}

	return FM1715_OK;
}

/****************************************************************/
/*名称: HL_Write */
/*功能: 该函数实现高级写命令*/
/*输入: buff: 待写入数据的首地址*/
/* Secnr: 扇区号*/
/* Block_Adr: 块地址*/
/*输出:操作状态码*/
/****************************************************************/
uchar HL_Write(uchar idata *buff, uchar Block_Adr, uchar Mode)
{
	/*~~~~~~~~~*/
	uchar	temp;
	/*~~~~~~~~~*/

	temp = HL_Active(Block_Adr, Mode);
	if(temp != FM1715_OK)
	{
		return temp;
	}

	/* Write */
	temp = MIF_Write(buff, Block_Adr);
	if(temp != FM1715_OK)
	{
		return FM1715_WRITEERR;
	}

	return FM1715_OK;
}
#endif

///////////////////////////////////////////////////////////////////////
// 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 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 isr_UART(void) interrupt 4 using 1
{
    unsigned char len, i;
  	unsigned int j=0;
  	
  	if(RI)
	{		
		len=SBUF;
		RI=0;	
		for(i=0;i<len;i++)
		{
			while(!RI)
			{
				j++;
				if(j>1000)
				{
				    break;
				}
			}
			if(j<1000)
			{
				buffer[i]=SBUF;
				RI=0;
				j=0;
			}
			else
			{
			    break;
			}
		}
		if(i==len)
		{
			REN=0;
			CmdValid=1;
		}
	}
	else if(!RI && TI)
	{
		TI=0;
		len=buffer[0];
		for(i=0;i<len+1;i++)
		{
			SBUF=buffer[i];
			while(!TI);
			TI=0;			
		}
		REN=1;
	}
}

///////////////////////////////////////////////////////////////////////
// 系统初始化
///////////////////////////////////////////////////////////////////////
void init(void)
{
	MFRST=0;	
	ET2 = 0; 	
	T2CON = 0x04;		
    PCON = 0x80;                
    SCON = 0x70;                 
    TMOD = 0x21;                //TMOD = 0x22;

	TH1   = BAUD_9600;
	TL1   = TH1;
	TR1   = TRUE;               // 波特率发生器
	
	TH0 = 0x60;
    TL0 = 0x60;
    TR0 = 0;
    
    ET0=0;
	ET1=0;
	EA=1;
	EX0=1;
	IT0 = 1;	
	TR2=0;
 	ES = TRUE;    
	CmdValid=0; 
	
	SPEAKER=0;
	
	delay_10ms(30);
	SPEAKER=1;
	delay_10ms(30);
	SPEAKER=0;
	  
	Init_FM1715(0);                 //初始化成 Type A 格式
}

///////////////////////////////////////////////////////////////////////
// IC卡处理函数
///////////////////////////////////////////////////////////////////////
void cmd_execution(void)
{
	unsigned char cmd,pass_type,temp;
	unsigned char status;
	
	pass_type = 0x60;
	cmd = buffer[0];
	switch(cmd)
	{
		case 1:             // Halt the card     //终止卡的操作
			status=MIF_Halt();			
			buffer[0]=1;
			buffer[1]=status;
			break;			
		case 2:     
        	MIF_Halt();                                     //RF_CMD_REQUEST_ALL     RF_CMD_REQUEST_STD
        	status = Request(RF_CMD_REQUEST_STD);		    /* Request */
        	if(status != FM1715_OK)
        	{
        	    status = Request(RF_CMD_REQUEST_STD);		/* Request */
        	    if(status != FM1715_OK)
        	    {
        	        buffer[0] = 1;
        	        buffer[1] = FM1715_REQERR;
        	        break;
        	    }
        	}
			if(tagtype[0]==2)
				cardtype=mifarepro;     // Mifare Pro 卡
			else if(tagtype[0]==4)
				cardtype=mifare1;       // Mifare One 卡
			else if(tagtype[0]==16)
				cardtype=mifarelight;   // Mifare Light 卡
			else
				cardtype=unknowncard;
			buffer[0]=3;	
			buffer[1]=status;
			buffer[2]=tagtype[0];
			buffer[3]=tagtype[1];
			break;
	    case 3:                                 // 防冲突 读卡的系列号 MLastSelectedSnr
			status = AntiColl();;
			if(status!=FM1715_OK)
			{
				buffer[0]=1;	
				buffer[1]=FM1715_ANTICOLLERR;
				break;
			}
			//memcpy(MLastSelectedSnr,&buffer[2],4);
			buffer[0]=5;
			buffer[1]=status;
			buffer[2]=UID[0];
			buffer[3]=UID[1];
			buffer[4]=UID[2];
			buffer[5]=UID[3];
			break;	
		case 4:		                    // 选择卡 Select Card
			status=Select_Card();
			if(status!=FM1715_OK)
			{
				buffer[0]=1;	
				buffer[1]=FM1715_SELERR;
				break;
			}
			buffer[0]=1;
			buffer[1]=status;			
			break;
        case 6:     
			pass_type = buffer[1];
			status = Load_keyE2_CPY(&buffer[3]);
			if(status != TRUE)
			{
			    buffer[0]=1;
			    buffer[1]=status;
			    break;
        	}
			status = Authentication(UID, buffer[2], buffer[1]);	
        	if(status != FM1715_OK)
        	{
        		buffer[0]=1;
			    buffer[1]=status;
			    break;
        	}
			buffer[0]=1;
			buffer[1]=status;			
			break;	
		case 8:  
			status=MIF_READ(&buffer[2],buffer[1]);
			if(status != FM1715_OK)
			{
			    buffer[0]=1;
			    buffer[1]=status;
			    break;
			}
			else
			{
				if(cardtype==mifare1||cardtype==mifarepro)
					buffer[0]=17;
				else if(cardtype==1)
					buffer[0]=9;
				else
					buffer[0]=16;
			}
			buffer[1]=status;
			break;	
		case 9:
		    status=MIF_Write(&buffer[2],buffer[1]);
			buffer[0]=1;
			buffer[1]=status;			
			break;	
		case 10:
			if(buffer[1] == RF_CMD_INC)
			{
			    status = MIF_Increment(&buffer[3],buffer[2]);
			    MIF_Transfer(buffer[2]);
			}
			else if(buffer[1] == RF_CMD_DEC)
			{
			    status = MIF_Decrement(&buffer[3],buffer[2]);   
			    MIF_Transfer(buffer[2]);
			}
			else
			{
			    status = 1;
			}
			buffer[0]=1;	
			buffer[1]=status;
			break;
		case 12:    
			buffer[0]=1;
			buffer[1]=0;
			break;
		case 14:                                 // 自动寻卡
			status = Request(RF_CMD_REQUEST_STD);
			while(status)
			{
			    status = Request(RF_CMD_REQUEST_STD);
		    }
			if(tagtype[0]==2)
				cardtype=mifarepro;     // Mifare Pro 卡
			else if(tagtype[0]==4)
				cardtype=mifare1;       // Mifare One 卡
			else if(tagtype[0]==16)
				cardtype=mifarelight;   // Mifare Light 卡
			else
				cardtype=unknowncard;
			buffer[0] = 3;	
			buffer[1] = status;
			buffer[2] = tagtype[0];
			buffer[3] = tagtype[1];
			break;
		case 16:
		    temp = Control;
        	temp = temp | (0x10);
        	Control = temp;                     // PowerDown = 1       进入软件掉电模式
		    buffer[0] = 1;	                    // 内部电流消耗模块包括晶振在内关闭
			buffer[1] = 0;
		    break;
		case 17:
		    temp = Control;
        	temp = temp & (0xEF);
        	Control = temp;                     // PowerDown = 0        退出软件掉电模式
		    buffer[0] = 1;	
			buffer[1] = 0;
		    break;
		default:
		    buffer[0] = 1;
		    buffer[1] = 1;
		    break;	
	}
}

void main(void)
{
    unsigned char baud;
    
    init();
    while (1)
    {	
 	    if (CmdValid)
	    {
		    CmdValid = FALSE;
		    if(buffer[0]==11)	    //为了加快相应速度 测试风鸣器
		    {
		    	buffer[2]=buffer[1];
	  	    	buffer[0]=1;         //contact
		    	buffer[1]=0;
		    	CALL_isr_UART();		
		    	SPEAKER=1;
		    	delay_10ms(buffer[2]);
		    	SPEAKER=0;
		    }
	    	else if(buffer[0]==13)   //设置通讯波特率
	    	{
    			switch(buffer[1])
    			{
    				case 0:
	    				baud=BAUD_9600;
	    				break;
	    			case 1:
	    				baud=BAUD_19200;
	    				break;
	    			case 2:
	    				baud=BAUD_38400;
	    				break;
	    			case 3:
	    				baud=BAUD_57600;
	    				break;
	    			default:
	    				baud=BAUD_9600;
	    				break;
	    		}				
	    		buffer[0]=1;	        //contact
	    		buffer[1]=0;
	    		CALL_isr_UART();
	    		delay_10ms(5);			
	    		TR1   = 0;
	    		TH1   = baud;
	    		TL1   = TH1;
	    		delay_10ms(2);
	    		TR1   = TRUE;
	    	}
       		else
    		{
    			cmd_execution();        // 进入IC卡处理程序
    			CALL_isr_UART();
    		}
    	}
    }
}

⌨️ 快捷键说明

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