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

📄 main.c

📁 射频卡读写程序和读写器原理图,常用的射频卡读写器源程序,源程序和原理图均是最终应用的程序,该读卡器已经批量生产,性能稳定.
💻 C
📖 第 1 页 / 共 5 页
字号:
	
//以下为调试用	vvvvvvvvvvvvvv
/*
lin_1:
	ack_to_main_par=authentication_p(5,0x60);	//认证
	if (ack_to_main_par!=0) goto lin_1;

	for (ls1=0;ls1<16;ls1++)
		re_buf[5+ls1]=0x10+ls1;
	
lin_1s:
	ack_to_main_par=write_card(5*4+1);				//写入
	if (ack_to_main_par!=0) goto lin_1s;

	delay_ms(10);
	
	for (ls1=0;ls1<16;ls1++)
		card_wrrd_buf[ls1]=0;
lin_2:
	ack_to_main_par=read_card(5*4+1);				//读出
	if (ack_to_main_par!=0) goto lin_2;
*/
/*
lin_2s:
	ack_to_main_par=format_card_money(5,1,0x60);
	if (ack_to_main_par!=0) goto lin_2s;
	delay_ms(10);

	ls1=read_fifo();
lin_2:
	ack_to_main_par=read_card(5*4+1);				//读出
	if (ack_to_main_par!=0) goto lin_2;
//lin2b:
//	ls1=card_restore_p(5*4+1);
//	if (ls1!=0) goto lin2b;
//	delay_ms(10);
 
 	card_inc_dec_buf[0]=0x50;
	card_inc_dec_buf[1]=0x00;
	card_inc_dec_buf[2]=0x00;
	card_inc_dec_buf[3]=0x00;
lin_3:
	ack_to_main_par=card_inc_p(5*4+1);
	if (ack_to_main_par!=0) goto lin_3;
	delay_ms(10);
	ack_to_main_par=card_transfer_p(5*4+1);
	if (ack_to_main_par!=0) goto lin_3;
	
lin_4:
	ack_to_main_par=read_card(5*4+1);				//读出
	if (ack_to_main_par!=0) goto lin_4;
*/
	Nop();
}


//----------------------------------------------------------------
//询卡, 发出询卡指令
//询卡指令为mode(0x52或 0x26)
//返回值为00: 有卡且卡类型为8K卡   其它:无卡或卡类型不符
//----------------------------------------------------------------
uchar request_card(uchar mode)
{
	uchar ls1;
	wr_1byte_rfm(CRCPresetLSB,0x63);
	wr_1byte_rfm(CWConductance,0x3f);
	wr_1byte_rfm(Bit_Frame,0x07);
	wr_1byte_rfm(ChannelRedundancy,0x03);	//0x22; //关闭校验
	ls1=rd_1byte_rfm(Control);
	ls1&=0xf7;
	wr_1byte_rfm(Control,ls1);
	card_wrrd_buf[0]=mode;	//询卡指令
	ls1=command_send(1,MU_TransCeive);	//
	if (ls1!=0) return 0xff;			//询卡错误,下次重新进行
	ls1=read_fifo();
	if (card_wrrd_buf[0]!=0x04) 
	{
//		reque_delay_t=200;	//有卡,但卡不是8K卡,则返回后延时再询卡
		return 0xff;
	}
	//卡类型正确
	rfcard_type=0;	//卡类型
	return 0;
}


//----------------------------------------------------------------
//防冲突
//发出0x93, 返回获取卡片UID (低字节在前)  卡片UID存放在rfcard_sn_buf[]中, 低字节在前
//本函数紧跟在询卡函数request_card后
//返回值表示处理结果  00:卡片操作正确  1x:无卡   2x:卡序列号错误  3x:从卡片接收信息错误  0xcx:有冲突
//----------------------------------------------------------------
uchar anti_coll(void)
{
	uchar i,ls1;
	uchar row=0;
	uchar col=0;
	uchar pre_row=0;
	
	wr_1byte_rfm(CRCPresetLSB,0x63);
	wr_1byte_rfm(CWConductance,0x3f);
//	wr_1byte_rfm(ModConductance,0x3f);
	card_wrrd_buf[0]=RF_Anticol;	//防冲突指令
	card_wrrd_buf[1]=0x20;	//
	wr_1byte_rfm(ChannelRedundancy,0x03);	//关闭校验
	ls1=command_send(2,MU_TransCeive);

	for (;;)
	{
		if (ls1!=0) return 0x10;
		ls1=rd_1byte_rfm(FIFO_Length);		//FIFO LENGTH
		if (ls1==0)
		{
			return 0x30;
		}
		ls1=read_fifo();		//读出序列号UID
		save_uid(row,col,ls1);

		ls1=rd_1byte_rfm(ErrorFlag);		//Errflg
		ls1&=0x01;
		if (ls1==0x00)
		{
			ls1=0;
			for (i=0;i<5;i++)
			{
				ls1^=rfcard_sn_buf[i];
			}
			if (ls1==0) return 0x00;
			else return 0x20;
		}
		else
		{	//有冲突  
			return 0xc0;
//先不进行冲突处理,有冲突则重新开始
/*
			ls1=rd_1byte_rfm(CollPos);
			row=ls1/8;
			col=ls1%8;
			card_wrrd_buf[0]=RF_Anticol;

			set_bitframing(row + pre_row, col);			//设置待发送数据的字节数
			pre_row = pre_row + row;
			for(i = 0; i < pre_row + 1; i++)
			{
				card_wrrd_buf[i + 2] = rfcard_sn_buf[i];
			}
			if(col != 0x00)
			{
				row = pre_row + 1;
			}
			else
			{
				row = pre_row;
			}
			ls1 = command_send(row + 2,MU_TransCeive);
*/
		}
	}
}




