RC500系列 MIFARE系列射频卡 C51开发指南 2002/01/10
版本 1.1
1
目 录
简介
第一章 电子钱包两种存储形式的转换 第二章 常用常量定义 第三章 开发指南 第四章 模块命令集
2
简 介
本手册介绍了RC500系列MIFARE模块的接口命令,以及与其有关的常量定义和基本概念,并对每个命令给出了C51语言描述的调用示例。
本手册主要应用于将RC500系列模块嵌入到用户自己的主系统中,并用户系统由C51语言编写调试。请详细参阅我们提供的C51语言编写的DEMO应用程序,相信对你的工作有所帮助。
请参阅《RC500系列MIFARE开发指南》。
一、 标准通信命令
为方便用户开发,请用户尽量使用我们在DEMO目录中提供的标准通信函数Mf_sendcmd(),此命令已经过我们完整的测试。用户只需了解此函数的入口、出口参数即可。
此函数采用全局数组write_buff 存放入口、出口参数,用户亦可以按照自身的 实际要求,修改此函数。
调用格式:
unsigned char cmd; unsigned char length; /*对cmd 赋值*/ /*对length 赋值*/ /*对write_buff 赋值*/ unsigned char status=Mf_sendcmd(cmd,length) /* 处理 status 以及 出口参数 write_buff*/
参 数: write_buff: 命令块数组,系统默认的参数传入、传出数组 cmd : 是发给模块的命令码 length : 是命令块长度 返回状态: 参见“错误代码表” MI_OK: 命令执行正确 MI_ERR: 命令执行错误
描 述: 此命令用来与模块通讯。调用前必须设置命令代码和命令块长度。 如是入口参数,则从write_buff数组传入(参见示例a.) 如是出口参数,则从write_buff数组取出(参见示例b.)
示 例:
a.模块设备的控制(传入参数的情况) unsigned char status; 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数组中,无回传参数
3
b.读取模块号(传出参数的情况) unsigned char status; unsigned char McmNo; status=Mf_sendcmd(MCMNO,0); McmNo=write_buff[0];
说明:读取模块号命令,命令码是MCMNO,命令块长度是0,有一个回传参数
4
第一章 电子钱包两种存储形式的转换
Mifare 1卡中电子钱包是一个LONG型数据,在内存中占用4字节。 在C51中这两种数据类型转换如下:
[1] 数组转换到长整型
unsigned long longvalue; unsigned char value[4]; longvalue=0;
for(unsigned char i=0;i<4;i++) { longvalue+=value[i]<<(8*I); }
[2] 长整型转换到数组
unsigned long longvalue; unsigned char value[4]; longvalue=0x10203040; for(unsigned char i=0;i<4;i++) { value[i]=(unsigned char )(longvalue>>(8*i)); }
5
第二章 常用常量定义
本指南预定义了几组用户需要用到的常量,定义如下:
2.1 设备号定义
#define REDLED 1 #define GREENLED 2 #define BELL 4
2.2 呼叫方式定义
#define IDLE 0 #define ALL 1
2.3 命令返回码定义
#define MI_OK 0 #define MI_ERR 1
2.4 密码常量定义
#define KEYA 0 /*密码A */ #define KEYB 4 /*密码B */
2.5 通信方式设置
#define RS232 1 #define LDSTD 0
2.6 命令代码定义(Command Code)
#define CONNECT 0x00 #define MCMVER 0x22 #define ALARM 0x7A #define MCMNO 0xA1
#define TRANSKEY 0xA4 #define AUTHMODE 0xA9 #define GETTYPE 0xAA #define GETSNR 0xAB #define READBLOCK 0xAC #define WRITEBLOCK 0xAD #define WRITEKEY 0xAE #define READVALUE 0xAF #define WRITEVALUE 0xB0 #define INCREMENTVALUE 0xB1 #define DECREMENTVALUE 0xB2
#define LOADKEY 0xB4 #define REQUEST 0xB5
6
#define ANTICOLL 0xB6 #define SELECT 0xB7 #define AUTHENTICATION 0xB8 #define READ 0xB9 #define WRTIE 0xBA #define INCREMENT 0xBB #define DECREMENT 0xBC #define HALT 0xBD
7
第三章 开发指南
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卡的操作命令相同,但参数和参数的含义在某些命令中会有一些区别。用户应当注意这些区别。
第四章 模块的命令集
8
4.1 通用命令
通用命令是一组对模块识别、测试、和声光控制的指令,共有四条这些命令适用于本公司生产的所有智能卡读写模块。
4.1.1 模块设备的操作
功能说明:此命令用来控制模块所提供的三个基本设备:红色LED,绿色LED,
蜂鸣器。可以控制三个设备的打开时间、关闭时间、动作次数以及动作方式。 命 令 字:ALARM 调用示例:
unsigned char mode; unsigned char actiontime; unsigned char intervaltime; unsigned char count; write_buff[0]=mode; write_buff[1]=actiontime; write_buff[2]=intervaltime; write_buff[3]=count; unsigned char status=Mf_sendcmd(ALARM,4); 参 数:
mode :设备号 是三个设备:REDLED、GREENLED、BELL的或集 例如:mode=REDLED|BELL actiontime :单次动作时间(设备打开时间) 单位是10ms 例如:actiontime=15,则单次动作时间为15*10ms intervaltime:动作间歇时间(设备关闭时间) 单位是10ms 例如:intervaltime=15,则动作间歇为15*10ms count: :连续动作次数(设备打开次数) 返 回 值: MI_OK,MI_ERR;
4.1.2 联结
功能说明:此命令用来测试主系统与模块的连接是否正确 命 令 字:CONNECT 调用示例:
unsigned char status=Mf_sendcmd(CONNECT,0); 参 数:无
返 回 值:MI_OK,MI_ERR;
4.1.3 读取模块号
功能说明:此命令用来读取模块的设备号。 命 令 字:MCMNO 调用示例:
unsigned char mcmno; status=Mf_sendcmd(MCMNO,0); mcmno=write_buff[0]; 参 数:
9
mcmno: 模块返回的模块代码 mcmno=17 170模块 mcmno=20 200模块 mcmno=50 500模块 mcmno=70 TEMIC模块 mcmno=90 MEMORY模块 返 回 值:MI_OK,MI_ERR;
4.1.4 读取模块控制软件版本号
功能说明:此命令读取模块中的控制软件的版本号,如:mcmver=“VER1.00A” 命 令 字:MCMVER 调用示例:
unsigned char mcmver[8];
unsigned char status=Mf_sendcmd(MCMVER,0); for(unsigned char i=0;i<8;i++) {
mcmver[i]=write_buff[i]; } 参 数:
mcmver: 模块的控制软件版本号 返 回 值:MI_OK,MI_ERR;
4.2 高级指令
高级指令是相对于基础指令集而言,高级指令集成了基础指令的功能,简化了模块的应用。
4.2.1 密码认证方式
功能说明:此命令指定密码认证的方式,本命令仅适应于ML10。 命 令 字:AUTHMODE 调用示例:
unsigned char mode; write_buff[0]=mode;
unsigned char status=Mf_sendcmd(AUTHMODE,1); 参 数:
mode : 密码认证的方式 0:用密码A认证 1:用密码B认证 返 回 值:MI_OK,MI_ERR;
4.2.2 密码加载
功能说明:此命令将一个新密码加载到指定扇区
此命令用于单密码系统,即每个扇区只用一组密码进行认证(密码B=密码A)。 命 令 字:TRANSKEY 调用示例:
unsigned char sector; unsigned char mima[6]; write_buff[0]=sector ;
10
for(unsigned char i=0;i<6;i++) { write_buff[1+i]=mima[i]; }
unsigned char status=Mf_sendcmd(TRANSKEY,7); 参 数:
sector : 要加载密码的扇区的扇区号 mima[6]: 要加载的密码 返 回 值: MI_OK,MI_ERR;
4.2.3 读卡类型
功能说明:此命令用于检测卡并检测卡类型 命 令 字:GETTYPE 调用示例:
unsigned int cardtype;
unsigned char status=Mf_sendcmd(GETTYPE,0); cardtype=write_buff[0]; cardtype+=write_buff[1]<<8; 参 数:
cardtype: 卡类型
cardtype=0x0004 Mifare 1 卡 cardtype=0x0010 Mifare Light 10卡 返 回 值: MI_OK,MI_ERR;
4.2.4 读卡序列号
功能说明:此命令读取卡的序列号,此序列号将在读/写命令中用作参数 命 令 字:GETSNR 调用示例:
unsigned char snr[4];
status=Mf_sendcmd(GETSNR,0) for(unsigned char i=0;i<4;i++) {
snr[i]=write_buff[i]; } 参 数:
snr[4]: 卡片序列号 返 回 值:MI_OK,MI_ERR;
4.2.5 读数据块
功能说明:此命令从指定卡的指定数据块读出数据,
读数据块前必须先读出卡序列号,存放于snr中。 命 令 字:READBLOCK 调用示例:(For M1卡)
unsigned char BlockNo; extern unsigned char snr[4]; unsigned char dat[16]; write_buff[0]=BlockNo;
11
for(i=0;i<4;i++) { write_buff[1+i]=snr[i] }
unsigned char status=Mf_sendcmd(READBLOCK,5); for(i=0;i<16;i++) { dat[i]=write_buff[i]; }
调用示例(For ML10卡):
unsigned char BlockNo; extern unsigned char snr[4]; unsigned char dat[4]; write_buff[0]=BlockNo; for(i=0;i<4;i++) { write_buff[1+i]=snr[i] }
unsigned char status=Mf_sendcmd(READBLOCK,5); for(i=0;i<4;i++) { dat[i]=write_buff[i]; } 参 数:
BlockNo : “数据块”的地址
snr[4] : 卡序列号。通过GETSNR命令得到 dat[16] : 返回的16字节数据 返 回 值: MI_OK,MI_ERR;
4.2.6 写数据块
功能说明:此命令将16字节(M1卡)或4字节(ML10卡)数据写入指定卡的指定数据块 中,如果写入成功,系统回读写入的数据。
写数据块前必须先读出卡序列号,存放于snr中 命 令 字:WRITEBLOCK 返 回 值: MI_OK,MI_ERR; 调用示例:(For M1 卡)
unsigned char BlockNo; extern unsigned char snr[4]; unsigned char indata[16]; unsigned char outdata[16]; write_buff[0]=BlockNo;
for(unsigned char i=0;i<4;i++) { write_buff[1+i]=snr[i] } for(i=0;i<16;i++) {
12
write_buff[5+i]=indata[i]; } unsigned char status=Mf_sendcmd(READBLOCK,21); for(i=0;i<16;i++) { outdata[i]=write_buff[i]; } 参 数:
BlockNo : “数据块”的地址
snr[4] : 卡序列号。通过GETSNR命令得到 indata[16] : 要写入的16字节数据 outdata[16]: 回读的16字节数据 调用示例:(For ML10 卡)
unsigned char BlockNo; extern unsigned char snr[4]; unsigned char indata[4]; unsigned char outdata[4]; write_buff[0]=BlockNo;
for(unsigned char i=0;i<4;i++) { write_buff[1+i]=snr[i] } for(i=0;i<4;i++) {
write_buff[5+i]=indata[i]; } unsigned char status=Mf_sendcmd(READBLOCK,9); for(i=0;i<4;i++) { outdata[i]=write_buff[i]; } 参 数: BlockNo : “数据块”的地址
Mifare Light 中可以修改的BlockNo有 2,3,4,5,6,7,8,9,10,11
Block 4,5 常用作16位的“电子钱包”
Block 6, 7 是密码A(6字节)和存取状态码(1字 节)以及存取状态码的反码(1字节)Block 8, 9 是 密码B(6字节)和存取状态码(1字节)以及存取状 态码的反码(1字节)
snr[4] : 卡序列号。通过GETSNR命令得到 indata[4] : 要写入的4字节数据 outdata[4] : 回读的4字节数据
4.2.7 修改卡片密码
功能说明:此命令将新密码写到指定扇区。写密码前必须先读出卡序列号,存放于snr中。 此命令用于单密码系统
13
命 令 字:WRITEKEY
返 回 值: MI_OK,MI_ERR; 调用示例:(For M1 卡)
unsigned char sector; unsigned char mima[6]; write_buff[0]=sector;
for(unsigned char i=0;i<4;i++) { write_buff[1+i]=snr[i]; }
for(i=0;i<6;i++) { write_buff[5+i]=mima[i]; }
unsigned char status=Mf_sendcmd(WRITEKEY,11); 参 数:
sector : 指定扇区号 mima[6] : 6字节新密码 调用示例:(For ML10 卡)
unsigned char keyset; unsigned char mima[6]; unsigned char keyctr;
keyctr=D1WREN|D1RDEN| D2WREN|D2RDEN|KEYRWEN|VALUEWREN; sector=0;
write_buff[0]=keyset;
for(unsigned char i=0;i<4;i++) { write_buff[1+i]=snr[i]; }
for(i=0;i<6;i++) { write_buff[5+i]=mima[i]; }
write_buff[11]=keyctr;
unsigned char status=Mf_sendcmd(WRITEKEY,12); 参 数:
keyset : 0 修改密码A,1修改密码B
如果采用“高级指令”集操作,只有修改密码A有效 keyctr : 密码控制状态代码
密码控制状态代码是对密码权限的描述 密码控制状态代码有以下的权限: D1WREN 对“数据块”2,3可写 D1RDEN 对“数据块”2,3可读 D2WREN 对“数据块”10,11可写 D2RDEN 对“数据块”10,11可读 KEYWREN 对密码可写
VALUEWREN 对16位“电子钱包”可写
14
有以下特殊情况:
1. 密码永远不能读
2.对“电子钱包”一直可读(任意一组密码认证后) 3.对“电子钱包”一直可减(任意一组密码认证后)
mima[6]: 6字节新密码
4.2.8 读电子钱包
功能说明:此命令从指定“电子钱包”读出当前“金额”。 命 令 字:READVALUE 调用示例:(For M1 卡)
unsigned char snr[4]; unsigned char BlockNo; unsigned char curvalue[4]; BlockNo=4;
write_buff[0]=BlockNo; for(i=0;i<4;i++) { write_buff[1+i]=snr[i]; }
unsigned char status=Mf_sendcmd(READVALUE,5); for(i=0;i<4;i++) { curvalue[i]=write_buff[i]; } 参 数:
snr[4] : 要操作的卡的卡序列号 BlockNo : “电子钱包”的地址
curvalue[4] : “电子钱包”当前的“金额” 返 回 值:MI_OK,MI_ERR;
调用示例:(For ML10 卡)
unsigned char snr[4]; unsigned char BlockNo; unsigned char curvalue[2]; BlockNo=0; (对 ML10卡,“电子钱包”的地址自动处理,BlockNo的值不重要 ) write_buff[0]=BlockNo; for(i=0;i<4;i++) { write_buff[1+i]=snr[i]; }
unsigned char status=Mf_sendcmd(READVALUE,5); curvalue[0]=write_buff[0]; curvalue[1]=write_buff[1]; 参 数: snr[4] : 要操作的卡的卡序列号 BlockNo : “电子钱包”的地址
curvalue[2] : “电子钱包”当前的“金额”
15
4.2.9 写电子钱包
功能说明:此命令将指定“金额”写入指定“电子钱包” 命 令 字:WRITEVALUE 调用示例:(对M1卡)
unsigned char BlockNo; unsigned char value[4]; unsigned char curvalue[4]; BlockNo=4;
write_buff[0]=BlockNo; for(i=0;i<4;i++) { write_buff[1+i]=snr[i]; }
for(i=0;i<4;i++) { write_buff[5+i]=value[i]; }
unsigned char status=Mf_sendcmd(READVALUE,9); for(i=0;i<4;i++) { curvalue[i]=write_buff[i]; } 参 数:
snr[4] : 要操作的卡的卡序列号 BlockNo : “电子钱包”的地址 value[4] : 要写入的“金额”
curvalue[4] : “电子钱包”当前的“金额” 返回值: MI_OK,MI_ERR; 调用示例:(For ML10卡):
unsigned char BlockNo; unsigned char value[2]; unsigned char curvalue[2]; BlockNo=0; (对 ML10卡,“电子钱包”的地址自动处理,BlockNo的值不重要 )
write_buff[0]=BlockNo; for(i=0;i<4;i++) { write_buff[1+i]=snr[i]; }
write_buff[5]=value[0]; write_buff[6]=value[1];
unsigned char status=Mf_sendcmd(READVALUE,7); curvalue[0]=write_buff[0]; curvalue[1]=write_buff[1]; 参 数:
16
snr[4] : 要操作的卡的卡序列号 BlockNo : “电子钱包”的地址 value[2] : 要写入的“金额”
curvalue[2] : “电子钱包”当前的“金额”
4.2.10 加电子钱包
功能说明:此命令增加电子钱包的金额,本命令仅对M1卡有效。 命 令 字:INCREMENTVALUE 调用示例:
unsigned char snr[4]; unsigned char BlockNo; unsigned char invalue[4]; unsigned char curvalue[4]; BlockNo=4;
write_buff[0]=BlockNo;
for(unsigned char i=0;i<4;i++) { write_buff[1+i]=snr[i]; }
for(i=0;i<4;i++) { write_buff[5+i]=invalue[i]; }
unsigned char status=Mf_sendcmd(INCREMENTDVALUE,9); for(i=0;i<4;i++) 回传的电子钱包数据,4字节 {
curvalue[i]=write_buff[i]; } 参 数:
snr[4] : 要操作的卡的卡序列号 BlockNo : “电子钱包”的地址 invalue[4] : 要增加的“金额”
curvalue[4] : “电子钱包”当前的“金额” 返 回 值: MI_OK,MI_ERR;
4.2.11 减电子钱包
功能说明:此命令扣除电子钱包的金额 命 令 字:DECREMENTVALUE 调用示例:(For M1 卡)
unsigned char snr[4]; unsigned char BlockNo; unsigned char devalue[4]; unsigned char curvalue[4]; BlockNo=4;
write_buff[0]=BlockNo;
for(unsigned char i=0;i<4;i++) {
17
write_buff[1+i]=snr[i]; }
for(i=0;i<4;i++) { write_buff[5+i]=devalue[i]; }
unsigned char status=Mf_sendcmd(DECREMENTDVALUE,9); for(i=0;i<4;i++) { curvalue[i]=write_buff[i]; } 参 数:
snr[4] : 要操作的卡的卡序列号 BlockNo : “电子钱包”的地址 devalue[4] : 要扣除的“电子金额”
curvalue[4] : “电子钱包”剩余的“电子金额” 返 回 值: MI_OK,MI_ERR; 调用示例:(For ML10卡)
unsigned char snr[4]; unsigned char BlockNo; unsigned char devalue[2]; unsigned char curvalue[2]; BlockNo=0; (对 ML10卡,“电子钱包”的地址自动处理,BlockNo的值不重 要 )
write_buff[0]=BlockNo;
for(unsigned char i=0;i<4;i++) { write_buff[1+i]=snr[i]; }
write_buff[5]=devalue[0]; write_buff[6]=devalue[1];
unsigned char status=Mf_sendcmd(DECREMENTDVALUE,7); value[0]=write_buff[0]; value[1]=write_buff[1]; 参 数:
snr[4] : 要操作的卡的卡序列号 BlockNo : “电子钱包”的地址 devalue[2] : 要扣除的“电子金额”
curvalue[2] : “电子钱包”剩余的“电子金额”
4.3 基础指令
基础指令提供了Mifare 射频模块最底层的操作。
基础指令的应用较为复杂,常需要几条指令才能完成一条高级指令的功能。
4.3.1 密码加载
功能说明:此命令将一个新密码加载到“模块控制芯片”的RAM中 命 令 字:LOADKEY
18
调用示例:(For M1 卡)
unsigned char mode; unsigned char sector; unsigned char mima[6]; mode=KEY?|KSET?; write_buff[0]=mode; write_buff[1]=sector; for(unsigned char i=0;i<6;i++) { write_buff[2+i]=mima[i]; }
unsigned char status=Mf_sendcmd(LOADKEY,8); 参 数:
mode : mode=KEY?|KSET?
KEY?=KEYA 加载密码A KEY?=KEYB 加载密码B
KSET?=KSET0 加载第0组密码 KSET?=KSET1 加载第1组密码 KSET?=KSET2 加载第2组密码 Sector : 要加载密码的扇区号 mima[6]: 要加载的6字节密码 返 回 值: MI_OK,MI_ERR; 调用示例:(For ML10 卡) unsigned char mode;
unsigned char mima[6]; mode=KEY?|KSET?; write_buff[0]=mode; write_buff[1]=0; for(unsigned char i=0;i<6;i++) { write_buff[2+i]=mima[i]; }
unsigned char status=Mf_sendcmd(LOADKEY,8); 参 数:
mode : mode=KEY?|KSET?
KEY?=KEYA 加载密码A KEY?=KEYB 加载密码B KSET?=KSET0 加载第0组密码 KSET?=KSET1 加载第1组密码 KSET?=KSET2 加载第2组密码 mima[6]: 要加载的6字节密码
4.3.2 卡呼叫
功能说明:此命令对在操作有效区的卡进行呼叫,若有卡响应,将返回该卡片型号。 命 令 字:REQUEST 调用示例:
19
unsigned char mode; unsigned int cardtype; mode=ALL; /* 或mode = IDLE */ write_buff[0]=mode; unsigned char status=Mf_sendcmd(REQUEST,1); cardtype =write_buff[0]; cardtype+=write_buff[1]<<8; 参 数: mode: 指定呼叫方式 mode=ALL 将呼叫所有卡 mode=IDLE 呼叫所有卡,但休眠的卡除外(即用HALT指令休眠的卡) cardtype:卡型号 cardtype = 0x0010 ML10卡 cardtype = 0x0004 M1 卡 返 回 值: MI_OK,MI_ERR;
4.3.3 防碰撞选择
功能说明:利用“防碰撞选择”命令,使同在系统有效天线工作区的几张卡中的一张被选 择,并返回卡号。当系统决定对这张卡操作时,可用SELECT命令激活这张卡。 命 令 字:ANTICOLL 调用示例:
unsigned char snr[4];
unsigned char status=Mf_sendcmd(ANTICOLL,0); for(i=0;i<4;i++) {
snr[i]=write_buff[i]; }
参 数: 无传入参数
snr[4]:返回的卡序列号 返 回 值: MI_OK,MI_ERR;
4.3.4 卡激活
功能说明:此命令激活指定的卡,卡的序列号由ANTICOLL命令返回 只有卡激活后,才可进行以下的操作 命 令 字:SELECT 调用示例:
extern unsigned char snr[4]; for(i=0;i<4;i++) { write_buff[i]=snr[i]; } unsigned char status=Mf_sendcmd(SELECT,4); 参 数:
snr[4]: 所要激活的卡的序列号, 返 回 值: MI_OK,MI_ERR;
4.3.5 卡认证
20
功能说明:此命令对卡进行认证。只有经过认证后的卡才可进行读、写、加、 减等操作
命 令 字:AUTHENTICATION 调用示例:(For M1 卡)
unsigned char mode; unsigned char sector; unsigned char adr; mode=KEY?|KSET?; write_buff[0]=mode; write_buff[1]=sector; write_buff[2]=adr; unsigned char status=Mf_sendcmd(AUTHENTICATION,3); 参 数:
mode : mode=KEY?|KSET?
KEY?=KEYA 用密码A认证
KEY?=KEYB 用密码B认证 KSET?=KSET0 用第0组密码 KSET?=KSET1 用第1组密码 KSET?=KSET2 用第2组密码 sector: MCM address
adr : 要进行操作的数据块的“数据块号” 返 回 值: MI_OK,MI_ERR; 调用示例:(For ML10 卡)
unsigned char mode; unsigned char adr; mode=KEY?|KSET?; write_buff[0]=mode; write_buff[1]=0; write_buff[2]=6; unsigned char status=Mf_sendcmd(AUTHENTICATION,3); 参 数:
mode : mode=KEY?|KSET?
KEY?=KEYA 用密码A认证
KEY?=KEYB 用密码B认证 KSET?=KSET0 用第0组密码 KSET?=KSET1 用第1组密码 KSET?=KSET2 用第2组密码 adr : 6
4.3.6 读数据块
功能说明:此命令从指定数据块读出数据 命 令 字:READ 调用示例:(For M1卡)
unsigned char BlockNo; unsigned char dat[16]; write_buff[0]=BlockNo;
21
unsigned char status=Mf_sendcmd(READ,1); for(i=0;i<16;i++) { dat[i]=write_buff[i]; } 参 数:
BlockNo : “数据块”的块号 dat[16]: 读出的数据 返 回 值: MI_OK,MI_ERR; 调用示例:(For ML10 卡)
unsigned char BlockNo; unsigned char dat[4]; write_buff[0]=BlockNo; unsigned char status=Mf_sendcmd(READ,1); for(i=0;i<4;i++) { dat[i]=write_buff[i]; } 参 数:
BlockNo : “数据块”的块号 dat[4]: 读出的数据
4.3.7 写数据块
功能说明:此命令将数据写入指定数据块 命 令 字:WRITE 调用示例:(For M1 卡)
unsigned char BlockNo; unsigned char dat[16]; write_buff[0]=BlockNo;
for(unsigned char i=0;i<16;i++) {
write_buff[1+i]=dat[i]; } unsigned char status=Mf_sendcmd(WRITE,17); 参 数:
BlockNo : “数据块”的块号 dat[16]: 要写入卡的数据 返 回 值: MI_OK,MI_ERR; 调用示例:(For ML10 卡)
unsigned char BlockNo; unsigned char dat[4]; write_buff[0]=BlockNo;
for(unsigned char i=0;i<4;i++) {
write_buff[1+i]=dat[i]; }
22
unsigned char status=Mf_sendcmd(WRITE,5); 参 数:
BlockNo : “数据块”的块号 dat[4]: 要写入卡的数据
4.3.8 加电子钱包
功能说明:此命令增加“电子钱包”的“金额”,本命令仅用于M1卡。 命 令 字:INCREMENT 调用示例:
unsigned char BlockNo; unsigned char value[4]; write_buff[0]=BlockNo;
for(unsigned char i=0;i<4;i++) {
write_buff[1+i]=value[i]; }
unsigned char status=Mf_sendcmd(INCREMENT,5); 参 数:
BlockNo : “电子钱包”的块号 value[4]: 要增加的“金额” 返 回 值: MI_OK,MI_ERR
4.3.9 减电子钱包
功能说明:此命令扣除电子钱包的金额。 命 令 字:DECREMENT 调用示例:(For M1 卡)
unsigned char BlockNo; unsigned char value[4]; write_buff[0]=BlockNo;
for(unsigned char i=0;i<4;i++) { write_buff[1+i]=value[i]; } unsigned char status=Mf_sendcmd(DECREMENT,5); 参 数:
BlockNo : “电子钱包”的块号 value[4]: 要扣除的“电子金额” 返 回 值: MI_OK,MI_ERR 调用示例:(For ML10 卡)
unsigned char BlockNo; unsigned char value[2]; write_buff[0]=BlockNo;
for(unsigned char i=0;i<2;i++) { write_buff[1+i]=value[i]; }
23
unsigned char status=Mf_sendcmd(DECREMENT,3); 参 数:
BlockNo : “电子钱包”的块号 value[2]: 要扣除的“电子金额”
4.3.10 卡睡眠
功能说明:此命令将激活的卡设置为 “休眠方式”,设置以后只有用两种方式可将它激活 (1) 复位卡,即将卡拿开操作区再将它从新拿入 (2) 用(ALL) 方式进行呼叫。参见“卡呼叫” 命 令 字:HALT
调用示例:unsigned char status=Mf_sendcmd(HALT,0); 参 数:无
返 回 值: MI_OK,MI_ERR;
24
因篇幅问题不能全部显示,请点此查看更多更全内容