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