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

📄 fm1702.c

📁 用c51驱动fm1702sl
💻 C
📖 第 1 页 / 共 3 页
字号:
	pre_row = 0;	write_reg(0x23,0x63);	write_reg(0x12,0x3f);	write_reg(0x13,0x3f);	buffer[0] = RF_CMD_ANTICOL;	buffer[1] = 0x20;	write_reg(0x22,0x03);	        /* 关闭CRC,打开奇偶校验 */	temp = Command_Send(2, buffer, Transceive);	while(1)	{		if(temp == FALSE)		{			return(FM1715_NOTAGERR);		}		temp = read_reg(0x0A);		temp = read_reg(0x04);		if(temp == 0)		{			return FM1715_BYTECOUNTERR;		}		Read_FIFO(buffer);		Save_UID(row, col, temp);			/* 将收到的UID放入UID数组中 */				temp = read_reg(0x0A);				    /* 判断接収数据是否出错 */		temp = temp & 0x01;		if(temp == 0x00)		{			temp = Check_UID();			/* 校验收到的UID */			if(temp == FALSE)			{				return(FM1715_SERNRERR);			}			return(FM1715_OK);		}		else		{			temp = read_reg(0x0B);                 /* 读取冲突检测寄存器 */			row = temp / 8;			col = temp % 8;			buffer[0] = RF_CMD_ANTICOL;			Set_BitFraming(row + pre_row, col);	/* 设置待发送数据的字节数 */			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);		}	}}/****************************************************************//*名称: Select_Card *//*功能: 该函数实现对放入FM1715操作范围之内的某张卡片进行选择*//*输入: N/A *//*输出: FM1715_NOTAGERR: 无卡*//* FM1715_PARITYERR: 奇偶校验错*//* FM1715_CRCERR: CRC校验错*//* FM1715_BYTECOUNTERR: 接收字节错误*//* FM1715_OK: 应答正确*//* FM1715_SELERR: 选卡出错*//****************************************************************/uchar Select_Card(void){	/*~~~~~~~~~~~~*/	uchar	temp, i;	/*~~~~~~~~~~~~*/	write_reg(0x23,0x63);	write_reg(0x12,0x3f);	buffer[0] = RF_CMD_SELECT;	buffer[1] = 0x70;	for(i = 0; i < 5; i++)	{		buffer[i + 2] = UID[i];	}	write_reg(0x22,0x0f);	            /* 开启CRC,奇偶校验校验 */	temp = Command_Send(7, buffer, Transceive);	if(temp == FALSE)	{		return(FM1715_NOTAGERR);	}	else	{		temp = read_reg(0x0A);		if((temp & 0x02) == 0x02) return(FM1715_PARITYERR);		if((temp & 0x04) == 0x04) return(FM1715_FRAMINGERR);		if((temp & 0x08) == 0x08) return(FM1715_CRCERR);		temp = read_reg(0x04);		if(temp != 1) return(FM1715_BYTECOUNTERR);		Read_FIFO(buffer);	/* 从FIFO中读取应答信息 */		temp = *buffer;		/* 判断应答信号是否正确 */          //change by hbp		if((temp == 0x08) || (temp == 0x88) || (temp == 0x53) ||(temp == 0x18)) //S70 temp = 0x18				return(FM1715_OK);		else			return(FM1715_SELERR);	}}/****************************************************************//*名称: Authentication *//*功能: 该函数实现密码认证的过程*//*输入: UID: 卡片序列号地址*//* SecNR: 扇区号*//* mode: 模式*//*输出: FM1715_NOTAGERR: 无卡*//* FM1715_PARITYERR: 奇偶校验错*//* FM1715_CRCERR: CRC校验错*//* FM1715_OK: 应答正确*//* FM1715_AUTHERR: 权威认证有错*//****************************************************************/uchar Authentication(uchar idata *UID, uchar SecNR, uchar mode){	/*~~~~~~~~~~~~~~~~~~~~~~~~*/	uchar idata	i;	uchar idata	temp, temp1;	/*~~~~~~~~~~~~~~~~~~~~~~~~*/	write_reg(0x23,0x63);	write_reg(0x12,0x3f);	write_reg(0x13,0x3f);	temp1 = read_reg(0x09);	temp1 = temp1 & 0xf7;	write_reg(0x09,temp1);	if(mode == RF_CMD_AUTH_LB)			/* AUTHENT1 */		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];	}	write_reg(0x22,0x0f);	        /* 开启CRC,奇偶校验校验 */	temp = Command_Send(6, buffer, Authent1);	if(temp == FALSE)	{		return FM1715_NOTAGERR;	}	temp = read_reg(0x0A);	if((temp & 0x02) == 0x02) return FM1715_PARITYERR;	if((temp & 0x04) == 0x04) return FM1715_FRAMINGERR;	if((temp & 0x08) == 0x08) return FM1715_CRCERR;	temp = Command_Send(0, buffer, Authent2);	/* AUTHENT2 */	if(temp == FALSE)	{		return FM1715_NOTAGERR;	}	temp = read_reg(0x0A);	if((temp & 0x02) == 0x02) return FM1715_PARITYERR;	if((temp & 0x04) == 0x04) return FM1715_FRAMINGERR;	if((temp & 0x08) == 0x08) return FM1715_CRCERR;	temp1 = read_reg(0x09);	temp1 = temp1 & 0x08;	/* Crypto1on=1验证通过 */	if(temp1 == 0x08)	{		return FM1715_OK;	}	return FM1715_AUTHERR;}/****************************************************************//*名称: MIF_Read *//*功能: 该函数实现读MIFARE卡块的数值*//*输入: buff: 缓冲区首地址*//* Block_Adr: 块地址*//*输出: FM1715_NOTAGERR: 无卡*//* FM1715_PARITYERR: 奇偶校验错*//* FM1715_CRCERR: CRC校验错*//* FM1715_BYTECOUNTERR: 接收字节错误*//* FM1715_OK: 应答正确*//****************************************************************/uchar MIF_READ(uchar idata *buff, uchar Block_Adr){	/*~~~~~~~~~~~~~~~~~*/	uchar idata	temp;	/*~~~~~~~~~~~~~~~~~*/	write_reg(0x23,0x63);	write_reg(0x12,0x3f);	write_reg(0x13,0x3f);	write_reg(0x22,0x0f);	buff[0] = RF_CMD_READ;	buff[1] = Block_Adr;	temp = Command_Send(2, buff, Transceive);	if(temp == 0)	{		return FM1715_NOTAGERR;	}	temp = read_reg(0x0A);	if((temp & 0x02) == 0x02) return FM1715_PARITYERR;	if((temp & 0x04) == 0x04) return FM1715_FRAMINGERR;	if((temp & 0x08) == 0x08) return FM1715_CRCERR;	temp = read_reg(0x04);	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;	}}/****************************************************************//*名称: 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;	/*~~~~~~~~~~~~~~~~~~~~*/	write_reg(0x23,0x63);	write_reg(0x12,0x3f);	F_buff = buff + 0x10;	write_reg(0x22,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 = read_reg(0x04);	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);	case 0x05:	return(FM1715_PARITYERR);	default:	return(FM1715_WRITEERR);	}	temp = Command_Send(16, buff, Transceive);	if(temp == TRUE)	{		return(FM1715_OK);	}	else	{		temp = read_reg(0x0A);		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);	}}/****************************************************************//*名称: 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;	/*~~~~~~~~~~~~~~~~~~~~*/	write_reg(0x23,0x63);	write_reg(0x12,0x3f);	F_buff = buff + 4;	*F_buff = RF_CMD_INC;	*(F_buff + 1) = Block_Adr;	write_reg(0x22,0x07);	temp = Command_Send(2, F_buff, Transceive);	if(temp == FALSE)	{		return FM1715_NOTAGERR;	}	temp = read_reg(0x04);	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:	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;}/****************************************************************//*名称: 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;	/*~~~~~~~~~~~~~~~~~~~~*/	write_reg(0x23,0x63);	write_reg(0x12,0x3f);	F_buff = buff + 4;	*F_buff = RF_CMD_DEC;	*(F_buff + 1) = Block_Adr;	write_reg(0x22,0x07);	temp = Command_Send(2, F_buff, Transceive);	if(temp == FALSE)	{		return FM1715_NOTAGERR;	}	temp = read_reg(0x04);	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:	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;}#if 0/****************************************************************//*名称: 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;	/*~~~~~~~~~~~~*/	write_reg(0x23,0x63);	write_reg(0x12,0x3f);	write_reg(0x22,0x07);	*buffer = RF_CMD_RESTORE;	*(buffer + 1) = Block_Adr;	temp = Command_Send(2, buffer, Transceive);	if(temp == FALSE)	{		return FM1715_NOTAGERR;	}	temp = read_reg(0x04);	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);	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;}#endif/****************************************************************//*名称: 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;	/*~~~~~~~~~*/	write_reg(0x23,0x63);	write_reg(0x12,0x3f);	write_reg(0x22,0x07);	buffer[0] = RF_CMD_TRANSFER;	buffer[1] = Block_Adr;	temp = Command_Send(2, buffer, Transceive);	if(temp == FALSE)	{		return FM1715_NOTAGERR;	}	temp = read_reg(0x04);	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);	default:	return(FM1715_TRANSERR);	}}#if 0/****************************************************************//*名称: HL_Active *//*功能: 该函数实现高级MIFARE卡激活命令*//*输入: Secnr: 扇区号*//* Block_Adr: 块地址*//*输出: 操作状态码*//* 读出数据存于buffer中*//****************************************************************/uchar HL_Active(uchar Block_Adr, uchar Mode){	/*~~~~~~~~~*/	uchar	temp;

⌨️ 快捷键说明

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