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

📄 fm1715_test.c

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

//常量定义
#define FALSE  0
#define TRUE   1

#FM1715命令码

#define Transceive 	0x1E	//发送接收命令
#define Transmit   	0x1A	//发送命令
#define ReadE2     	0x03   	//读取FM1715 EEPROM命令
#define WriteE2    	0x01   	//写FM1715 EEPROM命令
#define Authent1   	0x0c   	//验证命令认证过程第1步
#define Authent2   	0x14   	//验证命令认证过程第2步
#define LoadKeyE2  	0x0B   	//将密钥从EEPROM复制到KEY缓存
#define LoadKey    	0x19   	//将密钥从FIFO memory复制到key memory

#define RF_TimeOut 	0xfff  	//send command delay 
#define Req        	0x01   
#define Sel	   	0x02

//Define data type
#define uchar unsigned char
#define uint  unsigned int

//Define card type
#define TYPEA_MODE	0	//type A mode
#define TYPEB_MODE	1	//type B mode
#define SHANGHAI_MODE	2	//shanghai mode

#define TM0_HIGH	0xf0	//timer0 high bit,4ms setting
#define TM0_LOW		0x60    //timer0 low bit
#define TIMEOUT		100	//Timer out ,4ms x100 =0.4s

//RF communication command 
#define	RF_CMD_REQUEST_STD	0x26
#define	RF_CMD_REQUEST_ALL	0x52
#define	RF_CMD_ANTICOL		0x93	//?????
#define	RF_CMD_SELECT		0x93	//?????
#define	RF_CMD_AUTH_LA		0x60
#define	RF_CMD_AUTH_LB		0x61
#define	RF_CMD_READ		0x30
#define	RF_CMD_WRITE		0xA0
#define	RF_CMD_INC		0xC1
#define	RF_CMD_DEC		0xC0
#define	RF_CMD_RESTORE		0xC2
#define	RF_CMD_TRANSFER		0xb0
#define	RF_CMD_HALT		0x50

//status Values
#define ALL			0x01
#define KEYB			0x04
#define KEYA			0x00
#define _AB			0x40	
#define CRC_A			1
#define CRC_B			2

#define CRC_OK			0
#define CRC_ERR			1

#define BBC_OK			0
#define BBC_ERR			1

//******************  Define Card Type *****************************
#define MIFARE_8K		0	// Mifare series 8KB card
#define MIFARE_TOKEN		1	// Mifare series 1KB TOKEN card
#define SHANGHAI_8K		2	// shanghai standard 8KB card
#define SHANGHAI_TOKEN		3	// shanghai standard 1KB TOKEN card

//******************  Function error code **************************
#define FM1715_OK		0	// Right
#define FM1715_NOTAGERR		1	// No card
#define FM1715_CRCERR		2	// card CRC error
#define FM1715_EMPTY		3	// data overflow error
#define FM1715_AUTHERR		4	// card Auth error
#define FM1715_PARITYERR	5	// card Parity error
#define FM1715_CODEERR		6	// card communication error(BCC verify error)

#define FM1715_SERNRERR		8	// card serieal number error(anti-collision error)
#define FM1715_SELECTERR	9	// card data length error(select error)
#define FM1715_NOTAUTERRR	10	// card didnt pass athu
#define FM1715_BITCOUNTER	11	// Received bit counter error
#define FM1715_BYTECOUNTERR	12	// Received byte counter error
#define FM1715_RESTERR		13	// calling restore function error
#define FM1715_TRANSERR		14	// calling transfer function error
#define FM1715_WRITEERR		15	// calling write function error
#define FM1715_INCRERR		16	// calling increment function error
#define FM1715_DECRERR		17	// calling Decrement function error
#define FM1715_READERR		18	// calling read function error
#define FM1715_LOADKEYERR	19	// calling LOADKEY function error
#define FM1715_FRAMINGERR	20	// FM1715 Framing error
#define FM1715_REQERR		21	// calling Req function error
#define FM1715_SELERR		22	// calling Sel function error
#define FM1715_ANTICOLLERR	24	// calling anticoll function error
#define FM1715_INITVALERR	25	// calling init function error          与资料上有所改动
#define FM1715_READVALERR	26	// calling 高级读块值 function error
#define FM1715_DESELECTERR	27	// 
#define FM1715_CMD_ERR		28	// command error

