Write_to_Card(…)和Read_from_Card(…)可謂是所有函數(shù)的終點,而SPIWriteByte(…)則是最底層對MFRC522模塊進行操作的函數(shù),所有函數(shù)都是為了Write_to_Card(…)和Read_from_Card(…)而產(chǎn)生的。因此,我們只需要調(diào)用這兩個函數(shù)就可以完成IC卡的讀寫,同時,這兩個函數(shù)的參數(shù)和使用方法都是一樣的。
Mifare卡片的存儲容量為8192×1位字長(即1K * 8位字長),采用E2PROM作為存儲介質(zhì)。整個結(jié)構(gòu)劃分為16個扇區(qū),編為扇區(qū)0~15。每個扇區(qū)有4個塊(Block),分別為塊0,塊1,塊2和塊3。每個塊有16個字節(jié)。一個扇區(qū)共有16Byte* 4 = 64Byte。每個扇區(qū)的塊3(即第四塊)也稱作尾塊,包含了該扇區(qū)的密碼A(6個字節(jié))、存取控制(4個字節(jié))、密碼B(6 個字節(jié))。其余三個塊是一般的數(shù)據(jù)塊。 每個扇區(qū)的塊3(即第四塊)也稱作尾塊,包含了該扇區(qū)的密碼A(6個字節(jié))、存取控制(4個字節(jié))、密碼B(6個字節(jié))。其余三個塊是一般的數(shù)據(jù)塊。扇區(qū)0的塊0是特殊的塊,包含了廠商代碼信息,在生產(chǎn)卡片時寫入,不可改寫。其中:第0~4個字節(jié)為卡片的序列號,第5個字節(jié)為序列號的校驗碼;第6個字節(jié)為卡片的容量“SIZE”字節(jié);第7、8個字節(jié)為卡片的類型號字節(jié),即Tagtype字節(jié);其他字節(jié)由廠商另加定義。 綜上所述,我們可以用來存儲數(shù)據(jù)的空間為第一扇區(qū)的第1、2塊,第二扇區(qū)到第63扇區(qū)的第0、1、2塊,簡而言之就是我們上圖中的“數(shù)據(jù)塊”。
M1卡結(jié)構(gòu):
共16個扇區(qū),每個扇區(qū)4塊(塊0~3),共64塊,按塊號編址為0~63。
第0扇區(qū)的塊0(即絕對地址0塊)用于存放廠商代碼,已經(jīng)固化,不可更改。
其他各扇區(qū):
塊0、塊1、塊2為數(shù)據(jù)塊,用于存貯數(shù)據(jù);
塊3為控制塊,存放密碼A、存取控制、密碼B。
因此,只要做出一個接口,即設(shè)計一個函數(shù),讓我們指定要在哪個塊上輸入什么數(shù)據(jù)就好了,塊的數(shù)據(jù)范圍是0到63,寫入的數(shù)據(jù)的格式為16個字節(jié),如:ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff,我們設(shè)定一個數(shù)組來存儲這個數(shù)據(jù):Write_Data[16] = {0x00};
我們設(shè)計了一個函數(shù):Write_to_Card(kuai,Write_Data);其中,kuai就是指定是哪個塊,Write_Data是指要寫入的數(shù)據(jù),就是上面所說數(shù)組的起始地址,只要事先對這兩個變量進行賦值,就可以輕松向IC卡中寫入數(shù)據(jù)了,我們設(shè)計了另一個函數(shù)Read_from_Card(kuai,Read_Data);kuai是指要操作的塊,Read_Data就是從這個塊中讀取出來的數(shù)據(jù)的存放地,有了數(shù)據(jù),不管是在lcd1602還是lcd12864或者是tft液晶顯示都沒什么問題了。 現(xiàn)在讓我們看看Write_to_Card(…)和Read_from_Card(…)的使用方法: void main() { Write_Data[0] = 0x33; //需要寫入IC卡中的數(shù)據(jù)賦值 init(); //串口通信初始化 while(1) { Write_to_Card(0x01,Write_Data); //向IC卡中的0x01塊存儲區(qū)中寫數(shù)據(jù) delay_welcome(100); Read_from_Card(0x01,Read_Data); //從IC卡中的0x01塊存儲區(qū)中讀數(shù)據(jù) } } 這是Mian函數(shù)程序.
讀寫卡的時間是短暫的,而人刷卡時,卡在讀卡器讀卡范圍內(nèi)的時間相對較長,這就涉及到一次讀卡和重復(fù)讀卡的問題了,我們的程序設(shè)計的是一次讀卡,也就是說你不管把卡放在讀卡器上多長時間,系統(tǒng)只讀寫一次卡,串口調(diào)試助手不會重復(fù)顯示一樣的數(shù)據(jù),這個功能可不是所有淘寶店可以提供的哦。下面我們來看看程序: //向IC卡中寫數(shù)據(jù) 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(); //尋天線區(qū)內(nèi)未進入休眠狀態(tài)的卡,返回卡片類型 2字節(jié) status=PcdRequest(PICC_REQIDL,&RevBuffer[0]); if(status!=MI_OK) { flag = 0; green = 1; return 0x00; } //判斷當操作卡完成后就停止重復(fù)讀寫卡 if(flag == 1) { return 0x00; } //防沖撞,返回卡的序列號 4字節(jié) 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; } //向卡中指定塊中寫數(shù)據(jù) status=PcdWrite(KuaiN,pData); if(status!=MI_OK) { return 0; } //命令卡片進入休眠狀態(tài) PcdHalt(); flag = 1; green = 0; return 1; } //從IC卡中讀數(shù)據(jù) 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(); //尋天線區(qū)內(nèi)未進入休眠狀態(tài)的卡,返回卡片類型 2字節(jié) status=PcdRequest(PICC_REQIDL,&RevBuffer[0]); if(status!=MI_OK) { flag = 0; green = 1; return 0x00; } //判斷當操作卡完成后就停止重復(fù)讀寫卡 if(flag == 1) { return 0x00; } //防沖撞,返回卡的序列號 4字節(jié) 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; } //從卡中對應(yīng)塊中讀取數(shù)據(jù),注意,一次讀出整塊數(shù)據(jù),即16字節(jié) status= PcdRead (KuaiN,pData); if(status!=MI_OK) { return 0; } //命令卡片進入休眠狀態(tài) PcdHalt(); flag = 1; green = 0; //如果程序走到這一步,就說明讀卡成功,并且pData指定人數(shù)組中存放著塊數(shù)據(jù) //我們可以通過下面的函數(shù)向PC機傳送卡里的數(shù)據(jù) Serial_Rs232(pData,16); return 1; }
程序的函數(shù)關(guān)系:
Main() |---- Write_to_Card(…); //寫卡 | |---- PcdRequest(…); //尋天線區(qū)內(nèi)未進入休眠狀態(tài)的卡 | | |--- 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(…); //尋天線區(qū)內(nèi)未進入休眠狀態(tài)的卡 | |--- 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(…)
由于字數(shù)限制,如果有需要可以留意關(guān)注,可以提供全套資料。
|