相关数据手册参考文献复旦微电子fm1715编程指南_第1页
相关数据手册参考文献复旦微电子fm1715编程指南_第2页
相关数据手册参考文献复旦微电子fm1715编程指南_第3页
相关数据手册参考文献复旦微电子fm1715编程指南_第4页
相关数据手册参考文献复旦微电子fm1715编程指南_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

—概 FM1715寄存 头文 FM1715基本函 读 写 方便地使用FM1715模块访问MIFARE卡和上海标准卡.并在KEILC51V6.0编译环境下通过。二、ISO14443A0x00:0x0A:Command:0x26or: :: 卡片系列号 Command:0x60or Data[0]:0x60or0x61(0x60KEYA,0x61KEYB 将操作后的卡片置于halt 块地址 _Adr要写入数据的块地址 _Adr _Adr _AdrData[1]:Data[2]:Data[3]:Data[4]: Adr三、FM1715在每一次上电或硬件复位后,FM1712/1714/1715会复位并行微处理器接口模式,并独立的地址独立的地址复用的地址/线 制寄存器组Page5:FIFO,Timer及IRQ001264byteFIFO34FIFObyte567189ABCTimerDCRC8ECRC8Fbit2TX1TX2ISO14443-B3bit4CRC8CRC8MFOUT5FIFOTimerTimer启动/IRQPinConfigIRQ67mainmain编制时间修改时间:20039#ifndef_MAIN_INCLUDED_#define //FM1715 #define #define //FM1715EEPROM#define //FM1715EEPROM#define #define #define #define #defineReq#define

#defineucharunsignedchar#defineuintunsignedint#define #define #define #define #define #define //Status120101卡类型定义0123//*******************函数错误代码定义0123456//通讯错误(BCC校验错8//卡片序列号错误(anti-collision错误9//卡片数据长度字节错误(SELECT错误//调用decrement//*******************FM1715地址定义//mfOUTsbitMFRSTP1^ ucharidata_at_ucharidataucharidata_at__at_//*******************FM1715变量定义ucharidata_at_//16ucharidata_at_//16ucharidata_at_uchar _at_ucharidata_at_/*名称: /*功能:该函数实现对卡片复位应答信号的判 /*输入:*buff,指向应答数据的指 TRUE,卡片应答信号正 FALSE,卡片应答信号错 ucharJudge_Req(ucharidata*buff){uchartemp1=*buff;temp2=*(buff+1);if(((temp1==0x03)||(temp1==0x04)||(temp1==0x05)||(temp1==0x53))&&(temp2=={return}return}注:temp1= ;上海标准TOKENtemp1 temp1 temp1 ;8K/*名称: /*功能:该函数实现对收到的卡片的序列号的判 /*输入: TRUE:序列号正 FALSE:序列号错 ucharCheck_UID(void){uchartemp;uchari;temp=for(i=0;i<5;{temp=temp^}if(temp=={return}return}/*名称: row:产生冲突的 col:产生冲突的 length:接収到的UID数据长 voidSave_UID(ucharrow,ucharcol,ucharlength){uchari;uchartemp;uchartemp1;if((row==0x00)&&(col=={for(i=0;i<length;{UID[i]=}}{temp=buffer[0];temp1=UID[row-1];switch(col){casetemp1=0x00;row=row+1;casetemp=temp&0xFE;temp1=temp1&0x01;casetemp=temp&0xFC;temp1=temp1&0x03;casetemp=temp&0xF8;temp1=temp1&0x07;casetemp=temp&0xF0;temp1=temp1&0x0F;casetemp=temp&0xE0;temp1=temp1&0x1F;casetemp=temp&0xC0;temp1=temp1&0x3F;casetemp=temp&0x80;temp1=temp1&0x7F;}buffer[0]=UID[row-1]=temp1|temp;for(i=1;i<length;i++){UID[row-1+i]=}}}/*名称: row:产生冲突的 col:产生冲突的 voidSet_BitFraming(ucharrow,ucharcol){switch{casebuffer[1]=0x20;casebuffer[1]=0x30;casebuffer[1]=0x40;casebuffer[1]=0x50;casebuffer[1]=0x60;}{caseBit_Frame=0x00;caseBit_Frame=buffer[1]=(buffer[1]|0x01);caseBit_Frame=buffer[1]=(buffer[1]|0x02);caseBit_Frame=buffer[1]=(buffer[1]|0x03);caseBit_Frame=buffer[1]=(buffer[1]|0x04);caseBit_Frame=buffer[1]=(buffer[1]|0x05);caseBit_Frame=buffer[1]=(buffer[1]|0x06);caseBit_Frame=buffer[1]=(buffer[1]|0x07);}}/*名称: /*功能:该函数实现对FM1715操作的总线方式(并行总线,SPI)选 /*输入: FALSE,总线选择失 ucharFM1715_Bus_Sel(void){ucharPage_Sel //表示PageSelect的值做为寄存器地址A5,A4和A3//三位寄存器地址A2-A0由//外部地址线A2-A0for(i0;iRF_TimeOut; {if(Command ,{Page_Sel=0x00;returnTRUE;}}return}/*名称: /*功能:该函数实现对FM1715初始化操 /*输入:mode:工作模式 0:TYPEA模 1:TYPEB模 2:上海模 voidInit_FM1715(ucharmode){ucharidata MFRST //FM1715for(i=0;i<0x1fff;{}MFRST=for(i=0;i<0x1fff;{}while(Command {} TimerClock= TimerControl TimerReload //10msInterruptEn=0x7f; temp=InterruptEn;Int_Req=MFOUTSelect TxControl ifmode {TypeSH=}{TypeSH=}if(mode //TYPEB{CoderControl=0x20;TypeBFraming=0x05;DecoderControl=0x19;ChannelRedundancy=0x24;TxControl=0x4b;CWConductance=0x3f;ModConductance=af;}}/*名称: /*功能:该函数实现向FM1715发送命令集的功 /*输入:count,待发送命令集的长 buff,指向待发送数据的指 Comm_Set,命令 /*输出:TRUE,命令被正确执 FALSE,命令执行错 ucharCommand_Send(ucharcount,ucharidata*buff,ucharComm_Set){ ucharidataCommand=0x00;Write_FIFO(count,temp=Command for(j0;j<RF_TimeOut {temp=MFOUTSelect;temp=Command;temp1=Int_Req&0x80;if((temp==0x00)||(temp1=={returnTRUE;}}returnFALSE;}/*名称: /*功能:该函数实现从FM1715的EE中读出数 lsb,EE地址(低字节 msb,EE地址(高字节 count,待读出数据EE的字节个 buff,指向待读出数据的指 TRUE,EE数据正确读 FALSE,EE数据读出有 Read_E2(ucharlsb,ucharmsb,ucharcount,ucharidata*buff){ucharif(temp==FALSE)}/*名称: /*功能:该函数实现向FM1715的EE中写入数 lsb,EE地址(低字节 msb,EE地址(高字节 count,待写入数据EE的字节个 buff,指向待写入数据的指 TRUE,EE数据正确写 FALSE,EE数据写入有 Write_E2(ucharlsb,ucharmsb,ucharcount,ucharidata*buff){ucharidatafor(i=0;i<count;{*(buff+count-i+2)=*(buff-i+}*buff=*(buff+1)=temp=Command_Send(count+2,buff,WriteE2);temp=SecondaryStatus;temp=temp&0x40;if(temp==0x40){return}return}/*名称: /*功能:该函数实现清空FM1715中FIFO的数 /*输入: /*输出:TRUE,FIFO被清 FALSE,FIFO未被清 ucharClear_FIFO(void){uchartemp; temp temp=(temp|0x01);Control=temp;for(i0;iRF_TimeOut; {temp=FIFO_Length;if(temp==0){return}}return}/*名称: /*功能:该函数实现向FM1715的FIFO中写入xbytes数 /*输入:count,待写入字节的长 buff,指向待写入数据的指 /*输出: voidWrite_FIFO(ucharcount,ucharidata*buff){ucharfor(i=0;i<count;{FIFO=*(buff+}}/*名称: /*功能:该函数实现从FM1715的FIFO中读出xbytes数 buff,指向读出数据的指 ucharRead_FIFO(ucharidata*buff){uchartemp;uchari;temp=FIFO_Length;if(temp==0){return}if(temp temp= }for(i=0;i<temp;{*(buff+i)=}return}/*名称: /*功能:该函数实现暂停MIFARE /*输入: /*输出:FM1715_OK:应答正 FM1715_PARITYERR:奇偶校验 FM1715_CRCERR:CRC校验 FM1715_NOTAGERR:无 ucharMIF_Halt(void){uchartemp; CRCPresetLSB=0x63;CWConductance=0x3f;*buffer=*(buffer+1)=temp=Command_Send(2,buffer,Transmit);if(temp==TRUE){for(i=0;i<0x50;{}return}{temp=if((temp&{}if((temp&{}}}/*名称: /*功能:该函数实现把E2中密码存入FM1715的keybuffer /*输入:Secnr:EE起始地 /*输出:True:密钥装载成 False:密钥装载失 Load_keyE2_CPY(ucharSecnr,ucharMode){uchartemp;ucharmsb=0;ucharlsb=0;temp=Secnr*12;if(Mode==0){if(temp {lsb=temp-0x80;msb=0x01;}{msb=lsb=temp+}}{msb=lsb=temp+}buffer[0]=lsb;buffer[1]=msb;temp=Command_Send(2,buffer,LoadKeyE2);temp=ErrorFlag&0x40;if(temp=={return}return}/*名称: /*功能:FM1715Request操作 mode:ALL(监测所以FM1715操作范围之内的卡片 FM1715_NOTAGERR:无 FM1715_OK:应答正 FM1715_REQERR:应答错 ucharRequest(ucharmode){ idataCRCPresetLSB=0x63;buffer[0] Bit_Frame ChannelRedundancy=0x03; temp=Control;temp=temp&Control temp=Command_Send(1,buffer,Transceive);if(temp==FALSE){return} temp=Judge_Req(buffer); if(temp==TRUE){tagtype[0]=buffer[0];tagtype[1]=buffer[1];returnFM1715_OK;}return}/*名称: /*功能:该函数实现对放入FM1715操作范围之内的卡片的防冲突检 FM1715_NOTAGERR:无 FM1715_BYTECOUNTERR:接收字节错 FM1715_SERNRERR:卡片序列号应答错 FM1715_OK:卡片应答正 uchar{uchartemp;uchari;ucharrow,col;ucharrow=col=pre_row=CRCPresetLSB=0x63;CWConductance=0x3f;ModConductance=0X3f;buffer[0]=RF_CMD_ANTICOL;buffer[1]=0x20;ChannelRedundancy=0x03; temp=Command_Send(2,buffer,Transceive);{{}temp= if((temp& if((temp& if(temp==0){return}Save_UID(rowcol, temp=ErrorFlag; temp=temp&0x01;if(temp=={temp=Check_UID(); if(temp==FALSE){}}{

temp=CollPos; row=temp/8;col=temp%buffer[0]=Set_BitFraming(row+pre_row,col); pre_row=pre_row+row;for(i=0;i<pre_row+1;{buffer[i+2]=}if(col!={}{}

row=pre_row+row=temp=Command_Send(row+2,buffer,}}}/*名称: /*功能:该函数实现对放入FM1715操作范围之内的某张卡片进行选 FM1715_NOTAGERR:FM1715_PARITYERR:FM1715_CRCERR:CRCFM1715_BYTECOUNTERR:FM1715_OK:FM1715_SELERR:ucharSelect_Card(void){ucharCRCPresetLSB=0x63;CWConductance=0x3f;buffer[0]=RF_CMD_SELECT;buffer[1]=0x70;for(i=0;i<5;{} {}{if((temp&0x02)==0x02)if((temp&0x04)==0x04)if((temp&0x08)==0x08)if(temp!=1) temp=iftemp==0x08||temp==0x88)||temp==0x53))判断应答信号是否正确}}

/*名称: /*功能:该函数实现密码认证的过 /*输入:UID:卡片序列号地 SecNR:扇区 mode:模 /*输出:FM1715_NOTAGERR:无 FM1715_PARITYERR:奇偶校验 FM1715_CRCERR:CRC校验 FM1715_OK:应答正 FM1715_AUTHERR:权威认证有 Authentication(ucharidata*UID,ucharSecNR,ucharmode){ucharidataucharidataCRCPresetLSB=0x63;CWConductance=0x3f;ModConductance=0X3f;temp1=Control;temp1=temp1&0xf7;Control=temp1;if(mode== buffer[0]=buffer[0]=buffer[1]=SecNR*4+3;for(i=0;i<4;i++){buffer[2+i]=}ChannelRedundancy=0x0f; temp=Command_Send(6,buffer,Authent1);if(temp=={return}temp=if((temp&0x02)==if((temp&0x04)==0x04)returnif((temp&0x08)==0x08)returnFM1715_CRCERR;temp=Command_Send(0,buffer,Authent2); if(temp==FALSE){return}temp=if((temp&0x02)==if((temp&0x04)==0x04)returnif((temp&0x08)==0x08)returnFM1715_CRCERR;temp1=temp1=temp1&0x08; if(temp1==0x08){return}return}/*/*MIFARE/*buff: Block_Adr:/*FM1715_NOTAGERR: FM1715_PARITYERR: FM1715_CRCERR:CRC FM1715_BYTECOUNTERR: FM1715_OK:ucharMIF_READ(ucharidata*buff,ucharBlock_Adr){ucharidataCRCPresetLSB=0x63;CWConductance=0x3f;ModConductance=0X3f;ChannelRedundancy=0x0f;//Int_Req=0x7f;=RF_CMD_READ;=temp=Command_Send(2,buff,Transceive);if(temp==0){return}temp=if((temp&0x02)==0x02)returnFM1715_PARITYERR;if((temp&0x04)==0x04) returnFM1715_FRAMINGERR;if((temp&0x08)==0x08)returnFM1715_CRCERR;temp=FIFO_Length;iftemp {return}elseiftemp {}{}}

returnreturnbuff:Block_Adr:FM1715_NOTAGERR:FM1715_NOTAUTHERR:FM1715_EMPTY:FM1715_PARITYERR:FM1715_WRITEERR: FM1715_OK:应答正 ucharMIF_Write(ucharidata*buff,ucharBlock_Adr){ucharidatatemp;ucharidataCRCPresetLSB=0x63;CWConductance=0x3f;F_buff=buff+0x10;ChannelRedundancy=0x07;*F_buff=*(F_buff+1)=temp=Command_Send(2,F_buff,Transceive);if(temp==FALSE){}temp=FIFO_Length;if(temp==0){}temp=*F_buff;switch(temp){case0x00 case0x04:case0x0a:casecase0x05:}temp=Command_Send(16,buff,if(temp=={}{

temp=if((temp&0x02)==0x02)elseif((temp&0x04)==0x04)elseif((temp&0x08)==0x08)}}

buff:Block_Adr:FM1715_NOTAGERR:FM1715_BYTECOUNTERR:FM1715_NOTAUTHERR:FM1715_EMPTY:FM1715_CRCERR:CRCFM1715_PARITYERR:FM1715_INCRERR:FM1715_OK:ucharMIF_Increment(ucharidata*buff,ucharBlock_Adr){ucharucharidataCRCPresetLSB=0x63;CWConductance=0x3f;F_buff=buff+4;*F_buff=*(F_buff+1)=Block_Adr;ChannelRedundancy=0x07;temp=Command_Send(2,F_buff,Transceive);if(temp==FALSE){return}temp=FIFO_Length;if(temp==0){return}temp=*F_buff;{case0x00 case0x04:case0x0a:casecase0x05:}temp=Command_Send(4,buff,Transmit);if(temp==FALSE){return}return}buff:Block_Adr:FM1715_NOTAGERR:FM1715_BYTECOUNTERR:FM1715_NOTAUTHERR:FM1715_EMPTY:FM1715_CRCERR:CRCFM1715_PARITYERR:FM1715_DECRERR:FM1715_OK:ucharMIF_Decrement(ucharidata*buff,ucharBlock_Adr){ucharucharidataCRCPresetLSB=0x63;CWConductance=0x3f;F_buff=buff+4;*F_buff=*(F_buff+1)=Block_Adr;ChannelRedundancy=0x07;temp=Command_Send(2,F_buff,Transceive);if(temp==FALSE){return}temp=FIFO_Length;if(temp==0){return}temp=*F_buff;switch(temp){case0x00 case0x04:case0x0a:casecase0x05:}temp=Command_Send(4,buff,Transmit);if(temp==FALSE){}return}/*/*MIFARE/*Block_Adr:/*FM1715_NOTAGERR: FM1715_BYTECOUNTERR: FM1715_NOTAUTHERR: FM1715_EMPTY:FM1715_PARITYERR:FM1715_OK:ucharMIF_Restore(ucharBlock_Adr){ucharCRCPresetLSB=0x63;CWConductance=0x3f;ChannelRedundancy=*buffer=*(buffer+1)=temp=Command_Send(2,buffer,Transceive);if(temp==FALSE){return}temp=FIFO_Length;if(temp==0){return}temp=*buffer;switch(temp){case0x00 case0x04:case0x0a:casecase0x05:}for(i=0;i<4;i++)buffer[i]=0x00;temp=Command_Send(4,buffer,Transmit);if(temp==FALSE){return}return}Block_Adr:FM1715_NOTAGERR:FM1715_BYTECOUNTERR:FM1715_NOTAUTHERR:FM1715_EMPTY:FM1715_CRCERR:CRCFM1715_PARITYERR:FM1715_TRANSERR:FM1715_OK:ucharMIF_Transfer(ucharBlock_Adr){ucharCRCPresetLSB=0x63;CWConductance=0x3f;ChannelRedundancy=0x07;buffer[0]=RF_CMD_TRANSFER;buffer[1]=Block_Adr;temp=Command_Send(2,buffer,Transceive);if(temp==FALSE){return}temp=FIFO_Length;if(temp==0){return}temp=*buffer;switch(temp){case0x00 case0x04:case0x0a:case0x01:case0x05:}}/*名称: /*功能:该函数实现高级MIFARE卡激活命 /*输入:Secnr:扇区 Block_Adr:块地 /*输出:操作状态

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论