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

📄 fm1715.c

📁 射频读卡芯片FM1715的C驱动程序。实现对FM1715初始化操作;实现对FM1715操作的总线方式(并行总线,SPI)选择;该函数实现从FM1715的EEPOM中读出数据等功能函数
💻 C
📖 第 1 页 / 共 3 页
字号:
	//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 = ErrorFlagR;
	if ((temp & 0x02) == 0x02) return FM1715_PARITYERR;
	if((temp & 0x04) == 0x04) return FM1715_FRAMINGERR;
	if ((temp & 0x08) == 0x08) return FM1715_CRCERR;
	temp = FIFO_LengthR;
	if (temp == 0x10) //8K卡读数据长度为16
	{
		Read_FIFO(buff);
		return FM1715_OK;
	}
	else if (temp == 0x04) //Token 卡读数据长度为16
	{
		Read_FIFO(buff);
		return FM1715_OK;
	}
	else
	{
		return FM1715_BYTECOUNTERR;
	}
}


//第 39 页 共 52 页
//5.4.8 WRITE
//****************************************************************
//*名称: MIF_Write 
//*功能: 该函数实现写MIFARE 卡块的数值 
//*输入: buff: 缓冲区首地址 
//* Block_Adr: 块地址 
//*输出: FM1715_NOTAGERR: 无卡 
//* FM1715_BYTECOUNTERR: 接收字节错误 
//* FM1715_NOTAUTHERR: 未经权威认证 
//* FM1715_EMPTY: 数据溢出错误 
//* FM1715_CRCERR: CRC 校验错 
//* FM1715_PARITYERR: 奇偶校验错 
//* FM1715_WRITEERR: 写卡块数据出错 
//* FM1715_OK: 应答正确 
//****************************************************************
uchar MIF_Write(uchar idata *buff,uchar Block_Adr)
{
	uchar idata temp;
	uchar idata *F_buff;
	CRCPresetLSBW(0x63);
	CWConductanceW(0x3f);
	F_buff = buff + 0x10;
	ChannelRedundancyW(0x07);
	*F_buff = RF_CMD_WRITE;
	*(F_buff + 1) = Block_Adr;
	temp = Command_Send(2, F_buff, Transceive);
	if (temp == FALSE)
	{
		return(FM1715_NOTAGERR);
	}
	temp = FIFO_LengthR;
	if (temp == 0)
	{
		return(FM1715_BYTECOUNTERR);
	}
	Read_FIFO(F_buff);
	temp = *F_buff;
	switch (temp)
	{
		case 0x00 :
			return(FM1715_NOTAUTHERR); //暂时屏蔽掉写错误
		case 0x04:
			return(FM1715_EMPTY);
		case 0x0a:
			break;
		case 0x01:
			return(FM1715_CRCERR);
//第 40 页 共 52 页
		case 0x05:
			return(FM1715_PARITYERR);
		default:
			return(FM1715_WRITEERR);
	}
	temp = Command_Send(16, buff, Transceive);
	if (temp == TRUE)
	{
		return(FM1715_OK);
	}
	else
	{
		temp = ErrorFlagR;
		if ((temp & 0x02)==0x02)
			return(FM1715_PARITYERR);
		else if((temp & 0x04)==0x04)
			return(FM1715_FRAMINGERR);
		else if ((temp & 0x08)==0x08)
			return(FM1715_CRCERR);
		else
			return(FM1715_WRITEERR);
	}
}



//第 49 页 共 52 页
//六、例程
//注意:在下列操作前,应先将获取的密钥(6 字节)存放于keybuffer[ ]缓冲区中。
//6.1 卡片触发
//****************************************************************
//*名称: HL_Active 
//*功能: 该函数实现高级MIFARE 卡激活命令 
//*输入: Mode: 认证模式  =0表示用密码A认证,=1表示用密码B认证
//* 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);
	}
	Load_key_CPY(); //LoadKey
//	Load_keyE2_CPY((Secnr%16), Mode); //LoadKey
	temp = Authentication(UID, Secnr, Mode);//Authentication
	if(temp != FM1715_OK)
	{
		return(FM1715_AUTHERR);
	}
	return FM1715_OK;
}



//第 51 页 共 52 页
//6.3 读卡
//***************************************************************
//*名称: HL_Read 
//*功能: 该函数实现高级读命令 
//*输入: Mode: 认证模式  =0表示用密码A认证,=1表示用密码B认证
//* 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;
}


//第 52 页 共 52 页
//6.4 写卡
//****************************************************************
//*名称: HL_Write 
//*功能: 该函数实现高级写命令 
//*输入: buff: 待写入数据的首地址 
//* Mode: 认证模式  =0表示用密码A认证,=1表示用密码B认证
//* 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;
}

//*************************************************************************************************
//以下是比较少用的命令子程序


