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

📄 fm1715_test.c

📁 复旦FM1702源码,完整资料,已经编译通过.复旦FM1702的资料几乎就是RC500英文的翻译版
💻 C
📖 第 1 页 / 共 2 页
字号:
}

//********************************************************************
//name:Clear_FIFO
//function: Clear the data in FIFO
//input:N/A
//output: TRUE, FIFO has been cleared
//	 FALSE, FIFO hasn't beend cleared
//********************************************************************
uchar Clear_FIFO(void)
{
	uchar temp;
	uint i;
	
	temp=Control;			//Clear FIFO
	temp=(temp|0x01);
	Control=temp;
	for(i=0;i<RF_TimeOut;i++)   	//检查FIFO是否为空
	{
		temp=FIFO_Length;
		if(temp==0)
		{
			return TRUE;
		}
	}
	return FALSE;
}

//******************************************************************
//name: Write_FIFO
//function: write n bytes to FM1715's FIFO
//input: count , the data's length
//       buff, point to the data that to be writen
//output: N/A
//******************************************************************
void Write_FIFO(uchar count,uchar idata *buff)
{
	uchar i;
	for(i=0;i<count;i++)
	{
		FIFO=*(buff+i);
	}
}

//*****************************************************************
//name: Read_FIFO
//function: read data from FM1715's FIFO
//input: buff, 指向读出数据的指针
//output: N/A
//*****************************************************************
uchar Read_FIFO(uchar idata *buff)
{
	uchar temp;
	uchar i;
	
	temp=FIFO_Length;
	if(temp==0)
	{
		return 0;
	}
	if(temp>=24)			//temp=255,会进入死循环,因此增加FIFO_length越界判断
	{
		temp=24;
	}
	for(i=0;i<temp;i++)
	{
		*(buff+i)=FIFO;
	}
	return temp;
}

//*****************************************************************
//name: MIF_Halt
//function: halt the mifare card
//input: N/A
//output: FM1715_OK : ack succeed
//	 FM1715_PARITYERR: parity verify error
//	 FM1715_CRCERR:	CRC verify error
//	 FM1715_NOTAGERR: na card
//*****************************************************************
uchar MIF_Halt(void)
{
	uchar temp;
	CRCPresetLSB=0x63;
	CWCondundancy=0x03;
	ChannelRedundancy=0x03;
	*buffer=RF_CMD_HALT;
	*(buffer+1)=0x00;
	temp=Command_Send(2,buffer,Transceive);
	if(temp == FALSE)
	{
		return FM1715_OK;
	}
	else
	{
		temp = ErrorFlag;
		if((temp&0x02)==0x02)
		{
			return(FM1715_PARITYERR);
		}
		if((temp&0x04)==0x04)
		{
			return(FM1715_FRAMINGERR);
		}
		return(FM1715_NOTAGERR);
	}
}

//********************************************************************
//name: Load_key_CPY
//function: save E2's password to FM1715's keybuffer
//input: keybuffer: save key to this buffer
//output: TRUE: load key succeed
//	 FLASE: load key fail
//********************************************************************
uchar Load_key_CPY(void)
{
	uchar temp,i;
	uchar ln=0;
	uchar hn=0;
	
	for(i=0;i<6;i++)		//change the key to RC531 format
	{
		ln=keybuffer[i]&0x0f;	//low four bit
		hn=keybuffer[i]>>4;	//high four bit
		buffer[i*2+1]=(~ln<<4)|ln;
		buffer[i*2]=(~hn<<4)|hn;
	}
	temp=Command_Send(12,buffer,LoadKey);
	temp=ErrorFlag&0x40;
	if(temp==0x40)
	{
		return FALSE;
	}
	return TRUE;
}

