STM32——NFC門禁模塊(RC522)(含代碼)
大家好,今天給大家介紹,文章末尾附有本畢業設計的論文和源碼的獲取方式,也可現在直接進群免費領取。
1. 前言(包括一些個人理解)
(2021/11/1編輯)
在項目需要做一個NFC門禁功能的時候,突然發現有個RC522丟在我的桌面,甚至不知道它上面的引腳什么意思(還不會SPI通訊),搜索關鍵詞“RC522”去看博客搜索資料,發現了很多都在說扇區,塊,S50(M1)卡,然后就給代碼,一開始我還以為S50是內嵌在這個模塊里面的一個存儲器,然后越看越怪,后面去淘寶搜索S50,才發現S50其實是我們的門禁卡,RC522是用來感應和判斷的。
- PCD是接近式卡。PICC是接近式耦合設備。
- 在通信過程中實際上是使用PCD命令控制RC522發出PICC命令與卡進行交互。
2. RC522門禁工作過程
- 過程:尋卡->防沖突->選卡->操作卡
- PCD命令
/*MFRC522命令集,中文手冊P59*/ #define MFRC_IDLE 0x00 //取消當前命令的執行 #define MFRC_TRANSMIT 0x04 //發送FIFO緩沖區內容 #define MFRC_RECEIVE 0x08 //激活接收器接收數據 #define MFRC_TRANSCEIVE 0x0C //發送并接收數據 #define MFRC_AUTHENT 0x0E //執行Mifare認證(驗證密鑰) #define MFRC_RESETPHASE 0x0F //復位MFRC522 #define MFRC_CALCCRC 0x03 //激活CRC計算 #define MFRC_NOCMDCHANGE 0x07 //無命令改變
- PICC命令
/*Mifare1卡片命令字*/ #define PICC_REQIDL 0x26 //尋天線區內未進入休眠狀態的卡 #define PICC_REQALL 0x52 //尋天線區內全部卡 #define PICC_ANTICOLL1 0x93 //防沖撞 #define PICC_ANTICOLL2 0x95 //防沖撞 #define PICC_AUTHENT1A 0x60 //驗證A密鑰 #define PICC_AUTHENT1B 0x61 //驗證B密鑰 #define PICC_READ 0x30 //讀塊 #define PICC_WRITE 0xA0 //寫塊 #define PICC_DECREMENT 0xC0 //減值(扣除) #define PICC_INCREMENT 0xC1 //增值(充值) #define PICC_TRANSFER 0xB0 //轉存(傳送) #define PICC_RESTORE 0xC2 //恢復(重儲) #define PICC_HALT 0x50 //休眠
3. CubeMx配置
3.1 SPI通訊的配置
打開SPI模式設置為:Full-Duplex Master(全雙工主機模式)
- 分頻設置為8~256都行,這樣隨之波特率也會改變,波特率越小通信速度越快
- Clock Phase (CPHA) 設置為第一個上升沿這里一定要1Edge
- 不開啟CRC檢測
3.2 SDA和REST引腳的配置
隨后再定義兩個普通的OUTPUT輸出的引腳作為復位和使能引腳
4. 外設代碼函數編寫
4.1 主函數能調用的接口函數
- 初始化
/*************************************************************************************** * 函數名稱:PCD_Init * 功能描述:讀寫器初始化 * 入口參數:無 * 出口參數:無 * 返 回 值:無 * 說 明:無 ***************************************************************************************/
void PCD_Init(void)
{ MFRC_Init(); //MFRC管腳配置 PCD_Reset(); //PCD復位 并初始化配置 PCD_AntennaOff(); //關閉天線 PCD_AntennaOn(); //開啟天線 PCD_Reset(); }
- 尋卡
/*************************************************************************************** * 函數名稱:PCD_Request * 功能描述:尋卡 * 入口參數: -RequestMode:尋卡方式 * PICC_REQIDL:尋天線區內未進入休眠狀態 * PICC_REQALL:尋天線區內全部卡 * -pCardType:用于保存卡片類型 * 出口參數:-pCardType:卡片類型 * 0x4400:Mifare_UltraLight * 0x0400:Mifare_One(S50) * 0x0200:Mifare_One(S70) * 0x0800:Mifare_Pro(X) * 0x4403:Mifare_DESFire * 返 回 值:-status:錯誤代碼(PCD_OK、PCD_NOTAGERR、PCD_ERR) * 說 明:無 ***************************************************************************************/
char PCD_Request(uint8_t RequestMode, uint8_t *pCardType)
{ int status; uint16_t unLen; uint8_t CmdFrameBuf[MFRC_MAXRLEN]; MFRC_ClrBitMask(MFRC_Status2Reg, 0x08);//關內部溫度傳感器 MFRC_WriteReg(MFRC_BitFramingReg, 0x07); //存儲模式,發送模式,是否啟動發送等 MFRC_SetBitMask(MFRC_TxControlReg, 0x03);//配置調制信號13.56MHZ CmdFrameBuf[0] = RequestMode; status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 1, CmdFrameBuf, &unLen); if((status == PCD_OK) && (unLen == 0x10)) { *pCardType = CmdFrameBuf[0]; *(pCardType + 1) = CmdFrameBuf[1]; } return status; }
- 防沖撞
4.2 二級內部調用函數
- 宏定義
- MFRC管腳配置
- PCD復位 并初始化配置
- 關閉天線
- 開啟天線
- RC與M1卡通訊幀函數
4.3 第三級最底層函數
- 讀一個寄存器
- 設置寄存器的位
- 清除寄存器的位
4.4 頭文件
5. 使用教程
//先用CubeMx初始化 PCD_Init();//RC522初始化 /*
* 函數功能:驗證刷卡人,以及發送上位機刷卡人身份
* 參 數:無
* 返 回 值:無
* 注 意:無
* 作 者:蘇釋州
*/ void NFC(void) { //尋卡 if (PCD_Request(PICC_REQALL, RxBuffer)!=0)//返回值為0,代表尋卡成功;并把卡類型存入RxBuffer中) { /*果然這里要清空一下不然就會亂,會有一些RxBuffer沒用的在那里占位*/ memset(RxBuffer, 0, sizeof(RxBuffer));//清空字符串 return;//如果不加這個判斷的話,則會無論尋卡是否成功都會有值000 } //防沖撞 if (PCD_Anticoll(RxBuffer)!=0)//防沖撞,完成這部就可以簡單地 讀取卡號 { memset(RxBuffer, 0, sizeof(RxBuffer));//清空字符串 return;//如果不加這個判斷的話,則會無論尋卡是否成功都會擾亂卡號 } //處理卡號數據 sprintf(Card_ID,"%x%x%x%x",RxBuffer[0],RxBuffer[1],RxBuffer[2],RxBuffer[3]); //對卡號進行權限的判斷 if(strcmp(Card_ID,"b59dfcaa")==0)//賣家配的卡 {
DoorControl(1);//開門 HAL_TIM_Base_Start_IT(&htim5);//開門的時候開啟定時器5的中斷,進入關門計時 memset(RxBuffer, 0, sizeof(RxBuffer));//清空字符串,這里要清除RxBuffer才行,否則Card_ID又會被組起來 } else if(strcmp(Card_ID,"e1eff3cc")==0)//劉駿帆手機本科生證 {
DoorControl(1);//開門 HAL_TIM_Base_Start_IT(&htim5);//開啟定時器5的中斷 memset(RxBuffer, 0, sizeof(RxBuffer));//清空字符串,這里要清除RxBuffer才行,否則Card_ID又會被組起來 } else {
DoorControl(1);//開門 HAL_TIM_Base_Start_IT(&htim5);//開啟定時器5的中斷 memset(RxBuffer, 0, sizeof(RxBuffer));//清空字符串 }
HAL_Delay(100); return;
}
完整代碼可進群免費領取!!!
嵌入式物聯網的學習之路非常漫長,不少人因為學習路線不對或者學習內容不夠專業而錯失高薪offer。不過別擔心,我為大家整理了一份150多G的學習資源,基本上涵蓋了嵌入式物聯網學習的所有內容。點擊下方鏈接,0元領取學習資源,讓你的學習之路更加順暢!記得點贊、關注、收藏、轉發哦!
- 贊