单片机_MFRC522射频模块使用方法(含代码)
MFRC522射頻模塊使用方法
本文只講解MFRC522射頻模塊使用方法(下文簡稱522模塊),不包含原理說明,原理下篇~
一、管腳解釋
522模塊總共有8個引腳,除去復位、GND接地、3.3V電源、NC端懸空、SCK時鐘端,剩余3個引腳,起數據作用。
二、連接方法
這里主要使用IIC的方法,相信寫過IIC的同學都很熟悉這段代碼。不熟悉也沒關系,后文會附上52單片機的LCD1602顯示UID的實現代碼,包含UART測試代碼。
顯而易見,通過總線辦法讀取數據只需要依照手冊寫代碼就可以讀出來,這里官方提供了函數代碼。同樣后文附上。
再附上IIC的數據傳輸規則。
三、實戰
什么是UID?
假設我們寫522代碼的目的是為了設計一個門禁系統,那提出的第一個問題一定是:我們需要從ic中讀出什么數據?什么數據又是正確的數據?
ic卡分為16個扇區,每個扇區為4塊,每塊16個字節,以塊為存取單位。
第0扇區的塊0(即絕對地址0塊),它用于存放廠商代碼,已經固化,不可更改。
這樣一個東西,叫做UID,這是一個存儲在ic中的不可更改的數據,他是一個4字節16進制數,所以我們將他作為我們的判斷依據。
幸運的是廠商給我們提供了參考代碼,返回這個ic的UID。見后
讀取數據流程
簡單做個解釋。1、檢測是否有人打卡(尋卡),2、放沖突,3、選擇這張卡(目的是確認寫入卡片),4、進入三次相互驗證(對于門禁系統來說僅涉及1,2步驟)
尋卡
卡片的電氣部分只由一個天線和ASIC組成。
天線:卡片的天線是只有幾組繞線的線圈,很適于封裝到IS0卡片中。
工作原理:讀寫器向M1卡發一組固定頻率的電磁波,卡片內有一個LC串聯諧振電路,其頻率與讀寫器發射的頻率相同,在電磁波的激勵下,LC諧振電路產生共振,從而使電容內有了電荷,在這個電容的另一端,接有一個單向導通的電子泵,將電容內的電荷送到另一個電容內儲存,當所積累的電荷達到2V時,此電容可做為電源為其它電路提供工作電壓,將卡內數據發射出去或接取讀寫器的數據。
了解原理了,來看看官方代碼。
/
// req_code[in]:尋卡方式
// 0x52:尋找感應區內所有符合14443A標準的卡(一般傳入參數)
// 0x26:尋找進入休眠狀態的卡
// pTagType[out]:卡片類型代碼
/
char PcdRequest(unsigned char req_code,unsigned char *pTagType)
{
char status;
unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];
ClearBitMask(Status2Reg,0x08);
WriteRawRC(BitFramingReg,0x07);
SetBitMask(TxControlReg,0x03);
ucComMF522Buf[0] = req_code;
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,1,ucComMF522Buf,&unLen);
if ((status == MI_OK) && (unLen == 0x10))
{
*pTagType = ucComMF522Buf[0];
*(pTagType+1) = ucComMF522Buf[1];
}
else
{
status = MI_ERR; }
return status;
}
當req_code傳入0x52時,如果尋找到卡,返回status == MI_OK == 0。調用:
if (PcdRequest(0x52, Temp) == MI_OK){
}
放沖突
在通過了尋卡這個if后,進入到放沖突環節,對于門禁設計而言,進入這個函數最大的需要在于,這個函數的返回,是ic卡的UID。
/
// 防沖撞
// pSnr[out]:卡片UID,4字節
/
char PcdAnticoll(unsigned char *pSnr)
{
char status;
unsigned char i,snr_check=0;
unsigned int unLen;
unsigned char ucComMF522Buf[MAXRLEN];
ClearBitMask(Status2Reg,0x08);
WriteRawRC(BitFramingReg,0x00);
ClearBitMask(CollReg,0x80);
ucComMF522Buf[0] = PICC_ANTICOLL1;
ucComMF522Buf[1] = 0x20;
status = PcdComMF522(PCD_TRANSCEIVE,ucComMF522Buf,2,ucComMF522Buf,&unLen);
if (status == MI_OK)
{
for (i=0; i<4; i++)
{
*(pSnr+i) = ucComMF522Buf[i];
snr_check ^= ucComMF522Buf[i];
}
if (snr_check != ucComMF522Buf[i])
{
status = MI_ERR; }
}
SetBitMask(CollReg,0x80);
return status;
}
當這個函數執行了后,所傳入的pSnr參數就會被傳入UID。
剩下的就是
if (UID == predict)
調試
使用UART進行調試有兩種方法,一、上位機軟件調試(開發板),二、串口調試,適用于打卡系統,可以直接與后端交互
一、開發板調試
我將其濃縮為三個步驟
1、將522模塊連接上開發板(按照上文管教解釋連接)。
2、打開串口調試助手
3、在串口發送區,輸入 A 點擊發送,為自動尋卡模式;若輸入F 點擊發送則為單次尋卡模式。將卡片放到讀卡模塊上,則可以看到讀出卡的 ID 號。
二、串口調試
具體點應該叫做,代碼版串口調試,或無需開發板版調試,hhh。
這種方法有個前提:你已經學會了怎么讀取卡片的UID。
那我們的方法就很簡單了,通過sbuf串口把我們接受到的UID發送出去。
void UART_send_byte(unsigned char dat) { SBUF = dat; while (TI == 0); TI = 0; } // 發送一個字符串 ART_send_string(unsigned char *buf) { while (*buf != 'void UART_send_byte(unsigned char dat) { SBUF = dat; while (TI == 0); TI = 0; } // 發送一個字符串 ART_send_string(unsigned char *buf) { while (*buf != '\0') { UART_send_byte(*buf++); } }')
{
UART_send_byte(*buf++);
}
}如果有小伙伴在嘗試這種方法,并將這個UID通過ETH-01網絡模塊發送給服務器,相信會發現一個很有趣的事情,評論區見。
這里我補充一個函數void u16ToString(uchar Volume[], char *hexStr, uint u) { /* hexStr ?a×a??oóμ?×?·?′? XXXX*/ uint j,k; char strlist[] = "0123456789ABCDEF"; /*16????×?·?±í£?ó?2é±í·¨??D§?ì?ù*/ for(j=0;j<u;j++){ if(Volume[j] != 'void u16ToString(uchar Volume[], char *hexStr, uint u) { /* hexStr ?a×a??oóμ?×?·?′? XXXX*/ uint j,k; char strlist[] = "0123456789ABCDEF"; /*16????×?·?±í£?ó?2é±í·¨??D§?ì?ù*/ for(j=0;j<u;j++){ if(Volume[j] != '\0'){ for(k=0;k<2;k++){ hexStr[j*2+k] = strlist[Volume[j] & 0x0f]; /*Volume & 0x0f£oè?μ? ????μ?16?????μ£???ó|μ??íê?strêy×éμ?ascii??*/ Volume[j] = Volume[j] >> 4; } } else{ break;} } }'){
for(k=0;k<2;k++){
hexStr[j*2+k] = strlist[Volume[j] & 0x0f]; /*Volume & 0x0f£oè?μ? ????μ?16?????μ£???ó|μ??íê?strêy×éμ?ascii??*/
Volume[j] = Volume[j] >> 4;
}
}
else{
break;}
}}
分享到這里就結束了,我們評論區見~,最后附上代碼。
百度云
鏈接: https://pan.baidu.com/s/14u8R8tpNyBmoxiftK0BCSA
提取碼: u4x8總結
以上是生活随笔為你收集整理的单片机_MFRC522射频模块使用方法(含代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql监控sql排名_监控数据库性能
- 下一篇: tarball介绍[通俗易懂]