//***********************************************************************
//name: Request
//function: response the card's request in FM1715's control range
//input: mode: ALL(monitor card in FM1715 control range)
//       STD:(monitor the halt card in FM1715's control range)
//output: FM1715_NOTAGERR: no card
//  	  FM1715_OK: ack succeed 
//	  FM1715_REQERR: ack error
//************************************************************************
uchar Request(uchar mode)
{
	uchar temp;
	TxControl=0x58;
	delay(1);
	TxControl=0x5b;
	CRCPresetLSB=0x63;
	CWConductance=0x3f;
	buffer[0]=mode;		//select Request mode
	Bit_Fram=0x07;		//send 7 bit
	ChannelRedundancy=0x03;	//closed CRC
	TxControl=0x5b;
	Control=0x01;		//mask CRYPT01 bit
	temp=Command_Send(1,buffer,Transceive);
	if(temp==FALSE)
	{
		return FM1715_NOTAGERR;
	}

	Read_FIFO(buffer);	//read ack information from FIFO
	tagtype[0]=buffer[0];
	tagtype[1]=buffer[1];
	
	return FM1715_OK;
}

//**************************************************************************
//name: AntiColl(void)
//function: anticollision for the card in FM1715's control range
//input: N/A
//output: FM1715_NOTAGERR: no card
//	  FM1715_BYTECOUNTERR: receive byte error
//	  FM1715_SERNRERR: card's serial ack error
//	  FM1715_OK: card ack succeed
//**************************************************************************
uchar AntiColl(void)
{
	uchar temp;
	uchar i;
	uchar row,col;
	uchar pre_row;
	
	row=0;
	col=0;
	pre_row=0;

	CRCPresetLSB=0x63;
	CWConductance=0x3f;
	ModConductance=0x3f;
	buffer[0]=RF_CMD_ANTICOL;
	buffer[1]=0x20;
	ChannelRedundancy=0x03;				//closed CRC,start parity
	temp=Command_Send(2,buffer,Transceive);
	
	while(1)
	{
		if(temp==0)
		{
			return FM1715_BYTECOUNTERR;
		}			??????????????????????????
		Read_FIFO(buffer);
		Save_UID(row,col,temp);		//save UID to UID array
		Show_UID();			//show UID
		temp=ErrorFlag;			//
		temp=temp&0x01;
		if(temp==0x00)
		{
			temp=Check_UID();
			if(temp==FALSE)
			{
				return(FM1715_SERNRERR);
			}
			return(FM1715_OK);
		}
		else
		{
			temp=CollPos;		//read collision register
			row=temp/8;
			col=temp%8;
			buffer[0]=RF_CMD_ANTICOL;	//set the count that the data to be sent
			pre_row=pre_row+row;
			for(i=0;i<pre_row+1;i++)
			{
				buffer[i+2]=UID[i];
			}
			if(col!=0x00)
			{
				row=pre_row+1;
			}
			else
			{
				row=pre_row;
			}
			temp=Command_Send(row+2,buffer,Transceive);
		}
	}
}

