1RC500系列MIFARE系列射频卡C51开发指南2002/01/10版本1.12目录简介第一章电子钱包两种存储形式的转换第二章常用常量定义第三章开发指南第四章模块命令集3简介本手册介绍了RC500系列MIFARE模块的接口命令,以及与其有关的常量定义和基本概念,并对每个命令给出了C51语言描述的调用示例。本手册主要应用于将RC500系列模块嵌入到用户自己的主系统中,并用户系统由C51语言编写调试。请详细参阅我们提供的C51语言编写的DEMO应用程序,相信对你的工作有所帮助。请参阅《RC500系列MIFARE开发指南》。一、标准通信命令为方便用户开发,请用户尽量使用我们在DEMO目录中提供的标准通信函数Mf_sendcmd(),此命令已经过我们完整的测试。用户只需了解此函数的入口、出口参数即可。此函数采用全局数组write_buff存放入口、出口参数,用户亦可以按照自身的实际要求,修改此函数。调用格式:unsignedcharcmd;unsignedcharlength;/*对cmd赋值*//*对length赋值*//*对write_buff赋值*/unsignedcharstatus=Mf_sendcmd(cmd,length)/*处理status以及出口参数write_buff*/参数:write_buff:命令块数组,系统默认的参数传入、传出数组cmd:是发给模块的命令码length:是命令块长度返回状态:参见“错误代码表”MI_OK:命令执行正确MI_ERR:命令执行错误描述:此命令用来与模块通讯。调用前必须设置命令代码和命令块长度。如是入口参数,则从write_buff数组传入(参见示例a.)如是出口参数,则从write_buff数组取出(参见示例b.)示例:a.模块设备的控制(传入参数的情况)unsignedcharstatus;write_buff[0]=REDLED|BELL;write_buff[1]=10;write_buff[2]=20;write_buff[3]=3;status=Mf_sendcmd(ALARM,4);说明:灯控命令,命令码是ALARM,命令块长度是4,4个参数存放于write_buff数组中,无回传参数4b.读取模块号(传出参数的情况)unsignedcharstatus;unsignedcharMcmNo;status=Mf_sendcmd(MCMNO,0);McmNo=write_buff[0];说明:读取模块号命令,命令码是MCMNO,命令块长度是0,有一个回传参数5第一章电子钱包两种存储形式的转换Mifare1卡中电子钱包是一个LONG型数据,在内存中占用4字节。在C51中这两种数据类型转换如下:[1]数组转换到长整型unsignedlonglongvalue;unsignedcharvalue[4];longvalue=0;for(unsignedchari=0;i4;i++){longvalue+=value[i](8*I);}[2]长整型转换到数组unsignedlonglongvalue;unsignedcharvalue[4];longvalue=0x10203040;for(unsignedchari=0;i4;i++){value[i]=(unsignedchar)(longvalue(8*i));}6第二章常用常量定义本指南预定义了几组用户需要用到的常量,定义如下:2.1设备号定义#defineREDLED1#defineGREENLED2#defineBELL42.2呼叫方式定义#defineIDLE0#defineALL12.3命令返回码定义#defineMI_OK0#defineMI_ERR12.4密码常量定义#defineKEYA0/*密码A*/#defineKEYB4/*密码B*/2.5通信方式设置#defineRS2321#defineLDSTD02.6命令代码定义(CommandCode)#defineCONNECT0x00#defineMCMVER0x22#defineALARM0x7A#defineMCMNO0xA1#defineTRANSKEY0xA4#defineAUTHMODE0xA9#defineGETTYPE0xAA#defineGETSNR0xAB#defineREADBLOCK0xAC#defineWRITEBLOCK0xAD#defineWRITEKEY0xAE#defineREADVALUE0xAF#defineWRITEVALUE0xB0#defineINCREMENTVALUE0xB1#defineDECREMENTVALUE0xB2#defineLOADKEY0xB4#defineREQUEST0xB57#defineANTICOLL0xB6#defineSELECT0xB7#defineAUTHENTICATION0xB8#defineREAD0xB9#defineWRTIE0xBA#defineINCREMENT0xBB#defineDECREMENT0xBC#defineHALT0xBD8第三章开发指南RC500系统模块提供了两组操作命令用于用户的开发工作:高级指令和基础指令。基础指令提供了RC500系列MIFARE读写器最基本的指令,适用于有特殊要求和极高安全要求的用户。使用基础指令开发难度较大,且需要对MIFARE射频卡有较深入的了解。高级指令是为方便用户操作,将基础指令集成,提供了相对强大的功能,用高级指令集开发系统,开发速度快,总的执行时间短,易于用户维护。常见的用户数据有两种:通用数据和钱包数据。通用数据指用户存放的文本数据、二进制数据,模块高级指令中提供的读写通用数据的命令有两条:READBLOCK(读),WRITEBLOCK(写)。钱包数据是一个长整形数据(M1卡)或整形数据(ML10卡)。对M1卡,模块高级指令中提供了4条操作命令:READVALUE(读),WRITEVALUE(写),INCREMENTVALUE(加),DECREMENTVALUE(减);对ML10卡,模块高级指令中提供了3提供了3条操作命令:READVALUE(读)、WRITEVALUE(写)、DECREMENTVALUE(减)。在M1卡中,每个BLOCK都可以存放通用数据或钱包数据,但要注意的是在一个BLOCK中必须使用WRITEVALUE命令后,才能作为一个钱包数据进行加减读操作。否则,会发生错误。在ML10卡中,有两个专门的BLOCK存放钱包数据,其他BLOCK不能存放钱包数据,操作钱包数据时不需传递钱包数据的地址(BLOCK号),在不需要钱包数据时,存放钱包数据的BLOCK可以存放普通的数据。利用高级指令开发应用系统时,对卡的操作请遵循以下的顺序:1.加载密码在系统上电后,如果每张卡的密码都一样,则只要向系统传递一次密码即可系统采用M1卡时,可以有两个密码加载命令,TRANSKEY、LOADKEY。建议使用TRANSKEY。对ML10卡,则只能使用LOADKEY命令传递密码。参见以下《命令集》2.系统可以通过GETTYPE命令来判定是否有卡进入操作区当GETTYPE命令正确返回时,说明有卡进入操作区。GETTYPE命令返回卡的类型根据卡的不同类型,用户执行相应的操作。3.读卡序列号(GETSNR)GETSNR命令返回卡的序列号,用户应当保存卡的序列号,以作为读/写/加/减命令的参数。4.读、写数据块,读、写、加、减电子钱包,修改密码采用高级指令进行操作,模块在一个时刻只能处理一张卡,当有多张卡同时进入模块的操作区时,模块不能有效处理每一张卡。在需要同时处理多张卡时,应该采用基础指令集进行操作。在对卡进行写、加、减操作时,模块都会返回该BLOCK当前的数值。模块对M1卡和ML10卡的操作命令相同,但参数和参数的含义在某些命令中会有一些区别。用户应当注意这些区别。第四章模块的命令集94.1通用命令通用命令是一组对模块识别、测试、和声光控制的指令,共有四条这些命令适用于本公司生产的所有智能卡读写模块。4.1.1模块设备的操作功能说明:此命令用来控制模块所提供的三个基本设备:红色LED,绿色LED,蜂鸣器。可以控制三个设备的打开时间、关闭时间、动作次数以及动作方式。命令字:ALARM调用示例:unsignedcharmode;unsignedcharactiontime;unsignedcharintervaltime;unsignedcharcount;write_buff[0]=mode;write_buff[1]=actiontime;write_buff[2]=intervaltime;write_buff[3]=count;unsignedcharstatus=Mf_sendcmd(ALARM,4);参数:mode:设备号是三个设备:REDLED、GREENLED、BELL的或集例如:mode=REDLED|BELLactiontime:单次动作时间(设备打开时间)单位是10ms例如:actiontime=15,则单次动作时间为15*10msintervaltime:动作间歇时间(设备关闭时间)单位是10ms例如:intervaltime=15,则动作间歇为15*10mscount::连续动作次数(设备打开次数)返回值:MI_OK,MI_ERR;4.1.2联结功能说明:此命令用来测试主系统与模块的连接是否正确命令字:CONNECT调用示例:unsignedcharstatus=Mf_sendcmd(CONNECT,0);参数:无返回值:MI_OK,MI_ERR;4.1.3读取模块号功能说明:此命令用来读取模块的设备号。命令字:MCMNO调用示例:unsignedcharmcmno;status=Mf_sendcmd(MCMNO,0);mcmno=write_buff[0];参数:10mcmno:模块返回的模块代码mcmno=17170模块mcmno=20200模块mcmno=50500模块mcmno=70TEMIC模块mcmno=90MEMORY模块返回值:MI_OK,MI_ERR;4.1.4读取模块控制软件版本号功能说明:此命令读取模块中的控制软件的版本号,如:mcmver=“VER1.00A”命令字:MCMVER调用示例:unsignedcharmcmver[8];unsignedcharstatus=Mf_sendcmd(MCMVER,0);for(unsignedchari=0;i8;i++){mcmver[i]=write_buff[i];}参数:mcmver:模块的控制软件版本号返回值:MI_OK,MI_ERR;4.2高级指令高级指令是相对于基础指令集而言,高级指令集成了基础指令的功能,简化了模块的应用。4.2.1密码认证方式功能说明:此命令指定密码认证的方式,本命令仅适应于ML10。命令字:AUTHMODE调用示例:unsignedcharmode;write_buff[0]=mode;unsignedcharstatus=Mf_sendcmd(AUTHMODE,1);参数:mode:密码认证的方式0:用密码A认证1:用密码B认证返回值:MI_OK,MI_ERR;4.2.2密码加载功能说明:此命令将一个新密码加载到指定扇区此命令用于单密码系统,即每个扇区只用一组密码进行认证(密码B=密码A)。命令字:TRANSKEY调用示例:unsignedcharsector;unsignedcharmima[6];write_buff[0]=sector;11for(unsignedchari=0;i6;i++){write_buff[1+i]=mima[i];}unsignedcharstatus=Mf_sendcmd(TRANSKEY,7);参数:sector:要加载密码的扇区的扇区号mima[6]:要加载的密码返回值:MI_OK,MI_ERR;4.2.3读卡类型功能说明:此命