//第 41 页 共 52 页
//5.4.9 INCREMENT
//****************************************************************
//*名称: MIF_Increment 
//*功能: 该函数实现MIFARE 卡自动增值操作 
//*输入: buff: 四个字节数值起始地址 
//* Block_Adr: 块地址 
//*输出: FM1715_NOTAGERR: 无卡 
//* FM1715_BYTECOUNTERR: 接收字节错误 
//* FM1715_NOTAUTHERR: 未经权威认证 
//* FM1715_EMPTY: 数据溢出错误 
//* FM1715_CRCERR: CRC 校验错 
//* FM1715_PARITYERR: 奇偶校验错 
//* FM1715_INCRERR: 卡片增款操作失败 
//* FM1715_OK: 应答正确 
//****************************************************************
uchar MIF_Increment(uchar idata *buff,uchar Block_Adr)
{
	uchar temp;
	uchar idata *F_buff;
	CRCPresetLSBW(0x63);
	CWConductanceW(0x3f);
	F_buff = buff + 4;
	*F_buff = RF_CMD_INC;
	*(F_buff + 1) = Block_Adr;
	ChannelRedundancyW(0x07);
	temp = Command_Send(2, F_buff, Transceive);
	if (temp == FALSE)
	{
		return FM1715_NOTAGERR;
	}
	temp = FIFO_LengthR;
	if (temp == 0)
	{
		return FM1715_BYTECOUNTERR;
	}
	Read_FIFO(F_buff);
	temp = *F_buff;
	switch(temp)
	{
		case 0x00 :
		//break;
			return(FM1715_NOTAUTHERR); //暂时屏蔽掉写错误
		case 0x04:
			return(FM1715_EMPTY);
		case 0x0a:
			break;
		case 0x01:
//第 42 页 共 52 页
			return(FM1715_CRCERR);
		case 0x05:
			return(FM1715_PARITYERR);
		default:
			return(FM1715_INCRERR);
	}
	temp = Command_Send(4, buff, Transmit);
	if (temp == FALSE)
	{
		return FM1715_INCRERR;
	}		
	return FM1715_OK;
}


//第 43 页 共 52 页
//5.4.10 DECREMENT
//****************************************************************
//*名称: MIF_Decrement 
//*功能: 该函数实现MIFARE 卡自动减值操作 
//*输入: buff: 四个字节数值起始地址 
//* Block_Adr: 块地址 
//*输出: FM1715_NOTAGERR: 无卡 
//* FM1715_BYTECOUNTERR: 接收字节错误 
//* FM1715_NOTAUTHERR: 未经权威认证 
//* FM1715_EMPTY: 数据溢出错误 
//* FM1715_CRCERR: CRC 校验错 
//* FM1715_PARITYERR: 奇偶校验错 
//* FM1715_DECRERR: 卡片扣款操作失败 
//* FM1715_OK: 应答正确 
//****************************************************************
uchar MIF_Decrement(uchar idata *buff,uchar Block_Adr)
{
	uchar temp;
	uchar idata *F_buff;
	CRCPresetLSBW(0x63);
	CWConductanceW(0x3f);
	F_buff = buff + 4;
	*F_buff = RF_CMD_DEC;
	*(F_buff + 1) = Block_Adr;
	ChannelRedundancyW(0x07);
	temp = Command_Send(2, F_buff, Transceive);
	if (temp == FALSE)
	{
		return FM1715_NOTAGERR;
	}
	temp = FIFO_LengthR;
	if (temp == 0)
	{
		return FM1715_BYTECOUNTERR;
	}
	Read_FIFO(F_buff);
	temp = *F_buff;
	switch (temp)
	{
		case 0x00 :
		//break;
			return(FM1715_NOTAUTHERR); //暂时屏蔽掉写错误
		case 0x04:
			return(FM1715_EMPTY);
		case 0x0a:
			break;
		case 0x01:
//第 44 页 共 52 页
			return(FM1715_CRCERR);
		case 0x05:
			return(FM1715_PARITYERR);
		default:
			return(FM1715_DECRERR);
	}
	temp = Command_Send(4, buff, Transmit);
	if (temp == FALSE)
	{
		return(FM1715_DECRERR);
	}
	return FM1715_OK;
}