//----------------------------------------------------------------
//选卡
//发出0x93,同时跟序列号(UID) 选择要操作的卡片, 卡片序列号存放在rfcard_sn_buf[]
//返回值表示处理结果  00:卡片操作正确  1x:无卡   2x:选卡出错  3x:从卡片接收信息错误   4x:校验错误  5x:帧错误
//----------------------------------------------------------------
uchar select_card(void)
{
	uchar i,ls1;
	wr_1byte_rfm(CRCPresetLSB,0x63);
	wr_1byte_rfm(CWConductance,0x3f);

	card_wrrd_buf[0]=RF_Select;	//选卡指令
	card_wrrd_buf[1]=0x70;	//
	for (i=0;i<5;i++)
	{
		card_wrrd_buf[i+2]=rfcard_sn_buf[i];
	}

	wr_1byte_rfm(ChannelRedundancy,0x0f);	//开启校验

	ls1=command_send(7,MU_TransCeive);
	if (ls1!=0) return 0x10;
	ls1=rd_1byte_rfm(ErrorFlag);		//Errflg
	if (ls1&0x02==0x02)
	{
		return 0x40;
	}
	if (ls1&0x04==0x04)
	{
		return 0x50;
	}
	if (ls1&0x08==0x08)
	{
		return 0x40;
	}
	ls1=rd_1byte_rfm(FIFO_Length);		//FIFO LENGTH
	if (ls1!=1)
	{
		return 0x30;
	}
	ls1=read_fifo();		//读出接收信息
	ls1=card_wrrd_buf[0];
	if ((ls1==0x08)||(ls1==0x88)||(ls1==0x53)) return 0;
	else return 0x20;
}



//----------------------------------------------------------------
//认证
//进行双重认证, 用key_calcu_p()计算密钥
//输入参数为卡UID(存放在rfcard_sn_buf[]) 认证的扇区号sector_nm   模式mode: 0x60-->采用密钥keyA   0x61-->采用密钥keyB
//返回值表示处理结果  00:卡片认证通过  1x:无卡   2x:认证出错  3x:从卡片接收信息错误   4x:校验错误  5x:帧错误  8x:密钥格式错误
//----------------------------------------------------------------
uchar authentication_p(uchar sector_nm, uchar mode)
{
	uchar ls1,i;
	key_calcu_p();				//密钥计算
	ls1=load_key();				//可以选择密钥存储地方
//	ls1=load_e2key(sector_nm);	//可以选择密钥存储地方
	if (ls1!=0) return 0x80;

	wr_1byte_rfm(CRCPresetLSB,0x63);
	wr_1byte_rfm(CWConductance,0x3f);
//	wr_1byte_rfm(ModConductance,0x3f);
	
	ls1=rd_1byte_rfm(Control);
	ls1&=0xf7;
	wr_1byte_rfm(Control,ls1);		//关闭加密传输

	card_wrrd_buf[0]=mode;		//认证密钥
	card_wrrd_buf[1]=sector_nm*4+3;	//
	for (i=0;i<4;i++)
	{
		card_wrrd_buf[i+2]=rfcard_sn_buf[i];
	}

	wr_1byte_rfm(ChannelRedundancy,0x0f);	//开启校验
	ls1=command_send(6,MU_Authent1);
	if (ls1!=0) return 0x10;
	t_data=ls1=read_fifo();

	ls1=rd_1byte_rfm(ErrorFlag);		//Errflg
	if (ls1&0x02==0x02)
	{
		return 0x40;
	}
	if (ls1&0x04==0x04)
	{
		return 0x50;
	}
	if (ls1&0x08==0x08)
	{
		return 0x40;
	}

	ls1=command_send(0,MU_Authent2);	//认证2
	if (ls1!=0) return 0x10;

	ls1=read_fifo();

	ls1=rd_1byte_rfm(ErrorFlag);		//Errflg
	if (ls1&0x02==0x02)
	{
		return 0x40;
	}
	if (ls1&0x04==0x04)
	{
		return 0x50;
	}
	if (ls1&0x08==0x08)
	{
		return 0x40;
	}
	//认证通过, 以后的传输按照加密传输
	ls1=rd_1byte_rfm(Control);
	ls1&=0x08;
	if (ls1==0x08) return 0;
	else return 0x20;
}




