📄 fm1702.c
字号:
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;
/*~~~~~~~~~*/
Secnr = Block_Adr / 4;
MIF_Halt(); /* Halt */
temp = Request(RF_CMD_REQUEST_STD); /* Request */
if(temp != FM1715_OK)
{
return(FM1715_REQERR);
}
temp = AntiColl(); /* AntiCol */
if(temp != FM1715_OK)
{
return(FM1715_ANTICOLLERR);
}
temp = Select_Card(); /* Select */
if(temp != FM1715_OK)
{
return(FM1715_SELERR);
}
temp = Load_keyE2_CPY((Secnr % 16), Mode); /* LoadKey */
if(temp != TRUE)
{
return(FM1715_AUTHERR);
}
temp = Authentication(UID, Secnr, Mode); /* Authentication */
if(temp != FM1715_OK)
{
return(FM1715_AUTHERR);
}
return FM1715_OK;
}
/****************************************************************/
/*名称: MIF_Initival */
/*功能: 该函数实现MIFARE卡初始化值操作*/
/*输入: buff: 四个字节初始化数值起始地址*/
/* Block_Adr: 块地址*/
/*输出: FM1715_NOTAGERR: 无卡*/
/* FM1715_BYTECOUNTERR: 接收字节错误*/
/* FM1715_NOTAUTHERR: 未经权威认证*/
/* FM1715_EMPTY: 数据溢出错误*/
/* FM1715_CRCERR: CRC校验错*/
/* FM1715_PARITYERR: 奇偶校验错*/
/* FM1715_WRITEERR: 写卡块数据出错*/
/* FM1715_OK: 应答正确*/
/****************************************************************/
uchar MIF_Initival(uchar idata *buff, uchar Block_Adr)
{
/*~~~~~~~~~~~~~~~~~*/
uchar idata temp;
uchar i;
/*~~~~~~~~~~~~~~~~~*/
for(i = 0; i < 4; i++)
{
*(buff + 4 + i) = ~(*(buff + i));
}
for(i = 0; i < 4; i++)
{
*(buff + 8 + i) = *(buff + i);
}
*(buff + 12) = Block_Adr;
*(buff + 13) = ~Block_Adr;
*(buff + 14) = Block_Adr;
*(buff + 15) = ~Block_Adr;
temp = MIF_Write(buff, Block_Adr);
return temp;
}
/****************************************************************/
/*名称: HL_Read */
/*功能: 该函数实现高级读命令*/
/*输入: Secnr: 扇区号*/
/* Block_Adr: 块地址*/
/*输出: 操作状态码*/
/* 读出数据存于buffer中*/
/****************************************************************/
uchar HL_Read(uchar idata *buff, uchar Block_Adr, uchar Mode)
{
/*~~~~~~~~~*/
uchar temp;
/*~~~~~~~~~*/
temp = HL_Active(Block_Adr, Mode);
if(temp != FM1715_OK)
{
return temp;
}
/* Read */
temp = MIF_READ(buff, Block_Adr);
if(temp != FM1715_OK)
{
return temp;
}
return FM1715_OK;
}
/****************************************************************/
/*名称: HL_Write */
/*功能: 该函数实现高级写命令*/
/*输入: buff: 待写入数据的首地址*/
/* Secnr: 扇区号*/
/* Block_Adr: 块地址*/
/*输出:操作状态码*/
/****************************************************************/
uchar HL_Write(uchar idata *buff, uchar Block_Adr, uchar Mode)
{
/*~~~~~~~~~*/
uchar temp;
/*~~~~~~~~~*/
temp = HL_Active(Block_Adr, Mode);
if(temp != FM1715_OK)
{
return temp;
}
/* Write */
temp = MIF_Write(buff, Block_Adr);
if(temp != FM1715_OK)
{
return FM1715_WRITEERR;
}
return FM1715_OK;
}
#endif
///////////////////////////////////////////////////////////////////////
// Delay 50us
///////////////////////////////////////////////////////////////////////
void delay_50us(unsigned char _50us)
{
while(_50us--)
{
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();
}
}
///////////////////////////////////////////////////////////////////////
// Delay 10ms
///////////////////////////////////////////////////////////////////////
void delay_10ms(unsigned int _10ms)
{
#ifndef NO_TIMER2
RCAP2LH = RCAP2_10ms;
T2LH = RCAP2_10ms;
TR2 = TRUE;
while (_10ms--)
{
while (!TF2);
TF2 = FALSE;
}
TR2 = FALSE;
#else
while (_10ms--)
{
delay_50us(19);
if (CmdValid)
return;
delay_50us(20);
if (CmdValid)
return;
delay_50us(20);
if (CmdValid)
return;
delay_50us(20);
if (CmdValid)
return;
delay_50us(20);
if (CmdValid )
return;
delay_50us(20);
if (CmdValid)
return;
delay_50us(20);
if (CmdValid)
return;
delay_50us(20);
if (CmdValid)
return;
delay_50us(20);
if (CmdValid)
return;
delay_50us(19);
if (CmdValid)
return;
}
#endif
}
///////////////////////////////////////////////////////////////////////
// 接收和发送中断
///////////////////////////////////////////////////////////////////////
void isr_UART(void) interrupt 4 using 1
{
unsigned char len, i;
unsigned int j=0;
if(RI)
{
len=SBUF;
RI=0;
for(i=0;i<len;i++)
{
while(!RI)
{
j++;
if(j>1000)
{
break;
}
}
if(j<1000)
{
buffer[i]=SBUF;
RI=0;
j=0;
}
else
{
break;
}
}
if(i==len)
{
REN=0;
CmdValid=1;
}
}
else if(!RI && TI)
{
TI=0;
len=buffer[0];
for(i=0;i<len+1;i++)
{
SBUF=buffer[i];
while(!TI);
TI=0;
}
REN=1;
}
}
///////////////////////////////////////////////////////////////////////
// 系统初始化
///////////////////////////////////////////////////////////////////////
void init(void)
{
MFRST=0;
ET2 = 0;
T2CON = 0x04;
PCON = 0x80;
SCON = 0x70;
TMOD = 0x21; //TMOD = 0x22;
TH1 = BAUD_9600;
TL1 = TH1;
TR1 = TRUE; // 波特率发生器
TH0 = 0x60;
TL0 = 0x60;
TR0 = 0;
ET0=0;
ET1=0;
EA=1;
EX0=1;
IT0 = 1;
TR2=0;
ES = TRUE;
CmdValid=0;
SPEAKER=0;
delay_10ms(30);
SPEAKER=1;
delay_10ms(30);
SPEAKER=0;
Init_FM1715(0); //初始化成 Type A 格式
}
///////////////////////////////////////////////////////////////////////
// IC卡处理函数
///////////////////////////////////////////////////////////////////////
void cmd_execution(void)
{
unsigned char cmd,pass_type,temp;
unsigned char status;
pass_type = 0x60;
cmd = buffer[0];
switch(cmd)
{
case 1: // Halt the card //终止卡的操作
status=MIF_Halt();
buffer[0]=1;
buffer[1]=status;
break;
case 2:
MIF_Halt(); //RF_CMD_REQUEST_ALL RF_CMD_REQUEST_STD
status = Request(RF_CMD_REQUEST_STD); /* Request */
if(status != FM1715_OK)
{
status = Request(RF_CMD_REQUEST_STD); /* Request */
if(status != FM1715_OK)
{
buffer[0] = 1;
buffer[1] = FM1715_REQERR;
break;
}
}
if(tagtype[0]==2)
cardtype=mifarepro; // Mifare Pro 卡
else if(tagtype[0]==4)
cardtype=mifare1; // Mifare One 卡
else if(tagtype[0]==16)
cardtype=mifarelight; // Mifare Light 卡
else
cardtype=unknowncard;
buffer[0]=3;
buffer[1]=status;
buffer[2]=tagtype[0];
buffer[3]=tagtype[1];
break;
case 3: // 防冲突 读卡的系列号 MLastSelectedSnr
status = AntiColl();;
if(status!=FM1715_OK)
{
buffer[0]=1;
buffer[1]=FM1715_ANTICOLLERR;
break;
}
//memcpy(MLastSelectedSnr,&buffer[2],4);
buffer[0]=5;
buffer[1]=status;
buffer[2]=UID[0];
buffer[3]=UID[1];
buffer[4]=UID[2];
buffer[5]=UID[3];
break;
case 4: // 选择卡 Select Card
status=Select_Card();
if(status!=FM1715_OK)
{
buffer[0]=1;
buffer[1]=FM1715_SELERR;
break;
}
buffer[0]=1;
buffer[1]=status;
break;
case 6:
pass_type = buffer[1];
status = Load_keyE2_CPY(&buffer[3]);
if(status != TRUE)
{
buffer[0]=1;
buffer[1]=status;
break;
}
status = Authentication(UID, buffer[2], buffer[1]);
if(status != FM1715_OK)
{
buffer[0]=1;
buffer[1]=status;
break;
}
buffer[0]=1;
buffer[1]=status;
break;
case 8:
status=MIF_READ(&buffer[2],buffer[1]);
if(status != FM1715_OK)
{
buffer[0]=1;
buffer[1]=status;
break;
}
else
{
if(cardtype==mifare1||cardtype==mifarepro)
buffer[0]=17;
else if(cardtype==1)
buffer[0]=9;
else
buffer[0]=16;
}
buffer[1]=status;
break;
case 9:
status=MIF_Write(&buffer[2],buffer[1]);
buffer[0]=1;
buffer[1]=status;
break;
case 10:
if(buffer[1] == RF_CMD_INC)
{
status = MIF_Increment(&buffer[3],buffer[2]);
MIF_Transfer(buffer[2]);
}
else if(buffer[1] == RF_CMD_DEC)
{
status = MIF_Decrement(&buffer[3],buffer[2]);
MIF_Transfer(buffer[2]);
}
else
{
status = 1;
}
buffer[0]=1;
buffer[1]=status;
break;
case 12:
buffer[0]=1;
buffer[1]=0;
break;
case 14: // 自动寻卡
status = Request(RF_CMD_REQUEST_STD);
while(status)
{
status = Request(RF_CMD_REQUEST_STD);
}
if(tagtype[0]==2)
cardtype=mifarepro; // Mifare Pro 卡
else if(tagtype[0]==4)
cardtype=mifare1; // Mifare One 卡
else if(tagtype[0]==16)
cardtype=mifarelight; // Mifare Light 卡
else
cardtype=unknowncard;
buffer[0] = 3;
buffer[1] = status;
buffer[2] = tagtype[0];
buffer[3] = tagtype[1];
break;
case 16:
temp = Control;
temp = temp | (0x10);
Control = temp; // PowerDown = 1 进入软件掉电模式
buffer[0] = 1; // 内部电流消耗模块包括晶振在内关闭
buffer[1] = 0;
break;
case 17:
temp = Control;
temp = temp & (0xEF);
Control = temp; // PowerDown = 0 退出软件掉电模式
buffer[0] = 1;
buffer[1] = 0;
break;
default:
buffer[0] = 1;
buffer[1] = 1;
break;
}
}
void main(void)
{
unsigned char baud;
init();
while (1)
{
if (CmdValid)
{
CmdValid = FALSE;
if(buffer[0]==11) //为了加快相应速度 测试风鸣器
{
buffer[2]=buffer[1];
buffer[0]=1; //contact
buffer[1]=0;
CALL_isr_UART();
SPEAKER=1;
delay_10ms(buffer[2]);
SPEAKER=0;
}
else if(buffer[0]==13) //设置通讯波特率
{
switch(buffer[1])
{
case 0:
baud=BAUD_9600;
break;
case 1:
baud=BAUD_19200;
break;
case 2:
baud=BAUD_38400;
break;
case 3:
baud=BAUD_57600;
break;
default:
baud=BAUD_9600;
break;
}
buffer[0]=1; //contact
buffer[1]=0;
CALL_isr_UART();
delay_10ms(5);
TR1 = 0;
TH1 = baud;
TL1 = TH1;
delay_10ms(2);
TR1 = TRUE;
}
else
{
cmd_execution(); // 进入IC卡处理程序
CALL_isr_UART();
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -