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

📄 rfcard.h

📁 射频卡读写程序和读写器原理图,常用的射频卡读写器源程序,源程序和原理图均是最终应用的程序,该读卡器已经批量生产,性能稳定.
💻 H
字号:
#define uchar 		     unsigned char
#define uint		     unsigned int

//------++------++------++------++------++------++------++------++------++------
//	常量定义
//------++------++------++------++------++------++------++------++------++------
//MF1702操作指令
#define MU_TransCeive	0x1e	//发送再接收指令
#define MU_Trans	0x1a	//发送指令
#define MU_Receive	0x16	//接收指令
#define MU_Authent1	0x0c	//认证1 指令
#define MU_Authent2	0x14	//认证2 指令
#define MU_Loadkey	0x19	//把密钥送入FM1702指令
#define MU_LoadkeyE2	0x0b	//把密钥从内部E2读出送入FM1702指令
#define MU_ReadE2	0x03	//读内部E2指令
#define MU_WritE2	0x01	//写内部E2指令

//卡片操作指令
#define RF_Requ_ALL	0x52	//询卡指令--查询所有卡
#define RF_Requ_STD	0x26	//询卡指令--查询HALT的卡
#define RF_Anticol	0x93	//防冲突指令
#define RF_Select	0x93	//选卡指令
#define RF_Auth_LA	0x60	//验证密钥A指令
#define RF_Auth_LB	0x61	//验证密钥B指令
#define RF_Read		0x30	//读卡指令
#define RF_Write	0xa0	//写卡指令
#define RF_INC		0xc1	//电子钱包加指令
#define RF_DEC		0xc0	//电子钱包减指令
#define RF_Restore	0xc2	//存储指令
#define RF_Tranfer	0xb0	//传输指令
#define RF_Halt		0x50	//卡片暂停指令

//FM1702寄存器地址定义
#define	Page_Sel		0x00	//XBYTE[0x7000]	//页写寄存器
#define	Command			0x01	//XBYTE[0x7001]	//命令寄存器
#define	FIFO			0x02	//XBYTE[0x7002]	//64字节FIFO缓冲的输入输出寄存器
#define	PrimaryStatus	0x03	//XBYTE[0x7003]	//发射器,接收器及FIFO的状态寄存器1
#define	FIFO_Length		0x04	//XBYTE[0x7004]	//当前FIFO内字节数寄存器
#define	SecondaryStatus 0x05	//XBYTE[0x7005]	//各种状态寄存器2
#define InterruptEn		0x06	//XBYTE[0x7006]	//中断使能/禁止寄存器
#define	Int_Req			0x07	//XBYTE[0x7007]	//中断请求标识寄存器

#define	Control			0x09	//XBYTE[0x7009]	//控制寄存器
#define	ErrorFlag		0x0a	//XBYTE[0x700A]	//错误状态寄存器
#define CollPos			0x0b	//XBYTE[0x700B]	//冲突检测寄存器
#define TimerValue		0x0c	//XBYTE[0x700c]	//定时器当前值
#define	Bit_Frame		0x0f	//XBYTE[0x700F]	//位帧调整寄存器

#define	TxControl		0x11	//XBYTE[0x7011]	//发送控制寄存器
#define	CWConductance	0x12	//XBYTE[0x7012]	//选择发射脚TX1和TX2发射天线的阻抗
#define	ModConductance	0x13	//XBYTE[0x7013]	//定义输出驱动阻抗
#define	CoderControl	0x14	//XBYTE[0x7014]	//定义编码模式和时钟频率
#define	TypeBFraming	0x17	//XBYTE[0x7017]	//定义ISO14443B帧格式

#define	DecoderControl	0x1a	//XBYTE[0x701a]	//解码控制寄存器
#define	Rxcontrol2		0x1e	//XBYTE[0x701e]	//解码控制及选择接收源

#define RxWait			0x21	//XBYTE[0x7021]	//选择发射和接收之间的时间间隔
#define	ChannelRedundancy	0x22	//XBYTE[0x7022]	//RF通道检验模式设置寄存器
#define CRCPresetLSB	0x23	//XBYTE[0x7023]
#define	CRCPresetMSB	0x24	//XBYTE[0x7024]          
#define MFOUTSelect		0x26	//XBYTE[0x7026]	//mf OUT 选择配置寄存器	