//----------------------------------------------------------------
//读卡---只能对已经认证的扇区进行操作
//输入为块地址
//读出数据放在card_wrrd_buf[]
//返回值表示处理结果  00:卡片操作正确  1x:无卡   2x:未经认证  3x:从卡片接收信息错误   4x:校验错误  5x:数据溢出错误  6x:操作失败
//----------------------------------------------------------------
uchar read_card (uchar block_nm)
{
	uchar ls1;
	wr_1byte_rfm(CRCPresetLSB,0x63);
	wr_1byte_rfm(CWConductance,0x3f);
//	wr_1byte_rfm(ModConductance,0x3f);

	wr_1byte_rfm(ChannelRedundancy,0x0f);	//开启校验
	card_wrrd_buf[0]=RF_Read;
	card_wrrd_buf[1]=block_nm;
	ls1=command_send(2,MU_TransCeive);	//
	if (ls1!=0) return 0x10;
	ls1=rd_1byte_rfm(ErrorFlag);		//Errflg
	if (ls1&0x02==0x02)
	{
		return 0x40;
	}
	if (ls1&0x04==0x04)
	{
		return 0x50;
	}
	if (ls1&0x08==0x08)
	{
		return 0x40;
	}
	ls1=rd_1byte_rfm(FIFO_Length);
	if (ls1==0x10)
	{
		ls1=read_fifo();
		return 0;
	}
	else return 0x60;
}



//----------------------------------------------------------------
//写卡---只能对已经认证的扇区进行操作
//要写入数据放在re_buf[5~20] 块地址直接带进
//返回值表示处理结果  00:卡片操作正确  1x:无卡   2x:未经认证  3x:从卡片接收信息错误   4x:校验错误
//	5x:数据溢出错误   6x: 操作失败
//----------------------------------------------------------------
uchar write_card (uchar block_nm)
{
	uchar ls1;
	wr_1byte_rfm(CRCPresetLSB,0x63);
	wr_1byte_rfm(CWConductance,0x3f);
//	wr_1byte_rfm(ModConductance,0x3f);

	wr_1byte_rfm(ChannelRedundancy,0x07);	//开启校验

	card_wrrd_buf[0]=RF_Write;
	card_wrrd_buf[1]=block_nm;
	ls1=command_send(2,MU_TransCeive);
	if (ls1!=0) return 0x10;
	ls1=rd_1byte_rfm(FIFO_Length);		//FIFO LENGTH
	if (ls1==0)
	{
		return 0x30;
	}
	ls1=read_fifo();
	ls1=card_wrrd_buf[0];
	switch (ls1)
	{
		case 0x00:
			return 0x20;
		case 0x04:
			return 0x50;
		case 0x0a:
			break;
		case 0x01:
			return 0x40;
		case 0x05:
			return 0x40;
		default:
			return 0x60;
	}
	for (ls1=0;ls1<16;ls1++)
	{
		card_wrrd_buf[ls1]=re_buf[ls1+5];
	}
	ls1=command_send(16,MU_TransCeive);
	if (ls1==0) 
	{
		return 0;
	}
	else
	{
		ls1=rd_1byte_rfm(ErrorFlag);		//Errflg
		if (ls1&0x02==0x02)
		{
			return 0x40;
		}
		if (ls1&0x04==0x04)
		{
			return 0x50;
		}
		if (ls1&0x08==0x08)
		{
			return 0x40;
		}
	}
}



//----------------------------------------------------------------
//加 操作---只能对已经认证的扇区进行操作
//实现卡的自动增值, 增加值存放在 card_inc_dec_buf[]中   块地址直接带进
//返回值表示处理结果  00:卡片操作正确  1x:无卡   2x:未经认证  3x:从卡片接收信息错误   4x:校验错误  5x:数据溢出错误  6x:操作失败
//----------------------------------------------------------------
uchar card_inc_p(uchar block_nm)
{
	uchar ls1,i;
	wr_1byte_rfm(CRCPresetLSB,0x63);
	wr_1byte_rfm(CWConductance,0x3f);
//	wr_1byte_rfm(ModConductance,0x3f);
	card_wrrd_buf[0]=RF_INC;
	card_wrrd_buf[1]=block_nm;

	wr_1byte_rfm(ChannelRedundancy,0x0f);	//开启校验

	ls1=command_send(2,MU_TransCeive);
	if (ls1!=0) return 0x10;
	ls1=rd_1byte_rfm(FIFO_Length);		//FIFO LENGTH
	if (ls1==0)
	{
		return 0x30;
	}
	ls1=read_fifo();
	ls1=card_wrrd_buf[0];
	switch (ls1)
	{
		case 0x00:
			return 0x20;
		case 0x04:
			return 0x50;
		case 0x0a:
			break;
		case 0x01:
			return 0x40;
		case 0x05:
			return 0x40;
		default:
			return 0x60;
	}
	for (i=0;i<4;i++) 	card_wrrd_buf[i]=card_inc_dec_buf[i];
	ls1=command_send(4,MU_TransCeive);
	if (ls1==0) 
	{
		return 0;
	}
	else
	{

⌨️ 快捷键说明

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