//*************************** FM1715 Address define *******************
#define Page_Sel		XBYTE[0x7000]	//Page write register
#define Command			XBYTE[0x7001]	//Command register
#define FIFO			XBYTE[0x7002]	//64 bytes FIFO register
#define PrimaryStatus		XBYTE[0x7003]	//Sender,Receiver , FIFO status register
#define FIFO_Length		XBYTE[0x7004]	//Current FIFO byte count register	
#define SecondaryStatus		XBYTE[0x7005]	//each status register
#define InterruptEn		XBYTE[0x7006]	//Interrupt Enable/Disable register
#define Int_Req			XBYTE[0x7007]	//Int request flag register

#define Control 		XBYTE[0x7009]	//Control register
#define ErrorFlag		XBYTE[0x700A]	//Error Status register
#define CollPos			XBYTE[0x700B]   //Collision Detect register
#define TimerValue		XBYTE[0x700C]   //Current timer value

#define Bit_Frame		XBYTE[0x700F]   //bit frame adjust register

#define TxControl		XBYTE[0x7011]   //Transmit control register
#define CWConductance		XBYTE[0x7012]   //Select TX1 and TX2 发射天线 Impedence
#define ModConductance		XBYTE[0x7013]   //output driver impedence
#define CoderControl		XBYTE[0x7014]   //coder mode and clock frequency

#define TypeBFraming		XBYTE[0x7017]   //ISO14443B Framing format
#define DecoderControl		XBYTE[0x701a]   //Decoder control register
#define Rxcontrol2		XBYTE[0x701e]   //Decoder control and select receive source

#define RxWait			XBYTE[0x7021]   //select transmit and receive interval
#define ChannelRedundancy	XBYTE[0x7022]   //RF channel detect mode setting register
#define CRCPresetLSB		XBYTE[0x7023]   
#define CRCPresetMSB		XBYTE[0x7024]  
#define MFOUTSelect		XBYTE[0x7026]   //mfOUT configure register

#define TimerClock		XBYTE[0x702a]   //timer cycle setting register
#define TimerControl		XBYTE[0x702b]   //timer control register
#define TimerReload		XBYTE[0x702C]   //Timer init value register

#define TypeSH			XBYTE[0x7031]   //shanghai standard select register
#define TestDigiSelect		XBYTE[0x703d]   //Test pin configure register
#endif

sbit MFRST=P1^0;				//FM1715 Reset pin
uchar idata readdata[6]		_at_ 0x0040;	//Read/write memory
uchar idata value[4]		_at_ 0x0050;	//Inc/Dec value
uchar idata KeySet;				//password type
uchar idata tagtype[2]		_at_ 0x0096;	//card indentify character

//***************************** FM1715 varialbe define *********************
uchar idata PRO_SendBuf[16]	_at_ 0x0080;	//Send buffer
uchar idata PRO_RecvBuf[16]	_at_ 0x0080;	//Receive buffer
uchar idata buffer[24]		_at_ 0x0060;	//FM1715 command send/receive buffer
uchar idata UID[5]		_at_ 0x007a;	//User ID
uchar idata Secnr		_at_ 0x0090;	//sector number
uchar idata keybuffer[6];			//key save buffer



//**********************************************************
//Name: Check_UID
//function: check card UID
//input: N/A
//output:	TRUE  UID right
//		FALSE UID error
//**********************************************************'
uchar Check_UID(void)
{
	uchar temp;
	uchar i;
	
	temp=0x00;
	for(i=0;i<5;i++)
	{
		temp=temp^UID[i];
	}
	if(temp==0)
	{
		return TRUE;
	}
	return FALSE;
}

//*******************************************************************
//name:Save_UID
//function: This function sae card's serial number
//input:  row : coflict row
//	  col : coflict line
//	length: the length of received UID data
//output:  N/A
//*******************************************************************
void Save_UID(uchar row,uchar col,uchar length)
{
	uchar i;
	uchar temp;
	uchar temp1;

	if((row == 0x00)&&(col==0x00))
	{
		for(i=0;i<length;i++)
		{
			UID[i]=buffer[i];
		}
	}
	else
	{
		temp=buffer[0];
		temp1=UID[row-1];
		switch(col)
		{
			case 0:
			temp1=0x00;
			row=row+1;
			break;
			case 1:
			temp=temp&0xFE;
			temp1=temp1&0x01;
			break;
			case 2:
			temp=temp&0xFC;
			temp1=temp1&0x03;
			break;
			case 3:
			temp=temp&0xF8;
			temp1=temp1&0x07;
			break;
			case 4:
			temp=temp&0xF0;
			temp1=temp1&0x0F;
			break;
			case 5:
			temp=temp&0xE0;
			temp1=temp1&0x1F;
			break;
			case 6:
			temp=tmep&0xC0;
			temp1=temp1&0x3F;
			break;
			case 7:
			temp=temp&0x80;
			temp1=temp1&0x7F;
			break;
			default:
			break;
		}
		buffer[0]=temp;
		UID[row-1]=temp1|temp;
		for(i=1;i<length;i++)
		{
			UID[row-1+i]=buffer[i];
		}
	}
}