#define TimerClock		0x2a	//XBYTE[0x702a]	//定时器周期设置寄存器
#define TimerControl	0x2b	//XBYTE[0x702b]	//定时器控制寄存器
#define TimerReload		0x2c	//XBYTE[0x702c]	//定时器初值寄存器

#define TypeSH			0x31	//XBYTE[0x7031]	//上海标准选择寄存器
#define TestDigiSelect  0x3d	//XBYTE[0x703d]	//测试管脚配置寄存器

//------++------++------++------++------++------++------++------++------++------
//	口线定义
//------++------++------++------++------++------++------++------++------++------
#define com_trdt_kx	PTD_PTD2	//对上位机发送数据口
#define com_trck_kx	PTA_PTA7	//对上位机发送时钟口
#define com_redt_kx	PTD_PTD5	//接收上位机数据口
#define com_reck_kx	PTA_PTA5	//接收上位机时钟口
#define com_type_sel_kx	PTA_PTA0	//通讯方式选择口线  1:UART  0:SPI

#define rfm_data_k	PTB				//射频读写模块操作数据口
#define rfm_wr_kx	PTE_PTE1		//射频读写模块操作写数据信号线
#define rfm_rd_kx	PTD_PTD0		//射频读写模块操作读数据信号线
#define rfm_cs_kx	PTE_PTE0		//射频读写模块操作选通信号线
#define rfm_add_A0	PTA_PTA3		//射频读写模块操作地址口-A0
#define rfm_add_A1	PTA_PTA2		//射频读写模块操作地址口-A1
#define rfm_add_A2	PTA_PTA1		//射频读写模块操作地址口-A2
#define rfm_rst_kx	PTD_PTD4		//射频读写模块复位口线


#define card_run_kx		PTD_PTD1		//可以读写卡运行指示灯驱动口线
#define card_avai_kx	PTA_PTA4		//卡有效指示灯驱动口线
#define error_lgt_kx	PTD_PTD3		//故障指示灯驱动口线

//------++------++------++------++------++------++------++------++------++------
//	位变量定义
//------++------++------++------++------++------++------++------++------++------
#pragma DATA_SEG _DATA_ZEROPAGE

union
{
	uchar BYTE;
	struct
	{
		unsigned S0:1;
		unsigned S1:1;
		unsigned S2:1;
		unsigned S3:1;
		unsigned S4:1;
		unsigned S5:1;
		unsigned S6:1;
		unsigned S7:1;
	}BIT;
}GFLG1U;
//	#define com_up_err_flg		GFLG1U.BIT.S1	//与上位机通讯故障
	#define comming_spi_flg		GFLG1U.BIT.S2		//SPI发送标志,=1,表示有数据需要发送
	#define comming_uart_flg	GFLG1U.BIT.S3		//UART发送标志,=1,表示有数据需要发送
	#define spi_tr_strt_flg		GFLG1U.BIT.S4		//SPI发送起始位标志 =1:已经发送起始位
	#define spi_re_strt_flg		GFLG1U.BIT.S5		//SPI收到起始位标志 =1:已经收到起始位
	#define spi_re_data_flg		GFLG1U.BIT.S6		//SPI正在接收的位
	#define recv_reply_flg		GFLG1U.BIT.S7		//通讯收到了回复

union
{
	uchar BYTE;
	struct
	{
		unsigned S0:1;
		unsigned S1:1;
		unsigned S2:1;
		unsigned S3:1;
		unsigned S4:1;
		unsigned S5:1;
		unsigned S6:1;
		unsigned S7:1;
	}BIT;
}GFLG2U;
	#define uart_re_strt_flg	GFLG2U.BIT.S0	//UART通讯,是否接收到头
	#define uart_re_ff_flg		GFLG2U.BIT.S1	//UART通讯,是否接收到头的第1个FF
	#define rfcard_in_flg		GFLG2U.BIT.S2	//查询到了卡,完成了防冲突和选卡,已知道卡号,但未进行认证等操作
	#define rfcard_runing_flg	GFLG2U.BIT.S3	//卡正在操作
	#define recv_reply_errflg	GFLG2U.BIT.S4	//通讯收到回复错误
	#define card_inc_or_dec_flg	GFLG2U.BIT.S5	//上位机发来指令表明是加还是减操作  1:减  0:加
	#define ins_spi_flg			GFLG2U.BIT.S6		//SPI接收到指令需要处理
	#define ins_uart_flg		GFLG2U.BIT.S7		//UART接收到指令需要处理

