📄 rfcard.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 + -