Write_to_Card(…)和Read_from_Card(…)可谓是所有函数的终点,而SPIWriteByte(…)则是最底层对MFRC522模块进行操作的函数,所有函数都是为了Write_to_Card(…)和Read_from_Card(…)而产生的。因此,我们只需要调用这两个函数就可以完成IC卡的读写,同时,这两个函数的参数和使用方法都是一样的。
Mifare卡片的存储容量为8192×1位字长(即1K * 8位字长),采用E2PROM作为存储介质。整个结构划分为16个扇区,编为扇区0~15。每个扇区有4个块(Block),分别为块0,块1,块2和块3。每个块有16个字节。一个扇区共有16Byte* 4 = 64Byte。每个扇区的块3(即第四块)也称作尾块,包含了该扇区的密码A(6个字节)、存取控制(4个字节)、密码B(6 个字节)。其余三个块是一般的数据块。 每个扇区的块3(即第四块)也称作尾块,包含了该扇区的密码A(6个字节)、存取控制(4个字节)、密码B(6个字节)。其余三个块是一般的数据块。扇区0的块0是特殊的块,包含了厂商代码信息,在生产卡片时写入,不可改写。其中:第0~4个字节为卡片的序列号,第5个字节为序列号的校验码;第6个字节为卡片的容量“SIZE”字节;第7、8个字节为卡片的类型号字节,即Tagtype字节;其他字节由厂商另加定义。 综上所述,我们可以用来存储数据的空间为第一扇区的第1、2块,第二扇区到第63扇区的第0、1、2块,简而言之就是我们上图中的“数据块”。
M1卡结构:
共16个扇区,每个扇区4块(块0~3),共64块,按块号编址为0~63。
第0扇区的块0(即绝对地址0块)用于存放厂商代码,已经固化,不可更改。
其他各扇区:
块0、块1、块2为数据块,用于存贮数据;
块3为控制块,存放密码A、存取控制、密码B。
因此,只要做出一个接口,即设计一个函数,让我们指定要在哪个块上输入什么数据就好了,块的数据范围是0到63,写入的数据的格式为16个字节,如:ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff,我们设定一个数组来存储这个数据:Write_Data[16] = {0x00};
我们设计了一个函数:Write_to_Card(kuai,Write_Data);其中,kuai就是指定是哪个块,Write_Data是指要写入的数据,就是上面所说数组的起始地址,只要事先对这两个变量进行赋值,就可以轻松向IC卡中写入数据了,我们设计了另一个函数Read_from_Card(kuai,Read_Data);kuai是指要操作的块,Read_Data就是从这个块中读取出来的数据的存放地,有了数据,不管是在lcd1602还是lcd12864或者是tft液晶显示都没什么问题了。 现在让我们看看Write_to_Card(…)和Read_from_Card(…)的使用方法: void main() { Write_Data[0] = 0x33; //需要写入IC卡中的数据赋值 init(); //串口通信初始化 while(1) { Write_to_Card(0x01,Write_Data); //向IC卡中的0x01块存储区中写数据 delay_welcome(100); Read_from_Card(0x01,Read_Data); //从IC卡中的0x01块存储区中读数据 } } 这是Mian函数程序.
读写卡的时间是短暂的,而人刷卡时,卡在读卡器读卡范围内的时间相对较长,这就涉及到一次读卡和重复读卡的问题了,我们的程序设计的是一次读卡,也就是说你不管把卡放在读卡器上多长时间,系统只读写一次卡,串口调试助手不会重复显示一样的数据,这个功能可不是所有淘宝店可以提供的哦。下面我们来看看程序: //向IC卡中写数据 unsigned charWrite_to_Card(unsigned char data KuaiN,unsigned char *pData) { char data status; unsigned char idata RevBuffer[4]; unsigned char data MLastSelectedSnr[4]; unsigned char dataPassWd[6]={0xff,0xff,0xff,0xff,0xff,0xff}; unsigned char data place = 0x00; PcdReset(); //寻天线区内未进入休眠状态的卡,返回卡片类型 2字节 status=PcdRequest(PICC_REQIDL,&RevBuffer[0]); if(status!=MI_OK) { flag = 0; green = 1; return 0x00; } //判断当操作卡完成后就停止重复读写卡 if(flag == 1) { return 0x00; } //防冲撞,返回卡的序列号 4字节 status=PcdAnticoll(&RevBuffer[2]); if(status!=MI_OK) { return 0x00; } memcpy(MLastSelectedSnr,&RevBuffer[2],4); //拷贝序列号到变量MLastSelectedSnr中 //选卡,卡号为MLastSelectedSnr status=PcdSelect(MLastSelectedSnr); if(status!=MI_OK) { return 0; } //验证卡片密码,空白卡都是0xff,0xff,0xff,0xff,0xff,0xff status=PcdAuthState(PICC_AUTHENT1A,KuaiN,PassWd,MLastSelectedSnr); if(status!=MI_OK) { return 0x00; } //向卡中指定块中写数据 status=PcdWrite(KuaiN,pData); if(status!=MI_OK) { return 0; } //命令卡片进入休眠状态 PcdHalt(); flag = 1; green = 0; return 1; } //从IC卡中读数据 unsigned char Read_from_Card(unsigned char data KuaiN,unsigned char *pData) { char data status; unsigned char idata RevBuffer[4]; unsigned char data MLastSelectedSnr[4]; unsigned char dataPassWd[6]={0xff,0xff,0xff,0xff,0xff,0xff}; unsigned char data place = 0x00; PcdReset(); //寻天线区内未进入休眠状态的卡,返回卡片类型 2字节 status=PcdRequest(PICC_REQIDL,&RevBuffer[0]); if(status!=MI_OK) { flag = 0; green = 1; return 0x00; } //判断当操作卡完成后就停止重复读写卡 if(flag == 1) { return 0x00; } //防冲撞,返回卡的序列号 4字节 status=PcdAnticoll(&RevBuffer[2]); if(status!=MI_OK) { return 0x00; } memcpy(MLastSelectedSnr,&RevBuffer[2],4); //拷贝序列号到变量MLastSelectedSnr中 //选卡,卡号为MLastSelectedSnr status=PcdSelect(MLastSelectedSnr); if(status!=MI_OK) { return 0; } //验证卡片密码,空白卡都是0xff,0xff,0xff,0xff,0xff,0xff status=PcdAuthState(PICC_AUTHENT1A,KuaiN,PassWd,MLastSelectedSnr); if(status!=MI_OK) { return 0x00; } //从卡中对应块中读取数据,注意,一次读出整块数据,即16字节 status= PcdRead (KuaiN,pData); if(status!=MI_OK) { return 0; } //命令卡片进入休眠状态 PcdHalt(); flag = 1; green = 0; //如果程序走到这一步,就说明读卡成功,并且pData指定人数组中存放着块数据 //我们可以通过下面的函数向PC机传送卡里的数据 Serial_Rs232(pData,16); return 1; }
程序的函数关系:
Main() |---- Write_to_Card(…); //写卡 | |---- PcdRequest(…); //寻天线区内未进入休眠状态的卡 | | |--- ClearBitMask(…) | | | |--- ReadRawRC(…) | | | | |---SPIWriteByte(…) | | | | |---SPIReadByte(…) | | | |--- WriteRawRC(…) | | | |---SPIWriteByte(…) | | |--- WriteRawRC(…) | | | |--- SPIWriteByte(…) | | |--- SetBitMask(…) | | | |--- ReadRawRC (…) | | | | |---SPIWriteByte(…) | | | | |---SPIReadByte(…) | | | |--- WriteRawRC (…) | | | | |---SPIWriteByte(…) | | |--- PcdComMF522 | | |--- WriteRawRC (…) | | |---SPIWriteByte(…) | | |--- ClearBitMask (…) | | | |--- ReadRawRC(…) | | | | |---SPIWriteByte(…) | | | | |---SPIReadByte(…) | | | |--- WriteRawRC(…) | | | |---SPIWriteByte(…) | | |--- SetBitMask (…) | | | |--- ReadRawRC (…) | | | | |---SPIWriteByte(…) | | | | |---SPIReadByte(…) | | | |--- WriteRawRC (…) | | | | |---SPIWriteByte(…) | | |--- ReadRawRC(…) | | |---SPIWriteByte(…) | |---- PcdAnticoll(…) | | |--- ClearBitMask (…) | | | | |--- ReadRawRC(…) | | | | | |---SPIWriteByte(…) | | | | | |---SPIReadByte(…) | | | | |--- WriteRawRC(…) | | | | |---SPIWriteByte(…) | | |--- WriteRawRC (…) | | | |---SPIWriteByte(…) | | |--- PcdComMF522 (…) | | | |--- WriteRawRC (…) | | | | |---SPIWriteByte(…) | | | |--- ClearBitMask (…) | | | | |--- ReadRawRC(…) | | | | | |---SPIWriteByte(…) | | | | | |---SPIReadByte(…) | | | | |--- WriteRawRC(…) | | | | |---SPIWriteByte(…) | | | |--- SetBitMask (…) | | | | |--- ReadRawRC (…) | | | | | |---SPIWriteByte(…) | | | | | |---SPIReadByte(…) | | | | |--- WriteRawRC (…) | | | | | |---SPIWriteByte(…) | | | |--- ReadRawRC(…) | | | |---SPIWriteByte(…) | | |--- SetBitMask (…) | | | |--- ReadRawRC (…) | | | | |---SPIWriteByte(…) | | | | |---SPIReadByte(…) | | | |--- WriteRawRC (…) | | | | |---SPIWriteByte(…) | |----PcdSelect(…) | | |--- CalulateCRC (…) | | | |--- WriteRawRC (…) | | | | |---SPIWriteByte(…) | | | |--- ClearBitMask (…) | | | | |--- ReadRawRC(…) | | | | | |---SPIWriteByte(…) | | | | | |---SPIReadByte(…) | | | | |--- WriteRawRC(…) | | | | |---SPIWriteByte(…) | | | |--- SetBitMask (…) | | | | |--- ReadRawRC (…) | | | | | |---SPIWriteByte(…) | | | | | |---SPIReadByte(…) | | | | |--- WriteRawRC (…) | | | | | |---SPIWriteByte(…) | | | |--- ReadRawRC(…) | | | |---SPIWriteByte(…) | | |--- ClearBitMask (…) | | | | |--- ReadRawRC(…) | | | | | |---SPIWriteByte(…) | | | | | |---SPIReadByte(…) | | | | |--- WriteRawRC(…) | | | | |---SPIWriteByte(…) | | |--- PcdComMF522 (…) | | | |--- WriteRawRC (…) | | | | |---SPIWriteByte(…) | | | |--- ClearBitMask (…) | | | | |--- ReadRawRC(…) | | | | | |---SPIWriteByte(…) | | | | | |---SPIReadByte(…) | | | | |--- WriteRawRC(…) | | | | |---SPIWriteByte(…) | | | |--- SetBitMask (…) | | | | |--- ReadRawRC (…) | | | | | |---SPIWriteByte(…) | | | | | |---SPIReadByte(…) | | | | |--- WriteRawRC (…) | | | | | |---SPIWriteByte(…) | | | |--- ReadRawRC(…) | | | |---SPIWriteByte(…) | |----PcdAuthState (…) | | |--- PcdComMF522 (…) | | | |--- WriteRawRC (…) | | | | |---SPIWriteByte(…) | | | |--- ClearBitMask (…) | | | | |--- ReadRawRC(…) | | | | | |---SPIWriteByte(…) | | | | | |---SPIReadByte(…) | | | | |--- WriteRawRC(…) | | | | |---SPIWriteByte(…) | | | |--- SetBitMask (…) | | | | |--- ReadRawRC (…) | | | | | |---SPIWriteByte(…) | | | | | |---SPIReadByte(…) | | | | |--- WriteRawRC (…) | | | | | |---SPIWriteByte(…) | | | |--- ReadRawRC(…) | | | |---SPIWriteByte(…) | | |--- ReadRawRC (…) | | | |---SPIWriteByte(…) | | | |---SPIReadByte(…) | | |--- PcdWrite (…) | | |---CalulateCRC(…) | | | |--- WriteRawRC (…) | | | | |---SPIWriteByte(…) | | | |--- ClearBitMask (…) | | | | |--- ReadRawRC(…) | | | | | |---SPIWriteByte(…) | | | | | |---SPIReadByte(…) | | | | |--- WriteRawRC(…) | | | | |---SPIWriteByte(…) | | | |--- SetBitMask (…) | | | | |--- ReadRawRC (…) | | | | | |---SPIWriteByte(…) | | | | | |---SPIReadByte(…) | | | | |--- WriteRawRC (…) | | | | | |---SPIWriteByte(…) | | | |--- ReadRawRC(…) | | | | |---SPIWriteByte(…) | | |---PcdComMF522(…) | | | |--- WriteRawRC (…) | | | | |---SPIWriteByte(…) | | | |--- ClearBitMask (…) | | | | |--- ReadRawRC(…) | | | | | |---SPIWriteByte(…) | | | | | |---SPIReadByte(…) | | | | |--- WriteRawRC(…) | | | | |---SPIWriteByte(…) | | | |--- SetBitMask (…) | | | | |--- ReadRawRC (…) | | | | | |---SPIWriteByte(…) | | | | | |---SPIReadByte(…) | | | | |--- WriteRawRC (…) | | | | | |---SPIWriteByte(…) | | | |--- ReadRawRC(…) | | | |---SPIWriteByte(…) | |----PcdHalt (…) | | |---CalulateCRC (…) | | |--- WriteRawRC (…) | | | |---SPIWriteByte(…) | | |--- ClearBitMask (…) | | | |---ReadRawRC(…) | | | | |---SPIWriteByte(…) | | | | |---SPIReadByte(…) | | | |--- WriteRawRC(…) | | | | |---SPIWriteByte(…) | | |--- SetBitMask (…) | | | |--- ReadRawRC (…) | | | | |---SPIWriteByte(…) | | | | |---SPIReadByte(…) | | | |--- WriteRawRC (…) | | | | |---SPIWriteByte(…) | | |--- ReadRawRC(…) | | | |---SPIWriteByte(…) | |---PcdComMF522 (…) | |--- WriteRawRC (…) | | |---SPIWriteByte(…) | |--- ClearBitMask (…) | | |--- ReadRawRC(…) | | | |---SPIWriteByte(…) | | | |---SPIReadByte(…) | | |--- WriteRawRC(…) | | |---SPIWriteByte(…) | |--- SetBitMask (…) | | |--- ReadRawRC (…) | | | |---SPIWriteByte(…) | | | |---SPIReadByte(…) | | |--- WriteRawRC (…) | | | |---SPIWriteByte(…) | |--- ReadRawRC(…) | |---SPIWriteByte(…) | |----delay_welcome(100); |----Read_from_Card(…) |---- PcdRequest(…); //寻天线区内未进入休眠状态的卡 | |--- ClearBitMask(…) | | |--- ReadRawRC(…) | | | |---SPIWriteByte(…) | | | |---SPIReadByte(…) | | |--- WriteRawRC(…) | | |---SPIWriteByte(…) | |--- WriteRawRC(…) | | |--- SPIWriteByte(…) | |--- SetBitMask(…) | | |--- ReadRawRC (…) | | | |---SPIWriteByte(…) | | | |---SPIReadByte(…) | | |--- WriteRawRC (…) | | | |---SPIWriteByte(…) | |--- PcdComMF522 | |--- WriteRawRC (…) | |---SPIWriteByte(…) | |--- ClearBitMask (…) | | |--- ReadRawRC(…) | | | |---SPIWriteByte(…) | | | |---SPIReadByte(…) | | |--- WriteRawRC(…) | | |---SPIWriteByte(…) | |--- SetBitMask (…) | | |--- ReadRawRC (…) | | | |---SPIWriteByte(…) | | | |---SPIReadByte(…) | | |--- WriteRawRC (…) | | | |---SPIWriteByte(…) | |--- ReadRawRC(…) | |---SPIWriteByte(…) |---- PcdAnticoll(…) | |--- ClearBitMask (…) | | | |--- ReadRawRC(…) | | | | |---SPIWriteByte(…) | | | | |---SPIReadByte(…) | | | |--- WriteRawRC(…) | | | |---SPIWriteByte(…) | |--- WriteRawRC (…) | | |---SPIWriteByte(…) | |--- PcdComMF522 (…) | | |--- WriteRawRC (…) | | | |---SPIWriteByte(…) | | |--- ClearBitMask (…) | | | |--- ReadRawRC(…) | | | | |---SPIWriteByte(…) | | | | |---SPIReadByte(…) | | | |--- WriteRawRC(…) | | | |---SPIWriteByte(…) | | |--- SetBitMask (…) | | | |--- ReadRawRC (…) | | | | |---SPIWriteByte(…) | | | | |---SPIReadByte(…) | | | |--- WriteRawRC (…) | | | | |---SPIWriteByte(…) | | |--- ReadRawRC(…) | | |---SPIWriteByte(…) | |--- SetBitMask (…) | | |--- ReadRawRC (…) | | | |---SPIWriteByte(…) | | | |---SPIReadByte(…) | | |--- WriteRawRC (…) | | | |---SPIWriteByte(…) |----PcdSelect(…) | |--- CalulateCRC (…) | | |--- WriteRawRC (…) | | | |---SPIWriteByte(…) | | |--- ClearBitMask (…) | | | |--- ReadRawRC(…) | | | | |---SPIWriteByte(…) | | | | |---SPIReadByte(…) | | | |--- WriteRawRC(…) | | | |---SPIWriteByte(…) | | |--- SetBitMask (…) | | | |--- ReadRawRC (…) | | | | |---SPIWriteByte(…) | | | | |---SPIReadByte(…) | | | |--- WriteRawRC (…) | | | | |---SPIWriteByte(…) | | |--- ReadRawRC(…) | | |---SPIWriteByte(…) | |--- ClearBitMask (…) | | | |--- ReadRawRC(…) | | | | |---SPIWriteByte(…) | | | | |---SPIReadByte(…) | | | |--- WriteRawRC(…) | | | |---SPIWriteByte(…) | |--- PcdComMF522 (…) | | |--- WriteRawRC (…) | | | |---SPIWriteByte(…) | | |--- ClearBitMask (…) | | | |--- ReadRawRC(…) | | | | |---SPIWriteByte(…) | | | | |---SPIReadByte(…) | | | |--- WriteRawRC(…) | | | |---SPIWriteByte(…) | | |--- SetBitMask (…) | | | |--- ReadRawRC (…) | | | | |---SPIWriteByte(…) | | | | |---SPIReadByte(…) | | | |--- WriteRawRC (…) | | | | |---SPIWriteByte(…) | | |--- ReadRawRC(…) | | |---SPIWriteByte(…) |----PcdAuthState (…) | |--- PcdComMF522 (…) | | |--- WriteRawRC (…) | | | |---SPIWriteByte(…) | | |--- ClearBitMask (…) | | | |--- ReadRawRC(…) | | | | |---SPIWriteByte(…) | | | | |---SPIReadByte(…) | | | |--- WriteRawRC(…) | | | |---SPIWriteByte(…) | | |--- SetBitMask (…) | | | |--- ReadRawRC (…) | | | | |---SPIWriteByte(…) | | | | |---SPIReadByte(…) | | | |--- WriteRawRC (…) | | | | |---SPIWriteByte(…) | | |--- ReadRawRC(…) | | |---SPIWriteByte(…) | |--- ReadRawRC (…) | | |---SPIWriteByte(…) | | |---SPIReadByte(…) | |--- PcdWrite (…) | |---CalulateCRC(…) | | |--- WriteRawRC (…) | | | |---SPIWriteByte(…) | | |--- ClearBitMask (…) | | | |--- ReadRawRC(…) | | | | |---SPIWriteByte(…) | | | | |---SPIReadByte(…) | | | |--- WriteRawRC(…) | | | |---SPIWriteByte(…) | | |--- SetBitMask (…) | | | |--- ReadRawRC (…) | | | | |---SPIWriteByte(…) | | | | |---SPIReadByte(…) | | | |--- WriteRawRC (…) | | | | |---SPIWriteByte(…) | | |--- ReadRawRC(…) | | | |---SPIWriteByte(…) | |---PcdComMF522(…) | | |--- WriteRawRC (…) | | | |---SPIWriteByte(…) | | |--- ClearBitMask (…) | | | |--- ReadRawRC(…) | | | | |---SPIWriteByte(…) | | | | |---SPIReadByte(…) | | | |--- WriteRawRC(…) | | | |---SPIWriteByte(…) | | |--- SetBitMask (…) | | | |--- ReadRawRC (…) | | | | |---SPIWriteByte(…) | | | | |---SPIReadByte(…) | | | |--- WriteRawRC (…) | | | | |---SPIWriteByte(…) | | |--- ReadRawRC(…) | | |---SPIWriteByte(…) |----PcdHalt (…) | |---CalulateCRC(…) | |--- WriteRawRC (…) | | |---SPIWriteByte(…) | |--- ClearBitMask (…) | | |---ReadRawRC(…) | | | |---SPIWriteByte(…) | | | |---SPIReadByte(…) | | |--- WriteRawRC(…) | | | |---SPIWriteByte(…) | |--- SetBitMask (…) | | |--- ReadRawRC (…) | | | |---SPIWriteByte(…) | | | |---SPIReadByte(…) | | |--- WriteRawRC (…) | | | |---SPIWriteByte(…) | |--- ReadRawRC(…) | | |---SPIWriteByte(…) |---PcdComMF522 (…) |--- WriteRawRC (…) | |---SPIWriteByte(…) |--- ClearBitMask (…) | |--- ReadRawRC(…) | | |---SPIWriteByte(…) | | |---SPIReadByte(…) | |--- WriteRawRC(…) | |---SPIWriteByte(…) |--- SetBitMask (…) | |--- ReadRawRC (…) | | |---SPIWriteByte(…) | | |---SPIReadByte(…) | |--- WriteRawRC (…) | | |---SPIWriteByte(…) |--- ReadRawRC(…) |---SPIWriteByte(…)
由于字数限制,如果有需要可以留意关注,可以提供全套资料。
|