union
{
	uchar BYTE;
	struct
	{
		unsigned S0:1;
		unsigned S1:1;
		unsigned S2:1;
		unsigned S3:1;
		unsigned S4:1;
		unsigned S5:1;
		unsigned S6:1;
		unsigned S7:1;
	}BIT;
}DATAU;
#define datac DATAU.BYTE
#define datac_b0 DATAU.BIT.S0
#define datac_b1 DATAU.BIT.S1
#define datac_b2 DATAU.BIT.S2
#define datac_b3 DATAU.BIT.S3
#define datac_b4 DATAU.BIT.S4
#define datac_b5 DATAU.BIT.S5
#define datac_b6 DATAU.BIT.S6
#define datac_b7 DATAU.BIT.S7


union
{
	uchar BYTE;
	struct
	{
		unsigned S0:1;
		unsigned S1:1;
		unsigned S2:1;
		unsigned S3:1;
		unsigned S4:1;
		unsigned S5:1;
		unsigned S6:1;
		unsigned S7:1;
	}BIT;
}DATAPU;
#define datap DATAPU.BYTE
#define datap_b0 DATAPU.BIT.S0
#define datap_b1 DATAPU.BIT.S1
#define datap_b2 DATAPU.BIT.S2
#define datap_b3 DATAPU.BIT.S3
#define datap_b4 DATAPU.BIT.S4
#define datap_b5 DATAPU.BIT.S5
#define datap_b6 DATAPU.BIT.S6
#define datap_b7 DATAPU.BIT.S7


union
{
	uchar BYTE;
	struct
	{
		unsigned :7;
		unsigned S7:1;
	}BIT;
}SPITRU;
	#define spitrbuf	SPITRU.BYTE	//SPI发送数据时用
	#define spitrbuf_7	SPITRU.BIT.S7	//SPI发送数据时用

union
{
	uchar BYTE;
	struct
	{
		unsigned S0:1;
		unsigned :7;
	}BIT;
}SPIREU;
	#define spirebuf	SPIREU.BYTE	//SPI接收数据时用
	#define spirebuf_0	SPIREU.BIT.S0	//SPI接收数据时用	
//------++------++------++------++------++------++------++------++------++------
//	字及字节变量定义
//------++------++------++------++------++------++------++------++------++------
uchar jsq10ms;			//毫秒计数器
uchar spi_re_strt_ct;		//SPI通讯,接收开始位计时器
uchar spi_tr_strt_ct;		//SPI通讯,发送开始位计时器
uchar crdpro_fen1_ct;		//向上位机发送卡号用,发出后等待回复的等待时间

uchar crdpro_fen1;		//向上位机发送卡号用,记录过程
uchar card_availed_ct;	//卡有效指示灯点亮计时
uchar tr_uart_count;		//UART口通讯已发送数据个数
uchar re_uart_count;		//UART口通讯已接收数据个数
uchar ndre_uart_count;		//UART口通讯需要接收数据个数
uchar nd_uart_tr_nu;		//UART口通讯需要发送数据个数++++
uchar re_uart_strt_ct;		//UART口通讯,接收头时间计时器,计时超过20毫秒接收到的FF FF才是头
uchar re_spi_count;		//SPI口通讯已接收数据个数
uchar nd_spi_tr_nu;		//SPI口通讯需要发送数据个数++++
uchar re_spi_bit_count;		//SPI口通讯已接收位个数

uchar rfcard_type;		//卡类型存储  0:复旦8K卡  1:复旦512卡
uchar card_rwm_type;		//读取卡类型设置	0:复旦512B/8KB卡  1:
uchar reque_delay_t;		//延时查询新卡计时器
uchar card_wrrd_buf[24];	//卡要写入或读出的数据 写入时包含指令,读出时只有数据 一次最多只写入或读出16字节数据(1个块)
uchar card_inc_dec_buf[4];	//卡加减操作中, 要加或减的数据 低字节在前
uchar card_rw_sta;		//对卡操作的结果存放, 用于向上位机返回应答ack
uchar rfcard_sn_buf[8];		//卡序列号存放区,尽最低地址存放最低字节

