📄 main.c
字号:
//以下为调试用 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 + -