//第 45 页 共 52 页
//5.4.11 RESTORE
//****************************************************************
//*名称: MIF_Restore 
//*功能: 该函数实现MIFARE 卡自动恢复,备份操作 
//*输入: Block_Adr: 块地址 
//*输出: FM1715_NOTAGERR: 无卡 
//* FM1715_BYTECOUNTERR: 接收字节错误 
//* FM1715_NOTAUTHERR: 未经权威认证 
//* FM1715_EMPTY: 数据溢出错误 
//* FM1715_CRCERR: CRC 校验错 
//* FM1715_PARITYERR: 奇偶校验错 
//* FM1715_RESTERR: 卡片恢复,备份操作失败 
//* FM1715_OK: 应答正确 
//****************************************************************
uchar MIF_Restore(uchar Block_Adr)
{
	uchar temp,i;
	CRCPresetLSBW(0x63);
	CWConductanceW(0x3f);
	ChannelRedundancyW(0x07);
	*buffer = RF_CMD_RESTORE;
	*(buffer + 1) = Block_Adr;
	temp = Command_Send(2, buffer, Transceive);
	if (temp == FALSE)
	{
		return FM1715_NOTAGERR;
	}
	temp = FIFO_LengthR;
	if (temp == 0)
	{
		return FM1715_BYTECOUNTERR;
	}
	Read_FIFO(buffer);
	temp = *buffer;
	switch (temp)
	{
		case 0x00 :
		//break;
			return(FM1715_NOTAUTHERR); //暂时屏蔽掉写错误
		case 0x04:
			return(FM1715_EMPTY);
		case 0x0a:
			break;
		case 0x01:
			return(FM1715_CRCERR);
		case 0x05:
			return(FM1715_PARITYERR);
//第 46 页 共 52 页
		default:
			return(FM1715_RESTERR);
	}
	for (i = 0; i < 4; i++)
		buffer[i] = 0x00;
	temp = Command_Send(4, buffer, Transmit);
	if (temp == FALSE)
	{
		return FM1715_RESTERR;
	}
	return FM1715_OK;
}


//第 47 页 共 52 页
//5.4.12 TRANSFER
//****************************************************************
//*名称: MIF_Transfer 
//*功能: 该函数实现MIFARE 卡电子钱包保存操作 
//*输入: Block_Adr: 块地址 
//*输出: FM1715_NOTAGERR: 无卡 
//* FM1715_BYTECOUNTERR: 接收字节错误 
//* FM1715_NOTAUTHERR: 未经权威认证 
//* FM1715_EMPTY: 数据溢出错误 
//* FM1715_CRCERR: CRC 校验错 
//* FM1715_PARITYERR: 奇偶校验错 
//* FM1715_TRANSERR: 卡片恢复,备份操作失败 
//* FM1715_OK: 应答正确 
//****************************************************************
uchar MIF_Transfer(uchar Block_Adr)
{
	uchar temp;
	CRCPresetLSBW(0x63);
	CWConductanceW(0x3f);
	ChannelRedundancyW(0x07);
	buffer[0] = RF_CMD_TRANSFER;
	buffer[1] = Block_Adr;
	temp = Command_Send(2, buffer, Transceive);
	if (temp == FALSE)
	{
		return FM1715_NOTAGERR;
	}
	temp = FIFO_LengthR;
	if (temp == 0)
	{
		return FM1715_BYTECOUNTERR;
	}
	Read_FIFO(buffer);
	temp = *buffer;
	switch (temp)
	{
		case 0x00 :
			//break;
			return(FM1715_NOTAUTHERR); //暂时屏蔽掉写错误
		case 0x04:
			return(FM1715_EMPTY);
		case 0x0a:
			return(FM1715_OK);
		case 0x01:
			return(FM1715_CRCERR);
		case 0x05:
			return(FM1715_PARITYERR);
//第 48 页 共 52 页
		default:
			return(FM1715_TRANSERR);
	}
}



//第 50 页 共 52 页
//6.2 INITVAL VALUE
//****************************************************************
//*名称: 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;
}



//第 25 页 共 47 页
//5.3.5 向FM1715的EEPROM中写入数据
//****************************************************************
//*名称: Write_E2 
//*功能: 该函数实现向FM1715的EE中写入数据 
//*输入: lsb, EE地址(低字节) 
//* msb, EE地址(高字节) 
//* count, 待写入数据EE的字节个数 
//* buff, 指向待写入数据的指针 
//*输出: TRUE, EE数据正确写入 
//* FALSE, EE数据写入有误 
//****************************************************************
uchar Write_E2(uchar lsb,uchar msb,uchar count,uchar idata *buff)
{
	uchar i;
	for(i = 0;i < count; i++)
	{
		*(buff + count - i + 2) = *(buff - i + count);
	}		
	*buff = lsb;
	*(buff + 1) = msb;
	if(Command_Send(count + 2, buff, WriteE2)==TRUE)
	{
		if((SecondaryStatusR & 0x40)==0x40)
			return TRUE;
	}
	return FALSE;
}

*/


//5.3.4 读FM1715中的EEPROM数据
//****************************************************************
//*名称: Read_E2 
//*功能: 该函数实现从FM1715的EE中读出数据 
//*输入: lsb, EE地址(低字节) 
//* msb, EE地址(高字节) 
//* count, 待读出数据EE的字节个数 
//* buff, 指向待读出数据的指针 
//*输出: TRUE, EE数据正确读出 
//* FALSE, EE数据读出有误 
//****************************************************************
/*
uchar Read_E2(uchar lsb,uchar msb,uchar count,uchar *buff)
{
	uchar temp;

	*buff=lsb;
	*(buff+1)=msb;
	*(buff+2)=count;
	temp=Command_Send(3,buff,ReadE2);
	if(temp==TRUE)
	{
		Read_FIFO(buff,4);	   //LJL 050415
		return(TRUE);
	}
	return(FALSE);
}
*/

⌨️ 快捷键说明

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