复旦微电子RF读写器动态库函数说明(第二版修改稿)_第1页
复旦微电子RF读写器动态库函数说明(第二版修改稿)_第2页
复旦微电子RF读写器动态库函数说明(第二版修改稿)_第3页
复旦微电子RF读写器动态库函数说明(第二版修改稿)_第4页
复旦微电子RF读写器动态库函数说明(第二版修改稿)_第5页
已阅读5页,还剩15页未读 继续免费阅读

下载本文档

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

文档简介

上海复旦微电子股份有限公司设计文件复旦微电子RF动态连接库函数说明上海复旦微电子股份有限公司上海复旦微电子股份有限公司中国上海目录TOC\o"1-4"\h\z1. 射频卡介绍 42. M1兼容卡 42.1. 电气特性 42.2. 存储结构 42.3. 控制属性 42.4. 工作原理 62.5. 提供操作函数 6 数据操作函数 6 值操作函数(钱包操作) 6 芯片操作函数 6 高级函数 63. TOKEN(筹码型)卡介绍 73.1. 电气特性 73.2. 提供操作函数 74. 非接触CPU卡介绍 84.1. 电气特性 84.2. 提供操作函数 85. 库函数 85.1. Mifare1卡函数使用规则 95.2. TOKEN卡函数使用规则 105.3. 钱包操作的特殊指令(适用于以上两种卡) 105.4. CPU卡函数使用规则 105.5. 函数返回信息代码 105.6. RFDLL.dll库函数详细说明 115.6.1. rf_reset 115.6.2. rf_beep 115.6.3. rf_init 125.6.4. rf_exit 125.6.5. rf_cardtype 125.6.6. rf_request 125.6.7. rf_anticoll 135.6.8. rf_select 135.6.9. rf_load_key 135.6.10. rf_halt 145.6.11. rf_read 145.6.12. rf_write 145.6.13. rf_authentication 145.6.14. rf_initval 155.6.15. rf_readval 155.6.16. rf_increment 155.6.17. rf_decrement 165.6.18. rf_restore 165.6.19. rf_transfer 165.6.20. rf_HL_read 165.6.21. rf_HL_write 175.6.22. rf_HL_initval 175.6.23. rf_HL_increment 185.6.24. rf_HL_decrement 185.6.25. rf_token_read_noauth 185.6.26. rf_token_read 195.6.27. rf_token_write 195.6.28. rf_rats 195.6.29. rf_pps 205.6.30. rf_cpu_access 20射频卡介绍射频卡即为非接触式IC卡,主要包括非接触逻辑加密卡和非接触CPU卡。按卡类型分类则有TYPEA卡、TYPEB卡、15693卡等类型,其中TYPEA卡应用比较广泛,我公司的FM11RF32、FM11RF08、FM11RF005以及新研发成功的FM1208等芯片均是不同容量的TYPEA卡。其中FM1208为兼容逻辑加密卡的非接触CPU卡。而FM11RF32、FM11RF08、FM11RF005为非接触逻辑加密卡。它们中间容量为8K的FM11RF08是与Mifareone完全兼容的,512位的FM11RF005是一种小容量的筹码卡(又叫做TOKEN卡)。下面分别介绍一下:M1兼容卡M1卡为8K位的非接触式IC卡(典型产品:FM11RF08)。电气特性容量为8K位EEPROM分为16个扇区,每个扇区为4块,每块16个字节,以块为存取单位每个扇区有独立的一组密码及访问控制每张卡有唯一序列号,为32位具有防冲突机制,支持多卡操作无电源,自带天线,内含加密控制逻辑和通讯逻辑电路工作温度:-20℃~50工作频率:13.56MHZ通信速率:106KBPS读写距离:10c数据保存期为10年,可改写10万次,读不限次存储结构M1卡分为16个扇区,每个扇区4块(块0~3),共64块,按块号编址为0~63。第0扇区的块0(即绝对地址0块)用于存放厂商代码,已经固化,不可更改。其他各扇区的块0、块1、块2为数据块,用于存贮数据;块3为控制块,存放密码A、存取控制、密码B,其结构如下:A0A1A2A3A4A5FF078069B0B1B2B3B4B5密码A(6字节)存取控制(4字节)密码B(6字节)控制属性每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制。在存取控制中每个块都有相应的三个控制位,定义如下:0块0:C10C20C301块1:C11C21C312块2:C12C22C323块3:C13C23C33三个控制位以正和反两种形式存在于存取控制字节中,决定了该块的访问权限(如进行减值操作必须验证KEYA,进行加值操作必须验证KEYB,等等)。三个控制位在存取控制字节中的位置如下(字节9为备用字节,默认值为0x69):bit76543210字节6C23_bC22_bC21_bC20_bC13_bC12_bC11_bC10_b字节7C13C12C11C10C33_bC32_bC31_bC30_b字节8C33C32C31C30C23C22C21C20(注:_b表示取反)其中,黑色区控制块3,蓝色区控制块2,绿色区控制块1,红色区控制块0。数据块(块0、块1、块2)的存取控制如下:控制位(X=0..2)访问条件(对块0、1、2)C1XC2XC3XReadWriteIncrementDecrement、transfer、restore000KeyA|BKeyA|BKeyA|BKeyA|B010KeyA|BNeverNeverNever100KeyA|BKeyBNeverNever110KeyA|BKeyBKeyBKeyA|B001KeyA|BNeverNeverKeyA|B011KeyBKeyBNeverNever101KeyBNeverNeverNever111NeverNeverNeverNever(KeyA|B表示密码A或密码B,Never表示任何条件下不能实现)例如:当块0的存取控制位C10C20C控制块(块3)的存取控制与数据块(块0、1、2)不同,它的存取控制如下:控制位密码A存取控制密码BC13C23C33ReadWriteReadWriteReadWrite000NeverKeyA|BKeyA|BNeverKeyA|BKeyA|B010NeverNeverKeyA|BNeverKeyA|BNever100NeverKeyBKeyA|BNeverNeverKeyB110NeverNeverKeyA|BNeverNeverNever001NeverKeyA|BKeyA|BKeyA|BKeyA|BKeyA|B011NeverKeyBKeyA|BKeyBNeverKeyB101NeverNeverKeyA|BKeyBNeverNever111NeverNeverKeyA|BNeverNeverNever例如:当块3的存取控制位C13C23C密码A:不可读,验证KEYB正确后,可写(更改)。存取控制:验证KEYA或KEYB正确后,可读不可写。密码B:不可读,验证KEYB正确后,可写。工作原理卡片的电气部分只由一个天线和ASIC组成。天线:卡片的天线是只有几组绕线的线圈,很适于封装到IS0卡片中。ASIC:卡片的ASIC由一个高速(106KB波特率)的RF接口,一个控制单元和一个8K位EEPROM组成。读写器向M1卡发一组固定频率的电磁波,卡片内有一个LC串联谐振电路,其频率与读写器发射的频率相同,在电磁波的激励下,LC谐振电路产生共振,从而使电容内有了电荷,在这个电容的另一端,接有一个单向导通的电子泵,将电容内的电荷送到另一个电容内储存,当所积累的电荷达到2V时,此电容可作为电源为其它电路提供工作电压,将卡内数据发射出去或接取读写器的数据。提供操作函数数据操作函数验证密码函数:rf_authentication()读函数:rf_read()写函数:rf_write()值操作函数(钱包操作)初始化值:rf_initval()读值函数:rf_readval()增值函数:rf_increment()减值函数:rf_decrement()芯片操作函数回传函数:rf_restore()传送函数:rf_transfer()高级函数高级函数集成以下几个函数:读函数:rf_HL_read()写函数:rf_HL_write()初始化值:rf_HL_initval()增值函数;rf_HL_increment()减值函数:rf_HL_decrement()TOKEN(筹码型)卡介绍TOKEN卡为512位的非接触式IC卡(典型产品:FM11RF005)。电气特性容量为512位EEPROM分为3个区、16个BLOCK,每个BLOCK包括4个字节,32位106Kbit/s的高速通信波特率半双工通信方式三重防伪认证、读写权限控制操作距离不小于6cm(筹码直径为300mm,厚度为2mm)符合ISO/IEC14443.2的TYPEA协议大于10万次的数据擦写测试超过10年数据保存期块分区与读写权限表1:读写权限块编号未认证认证后0~1只可读只可读2~7只可读可读/可写8~15不可读/不可写可读/可写块1和块2为芯片标识,它由客户代码、制造商代码和芯片序列号组成,见表2Block01230客户代码(CID)制造商(MID)1芯片序列号(SN)芯片的标识是唯一的,由芯片制造商固化在芯片内不能改变。提供操作函数数据操作函数在进行卡片操作前,应先执行:rf_cardtype指令未认证读函数(可读前8块):rf_token_read_noauth进行密码装载rf_load_key指令后可执行:读函数:rf_token_read写函数:rf_token_write非接触CPU卡介绍FM1208系列为支持电子钱包和兼容现有公交卡的低成本的非接触CPU卡。它把现有用于公交卡的非接触逻辑加密卡和符合银行标准的CPU卡的功能合二为一。电气特性通信协议:ISO14443-A兼容FM11RF08M、FM11RF08SH、FM11RF32M、FM11RF32SH系列非接触卡芯片MCU指令兼容Turbo51支持106Kbps和212Kbps数据传输速率Triple-DES协处理器程序存储器32Kx8bitROM(版本2为12Kx8bitEEPROM)数据存储器8Kx8bitEEPROM128x8bitiRAM384x8bitxRAM低压检测复位高低频检测复位EEPROM满足10万次擦写指标提供操作函数选择应答请求: rf_rats协议和参数选择请求: rf_pps发送COS命令: rf_cpu_access库函数我公司提供WINDOWS32位动态库供二次开发使用。设备操作函数复位:rf_reset蜂鸣:rf_beep通用函数串口初始化: rf_init关闭串口: rf_exit轮询卡: rf_request防冲突: rf_anticoll选卡: rf_select装载密钥: rf_load_key置空闲: rf_halt读块: rf_read写块: rf_write选择卡类型: rf_cardtypeM1卡密钥认证: rf_authentication初始化值: rf_initval读值: rf_readval增值: rf_increment减值: rf_decrement高级读: rf_HL_read高级写: rf_HL_write高级初始化值:rf_HL_initval高级增值: rf_HL_increment高级减值: rf_HL_decrementTOKEN卡未认证读: rf_token_read_noauth读: rf_token_read写: rf_token_writeCPU卡选择应答请求: rf_rats协议和参数选择请求: rf_pps发送COS命令: rf_cpu_accessMifare1卡函数使用规则程序开始,调用rf_init函数初始化串口。调用rf_cardtype函数设置卡片类型;对扇区操作,顺次执行A~C或顺次执行D~H;选定要操作的扇区;装载密码,调用rf_load_key;直接调用高级函数rf_HL_read和rf_HL_write调用rf_request发送轮询命令;调用rf_anticoll获得卡序列号;调用rf_select选中卡片;验证密码,调用rf_authentication;进行操作,包括读写及值操作(rf_read和rf_write)。中止操作,调用rf_halt。关闭串口,调用rf_exit。程序正常退出或因错误退出之前,要使用函数;否则再次执行初始化串口时将出错。TOKEN卡函数使用规则程序开始,调用rf_init函数初始化串口;调用rf_cardtype函数设置卡片类型;调用rf_token_read_noauth进行前8块读操作;装载密码,调用rf_load_key;调用rf_token_read、rf_token_write进行读写操作。中止操作,调用rf_halt。关闭串口,调用rf_exit。程序正常退出或因错误退出之前,要使用函数;否则再次执行初始化串口时将出错。钱包操作的特殊指令(适用于以上两种卡)由于存储钱包的块格式特殊,故若对钱包块操作需要以下函数:rf_initval将一个块初始化为钱包块;rf_readval读钱包值;rf_increment给钱包增值;rf_decrement给钱包减值。rf_HL_initval,rf_HL_increment,rf_HL_decrement与上面1)、3)、4)函数相同,只是使用它们底层程序自动完成轮询、防冲突、选卡、密钥认证操作,使用者不需再逐个调用。CPU卡函数使用规则程序开始,调用rf_init函数初始化串口。调用rf_cardtype函数设置卡片类型;调用rf_request发送轮询命令;调用rf_anticoll获得卡序列号;调用rf_select选中卡片;调用rf_rats发送选择应答请求,进入CPU卡模式;调用rf_pps发送协议和参数选择请求;调用rf_cpu_access可发送COS指令(COS指令结构参看FMCOS技术手册)。函数返回信息代码错误代码含义0正确1无卡2卡片CRC校验错误3数值溢出错误4验证不成功5卡片奇偶校验错误6通讯错误(BCC校验错)8卡片序列号错误(anticol错误)9卡片数据长度字节错误(SELECT错误)10卡片没有通过验证11从卡片接收到的位数错误12从卡片接收到的字节数错误(仅读函数有效)13调用restore函数出错14调用transfer函数出错15调用write函数出错16调用increment函数出错17调用decrement函数出错18调用read函数出错19调用LOADKEY函数出错20通讯帧错误21调用request函数出错22调用select函数出错23调用anticoll函数出错24调用初始化函数出错25调用高级读块值函数出错42命令参数错误rf_init函数返回1串口初始化错误0串口初始化正确RFDLL.dll库函数详细说明rf_resetint rf_reset(unsignedint_Msec);功能:射频读写模块复位参数:_Msec:复位时间,0~250毫秒有效返回:成功则返回0例子:intst;st=rf_reset(60);rf_beepint__stdcallrf_beep(unsignedintMsec);功能:蜂鸣参数:_Msec蜂鸣时限单位是10毫秒返回:成功则返回0例:intst;st=rf_beep(10);rf_initintrf_init(intport,longbaud);功能:初始化串口参数:port:串口号,取值为1~4baud:为通讯波特率9600~115200返回:成功则返回0例:intst;st=rf_init(1,19200)rf_exitint rf_exit();功能:释放串口参数:返回:若关闭成功则返回0例:rf_exit();rf_cardtypeintrf_cardtype(unsignedchar_Type);功能:选择卡类别参数:_Type:卡类别编号0:TypeA卡1:TypeB卡2:上海标准卡返回:成功则返回0例:intst;st=rf_card(0);//选择标准MIFARE卡rf_requestintrf_request(unsignedchar_Mode,unsignedint*TagType);功能:寻卡请求参数:_Mode:寻卡模式,保留Tagtype:卡类型值,0x0004为M1卡,0x0010为ML卡返回:成功则返回0例:intst;unsignedinttagtype;st=rf_request(0,&tagtype);rf_anticollintrf_anticoll(unsignedchar_Bcnt,unsignedlong*_Snr);功能:防止卡冲突,返回卡的序列号参数:_Bcnt:预选卡所用的位数,标准值为0(不考虑系列号)_Snr:返回的卡序列号地址返回:成功则返回0例:intst;Unsignedlong*snr;st=rf_anticoll(0,snr);注:request指令之后应立即调用anticoll,除非卡的序列号已知。rf_selectintrf_select(unsignedlong_Snr,unsignedchar*_Size);功能:从多个卡中选取一个给定序列号的卡参数:_Snr:卡序列号_Size:指向返回的卡容量的数据返回:成功则返回0例:intst;unsignedlongsnr=239474;unsignedchar*size;st=rf_select(snr,size);rf_load_keyintrf_load_key(unsignedchar_Mode,unsignedchar_SecNr,unsignedchar*_NKey);功能:将密码装入读写模块RAM中参数:_Mode:装入密码模式,0~3KeyA,4~7KeyB_SecNr:扇区号(0~15)_Nkey:写入读写器中的卡密码返回:成功则返回0例:unsignedchartk[6]={0xa0,0xa1,0xa2,0xa3,0xa4,0xa5};/*装入1扇区的0套A密码*/if((rf_load_key(0,1,tk))!=0){printf("Loadkeyerror!");rf_exit()exit(1);}rf_haltintrf_halt();功能:中止卡操作参数:返回:成功则返回0例:st=rf_halt();rf_readintrf_read(unsignedchar_Adr,unsignedchar*_Data);功能:读取卡中数据对于M1卡,一次读一个块的数据,为16个字节;对于ML卡,一次读出相同属性的两页(0和1,2和3,...),为8个字节参数:_Adr:块号(0~63);_Data:读出数据返回:成功则返回0例:intst;unsignedchardata[16];st=rf_read(1,data);//读M1卡的块1的数据 rf_writeintrf_write(unsingnedchar_Adr,unsignedchar*_Data);功能:向卡中写入数据对于M1卡,一次必须写一个块,为16个字节;对于ML卡,一次必须写一页,为4个字节参数:_Adr:M1卡块号(0~63);_Data:要写入的数据返回:成功则返回0例:intst;unsignedchar*data=”234567890123456”st=rf_write(2,data);rf_authenticationintrf_authentication(unsignedchar_Mode,unsignedchar_SecNr);功能:验证某一扇区密码参数:_Mode:密码验证模式,0~3KeyA,4~7KeyB_SecNr:要验证密码的扇区号(0~15)返回:成功则返回0例:intst;st=rf_authentication(0,0);注:卡上每个扇区有A密码和B密码,可根据实际需要确定是否使用B密码,这由该扇区的存取控制位来决定。此外,读写器中可以存放4套密码,可用rf_load_key()来分别装入,只有装入后才能使用验证密码函数验证。rf_initvalintrf_initval(unsignedchar_Adr,unsignedlong_Value);参数:_Adr:块地址(0~63)_Value:初始值返回:成功则返回0例:intst;unsignedlongvalue;value=1000;/*给value赋值*/st=rf_initval(1,value);/*将块1的值初始化为1000*/注:在进行值操作前时,必须已执行过一次初始化值操作,然后可以进行任意的读、减、加的操作。rf_readvalrf_readval(unsignedchar_Adr,unsignedlong*_Value);功能:读块值参数:_Adr:块地址(0~63)_Value:读出值的地址返回:成功则返回0例:intst;unsignedlongvalue;st=rf_readval(1,&value);/*读出块1的值,放入value*/rf_incrementintrf_increment(unsignedchar_Adr,unsignedlong_Value);功能:块加值参数:_Adr:块地址(0~63)_Value:要增加的值返回:成功则返回0;例:intst;unsignedlongvalue;value=10;st=rf_increment(1,value);/*将块1的值增加value*/rf_decrementintrf_decrement(unsignedchar_Adr,unsignedlong_Value);功能:块减值参数:_Adr:块地址(0~63)_Value:要减的值返回:成功则返回0例:intst;unsignedlongvalue;value=10;st=rf_decrement(1,value);/*将块1的值减少value*/rf_restoreintrf_restore(unsignedchar_Adr);功能:回传函数,将EEPROM中的内容传入卡的内部寄存器参数:_Adr:要进行回传的块地址(0~63)返回:成功返回0例:intst;st=rf_restore(1);注:用此函数将某一块中的数值传入内部寄存器,然后用rf_transfer()函数将寄存器中数据再传送到另一块中去,实现块与块之间数值传送。rf_transferintrf_transfer(unsignedchar_Adr);功能:传送,将寄存器的内容传送到EEPROM中参数:_Adr:要传送的地址(0~63)返回:成功返回0例:intst;st=rf_transfer(1);注:该函数仅在increment、decrement和restore命令之后调用。rf_HL_readintrf_HL_read(unsignedchar_Mode,unsignedchar_Adr,unsignedlong_Snr,unsignedchar*_Data,unsignedlong*_NSnr);功能:高级读函数参数:_Mode:密钥认证模式_Adr:块地址(0~63)_Snr:卡的序列号_Data:读出的数据_NSnr:返回卡的序列号返回:成功则返回0例:if((rf_HL_read(1,2,snr,HLdata,&Rsnr))!=0){printf("readHLRvaluewrong");}rf_HL_writeintrf_HL_write(unsignedchar_Mode,unsignedchar_Adr,unsignedlong*_Snr,unsignedchar*_Data);功能:高级写函数参数:_Mode:密钥认证模式_Adr:块地址(0~63)_Snr:卡的序列号地址_Data:写入的数据返回:成功则返回0例:if((rf_HL_write(1,2,Snr,HLdata))!=0){printf("readHLRvaluewrong");}rf_HL_initvalintrf_HL_initval(unsignedchar_Mode,unsignedchar_Adr,unsignedlong_Value,unsignedlong*_Snr);功能:高级初始化值参数:_Mode:密钥认证模式_Adr:块地址(0~63)_Value:初始值_Snr:卡的序列号地址返回:成功则返回0例:if((rf_HL_initval(0x1,1,100L,&snr))!=0){ printf("initHLWvaluewrong");}printf("invalOK\n");printf("snr=%lx\n",snr);rf_HL_incrementintrf_HL_increment(unsignedchar_Mode,unsignedchar_Adr,unsignedlong_Value,unsignedlong_Snr,unsignedlong*_NValue,unsignedlong*_NSnr);功能:高级增值操作参数:_Mode:密钥认证模式_Adr:块地址(0~63)_Value:要加的值_Snr:卡的序列号_NValue:加后的值_NSnr:返回卡的序列号地址返回:成功则返回0例:if((rf_HL_increment(1,1,1L,snr,&Rvalue,&Rsnr))!=0){ printf("HL_incrementwrong"); continue;} printf("newValue=%lx\n",Rvalue);rf_HL_decrementintrf_HL_decrement(unsignedchar_Mode,unsignedchar_Adr,unsignedlong_Value,unsignedlong_Snr,unsignedlong*_NValue,unsignedlong*_NSnr);功能:高级减值操作参数:_Mode:密钥认证模式_Adr:块地址(0~63)_Value:要减的值_Snr:卡的序列号_NValue:减后的值unsignedlong*_NSnr:返回卡的序列号地址返回:成功则返回0例:if((rf_HL_decrement(1,1,1L,snr,&Rvalue,&Rsnr))!=0){printf("HL_decrementwrong");continue;}printf("newValue=%lx\n",Rvalue);rf_token_read_noauthintrf_token_read_noauth(unsignedchar_Adr,unsignedchar

温馨提示

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

评论

0/150

提交评论