?
一、環(huán)境介紹
開發(fā)軟件:Keil5
非接觸式讀寫卡模塊: MFRC522
二、功能介紹
使用MFRC522模塊完成對IC卡卡號讀取、卡類型區(qū)分、IC卡扇區(qū)密碼修改、扇區(qū)數(shù)據(jù)讀寫等功能;底層采用SPI模擬時序,可以很方便的移植到其他設備,完成項目開發(fā)。 現(xiàn)在很多嵌入式方向的畢業(yè)設計經(jīng)常使用到該模塊,比如: 校園一卡通設計、水卡充值消費設計、公交卡充值消費設計等。
三、MFR522介紹
MF RC522 是應用于13.56MHz 非接觸式通信中高集成度讀寫卡系列芯片中的一員。是NXP 公司針對“三表”應用推出的一款低電壓、低成本、體積小的非接觸式讀寫卡芯片,是智能儀表和便攜式手持設備研發(fā)的較好選擇。
MF RC522 利用了先進的調(diào)制和解調(diào)概念,完全集成了在13.56MHz 下所有類型的被動非接觸式通信方式和協(xié)議。支持 ISO14443A 的多層應用。其內(nèi)部發(fā)送器部分可驅動讀寫器天線與ISO 14443A/MIFARE卡和應答機的通信,無需其它的電路。接收器部分提供一個堅固而有效的解調(diào)和解碼電路,用于處理ISO14443A 兼容的應答器信號。數(shù)字部分處理ISO14443A 幀和錯誤檢測(奇偶 &CRC)。此外,它還支持快速CRYPTO1 加密算法,用于驗證MIFARE 系列產(chǎn)品。MFRC522 支持MIFARE?更高速的非接觸式通信,雙向數(shù)據(jù)傳輸速率高達424kbit/s。
作為13.56MHz 高集成度讀寫卡系列芯片家族的新成員,MF RC522 與MF RC500和 MF RC530 有不少相似之處,同時也具備諸多特點和差異。它與主機間的通信采用連線較少的串行通信,且可根據(jù)不同的用戶需求,選取SPI、I2C 或串行UART(類似RS232)模式之一,有利于減少連線,縮小PCB 板體積,降低成本。
?
四、IC卡介紹
非接觸式IC卡又稱射頻卡,由IC芯片、感應天線組成,封裝在一個標準的PVC卡片內(nèi),芯片及天線無任何外露部分。是世界上最近幾年發(fā)展起來的一項新技術,它成功的將射頻識別技術和IC卡技術結合起來,結束了無源(卡中無電源)和免接觸這一難題,是電子器件領域的一大突破??ㄆ谝欢ň嚯x范圍(通常為5—10cm)靠近讀寫器表面,通過無線電波的傳遞來完成數(shù)據(jù)的讀寫操作。
射頻讀寫器向IC卡發(fā)一組固定頻率的電磁波,卡片內(nèi)有一個LC串聯(lián)諧振電路,其頻率與讀寫器發(fā)射的頻率相同,這樣在電磁波激勵下,LC諧振電路產(chǎn)生共振,從而使電容內(nèi)有了電荷;在這個電荷的另一端,接有一個單向導通的電子泵,將電容內(nèi)的電荷送到另一個電容內(nèi)存儲,當所積累的電荷達到2V時,此電容可作為電源為其它電路提供工作電壓,將卡內(nèi)數(shù)據(jù)發(fā)射出去或接受讀寫器的數(shù)據(jù)。
非接觸性IC卡與讀卡器之間通過無線電波來完成讀寫操作。二者之間的通訊頻率為13.56MHZ。非接觸性IC卡本身是無源卡,當讀寫器對卡進行讀寫操作時,讀寫器發(fā)出的信號由兩部分疊加組成:一部分是電源信號,該信號由卡接收后,與本身的L/C產(chǎn)生一個瞬間能量來供給芯片工作。另一部分則是指令和數(shù)據(jù)信號,指揮芯片完成數(shù)據(jù)的讀取、修改、儲存等,并返回信號給讀寫器,完成一次讀寫操作。讀寫器則一般由單片機,專用智能模塊和天線組成,并配有與PC的通訊接口,打印口,I/O口等,以便應用于不同的領域。
M1卡詳細指標
M1卡是指M1芯片,是指菲利浦下屬子公司恩智浦出品的芯片縮寫,全稱為NXP Mifare1系列,常用的有S50及S70兩種型號。
M1(S50)卡詳細規(guī)格:
- 芯片類型:PhilipsMifare1ICS50
- 存儲容量:8Kbit,16個分區(qū),每分區(qū)兩組密碼;
- 工作頻率:13.56?MHz;
- 通訊速率:106KBoud;
- 讀寫距離:2.5~10cm;
- 讀寫時間:1~2ms;
- 工作溫度:-20℃~55℃;
- 擦寫壽命:>100,000次;
- 數(shù)據(jù)保存:>10年;
- 外形尺寸:ISO標準卡85.6x54x0.82;
- 封裝材料:PVC、PET、PETG、0.13mm銅線;
Mifare S50和Mifare S70又常被稱為Mifare Standard、Mifare Classic、MF1,是遵守ISO14443A標準的卡片中應用最為廣、影響力最大的的一員。而Mifare S70的容量是S50的4倍,S50的容量是1K字節(jié),S70的容量為4K字節(jié)。
讀寫器對卡片的操作時序和操作命令,二者完全一致。 Mifare S50和Mifare S70的每張卡片都有一個4字節(jié)的全球唯一序列號,卡上數(shù)據(jù)保存期為10年,可改寫10萬次,讀無限次。一般的應用中,不用考慮卡片是否會被讀壞寫壞的問題,
當然暴力硬損壞除外。 Mifare S50和Mifare S70的區(qū)別主要有兩個方面。一是讀寫器對卡片發(fā)出請求命令,二者應答返回的卡類型(ATQA)字節(jié)不同。Mifare S50的卡類型(ATQA)是0004H,Mifare S70的卡類型(ATQA)是0002H。另一個區(qū)別就是二者的容量和內(nèi)存結構不同。
M1卡分為16個扇區(qū),每個扇區(qū)由4塊(0、1、2、3)組成。實際操作時,將16個扇區(qū)分為64個塊,按絕對地址編號為0-63。
結構如下:
?
?
- 第0個扇區(qū)用于存放廠商代碼,意見固話,不可更改。
- 每個扇區(qū)的塊0、塊1、塊2為數(shù)據(jù)塊,可以用于存儲數(shù)據(jù)。數(shù)據(jù)塊可以進行讀寫操作。
- 每個扇區(qū)的塊3為控制塊,包括了密碼A、存儲控制、密碼B。具體結構如下:
?
4. 每個扇區(qū)的密碼和控制位都是獨立的,可以根據(jù)實際需求設定各自的密碼及存取控制。存取控制為4個字節(jié),共32位,扇區(qū)中的每個塊(包括數(shù)據(jù)和控制塊)存取條件是由密碼和存取控制共同決定的,在存取控制中每個塊都有一個相應的三個控制位。定義如下:
?
Mifare 1 S50 白卡讀寫時一般步驟: 尋卡-->下載塊密碼--> 讀寫塊數(shù)據(jù)??刂茐K也是一樣。
?
? 數(shù)據(jù)塊的訪問權限設置表格:(根據(jù)自己需要的權限,完成上圖字節(jié)6、7、8的填充即可)
?
?
控制塊的讀寫權限設置:(包含了對密碼A、控制權限、密碼的讀寫權限)
?
?
7 6 5 4 3 2 1 0
字節(jié)6 1 1 1 1 1 1 1 1
字節(jié)7 0 0 0 0 1 1 1 1
字節(jié)8 0 0 0 0 0 0 0 0
字節(jié)9
設置的控制權限如下:0xFF 0x0F 0x00 0x00
代表數(shù)據(jù)塊的權限: 驗證密碼A或者密碼B都可以對數(shù)據(jù)塊進行讀寫操作或者加值鍵值操作。
2. 代表控制塊的權限
(1) 驗證A密碼之后可以寫A/B密碼,不能讀密碼。
可以讀控制字節(jié)(4個),無法寫控制字節(jié)
可以讀寫B(tài)密碼
(2) 驗證B密碼之后,可以讀寫A/B密碼,也可讀控制字節(jié),但無法寫控制字節(jié)。
五、核心代碼
5.1 rc522.c
完整工程源碼下載: https://download.csdn.net/download/xiaolong1126626497/18905806
#include "sys.h"
#include "RFID_RC522.h"
#include "delay.h"
#include "string.h"
#include "usart.h"
/*
函數(shù)功能:移植接口--SPI時序讀寫一個字節(jié)
函數(shù)參數(shù):data:要寫入的數(shù)據(jù)
返 回 值:讀到的數(shù)據(jù)
*/
u8 RC522_SPI_ReadWriteOneByte(u8 tx_data)
{
u8 rx_data=0;
u8 i;
for(i=0;i<8;i++)
{
RC522_SCLK=0;
if(tx_data&0x80){RC522_OUTPUT=1;}
else {RC522_OUTPUT=0;}
tx_data<<=1;
RC522_SCLK=1;
rx_data<<=1;
if(RC522_INPUT)rx_data|=0x01;
}
return rx_data;
}
/*
函數(shù)功能:初始化RC522的IO口
*/
void RC522_IO_Init(void)
{
RCC->APB2ENR|=1<<2; //PA時鐘使能
RCC->APB2ENR|=1<<7; //PF時鐘使能
//PA5 時鐘 RC522_SCLK
//PA6 輸入 RC522_INPUT
//PA7 輸出 RC522_OUTPUT
GPIOA->CRL&=0x000FFFFF;
GPIOA->CRL|=0x38300000;
GPIOA->ODR|=0x3<<5;
//RC522_RST <----->PF1--復位腳
//RC522_SDA <----->PF0--片選腳
GPIOF->CRL&=0xFFFFFF00;
GPIOF->CRL|=0x00000033;
GPIOF->ODR|=0x3<<0;
}
/*
功能描述:選卡讀取卡存儲器容量
輸入?yún)?shù):serNum 傳入卡序列號
返 回 值:成功返回卡容量
*/
u8 RC522_MFRC522_SelectTag(u8 *serNum) //讀取卡存儲器容量
{
u8 i;
u8 status;
u8 size;
u8 recvBits;
u8 buffer[9];
buffer[0]=PICC_ANTICOLL1; //防撞碼1
buffer[1]=0x70;
buffer[6]=0x00;
for(i=0;i<4;i++)
{
buffer[i+2]=*(serNum+i); //buffer[2]-buffer[5]為卡序列號
buffer[6]^=*(serNum+i); //卡校驗碼
}
RC522_CalulateCRC(buffer,7,&buffer[7]); //buffer[7]-buffer[8]為RCR校驗碼
RC522_ClearBitMask(Status2Reg,0x08);
status=RC522_PcdComMF522(PCD_TRANSCEIVE,buffer,9,buffer,&recvBits);
if((status==MI_OK)&&(recvBits==0x18))
size=buffer[0];
else
size=0;
return size;
}
/*
延時函數(shù),納秒級
*/
void RC522_Delay(u32 ns)
{
u32 i;
for(i=0;i
-
射頻
+關注
關注
104文章
5601瀏覽量
167997 -
IC卡
+關注
關注
2文章
168瀏覽量
34163 -
嵌入式
+關注
關注
5088文章
19159瀏覽量
306515 -
NXP
+關注
關注
60文章
1287瀏覽量
184854 -
STM32
+關注
關注
2270文章
10915瀏覽量
356787
發(fā)布評論請先 登錄
相關推薦
評論