uchar static_key_1[8];		//固定密钥1
uchar user_key_buf[12];		//计算出的密钥

uchar ack_to_main_par;		//返回上位机的处理结果
			//00:卡片操作正确  0f:接收上位机数据错误  1x:无卡   2x:未经认证  3x:从卡片接收信息错误   4x:校验错误
			//  5x:数据溢出错误  6x:操作失败
uchar card_block;		//要对卡片操作的块号
uchar card_key_mode;		//认证采用的密钥组
uchar card_opr_er_ct;		//对卡读写等操作不成功计数
union
{
	uint W;
	struct
	{
		uchar H;
		uchar L;
	}HL;
}SECTORU;		//发来的要求认证和操作的扇区号
	#define sector_r SECTORU.W
	#define sector_rh SECTORU.HL.H
	#define sector_rl SECTORU.HL.L

union
{
	uint W;
	struct
	{
		uchar H;
		uchar L;
	}HL;
}KEY_CALU;		//密钥计算用
	#define keycal_r KEY_CALU.W
	#define keycal_rh KEY_CALU.HL.H
	#define keycal_rl KEY_CALU.HL.L




#pragma DATA_SEG DEFAULT_RAM

union
{
	uchar SPI[22];
	uchar UART[22];
}RE_BUFU;
	#define re_buf RE_BUFU.SPI
	#define re_spi_buf RE_BUFU.SPI		//模拟 SPI 口通讯接收缓冲区
	#define re_uart_buf RE_BUFU.UART	//UART口通讯接收缓冲区

union
{
	uchar SPI[25];
	uchar UART[25];
}TR_BUFU;
	#define tr_buf TR_BUFU.SPI
	#define tr_spi_buf TR_BUFU.SPI		//模拟 SPI 口通讯发送缓冲区
	#define tr_uart_buf TR_BUFU.UART	//UART口通讯发送缓冲区


//调试用变量
uchar t_data;


//------++------++------++------++------++------++------++------++------++------
//	特殊定义
//------++------++------++------++------++------++------++------++------++------
#define Nop()	            	asm("nop")
#define nop()	            	asm("nop")

#define	tran_uartdisable()		{SCC2_TE=0;SCC2_TCIE=0;}		//发送禁止
#define	tran_uartenable()		{SCC2_TE=1;SCC2_TCIE=1;}		//发送允许

//------++------++------++------++------++------++------++------++------++------
//	函数列表
//------++------++------++------++------++------++------++------++------++------
void ini_ram(void);
void ini_pp(void);
void emi_p(void);
void uart_tr_sub(void);
void spi_com_p(void);
uchar spi_re1byte_p(void);
void uart_recv_isrp(void);
void rf_ins_proc_p(void);
void ini_rf_module(void);
void wr_1byte_rfm(uchar add,uchar data);
uchar rd_1byte_rfm(uchar add);
void card_chk_p(void);
void card_proc(void);
uchar request_card(uchar mode);
uchar anti_coll(void);
uchar select_card(void);
uchar authentication_p(uchar sector_nm, uchar mode);
uchar read_card (uchar block_nm);
uchar write_card (uchar block_nm);
uchar card_inc_p(uchar block_nm);
uchar card_dec_p(uchar block_nm);
uchar card_transfer_p(uchar block_nm);
void delay_ms(uchar dtl);

uchar command_send(uchar num,uchar comm);
uchar clear_fifo(void);
void write_fifo(uchar num);
uchar read_fifo(void);
void key_calcu_p(void);
uchar format_card_money(uchar sector_nm,uchar block_nm,uchar mode);
uchar request_card(uchar mode);
void save_uid(uchar row,uchar col,uchar length);
void set_bitframing(uchar row,uchar col);
uchar load_e2key(uchar sector);
uchar load_key(void);
uchar write_ee(uchar addl,uchar addh,uchar count);
uchar read_ee(uchar addl,uchar addh,uchar count);
uchar card_restore_p(uchar block_nm);

⌨️ 快捷键说明

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