快速學會RC522讀寫射頻M1卡(一)-點亮LED

學習目標

使用M1卡控制開發板LED,實現LED的開關功能

實驗器材

STM32開發板、RFID-RC522模組、M1卡

實驗步驟

我購買的MF522模組有SPI通訊、IIC通訊、UASRT串列埠通訊,我購買的模組採用SPI通訊模式與微控制器進行通訊。首先配置微控制器的SPI通訊,我們使用STM32CUBE配置圖如下:

快速學會RC522讀寫射頻M1卡(一)-點亮LED

SPI通訊配置

接線

微控制器與RC522模組之間的接線可按照下圖進行管腳連線,我用的微控制器為STM32微控制器的SPI1模組。其中RCC522模組中的SS為SPI片選、RST為模組的復位引腳,高電平有效。

快速學會RC522讀寫射頻M1卡(一)-點亮LED

管腳接線圖

快速學會RC522讀寫射頻M1卡(一)-點亮LED

RC522的管腳定義圖

微控制器操作RC522模組主要有以下流程:初始化->尋卡->獲取ID->選卡->密碼驗證->操作卡片這幾個步驟(關於這些流程的具體含義大家可以點下面連結影片有詳細描述:

快速上手RC522讀卡模組(一)

)。其中每一步都有對應的操作函式,具體見下圖。

快速學會RC522讀寫射頻M1卡(一)-點亮LED

微控制器操作RC522流程圖

我們本次實驗為使用M1卡點亮LED燈。因為每一個M1卡的ID均為固定唯一的,我們可以讀出卡的ID並對ID進行判別來實現對LED燈的控制。根據上述的流程圖,我們可以只執行到“獲取ID”這一步驟即可實現此功能。各函式如下:

//模組初始化:void MFRC_Init(void){ RS522_NSS(1); RS522_RST(1);}//模組復位:void PCD_Reset(void){ /*硬復位*/ RS522_RST(1); HAL_Delay(2); RS522_RST(0); HAL_Delay(2); RS522_RST(1); HAL_Delay(2); /*軟復位*/ MFRC_WriteReg(MFRC_CommandReg, MFRC_RESETPHASE); HAL_Delay(2); /*復位後的初始化配置*/ MFRC_WriteReg(MFRC_ModeReg, 0x3D); //CRC初始值0x6363 MFRC_WriteReg(MFRC_TReloadRegL, 30); //定時器重灌值 MFRC_WriteReg(MFRC_TReloadRegH, 0); MFRC_WriteReg(MFRC_TModeReg, 0x8D); //定時器設定 MFRC_WriteReg(MFRC_TPrescalerReg, 0x3E); //定時器預分頻值 MFRC_WriteReg(MFRC_TxAutoReg, 0x40); //100%ASK PCD_AntennaOff(); //關天線 HAL_Delay(2); PCD_AntennaOn(); //開天線}

尋卡函式:

/**************************************************************************************** 函式名稱: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;}

獲取ID函式:

/**************************************************************************************** 函式名稱:PCD_Anticoll* 功能描述:防衝突,獲取卡號* 入口引數:-pSnr:用於儲存卡片序列號,4位元組* 出口引數:-pSnr:卡片序列號,4位元組* 返 回 值:-status:錯誤程式碼(PCD_OK、PCD_NOTAGERR、PCD_ERR)* 說 明:無***************************************************************************************/char PCD_Anticoll(uint8_t *pSnr){ char status; uint8_t i, snr_check = 0; uint16_t unLen; uint8_t CmdFrameBuf[MFRC_MAXRLEN]; MFRC_ClrBitMask(MFRC_Status2Reg, 0x08); MFRC_WriteReg(MFRC_BitFramingReg, 0x00); MFRC_ClrBitMask(MFRC_CollReg, 0x80); CmdFrameBuf[0] = PICC_ANTICOLL1; CmdFrameBuf[1] = 0x20; status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 2, CmdFrameBuf, &unLen); if(status == PCD_OK) { for(i = 0; i < 4; i++) { *(pSnr + i) = CmdFrameBuf[i]; snr_check ^= CmdFrameBuf[i]; } if(snr_check != CmdFrameBuf[i]) { status = PCD_ERR; } } MFRC_SetBitMask(MFRC_CollReg, 0x80); return status;}

我們使用以上函式來讀出卡ID後,微控制器對卡ID進行判別,根據判別結果來實現對LED的控制。具體函式講解及功能實現影片大家可以點選以下連結觀看:

快速上手RC522(二)—製作開關卡