RC531操作说明分析(共14页).doc
精选优质文档-倾情为你奉上RC531操作说明1:上电初始化主要做SPI接口确认步骤:1:给rc531的RSTPD脚一个高电平脉冲至少100us,热复位RC5312:读command-reg 直到寄存器数值为0,表示芯片上电初始化完成3:写0x80到page-reg,让芯片开始处理接口时序4:读command-reg 直到寄存器数值为0,表示芯片接口时序初始化完成5:此时可以写0x00到page-reg,指定寄存器地址模式为线性地址模式 Note:见RC531第93页11.4 Initialising the Parallel Interface-Type说明 2:spi接口时序使用SPIMODE0模式,在时钟的上升沿发送和读取数据读时序:主机连续写地址,写第二个地址时,在时钟上升沿可以读到RC531返回的第一个地址的值要求,地址字节的最高位为1,中间6位为实际地址,最低位为0写时序:第一个字节是地址,后面可以是N个数据,都往这个地址写,这点在写FIFO时很方便要求,地址字节的最高位为0,中间6位为实际地址,最低位为0NOTE:见RC531第17页3:RC531操作, 通过写寄存器,一般两字节操作,addr+data 和卡的数据交互,写数据到RC531的FIFO寄存器 如(cs选中,addr写+data1+data2+.+dataN,cs释放) (cs选中,cmd-reg+0x1e(发送接收命令)+cs释放) (cs选中,addr读,读出n字节,cs释放)4:和卡的交互 寻卡,使用命令0x52(对所有卡包括halt的卡有效),0x26(对standby的卡有效) 数据长度1字节, 返回2字节 返回说明,2字节卡类型 0x04= CARD_S50; 0x44=UL卡 0x08=CPU卡 0x03= SHUL卡; NOTE:格式要求:RC531关闭所有校验,关闭加密,只发送7bit数据(通过更改 531寄存器BitFraming), 见ISOA,7.2.3.2 WAKE-UP(REQA)指令 防冲撞:先使用命令 0x93,0x20 返回5字节,4字节卡号+1字节异或效验 例:531设置:无发送CRC,无接收CRC,有奇校验,ZeroAfer=1; 发0x93,0x20; 收0x88,0x4,0x4b,0x7,0xc0 设置ZeroAfer=0;(必须有,否则之后操作不能完成) NOTE:格式要求:RC531关闭CRC,奇校验,通过设置DecodeControl接收控 制ZeroAfer置1,选卡:先使用命令 0x93,0x70 + 4字节卡号 + 卡号异或校验 返回1字节SAK 例:531设置:有发送CRC,接收CRC,有奇校验 发0x93,0x70,0x88,0x4,0x4b,0x7,0xc0 收0x04载入密码:验证:读卡: 先使用命令 0x30+block号(对UL卡而言是page号) 返回16字节数据 例:531设置:有发送CRC,有接收CRC,有奇校验 发0x30,0x05 收:0x4,0x4b,0x7,0xc0,0x99,0x2c,0x25,0x84,0x14,0x48,0x0,0x0,0x0,0x0,0x0,0x0 NOTE:UL卡每扇区只有4字节,所以每次读出4扇区数据,共16字节数据 对于普通mafare卡,每个扇区读写都要重新认证密钥写卡: 第一步: 先使用命令 0xA0+block号(对UL卡而言是page号)确定写入地址有效 返回1字节ACK(0x0a) 例:531设置:有发送CRC,无接收CRC,有奇校验 发0xA0,0x05 收0x0a 第二步: 写入16字节块数据 返回1字节ACK(0x0a) 例:531设置:有发送CRC,无接收CRC,有奇校验 发0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5,0x5 收0x0a NOTE:按照14443A标准,返回的ACK是4bit数据,所以在使用FM2701等 兼容芯片时,一定要取消接收CRC,否则接收不到ACK应答, 另:在写UL卡之前,要先读一下0扇区,确定块锁定状态,否则不能写入。 写入时,16字节数据仅前4字节有效,后12字节要设为0 对于普通mafare卡,每个扇区读写都要重新认证密钥ML卡ML卡是一种小容量卡,共384位,适合于一卡一用。电气特性l 容量为384位l 16位的数值计算l 128位的数据区(如果不用钱包文件可达192位)l 用户可自定义控制权限l 唯一的32位序列号l 工作频率:13.56MHZl 通信速率:106KB波特率l 防冲 突:同一时间可处理多张卡l 读写距离:在10cm以内(与天线有关)l 卡内无需电源存储结构ML卡共384位,分为12页,每页为4个字节。存储结构如下:页号字节0字节1字节2字节3说明0SerNr(0)SerNr(1)SerNr(2)SerNr(3)Block 01SerNr(4)Size CodeType(0)Type(1)2Data(0)Data(1)Data(2)Data(3)Data13Data(4)Data(5)Data(6)Data(7)4Value(0)Value(1)Value_b(0)Value_b(1)Value5Value(0)Value(1)Value_b(0)Value_b(1)6KeyA(0)KeyA(1)KeyA(2)KeyA(3)KeyA7KeyA(4)KeyA(5)AC-AAC-A_b8KeyB(0)KeyB(1)KeyB(2)KeyB(3)KeyB9KeyB(4)KeyB(5)AC-BAC-B_bAData(0)Data(1)Data(2)Data(3)Data2BData(4)Data(5)Data(6)Data(7)(注:_b表示取反)(1)第0、1页存放着卡的序列号等信息,只可读。(2)第2、3页及A、B两页数据块,可存贮一般的数据。(3)第4、5页为数值块,可作为钱包使用,两字节的值以正和反两种形式存贮。只有减值操作,没有加值操作。如果不做钱包使用,则可以做为普通的数据块使用。(4)第6、7、8、9页存储着密码A(6字节)、密码B(6字节)及存取控制。(5)第7页的2字节、第9页的2字节为存储控制,存储控制以正和反的形式存两次。Bit 7Bit 6Bit 5Data2WriteEnableBit 4Data2readEnableBit 3Key+ACWriteEnableBit 2ValueWriteEnableBit 1Data1WriteEnableBit 0Data1readEnable例如:AC-A的初始值为ff,即,即:Data1:可读、可写;Value:可写;AC-A:可写;Data2:可读、可写;(6)一次写一页(4个字节),一次读两页(8个字节)。UL卡M1卡0扇区0块厂商标识信息第04个字节为卡片的序列号,第5个字节为序列号的校验码; 第6个字节为卡片的容量“SIZE”字节; 第7,8个字节为卡片的类型号字节,即Tagtype字节; 其他字节由厂商另加定义。 UL卡储存规范,共16扇区,每扇区4字节,等效与M1卡的4个块,(select时,返回4)存储结构:页号Byte0Byte1Byte2Byte3说明0SN0SN1SN2BCC0只读,存放卡的序列号:Page0前3字节+整个Page11SN3SN4SN5SN62BCC1保留LOCK0LOCK1只读,通过设置LOCK0和LOCK1可以讲16个page设为只读3OTP0OTP1OTP2OTP3可读写,一次性交易计数器,不可逆4Data0Data1Data2Data3可读写,数据存放区域5Data0Data1Data2Data36Data0Data1Data2Data37Data0Data1Data2Data38Data0Data1Data2Data39Data0Data1Data2Data310Data0Data1Data2Data311Data0Data1Data2Data312Data0Data1Data2Data313Data0Data1Data2Data314Data0Data1Data2Data315Data0Data1Data2Data3红色的SN在读扇区0时,返回的是SN0,SN1,SN2,BCC,SN3,SN4,SN5,SN6,xx,xx,0,0,0,0,0,0所以实际取得的psnr(卡序列号)为SN0,SN1,SN2 + SN3,SN4,SN5,SN62.2.2 读卡和写卡指令14443A协议中并没有具体规定对射频卡的读写操作方式,故对每种卡的读写操作都必须考虑该卡的存储区域组织形式和应答形式。MIFARE卡内部存储器是由E2PROM组成的,共划分为16个扇区,每个扇区4个块,每块16字节。对E2PROM的读写都以块为单位进行,即每次读写16字节。以写卡指令为例,MIFARE卡要求有两步握手,指令格式分别如下所述。注意:address值无意义,但value值写入时必须在47字节中存入取反值。一次写一页,一次读4页S50卡(常用标准卡)Mifare 1卡的存储结构2007-06-22 11:262、Mifare 1卡的存储结构1 2Mifare 1卡(简称M1卡)为8k位的IC卡。M1卡的存储结构如下。M1卡分为16个扇区,每个扇区4块(块03),共64块,按块号编址为063,除了第0扇区的块0(即绝对地址0块)用于存放厂商代码不可更改外,其他各扇区的块0、块1、块2为数据块,用于存储数据;块3为控制块,存放密码A、存取控制、密码B,其结构如表1:A0A1A2A3A4A5PPB0B1B2B3B4B5密码A(6字节)存取控制(4字节)密码B(6字节)表1各扇区块3存储结构每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制,在存取控制中每个块都有相应的三个控制位,分别以正和反两种形式存在于存取控制字节中,决定了该块的访问权限(如进行减值操作必须验证KEY A,进行加值操作必须验证KEY B,等等)。三个控制位在存取控制字节中的位置如表2所示(字节9为备用字节,默认值为0x69)。Bit76543210字节6C23_bC22_bC21_bC20_bC13_bC12_bC11_bC10_b字节7C13C12C11C10C33_bC32_bC31_bC30_b字节8C33C32C31C30C23C22C21C20表2控制位在存取控制字节中的位置 (注:_b表示取反)每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制,扇区中的每个数据块的存取条件由密码和存取控制共同决定,他们的关系如表3所示。控制位(X:0.2)访问条件(对块0、1、2)C1XC2XC3X读写加值减值000KeyA|BKeyA|BKeyA|BKeyA|B010KeyA|BNeverNeverNever100KeyA|BKeyBNeverNever110KeyA|BKeyBKeyBKeyA|B001KeyA|BNeverNeverKeyA|B011KeyBKeyBNeverNever101KeyBNeverNeverNever111NeverNeverNeverNever表3数据块存取控制条件据此通过授权机制,对特定操作用户实现不同级别的读写控制。只有知道特定密码组合的操作用户才能更新卡中数据,从而大大增强了系统的性。射频卡的存储实现技术和工作原理决定了其良好特性,可适用于多种应用。其中射频卡具多个分区、适合一卡多用的特性,使得射频卡在各种系统中得到广泛应用。M1卡读写失误常见问题 盲目操作: 造成某些区块误操作被锁死不能再使用。应当仔细参考控制位的权限后,预先得出操作后的结果是否 适合使用要求,并且列出操作顺序表单再操作。最好授权程序员对块3的设置作专人操作。 丢失密码: 在读写时造成密码认证出错而不能访问卡。特别要求在对MF卡进行块3编程操作时,必须及时记录相关卡 号的控制值、KeyA、KeyB等,而且应当有专人管理密码档案。 错误设置: 对MF1卡的块3控制位了解不透彻,错误的理解造成错误的设置。目前MF1卡的控制块仅只有8种数据 块控制权限和8种控制块设置权限,超出这16种权限的其它代码组合,将直接引起错误码设置而使卡片报废。 极端权限: 当块3的存取控制位C12 C23 C33=100或者111时,称为极端权限。除特殊应用外一般不被使用!启用前认真权衡对密码读写、存取控制的锁死是否必要,否则,数据加密后即使有密码 也无法读取被锁死的数据区块(看不见)! 设备低劣: 低劣的设备将直接影响卡的读写性能。对MF1卡进行块3编程操作的设备,特别要求其性能必须十分可 靠,运行十分稳定!建议选用由飞利浦公司原装读写模块构建的知名读写机具! 编程干扰: 在对块3进行编程操作时,不可以有任何的“IO”中断或打扰!包括同时运行两个以上程序干扰甚至PC 机不良的开关电源干扰等,否则,不成功的写操作将造成某个扇区被锁死的现象,致使该扇区再次访问时出错而报废。 数据出错: 在临界距离点上读卡和写卡造成的。通常的读卡,特别是写卡,应该避免在临界状态(刚能读卡的距离)读卡。因为临界状态下的数据传达是很不稳定的!容易引起读写出错! 人为失误: 例如,密码加载操作失误,误将KeyA加载为KeyB;或者是误将其他制卡厂约定的初始密码值如 a0a1a2a3a4a5、b0b1b2b3b4b5加载到MF1卡内;或者在初始状态下(密码A=0【隐藏状态,实际为 FFFFFFFFFFFF】、控制位=FF 07 80 69、密码B=FFFFFFFFFFFF【可见】),若不经意地将KeyA=0删除后又重新输入12个“0”,并加载了它!这时无 意中已将KeyA原来12个隐藏的“F”,修改成了12个“0”,其后果可想而知! 卡片失效: 读写均无数据传送,读写器报告“寻卡错误”!卡片被超标扭曲、弯曲而造成内电路断裂。 读写距离过近: 与用户使用的读写器性能有关。标准型MF1卡的读写距离可达10cm(在飞利浦公司的标准读写机 具上测试的最大距离),国产知名品牌读写器一般可达510cm。尺寸较小的匙扣卡,其读写距离当然比标准卡近许多,但只要可靠的读写距离在510cm 之间,一般不会影响正常使用!对于控制块的处理一定要仔细阅读一下部分,刚开始很容易出错。比如:用B密码读控制块,则控制块数据都是伪码数据其伪码数据值与控制字段有关,真实值不显示;用A密码读控制块,则除A区数据为伪码数据外,控制字段和B区数据显示真实值;A,B不能同时认证,每次认证都需要重新选卡等;存储器组织1024 x 8 bit EEPROM存储器分为16区,每区4块,每块16字节。在擦处后的状态下,EEPROM的单元读为逻辑“0”,写后的状态下读为“1”。块内字节编号扇区块0123456789ABCDEF说明153KEY A控制位KEY B扇区15尾块2数据1数据0数据143KEY A控制位KEY B扇区14尾块2数据1数据0数据:13KEY A控制位KEY B扇区1尾块2数据1数据0数据03KEY A控制位KEY B扇区0尾块2数据1数据0制造商占用块尾块(块3)各区均有一个尾块,存有:· 密钥A和B(可选),读时返回逻辑“0”。· 该区四个块的读写条件,存储在字节6至9 。读写控制位也指定了数据块的类型(读写块或数值块)。如果不需要密钥B,块3的最后6字节可以用作数据字节。尾块的字节9可用于用户数据。因为此字节享有与字节6、7、8相同的读写权限。字节号0123456789101112131415说明密钥A读写条件密钥B(可选)读写条件每个数据块和尾块的读写条件均由3个bit定义,并以非取反和取反形式保存在各个区的尾块中。读写控制位管理着使用密钥A和B读写存储器的权限。如果知道相关的密钥,并且当前读写条件允许,读写条件是可以更改的。读写控制位有效命令块说明C13 C23 C33read, write®3尾块C12 C22 C32read, write, increment, decrement, transfer, restore®2数据块C11 C21 C31read, write, increment, decrement, transfer, restore®1数据块C10 C20 C30read, write, increment, decrement, transfer, restore®0数据块注意:在每一次存储器读写时,内部逻辑会验证存储条件的格式。如果发现个是错误,这个区将被永久性锁死。注意:在下列说明中,读写控制位是仅以非取反形式表述的。MF1的内部逻辑保证了命令只有在通过认证后才被执行。尾块的读写条件对密钥和控制位的读写取决于尾块(块3)的访问控制位,分为“禁止”、“KEY A”、“KEY B”和“KEY A|B”( KEY A或KEY B)。访问控制位所控制的访问对象注释KEY A访问控制位KEY BC1C2C3读写读写读写000禁止Key AKey AKey BKey AKey AKey B可读010禁止禁止Key A禁止Key A禁止Key B可读100禁止Key BKey A|B禁止禁止Key B110禁止禁止Key A|B禁止禁止禁止001禁止Key AKey AKey AKey AKey AKey B可读传输配置状态011禁止Key BKey A|BKey B禁止Key B101禁止禁止Key A|BKey B禁止禁止111禁止禁止Key A|B禁止禁止禁止注:灰色行为key B可读并可用于存储数据的访问控制条件。 尾块和key A被预定义为传输配置状态。因为在传输配置状态下key B可读,新卡必须用key A认证。因为访问控制位本身也可以禁止访问,所以个人化时应当特别小心。数据块的访问控制条件对数据块(块0至2)的读写访问取决于其访问控制位,分为“禁止”、“KEY A”、“KEY B”和“kEY A|B”( KEY A或KEY B)。相关访问控制位的设置确定了其用途以及相应的可用命令。· 读写块:允许读、写操作。· 数值块:运行另外的数值操作加值、减值、转存和恢复。在用于非充值卡的一种情况(001)下,只能够读和减值。在另一种情况(110)下,可以用key B充值。· 制造厂商块:只读,不受访位控制位设置的影响!· 密钥管理:在传输配置状态下,必须用key A 认证。访问控制位所控制的访问操作用途C1C2C3读写加值减值转存恢复000key A|B1key A|B1key A|B1key A|B1传输配置状态010key A|B1key B1禁止禁止读写块100key A|B1key B1禁止禁止读写块110key A|B1key B1key B1key A|B1数值块001key A|B1禁止禁止key A|B1数值块011key B1key B1禁止禁止读写块101key B1禁止禁止禁止读写块111禁止禁止禁止禁止读写块1 如果相应扇区尾块Key B可读,则不得用作认证(前表中所有灰色行)。后果:如果读写器试图用灰色行的访问控制条件以Key B认证任何扇区的任何块,卡将在认证后拒绝所有后续存储器访问。S70卡(4K卡) S70卡又称M1进口S70卡,MF1 S70卡。2、S70卡芯片的初始密码为12个F,客户可自行无限次更改密码。3、S70卡有4KB内存,芯片内一共有40个扇区,前面32个扇区:每个扇区又分4个块,每个块有16个字节,后8个扇区:每个扇区分16个块,每个块有16个字节。故,S70芯片卡主要适用于一卡通卡方面,可以每一个扇区记载存储不同的项目,每一个项目下又记载存储不同的子项目。持一卡可以实现上百个不同项目的储值、消费、打折、积分、查询、记录等功能,真正做到一卡走遍天下!M1卡控制原理和读写方式M1结构:M1卡分为16个扇区,每个扇区4块(块03),共64块,按块号编址为063。第0扇区的块0(即绝对地址0块)用于存放厂商代码,已经固化,不可更改。其他各扇区的块0、块1、块2为数据块,用于存贮数据;块3为控制块,存放密码A、存取控制、密码B。每个扇区的密码和存取控制都是独立的,可以根据实际需要设定各自的密码及存取控制。 M1卡运作机理:连接读写器寻卡识别卡(获取卡序列号)从多卡中选一张卡向卡中缓冲区装载密码验证密码进行读写关闭连接即(代码说明)Open_USBrf_requestrf_anticollrf_selectrf_load_keyrf_authentication(/a_hex)rf_read/rf_write(hex_a)Close_USB如果概括来说的话,主要也就四部分 开关连接、寻卡、验证密码、读取。(至于详细程序代码,相信大家自己看过dll说明文档后,自己会明白的,这里就不写了,因为内容多) M1卡功能模式:1.寻卡模式:寻卡模式分三种情况:IDLE模式、ALL模式及指定卡模式(0,1,2 均是int类型,是方法参数,下同)。 0表示IDLE模式,一次只对一张卡操作; 1表示ALL模式,一次可对多张卡操作; 2表示指定卡模式,只对序列号等于snr的卡操作(高级函数才有)【不常用】也就是说,我们一次也可以同时操作多张卡。对于多卡操作,其实际真正执行操作的还是一张卡。读写器能识别多张卡的序列号(但注意识别出的顺序是不定的,并且最多也就能识别4张卡,因为卡叠放的厚度太厚,会超出读写器的识别范围),并一一进行操作。所以由此看出,多卡操作的意义并不大。但我建议大家还是设置为1好了(原因不说了,自己感受吧,其实无所谓)。2.密码验证模式: 0KEYSET0的KEYA 4KEYSET0的KEYBM1卡可以在验证密码时选择密码类型(A/B)。【其实M1卡有3套密码(KEYSET0、KEYSET1、KEYSET2),共6个密码(用02、46来表示这六个密码),目的是为了适应不同读写器。而这里我们用的是KEYSET0的2个密码】 M1卡密码机制:这可以说是M1卡的精髓了,也是M1卡最为复杂的地方,希望大家耐心看完。(请先看明白M1卡结构)如上所说,在存取控制中每个块都有相应的三个控制位,它们的定义如下: 块0: C10 C20 C30 块1: C11 C21 C31 块2: C12 C22 C32 块3: C13 C23 C33一个扇区的三个数据块,我们可以利用密码机制对它们分别进行权限控制。数据块(块0、块1、块2)的存取控制如下:例如:当块0的存取控制位C10 C20 C30=100时,验证密码A或密码B正确后可读;验证密码B正确后可写;不能进行加值、减值操作。那么M1卡修改密码的方法是rf_changeb3参数: icdev:通讯设备标识符 _SecNr:扇区号(015) KeyA:密码A _B0:块0控制字,低3位(D2D1D0)对应C10、C20、C30 _B1:块1控制字,低3位(D2D1D0)对应C11、C21、C31 _B2:块2控制字,低3位(D2D1D0)对应C12、C22、C32 _B3:块3控制字,低3位(D2D1D0)对应C13、C23、C33 _Bk:保留参数,取值为0 _KeyB:密码B由上我们看出_B0、_B1、_B2、_B3分别控制块0、块1、块2、块3。由图我们可知_B0、_B1、_B2的可取值为 0、10、100、110、1、11、101、111。这里大家一定要注意一点:不能装载密码到M1卡某一扇区后再更改那扇区的密码(最好连接完读写器后直接更改密码),否则更改密码会失败而冻结扇区。如果不慎这样了,解决的办法是完成一次读写操作,再更改密码。控制块(块3)的存取控制与数据块(块0、1、2)不同,它的存取控制如下:_B3的取值与_B0相同。 我从来没有说过块值不能当普通数据读出呀,只是说卡里寄存器的值不能直接读出,卡里面所有扇区(sector)的所有块(block)里面的数据都是读出的,我想你错误的理解了,下面是我的原话:钱包就是常说的块值操作,这个每个公司可能叫法不一,其实就是数据在块里的一种特殊的存储格式,这个我在以前的帖子已经讲过。寄存器的值不能直接读 出,而只能通过transfer和restore实现和块之间的数据传递。电子钱包块数据全部为0,其实就是说明改块没有进行初始化,没有按照上面提到的 特殊存储格式保存数据。因为如果钱包里余额为0时,块里面的数据应该如下(每两位表示一个16进制数):ffffffffxxyyxxyy其中xx表示该块的地址,yy是xx的反码 好了关于M1卡的编程我就介绍到这里了,大家如果有什么不明白的地方,可以和我联系交流专心-专注-专业