STM32系列(HAL库)——F103C8T6通过MFRC522、RFID射频卡、门禁卡模块读取卡片ID
1.軟件準(zhǔn)備
(1)編程平臺(tái):Keil5
(2)CubeMX
(3)XCOM(串口調(diào)試助手)
2.硬件準(zhǔn)備
(1)MFRC-522模塊
(2)F1的板子,本例使用經(jīng)典F103C8T6
(3)ST-link?下載器
(4)USB-TTL模塊
(5)杜邦線若干
?3.模塊資料
(1)模塊簡(jiǎn)介:
????????MFRC522-AN模塊采用 Philips MFRC522芯片設(shè)計(jì)讀卡電路,使用方便,成本低廉,適用于設(shè)備開發(fā)、讀卡器開發(fā)等高級(jí)應(yīng)用的用戶、需要進(jìn)行射頻卡終端設(shè)計(jì)/生產(chǎn)的用戶。本模塊可直接裝入各種讀卡器模具。模塊采用電壓為3.3V,通過(guò)SPI接口簡(jiǎn)單的幾條線就可以直接與用戶任何CPU主板相連接通信,可以保證模塊穩(wěn)定可靠的工作、讀卡距離遠(yuǎn)。
(2)關(guān)于RC255芯片:
????????MFRC522是應(yīng)用于13.56MHz非接觸式通信中高集成度的讀寫卡芯片,“三表”應(yīng)用推出的一款低電壓、低成本、體積小的非接觸式讀寫卡芯片,是智能儀表和便攜式手持設(shè)備研發(fā)的較好選擇。MFRC522利用了先進(jìn)的調(diào)制和解調(diào)概念,集成了在13.56MHz下所有類型的被動(dòng)非接觸式通信方式和協(xié)議。支持14443A兼容應(yīng)答器信號(hào)。數(shù)字部分處理ISO014443A幀和錯(cuò)誤檢測(cè)。此外,還支持快速 CRYPTO1加密算法,用語(yǔ)驗(yàn)證MIFARE系列產(chǎn)品。MFRC522支持 MIFARE系列更高速的非接觸式通信,雙向數(shù)據(jù)傳輸速率高達(dá)424 kbit/s 。作為13.56MHz高集成度讀寫卡系列芯片家族的新成員,MRC522與MFRC500和MFRC530有不少相似之處,同時(shí)也具備許多特點(diǎn)和差異。它與主機(jī)間通信采用SPi模式,有利于減少連線,縮小PCB板體積,降低成本。
(3)模塊參數(shù):
①工作電壓:3.3v
②工作頻率:13.56MHz
③支持卡類型:mifare1 s50、mifare1s70、 mifareUltraLight、mifare Pro, mifare Desfire
④通信方式:SPI協(xié)議
⑤環(huán)境工作溫度:-20°C——80°C
4.CubeMX配置
(1)芯片選擇
?(2)配置RCC、SYS、時(shí)鐘樹
配置RCC
配置SYS
配置時(shí)鐘樹
(3)配置GPIO?
?(4)配置串口1
?(5)配置SPI2
?(6)設(shè)置路徑、生成代碼工程
5、Keil5代碼
(1)勾選Use?MicroLIB
(2)創(chuàng)建RC522.c和RC522.h文件
(3)添加上述的RC522.c文件進(jìn)工程
——————上述兩步參考之前系列教學(xué)步驟,在此不再贅述(點(diǎn)擊跳轉(zhuǎn))
(4)RC522.c和5C522.h代碼
RC522.c
(以下部分僅讀卡功能,更多功能請(qǐng)?jiān)谖恼陆Y(jié)尾下載源碼查看)
#include "rc522.h" #include "stdio.h"//SPI2_SCK PB13 //SPI2_MISO PB14 //SPI2_MOSI PB15 //RCC522_RST(CE) PB9 //RCC522_NSS(SDA) PB8 //RCC522_IRQ 懸空uint8_t UID[5],Temp[4]; uint8_t RF_Buffer[18]; uint8_t Password_Buffer[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF}; // Mifare One 缺省密碼void RC522_Init(void) {RC522_SDA_LOW;HAL_SPI_Transmit(&hspi2, (uint8_t *)0xaa, sizeof((uint8_t *)0xaa), 0xFF);//啟動(dòng)傳輸 RC522_SDA_HIGH;HAL_Delay(50);PcdReset();//復(fù)位RC522讀卡器HAL_Delay(10);PcdReset();//復(fù)位RC522讀卡器HAL_Delay(10);PcdAntennaOff();//關(guān)閉天線發(fā)射 HAL_Delay(10); PcdAntennaOn();//開啟天線發(fā)射printf("RFID-MFRC522 初始化完成\r\nFindCard Starting ...\r\n"); //測(cè)試引腳初始化完成 }void delay_ns(uint32_t ns) {uint32_t i;for(i=0;i<ns;i++){__nop();__nop();__nop();} }//SPIx 讀寫一個(gè)字節(jié) //TxData:要寫入的字節(jié) //返回值:讀取到的字節(jié) //***************************************************************************/char RC522_ReadWriteByte(uint8_t TxData) { while (SPI_CHECK_FLAG(SPI2->SR,((uint16_t)0x0002)) == RESET) //檢查指定的SPI標(biāo)志位設(shè)置與否:發(fā)送緩存空標(biāo)志位{;} SPI2->DR=TxData; //通過(guò)外設(shè)SPIx發(fā)送一個(gè)數(shù)據(jù)while (SPI_CHECK_FLAG(SPI2->SR,((uint16_t)0x0001)) == RESET) //檢查指定的SPI標(biāo)志位設(shè)置與否:接受緩存非空標(biāo)志位{} return SPI2->DR; //返回通過(guò)SPIx最近接收的數(shù)據(jù) }//******************************************************************/ //功 能:讀RC522寄存器 //參數(shù)說(shuō)明:Address[IN]:寄存器地址 //返 回:讀出的值 //******************************************************************/ unsigned char ReadRawRC(unsigned char Address) {uint8_t ucAddr;uint8_t ucResult=0;RC522_SDA_LOW;HAL_Delay(10);ucAddr = ((Address<<1)&0x7E)|0x80;RC522_ReadWriteByte(ucAddr);HAL_Delay(10);ucResult=RC522_ReadWriteByte(0);HAL_Delay(10);RC522_SDA_HIGH;return ucResult; }//******************************************************************/ //功 能:寫RC522寄存器 //參數(shù)說(shuō)明:Address[IN]:寄存器地址 // value[IN]:寫入的值 //******************************************************************/ void WriteRawRC(unsigned char Address, unsigned char value) {uint8_t ucAddr;RC522_SDA_LOW;HAL_Delay(10);ucAddr = ((Address<<1)&0x7E) ;RC522_ReadWriteByte(ucAddr);HAL_Delay(10);RC522_ReadWriteByte(value);HAL_Delay(10);RC522_SDA_HIGH; }//******************************************************************/ //功 能:置RC522寄存器位 //參數(shù)說(shuō)明:reg[IN]:寄存器地址 // mask[IN]:置位值 //******************************************************************/ void SetBitMask(unsigned char reg,unsigned char mask) {char tmp = 0x0 ;tmp = ReadRawRC(reg)| mask;WriteRawRC(reg,tmp | mask); // set bit mask }//******************************************************************/ //功 能:清RC522寄存器位 //參數(shù)說(shuō)明:reg[IN]:寄存器地址 // mask[IN]:清位值 //******************************************************************/ void ClearBitMask(unsigned char reg,unsigned char mask) {char tmp = 0x0 ;tmp = ReadRawRC(reg)&(~mask);WriteRawRC(reg, tmp) ; // clear bit mask } //******************************************************************/ //功 能:復(fù)位RC522 //返 回: 成功返回MI_OK //******************************************************************/ char PcdReset() {RC522_RST_HIGH; ;delay_ns(10) ;RC522_RST_LOW; ;delay_ns(100) ;RC522_RST_HIGH; ;delay_ns(10) ;WriteRawRC(CommandReg,PCD_RESETPHASE);delay_ns(100) ;WriteRawRC(ModeReg,0x3D) ;//定義發(fā)送和接收常用模式 和Mifare卡通訊,CRC初始值0x6363WriteRawRC(TReloadRegL,30) ;//16位定時(shí)器低位 30WriteRawRC(TReloadRegH,0) ;//16位定時(shí)器高位WriteRawRC(TModeReg,0x8D) ;//定義內(nèi)部定時(shí)器的設(shè)置WriteRawRC(TPrescalerReg,0x3E) ;//設(shè)置定時(shí)器分頻系數(shù) WriteRawRC(TxASKReg,0x40) ;//調(diào)制發(fā)送信號(hào)為100%ASKreturn MI_OK ; } // //設(shè)置RC522的工作方式 // char MF522PcdConfigISOType(unsigned char type) {if (type == 'A') //ISO14443_A{ClearBitMask(Status2Reg,0x08); //狀態(tài)2寄存器 WriteRawRC(ModeReg,0x3D); //3F //和Mifare卡通訊,CRC初始值0x6363 WriteRawRC(RxSelReg,0x86); //84 選擇內(nèi)部接收器設(shè)置,內(nèi)部模擬部分調(diào)制信號(hào),發(fā)送數(shù)據(jù)后,延遲6個(gè)位時(shí)鐘,接收 WriteRawRC(RFCfgReg,0x7F); //4F 配置接收器 48dB最大增益 WriteRawRC(TReloadRegL,30); //tmoLength);TReloadVal = 'h6a =tmoLength(dec) WriteRawRC(TReloadRegH,0); //實(shí)際值是OXD3E 這部分主要是設(shè)置定時(shí)器寄存器 WriteRawRC(TModeReg,0x8D);WriteRawRC(TPrescalerReg,0x3E);delay_ns(1000);PcdAntennaOn();} else {return 0xFE;} return MI_OK; } //******************************************************************/ //開啟天線發(fā)射 //每次啟動(dòng)或關(guān)閉天險(xiǎn)發(fā)射之間應(yīng)至少有1ms的間隔 //******************************************************************/ void PcdAntennaOn() {unsigned char i;WriteRawRC(TxASKReg,0x40) ;HAL_Delay(1);i = ReadRawRC(TxControlReg) ;if(!(i&0x03))SetBitMask(TxControlReg, 0x03);i=ReadRawRC(TxASKReg) ; }//******************************************************************/ //關(guān)閉天線發(fā)射 //******************************************************************/ void PcdAntennaOff() {ClearBitMask(TxControlReg, 0x03); }//******************************************************************/ //功 能:通過(guò)RC522和ISO14443卡通訊 //參數(shù)說(shuō)明:Command[IN]:RC522命令字 // pInData[IN]:通過(guò)RC522發(fā)送到卡片的數(shù)據(jù) // InLenByte[IN]:發(fā)送數(shù)據(jù)的字節(jié)長(zhǎng)度 // pOutData[OUT]:接收到的卡片返回?cái)?shù)據(jù) // *pOutLenBit[OUT]:返回?cái)?shù)據(jù)的位長(zhǎng)度 //******************************************************************/ char PcdComMF522(unsigned char Command ,unsigned char *pInData , unsigned char InLenByte,unsigned char *pOutData, unsigned int *pOutLenBit ) {char status = MI_ERR ;unsigned char irqEn = 0x00 ;unsigned char waitFor = 0x00 ;unsigned char lastBits ;unsigned char n ;unsigned int i ;switch (Command){case PCD_AUTHENT:irqEn = 0x12 ;waitFor = 0x10 ;break ;case PCD_TRANSCEIVE:irqEn = 0x77 ;waitFor = 0x30 ;break ;default:break ;}WriteRawRC(ComIEnReg,irqEn|0x80) ; //ClearBitMask(ComIrqReg,0x80) ;WriteRawRC(CommandReg,PCD_IDLE) ;SetBitMask(FIFOLevelReg,0x80) ; // 清空FIFO for(i=0; i<InLenByte; i++)WriteRawRC(FIFODataReg,pInData[i]) ; // 數(shù)據(jù)寫入FIFO WriteRawRC(CommandReg, Command) ; // 命令寫入命令寄存器if(Command == PCD_TRANSCEIVE)SetBitMask(BitFramingReg,0x80) ; // 開始發(fā)送 i = 6000 ; //根據(jù)時(shí)鐘頻率調(diào)整,操作M1卡最大等待時(shí)間25msdo {n = ReadRawRC(ComIrqReg) ;i-- ;}while((i!=0)&&!(n&0x01)&&!(n&waitFor)) ;ClearBitMask(BitFramingReg,0x80) ;if(i!=0){if(!(ReadRawRC(ErrorReg)&0x1B)){status = MI_OK ;if (n&irqEn&0x01)status = MI_NOTAGERR ;if(Command==PCD_TRANSCEIVE){n = ReadRawRC(FIFOLevelReg) ;lastBits = ReadRawRC(ControlReg)&0x07 ;if(lastBits)*pOutLenBit = (n-1)*8 + lastBits ;else*pOutLenBit = n*8 ;if(n==0)n = 1 ;if(n>MAXRLEN)n = MAXRLEN ;for (i=0; i<n; i++)pOutData[i] = ReadRawRC(FIFODataReg) ; }}elsestatus = MI_ERR ; }SetBitMask(ControlReg,0x80) ;// stop timer nowWriteRawRC(CommandReg,PCD_IDLE) ; return status; }//******************************************************************/ //功 能:尋卡 / //參數(shù)說(shuō)明: req_code[IN]:尋卡方式 / // 0x52 = 尋感應(yīng)區(qū)內(nèi)所有符合14443A標(biāo)準(zhǔn)的卡 / // 0x26 = 尋未進(jìn)入休眠狀態(tài)的卡 / // pTagType[OUT]:卡片類型代碼 / // 0x4400 = Mifare_UltraLight / // 0x0400 = Mifare_One(S50) / // 0x0200 = Mifare_One(S70) / // 0x0800 = Mifare_Pro(X) / // 0x4403 = Mifare_DESFire / //返 回: 成功返回MI_OK / //******************************************************************/ char PcdRequest(unsigned char req_code,unsigned char *pTagType) {char status ; unsigned int unLen ;unsigned char ucComMF522Buf[MAXRLEN] ; ClearBitMask(Status2Reg,0x08) ;//清除MRCrypto1on,要用軟件清零WriteRawRC(BitFramingReg,0x07) ;//startsend=0,rxalign=0,在FIFO中存放的位置,TXlastbit=7SetBitMask(TxControlReg,0x03) ;//TX2rfen=1,TX1RFen=1,傳遞調(diào)制的13.56MHZ的載波信號(hào)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] ;}elsestatus = MI_ERR ;return status ; }//******************************************************************/ //功 能:防沖撞 / //參數(shù)說(shuō)明: pSnr[OUT]:卡片序列號(hào),4字節(jié) / //返 回: 成功返回MI_OK / //******************************************************************/ char PcdAnticoll(unsigned char *pSnr) {char status;unsigned char i,snr_check=0;unsigned int unLen;unsigned char ucComMF522Buf[MAXRLEN]; ClearBitMask(Status2Reg,0x08);//清除MRCrypto1on,要用軟件清零WriteRawRC(BitFramingReg,0x00);//表示最后一個(gè)字節(jié)所有位都發(fā)送ClearBitMask(CollReg,0x80);//CollRegCollReg0沖突結(jié)束后沖突位被置零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);//CollRegCollReg 在106kbps良好的防沖突情況下該位置1return status; }//============================================================================== //讀取卡的類型 //讀取卡的ID號(hào) //============================================================================== void ReaderCard(void) {char temp_value;if(PcdRequest(PICC_REQALL,Temp)==MI_OK) //選卡{if(Temp[0]==0x04&&Temp[1]==0x00) printf("\r\nMFOne-S50\r\n");else if(Temp[0]==0x02&&Temp[1]==0x00)printf("MFOne-S70");else if(Temp[0]==0x44&&Temp[1]==0x00)printf("MF-UltraLight");else if(Temp[0]==0x08&&Temp[1]==0x00)printf("MF-Pro");else if(Temp[0]==0x44&&Temp[1]==0x03)printf("MF Desire");elseprintf("Unknown");if(PcdAnticoll(UID)==MI_OK) //防沖撞{ printf("Card Id is:");/* 獲取卡值 */printf("%d%d%d%d\r\n",UID[0],UID[1],UID[2],UID[3]); temp_value = ((UID[0]>>4)*10+(UID[0]&0x0f));switch(temp_value){case 63 : printf("管理員:%d 驗(yàn)證通過(guò)!\r\n",temp_value); break;default : printf("無(wú)效卡:%d 驗(yàn)證失敗!\r\n",temp_value); break;} }} }RC522.h
#ifndef __RC522_H #define __RC522_H #include "spi.h" #include "main.h" #include "usart.h"//------------------------------- RC522引腳定義 ------------------------------//#define RC522_SDA_HIGH HAL_GPIO_WritePin(GPIOB, RC522_SDA_Pin, GPIO_PIN_SET); #define RC522_SDA_LOW HAL_GPIO_WritePin(GPIOB, RC522_SDA_Pin, GPIO_PIN_RESET);#define RC522_RST_HIGH HAL_GPIO_WritePin(GPIOB, RC522_RST_Pin, GPIO_PIN_SET); #define RC522_RST_LOW HAL_GPIO_WritePin(GPIOB, RC522_RST_Pin, GPIO_PIN_RESET);#define MAXRLEN 18 #define MIN_STRENGTH 228 //******************************************************************/ // RC522 FIFO長(zhǎng)度定義 / //******************************************************************/ #define DEF_FIFO_LENGTH 64 //FIFO size=64byte//******************************************************************/ // RC522命令字 / //******************************************************************/ #define PCD_IDLE 0x00 //取消當(dāng)前命令 #define PCD_AUTHENT 0x0E //驗(yàn)證密鑰 #define PCD_RECEIVE 0x08 //接收數(shù)據(jù) #define PCD_TRANSMIT 0x04 //發(fā)送數(shù)據(jù) #define PCD_TRANSCEIVE 0x0C //發(fā)送并接收數(shù)據(jù) #define PCD_RESETPHASE 0x0F //復(fù)位 #define PCD_CALCCRC 0x03 //CRC計(jì)算//******************************************************************/ // Mifare_One卡片命令字 */ //******************************************************************/ #define PICC_REQIDL 0x26 //尋天線區(qū)內(nèi)未進(jìn)入休眠狀態(tài) #define PICC_REQALL 0x52 //尋天線區(qū)內(nèi)全部卡 #define PICC_ANTICOLL1 0x93 //防沖撞 #define PICC_ANTICOLL2 0x95 //防沖撞 #define PICC_AUTHENT1A 0x60 //驗(yàn)證A密鑰 #define PICC_AUTHENT1B 0x61 //驗(yàn)證B密鑰 #define PICC_READ 0x30 //讀塊 #define PICC_WRITE 0xA0 //寫塊 #define PICC_DECREMENT 0xC0 //扣款 #define PICC_INCREMENT 0xC1 //充值 #define PICC_RESTORE 0xC2 //調(diào)塊數(shù)據(jù)到緩沖區(qū) #define PICC_TRANSFER 0xB0 //保存緩沖區(qū)中數(shù)據(jù) #define PICC_HALT 0x50 //休眠//******************************************************************/ // MF522寄存器定義 / //******************************************************************/ // PAGE 0 #define RFU00 0x00 #define CommandReg 0x01 #define ComIEnReg 0x02 #define DivlEnReg 0x03 #define ComIrqReg 0x04 #define DivIrqReg 0x05 #define ErrorReg 0x06 #define Status1Reg 0x07 #define Status2Reg 0x08 #define FIFODataReg 0x09 #define FIFOLevelReg 0x0A #define WaterLevelReg 0x0B #define ControlReg 0x0C #define BitFramingReg 0x0D #define CollReg 0x0E #define RFU0F 0x0F // PAGE 1 #define RFU10 0x10 #define ModeReg 0x11 #define TxModeReg 0x12 #define RxModeReg 0x13 #define TxControlReg 0x14 #define TxASKReg 0x15 #define TxSelReg 0x16 #define RxSelReg 0x17 #define RxThresholdReg 0x18 #define DemodReg 0x19 #define RFU1A 0x1A #define RFU1B 0x1B #define MifareReg 0x1C #define RFU1D 0x1D #define RFU1E 0x1E #define SerialSpeedReg 0x1F // PAGE 2 #define RFU20 0x20 #define CRCResultRegM 0x21 #define CRCResultRegL 0x22 #define RFU23 0x23 #define ModWidthReg 0x24 #define RFU25 0x25 #define RFCfgReg 0x26 #define GsNReg 0x27 #define CWGsCfgReg 0x28 #define ModGsCfgReg 0x29 #define TModeReg 0x2A #define TPrescalerReg 0x2B #define TReloadRegH 0x2C #define TReloadRegL 0x2D #define TCounterValueRegH 0x2E #define TCounterValueRegL 0x2F // PAGE 3 #define RFU30 0x30 #define TestSel1Reg 0x31 #define TestSel2Reg 0x32 #define TestPinEnReg 0x33 #define TestPinValueReg 0x34 #define TestBusReg 0x35 #define AutoTestReg 0x36 #define VersionReg 0x37 #define AnalogTestReg 0x38 #define TestDAC1Reg 0x39 #define TestDAC2Reg 0x3A #define TestADCReg 0x3B #define RFU3C 0x3C #define RFU3D 0x3D #define RFU3E 0x3E #define RFU3F 0x3F//******************************************************************/ // RC522通訊返回錯(cuò)誤代碼 / //******************************************************************/ #define MI_ERR 0xFE //#define MI_ERR //(-2)// Mifare Error Codes // Each function returns a status value, which corresponds to the // mifare error codes. #define MI_OK 0 #define MI_CHK_OK 0 #define MI_CRC_ZERO 0 #define MI_CRC_NOTZERO 1 #define MI_NOTAGERR 0xFF #define MI_CHK_FAILED 0xFF #define MI_CRCERR 0xFE #define MI_CHK_COMPERR 0xFE #define MI_EMPTY 0xFD #define MI_AUTHERR 0xFC #define MI_PARITYERR 0xFB #define MI_CODEERR 0xFA #define MI_SERNRERR 0xF8 #define MI_KEYERR 0xF7 #define MI_NOTAUTHERR 0xF6 #define MI_BITCOUNTERR 0xF5 #define MI_BYTECOUNTERR 0xF4 #define MI_IDLE 0xF3 #define MI_TRANSERR 0xF2 #define MI_WRITEERR 0xF1 #define MI_INCRERR 0xF0 #define MI_DECRERR 0xEF #define MI_READERR 0xEE #define MI_OVFLERR 0xED #define MI_POLLING 0xEC #define MI_FRAMINGERR 0xEB #define MI_ACCESSERR 0xEA #define MI_UNKNOWN_COMMAND 0xE9 #define MI_COLLERR 0xE8 #define MI_RESETERR 0xE7 #define MI_INITERR 0xE7 #define MI_INTERFACEERR 0xE7 #define MI_ACCESSTIMEOUT 0xE5 #define MI_NOBITWISEANTICOLL 0xE4 #define MI_QUIT 0xE2 #define MI_RECBUF_OVERFLOW 0xCF #define MI_SENDBYTENR 0xCE #define MI_SENDBUF_OVERFLOW 0xCC #define MI_BAUDRATE_NOT_SUPPORTED 0xCB #define MI_SAME_BAUDRATE_REQUIRED 0xCA #define MI_WRONG_PARAMETER_VALUE 0xC5 #define MI_BREAK 0x9E #define MI_NY_IMPLEMENTED 0x9D #define MI_NO_MFRC 0x9C #define MI_MFRC_NOTAUTH 0x9B #define MI_WRONG_DES_MODE 0x9A #define MI_HOST_AUTH_FAILED 0x99 #define MI_WRONG_LOAD_MODE 0x97 #define MI_WRONG_DESKEY 0x96 #define MI_MKLOAD_FAILED 0x95 #define MI_FIFOERR 0x94 #define MI_WRONG_ADDR 0x93 #define MI_DESKEYLOAD_FAILED 0x92 #define MI_WRONG_SEL_CNT 0x8F #define MI_RC531_WRONG_READVALUE 0x8E //LI ADDED 09-4-24 #define MI_WRONG_TEST_MODE 0x8C #define MI_TEST_FAILED 0x8B #define MI_TOC_ERROR 0x8A #define MI_COMM_ABORT 0x89 #define MI_INVALID_BASE 0x88 #define MI_MFRC_RESET 0x87 #define MI_WRONG_VALUE 0x86 #define MI_VALERR 0x85//******************************************************************/ // 函數(shù)定義 / //******************************************************************/ void RC522_Init(void); char RC522_ReadWriteByte(uint8_t TxData); void delay_ns(uint32_t ns);char PcdHalt(void) ; char PcdReset(void) ; void PcdAntennaOn(void) ; void PcdAntennaOff(void) ; char PcdRequest(unsigned char req_code,unsigned char *pTagType) ;char PcdAnticoll(unsigned char *pSnr) ; char PcdSelect(unsigned char *pSnr) ; char PcdAuthState(unsigned char auth_mode,unsigned char addr,unsigned char *pKey,unsigned char *pSnr) ; char PcdRead(unsigned char addr,unsigned char *pData) ; char PcdWrite(unsigned char addr,unsigned char *pData) ; char PcdValue(unsigned char dd_mode,unsigned char addr,unsigned char *pValue); char PcdBakValue(unsigned char sourceaddr, unsigned char goaladdr) ; char MF522PcdConfigISOType(unsigned char type); char PcdComMF522(unsigned char Command, unsigned char *pInData, unsigned char InLenByte,unsigned char *pOutData, unsigned int *pOutLenBit ) ; void CalulateCRC(unsigned char *pIndata,unsigned char len,unsigned char *pOutData ) ; void WriteRawRC(unsigned char Address,unsigned char value) ; unsigned char ReadRawRC(unsigned char Address) ; void SetBitMask(unsigned char reg,unsigned char mask) ; void ClearBitMask(unsigned char reg,unsigned char mask) ; char Read_Block(unsigned char Block,unsigned char *Buf) ; char Write_Block(unsigned char Block) ; void PcdAntennaTestOn(void) ;extern char KK[8] ; // 數(shù)據(jù)加密密鑰 extern unsigned char RF_Buffer[18] ; // 射頻卡數(shù)據(jù)緩沖區(qū) extern unsigned char UID[5] ; extern unsigned char Password_Buffer[6] ; extern void Uart1_SendByte(uint32_t ch); // extern void Des_Encrypt(char* In, char* K,char* Out) ; // extern void Des_Decrypt(char* In, char* K,char* Out) ; extern unsigned char des_on ; // DES加密標(biāo)志void ReaderCard(void);#endif(5)usrat.c代碼添加
/* USER CODE BEGIN 0 */ #include "stdio.h" /* USER CODE END 0 *//* USER CODE BEGIN 1 */ /********************************************************* * *重定義 fputc 函數(shù) * *********************************************************/ int fputc(int ch,FILE *f) {HAL_UART_Transmit (&huart1 ,(uint8_t *)&ch,1,HAL_MAX_DELAY );return ch; } /* USER CODE END 1 */(6)main函數(shù)
int main(void) {/* USER CODE BEGIN 1 *//* USER CODE END 1 *//* MCU Configuration--------------------------------------------------------*//* Reset of all peripherals, Initializes the Flash interface and the Systick. */HAL_Init();/* USER CODE BEGIN Init *//* USER CODE END Init *//* Configure the system clock */SystemClock_Config();/* USER CODE BEGIN SysInit *//* USER CODE END SysInit *//* Initialize all configured peripherals */MX_GPIO_Init();MX_SPI2_Init();MX_USART1_UART_Init();/* USER CODE BEGIN 2 */RC522_Init();/* USER CODE END 2 *//* Infinite loop *//* USER CODE BEGIN WHILE */while (1){HAL_Delay(1000);ReaderCard();/* USER CODE END WHILE *//* USER CODE BEGIN 3 */}/* USER CODE END 3 */ }6.接線圖及效果
?本例程源碼下載:點(diǎn)擊跳轉(zhuǎn)?
下一篇:MFRC522模塊使用鏈表結(jié)構(gòu)存儲(chǔ)數(shù)據(jù)
總結(jié)
以上是生活随笔為你收集整理的STM32系列(HAL库)——F103C8T6通过MFRC522、RFID射频卡、门禁卡模块读取卡片ID的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: python 超级秒表
- 下一篇: 加速处理单元提高数据中心性能