📄 fm1702.c
字号:
/*~~~~~~~~~*/ 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); }#if 0 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); }#endif 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){ ET2 = 0; T2CON = 0x00; 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; EX1 = 0; EX0 = 0; CmdValid=0; SPEAKER=0; LED = 0; delay_10ms(30); SPEAKER=1; LED = 1; delay_10ms(30); SPEAKER=0; LED = 0; Init_FM1715(); //初始化成 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] = status; 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; } 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 = read_reg(0x09); temp = temp | (0x10); write_reg(0x09,temp); // PowerDown = 1 进入软件掉电模式 buffer[0] = 1; // 内部电流消耗模块包括晶振在内关闭 buffer[1] = 0; break; case 17: temp = read_reg(0x09); temp = temp & (0xEF); write_reg(0x09,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; LED = 1; delay_10ms(buffer[2]); SPEAKER=0; LED = 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 + -