//********************************************************************
//name: Select_Card
//function: Select the card in FM1715 control range
//input: N/A
//output: FM1715_NOTAGERR:no card
//	  FM1715_PARITYERR:parity error
//	  FM1715_CRCERR: CRC verify error
//	  FM1715_BTECOUNTERR: Receive byte error
//	  FM1715_OK: ack succeed
//	  FM1715_SELERR: select error
//*********************************************************************
uchar Select_Card(void)
{
	uchar temp,i;
	
	CRCPresetLSB=0x63;
	CWConductanc=0x3f;
	buffer[0]=RF_CMD_SELECT;
	buffer[1]=0x70;
	for(i=0;i<5;i++)
	{
		buffer[i+2]=UID[i];
	}
	ChannelRedundancy=0x0f;
	temp=Command_Send(7,buffer,Transceive);
	
	if(temp==FALSE)
	{
		return(FM1715_NOTAGERR):
	}
	else
	{
		temp=ErrorFlag;
		if((temp&0x02)==0x02)
			return(FM1715_PARITYERR);
		if((temp&0x04)==0x04)
			return(FM1715_FRAMINGERR);
		if((temp&0x08)==0x08)
			return(FM1715_CRCERR);
	
		temp=FIFO_Length;
		if(temp!=1)
			return(FM1715_BYTECOUTNERR);
		Read_FIFO(buffer);			//Read FIFO information
		temp=*buffer;
		if((temp!=0)				//check ack signal
			return(FM1715_OK);
		else
			return(FM1715_SELERR);
	}
}

//*************************************************************************
//name:Authentication
//function: password autherntication
//input: UID: card serial address
//	SecNR: sector number
//	mode: mode
//output: FM1715_NOTAGERR: no card
//	  FM1715_PARITYERR:parity error
//	  FM1715_CRCERR: CRC error
//	  FM1715_OK: ack succeed 
//	  FM1715_AUTHERR: authentication error
//**************************************************************************
uchar Authenticatoin(uchar idata *UID,uchar SecNR, uchar mode)
{
	uchar idata i;
	uchar idata temp,temp1;
	
	CRCPresetLSB=0x63;
	CWCondunctance=0x3f;
	ModConductance=0x3f;
	temp1=Control
	temp1=temp1&0xf7;
	Control=temp1;
	
	if(mode==1)				//authentication
		buffer[0]=RF_CMD_AUTH_LB;
	else
		buffer[0]=RF_CMD_AUTH_LA;
	buffer[1]=SecNR*4 +3;
	for(i=0;i<4;i++)
	{
		buffer[2+i]=UID[i];
	}
	ChannelRedundancy=0x0f;			//start crc,parity verify
	temp=Command_Send(6,buffer,Authent1);
	if(temp==FALSE)
	{
		return FM1715_NOTAGERR;
	}
	temp=ErrorFlag;
	if((temp&0x02)==0x02)
		return FM1715_PARITY;
	if((temp&0x04)==0x04)
		return FM1715_FRAMINGERR;
	if((temp&0x08)==0x08)
		return FM17115_CRCERR;
	
	temp=Command_Send(0,buffer,Authent2);		//Authent2
	if(temp==FALSE)
	{
		return FM1715_NOTAGERR;
	}
	temp=ErrorFlag;
	if((temp&0x02)==0x02)
		return FM1715_PARITYERR;
	if((temp&0x04)==0x04)
		return FM1715_FRAMINGERR;
	if((temp&0x08)==0x08)
		return FM1715_CRCERR;
	temp1=Control;
	temp1=temp1&0x08;
	if(temp1==0x08)
	{
		return FMf1715_OK;
	}
	return FM1715_AUTHERR;
}

//*********************************************************************
//name:MIF_Read
//fucntion: read Mifare card block value
//input:buff: buffer headaddress
//	Block_Adr: Block address
//output: FM1715_NOTAGERR: no card
//	  FM1715_PARITYERR: parity error
//	  FM1715_CRCERR: CRC verify error
//	  FM1715_BYTECOUNTERR: receive error
//	  FM1715_OK: Ack succeed
//**********************************************************************
uchar MIF_READ(uchar idata *buff,uchar Block_Adr)
{
	uchar idata temp;
	
	CRCPresetLSB=0x63;
	CWConductance=0x3f;
	ModConductance=0x3f;
	ChannelRedundancy=0x0f;
	//Int_Req=0x7f;
	
	buff[0]=RF_CMD_READ;
	buff[1]=Block_Adr;
	temp=Command_Send(2,buff,Transceive)(;
	if(temp==0)
	{
		return FM1715_NOTAGERR;
	}
	temp=ErrorFlag;
	if((temp&0x02)==0x02) return FM1715_PARITYERR;
	if((temp&0x04)==0x04) return FM1715_FRAMINGERR;
	if((temp&0x08==0x08) return FM1715_CRCERR;
	temp=FIFO_Length;
	if(temp==0x10)			//8k card read data length is 16
	{
		Read_FIFO(buff);	
		return FM1715_OK;
	}
	else if(temp==0x04)		//Token card read data length is 16
	{
		Read_FIFO(buff);
		return FM1715_OK;
	}
	else
	{
		return FM1715_BYTECOUNTERR;
	}
}

//***********************************************************************
//name: MIF_Write
//function: write data to Mifare card's block
//input: buff: buffer headaddress
//	Block_Adr:Block address
//output: FM1715_NOTAGERR: no card
//	  FM1715_BYTECOUNTERR: receive byte error
//	  FM1715_NOTAUTHERR: not authentication
//	  FM1715_EMPTY: data overflow error
//	  FM1715_CRCERR: CRC verify error
//	  FM1715_PARITYERR: parity verify erro
//	  FM1715_WRITEERR: write block error
//	  FM1715_OK: ack succeed
//*************************************************************************
uchar 

⌨️ 快捷键说明

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