//*************************************************************
//name: Set_BitFraming
//function: set the byte that ready to send
//input: row : conflict row
//	 col : conflict col
//ouput: N/A
//*************************************************************
void Set_BitFraming(uchar row,uchar col)
{
	switch(row)
	{
		case 0:
		buffer[1]=0x20;
		break;
		case 1:
		buffer[1]=0x30;
		break;
		case 2:
		buffer[1]=0x40;
		break;
		case 3:
		buffer[1]=0x50;
		case 4:
		buffer[1]=0x60;
		break;
		default:
		break;
	}
	
	switch(col)
	{
		case 0:
		Bit_Frame=0x00;
		break;
		case 1:
		Bit_Frame=0x11;
		buffer[1]=(buffer[1]|0x01);
		break;
		case 2:
		Bit_Frame=0x22;
		buffer[1]=(buffer[1]|0x02);
		break;
		case 3:
		Bit_Frame=0x33;
		buffer[1]=(buffer[1]|0x03);
		break;
		case 4:
		Bit_Frame=0x44;
		buffer[1]=(buffer[1]|0x04);		
		break;
		case 5:
		Bit_Frame=0x55;
		buffer[1]=(buffer[1]|0x05);		
		break;
		case 6:
		Bit_Frame=0x66;
		buffer[1]=(buffer[1]|0x06);		
		break;
		case 7:
		Bit_Frame=0x77;
		buffer[1]=(buffer[1]|0x057);		
		break;
		default:
		break;
	}
}

//************************************************************
//name: FM1715_Bus_Sel
//function: this function select FM1715 control bus?
//input: N/A
//output: TRUE, select bus succeed
//	 FALSE, select bus fail
//************************************************************
uchar FM1715_Bus_Sel(void)
{
	uchar i;
	Page_Sel=0x80;			
	
	for(i=0;i<RF_TimeOut;i++)
	{
		if(Command==0x00)
		{
			Page_Sel=0x00;
			return TRUE;
		}
	}
	return FALSE;
}

//********************************************************
//name: Init_FM1715
//function: Init FM1715
//input: mode: 	0 -->TYPEA mode
//	 	1 -->TYPEB mode
//		2 -->shanghai mode
//ouput: N/A
//*********************************************************
void Init_FM1715(uchar mode)
{
	uchar idata temp;
	uint i;
	
	MFRST=1;		//Reset FM1715
	for(i=0;i<0x1fff;i++)
	{
		_nop_();
	}
	MFRST=0;
	for(i=0;i<0x1fff;i++)
	{
		_nop_();
	}
	
	while(Command!=0)		//waiting command=0, FM1715 Reset succeed
	{
		_nop_();
	}

	FM1715_Bus_Sel();		//Select FM1715 bus
	TimerClock=0x0b;		//151us/per
	TimerControl=0x02;		//send complete, start timer, recieve start ,stop timer
	TimerReload=0x42;		//10ms interval
	InterruptEn=0x7f;		//Close all interrupt
	temp=InterruptEn;
	Int_Req=0x7f;
	MFOUTSelect=0x02;		//for debug
	TxControl=0x5b;			//start TX1,TX2
	if(mode==SHANGHAI_MODE)		//shanghai mode
	{
		TypeSH=0x01;
	}
	else
	{
		TypeSH=0x00;
	}

	if(mode==TYPEB_MODE)
	{
		CoderControl=0x20;
		TypeBFraming=0x05;
		DecoderControl=0x19;
		ChannelRedundancy=0x24;
		TxControl=0x4b;
		CWConductance=0x3f;
		ModConductance=af;			??????这里是否有问题
	}
}

//******************************************************************
//name: Command_Send
//function: send command to FM1715
//input: count, the length of command
//	 buff, point to the data that ready to send
//	 Comm_Set, command code
//output: TRUE ,  running command succeed
//	  FALSE,  running command error
//******************************************************************
uchar Command_Send(uchar count,uchar idata *buff,uchar Comm_Set)
{
	uint j;
	uchar idata temp,temp1;
	Command=0x00;
	Clear_FIFO();
	Write_FIFO(count,buff);
	temp=MFOUTSelect;
	Command=Comm_Set;		//running command
	for(j=0;j<RF_TimeOut;j++)
	{
		temp=MFOUTSelect;
		temp=Command;
		temp1=Int_Req&0x80;
		if((temp==0x00)||(temp1==0x80))
		{
			return TRUE;
		}
	}
	return FALSE;

⌨️ 快捷键说明

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