MF500PICCACTIVATEIDLE () 激活处于IDLE状态(上电复位和通信失败时卡片都处于这种状态)的一张卡片。 用法: Mf500PiccActivateIdle ( unsigned char br, unsigned char * atq, unsigned char * sak, unsigned char * uid, unsigned char * uid_len) 描述: 本函数完成了“Request-Idle”,“Anticollision”和“Select”命令序列来激活一张卡片并将它的状态由IDLE改变为ACTIVE状态。多级序列号会被正确地处理。 参数: br (输入)针对MIFARE®通信的波特率,为0时速率为106 k atq (输出)请求的应答(Answer to Request) sak (输出)选择的应答(Select acknowledge) uid (输出)最多至10字节的UID uid_len (输出)UID的总长度(最多三级序列号10字节: 3 + 3 + 4) 返回值: CCRC, MI_BITCOUNTERR, MI_NOBITWISEANTICOLL, MI_BAUDRATE_NOT_SUPPORTED, MI_SERNRERR 以下内容为程序代码: |
-- 作者:mifarelight -- 发布时间:2007-12-15 15:24:46 -- MF500PICCAUTHKEY() 直接以微处理器装载的密钥来进行认证 用法: Mf500PiccAuthKey (unsigned char auth_mode, unsigned char * snr, unsigned char * keys, unsigned char sector ) 本函数利用微处理器提供的密钥来认证一个卡片扇区。密钥被装载进读写卡芯片并用于认证指定扇区。为了获得所需的已编码密钥(把六字节密钥编码为MF RC500要求的特定格式12字节),可以使用函数Mf500HostCodeKey。 参数: auth _mode (输入)选择密钥A或者密钥B(PICC_AUTHENT1A/PICC_AUTHENT1B) snr (输入)要认证卡片的4字节序列号 keys (输入)认证卡片所需的12字节特定格式密钥 block (输入)用来寻址卡片上要认证的块地址,对于MIFARE®标准卡,块地址由0到63,对于其它卡片类型,请参考相应的产品说明。 返回值: CCRC, MI_BITCOUNTERR, MI_KEYERR, MI_AUTHERR 以下内容为程序代码: 可见,它最终调用了函数Mf500PiccAuthState() 以下内容为程序代码: |
-- 作者:mifarelight -- 发布时间:2007-12-15 15:29:04 -- 若Authent2命令成功,则卡片和MF RC500的认证就过关了。对于这种情况,控制位Crypto1被自动置位。当Crypto1位置位时,所有后续的卡片通讯都是使用Crypto1安全原理加密了的。若Authent2命令失败,则Crypto1被清零。 |
-- 作者:mifarelight -- 发布时间:2007-12-15 15:55:41 -- 卡片(以MIFARE1 S50为例)的状态随着读写模块(以MF RC500为例)所发送的命令转换,读写模块的命令需要严格按照顺序来执行。 REQUEST ALL/IDLE 若一张MIFARE®卡片进入读写卡器的天线区域,则卡片被置于初始状态 - IDLE。处于这种初始状态的MIFARE®卡只能接受的“Request”命令是。有两个不同的request命令代码。 所有的卡片均响应“Request All(52hex)”命令。 只有未被置于HALT状态的卡才响应“Request Idle(26hex)”命令。 ANTICOLLISION 在成功的Request之后,MIFARE®卡接受“Anticollision”命令并返回它的序列号。若读写卡天线区域内有多张卡,MF RC500自动启动一个内部防冲撞过程并最终返回某张卡片的序列号。 ISO 14443非接触接口标准还包括支持多级序列号的另两个Anticollision命令代码(95hex,97hex)。 SELECT 在成功的“Request”或者“Anticollision”命令之后,MIFARE®卡接受“Select”命令。和“Select”命令有关,只有指定序列号的卡片被选中并和MF RC500继续通信,所有其它未被选中的卡片在之后的通信中都不再被涉及并再次返回初始状态 - IDLE。 Select所指定序列号的卡片以卡片特定代码“answer to select(ATS)”来响应“Select”命令。ISO 14443非接触接口标准,还包括支持多级序列号的另两个select命令代码(95hex,97hex)。 AUTHENTICATION 为了访问MIFARE® Classich卡片的EEPROM所保存的数据,卡片必须经过认证。因此,必须完成认证过程。用户选择合适的密钥向卡片提交认证。若这些密钥和保存在卡片扇区尾块的密钥相同,则可以对卡片进行进一步的访问,如读、写、增值、减值等等。 READ 通过认证过程之后,“Read”命令读出卡片EEPROM的内容。不同的卡片类型所读出的内容是不一样的,MIFARE Standard IC输出16字节的完整块内容而MIFARE Light IC输出两个4字节的页和8字节伪数据。 如果读取的是扇区的尾块,那么密钥会被卡片屏蔽为全零,因为密钥是不能读出的。 另外,对于有效认证之后的MIFARE Classic卡片,数据只能在该卡片该块的访问条件允许时读出。 通过认证过程之后,若访问条件允许,则“Write”向卡片EEPROM写入数据。不同的卡片类型所能写入的内容是不一样的,MIFARE Standard IC可以将16字节的完整块内容而MIFARE Light IC可以一个4字节的页写入卡片的EEPROM。 “Increment”命令读取MIFARE Standard卡片IC上所寻址的数值块,然后检查读回的数据结构并将数据块的内容加上所传输的数值,接着把结果保存到卡片的内部寄存器中。整个过程不对卡片的EEPROM进行写操作。 DECREMENT “Decrement”命令读取MIFARE Standard卡片IC上所寻址的数值块,然后检查读回的数据结构并将数据块的内容减去所传输的数值,接着把结果保存到卡片的内部寄存器中。整个过程不对卡片的EEPROM进行写操作。 RESTORE “Restore”命令读取MIFARE Standard卡片IC上所寻址的数值块,然后检查读回的数据结构并将数据块的内容保存到卡片的内部寄存器中。整个过程不对卡片的EEPROM进行写操作。 TRANSFER “Transfer”命令将卡片内部寄存器的内容传送到EEPROM指定的地址处。该命令只能在增值、减值或恢复功能之后调用。 HALT “Halt”命令将MIFARE卡置入睡眠状态 - HALT。为了再次激活该MIFARE卡片,必须对卡片重新上电复位(令卡片离开读卡区后重新进入)或者使用“Request All”命令。 |
-- 作者:iccreem -- 发布时间:2008-11-13 9:15:16 -- 小弟是一个大学生,下面是我写的一个用AVR单片机控制RC531的程序,可是总是不能RC531里的寄存器进行访问,是不是读写时的时序不对呢?应该怎样配置AVR的IO寄存器呢?请各位高手帮忙看一下,小弟感激不尽! 其中AD0~AD7是和RC531的数据线连起来的,我用的是独立选通方式中的地址和数据复用方式。 #define GetRegPage(addr) (0x80 | (addr>>3)) /////////////////////////////////////////////////////////////////////// // 往一个地址写一个数据 /////////////////////////////////////////////////////////////////////// void WriteRawIO(unsigned char Address, unsigned char Value) { set_bit(PORTB , ALE); //置ALE位,地址锁存有效 DDRA = 0xff; PORTA = Address; //写入地址,锁存为RC531内部地址 clr_bit(PORTB , ALE); //清ALE位,地址锁存无效 _delay_us(50); //延时50us clr_bit(PORTB , RC531_CS); //清NCS位,片选有效 clr_bit(PORTB , WR); //清NWR位,写有效 DDRA = 0xff; //设置A口为输出 PORTA = Value; //写入数据 _delay_us(50); //延时50us set_bit(PORTB , WR); //置NWR,写无效 set_bit(PORTB , RC531_CS); //置NCS位,片选无效 } /////////////////////////////////////////////////////////////////////// // 从一个地址读出一个数据 /////////////////////////////////////////////////////////////////////// unsigned char ReadRawIO(unsigned char Address) { uchar c; set_bit(PORTB , ALE); //置ALE位,地址锁存有效 DDRA = 0xff; PORTA = Address; //写入地址,锁存为RC531内部地址 clr_bit(PORTB , ALE); //清ALE位,地址锁存无效 _delay_us(50); //延时50us clr_bit(PORTB , RC531_CS); //清NCS位,片选有效 clr_bit(PORTB , RD); //清NRD位,读有效 DDRA = 0x00; //设置A口为输入 c = PINA; //读出数据 _delay_us(50); //延时50us set_bit(PORTB , RD); //置NRD位,读无效 set_bit(PORTB , RC531_CS); //置NCS位,片选无效 return c; } /////////////////////////////////////////////////////////////////////// // 往一个地址写一个数据(EEPROM) /////////////////////////////////////////////////////////////////////// void WriteIO(unsigned char Address, unsigned char value) { WriteRawIO(0x00,GetRegPage(Address)); WriteRawIO(Address,value); } /////////////////////////////////////////////////////////////////////// // 从一个地址读出一个数据(EEPROM) /////////////////////////////////////////////////////////////////////// unsigned char ReadIO(unsigned char Address) { WriteRawIO(0x00,GetRegPage(Address)); return ReadRawIO(Address); } |
-- 作者:mifarelight -- 发布时间:2008-11-13 20:45:40 -- ReadRawIO和WriteRawIO都和你的具体硬件连接有关,你肯定要仔细验证程序是否产生读写MF RC5XX所要求的时序。这是最底层的部分。 原始的读写操作都成功之后,你再尝试读取RC5XX的片上寄存器,把读回的值和芯片的上电复位值相比较,都差不多的话才意味着读写都正确进行了。 |