简介:STM32F103C8T6驱动RC522-RFID模块源码介绍。

开发平台:KEIL ARM

MCU型号:STM32F103C8T6

传感器型号:RC522-RFID

特别提示:驱动内可能使用了某些其他组件,比如delay等,在文末外设模板下载地址内有。

1积分源码下载地址在文末!!!

接口图:

使用举例:

#include <stdio.h>
#include "SPI.h"
#include "RC522.h"int main()
{uint8_t cardID[4] = {0};SPIClass.SPI1_Init(); // SPI初始化MFRC522_Init(); // RC522初始化while(1) {if(!RC522_cardScan(cardID)) {printf("card scan success, id:0x%02X%02X%02X%02X\n", cardID[0], cardID[1], cardID[2], cardID[3]);} else {printf("card scan failure\n");}}
}

驱动源码:

SPI.c

#include "main.h"static void SPI1_Init(void);
static void SPI2_Init(void);
static uint8_t SPI_WriteRead(SPI_TypeDef* SPIx, uint8_t data, uint32_t timeout);
static void SPI_CS_WritePin(SPI_TypeDef* SPIx, BitAction bitVal);SPIClassStruct SPIClass = {.SPI1_Init = SPI1_Init,.SPI2_Init = SPI2_Init,.WriteRead = SPI_WriteRead,.WriteCSPin = SPI_CS_WritePin
};
// SPI1 CS
#define SPI1_CS_GPIO_PORT           GPIOB
#define SPI1_CS_GPIO_CLK            RCC_APB2Periph_GPIOB
#define SPI1_CS_GPIO_PIN            GPIO_Pin_0
// SPI2 CS
#define SPI2_CS_GPIO_PORT           GPIOA
#define SPI2_CS_GPIO_CLK            RCC_APB2Periph_GPIOA
#define SPI2_CS_GPIO_PIN            GPIO_Pin_0/*** @brief  SPI1初始化* @param  None* @retval None*/
static void SPI1_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;SPI_InitTypeDef  SPI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);// SPI1 SCK-PA5  MOSI-PA7GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);// SPI1 MISO-PA6GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA, &GPIO_InitStructure);// software CS user writeRCC_APB2PeriphClockCmd(SPI1_CS_GPIO_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin = SPI1_CS_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(SPI1_CS_GPIO_PORT, &GPIO_InitStructure);GPIO_WriteBit(SPI1_CS_GPIO_PORT, SPI1_CS_GPIO_PIN, Bit_SET); // 拉高片选引脚RCC_APB2PeriphClockCmd(RCC_APB2Periph_SPI1, ENABLE); // SPI1时钟使能SPI_Cmd(SPI1, DISABLE);SPI_I2S_DeInit(SPI1);SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // SPI设置为双线全双工SPI_InitStructure.SPI_Mode = SPI_Mode_Master; // 设置SPI为主模式SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // SPI发送接收8位帧结构SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; // SPI时钟空闲时为低电平SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; // 第一个时钟沿开始采样数据SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // CS信号由软件管理SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_16; // SPI波特率预分频值 72M / PrescalerSPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; // 数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial = 7; // CRC值计算的多项式SPI_Init(SPI1, &SPI_InitStructure); // 根据SPI_InitStruct中指定的参数初始化外设SPI寄存器SPI_Cmd(SPI1, ENABLE); // 使能SPI
}/*** @brief  SPI2初始化* @param  None* @retval None*/
static void SPI2_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;SPI_InitTypeDef  SPI_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);// SPI1 SCK-PB13  MOSI-PB15GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);// SPI1 MISO-PB14GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOB, &GPIO_InitStructure);// software CS user writeRCC_APB2PeriphClockCmd(SPI2_CS_GPIO_CLK, ENABLE);GPIO_InitStructure.GPIO_Pin = SPI2_CS_GPIO_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;GPIO_Init(SPI2_CS_GPIO_PORT, &GPIO_InitStructure);GPIO_WriteBit(SPI2_CS_GPIO_PORT, SPI2_CS_GPIO_PIN, Bit_SET); // 拉高片选引脚RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE); // SPI2时钟使能SPI_Cmd(SPI2, DISABLE);SPI_I2S_DeInit(SPI2);SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex; // SPI设置为双线全双工SPI_InitStructure.SPI_Mode = SPI_Mode_Master; // 设置SPI为主模式SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b; // SPI发送接收8位帧结构SPI_InitStructure.SPI_CPOL = SPI_CPOL_Low; // SPI时钟空闲时为低电平SPI_InitStructure.SPI_CPHA = SPI_CPHA_1Edge; // 第一个时钟沿开始采样数据SPI_InitStructure.SPI_NSS = SPI_NSS_Soft; // CS信号由软件管理SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_8; // SPI波特率预分频值 36M / PrescalerSPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB; // 数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial = 7; // CRC值计算的多项式SPI_Init(SPI2, &SPI_InitStructure); // 根据SPI_InitStruct中指定的参数初始化外设SPI寄存器SPI_Cmd(SPI2, ENABLE); // 使能SPI
}
/*** @brief  SPI读写函数* @param  None* @retval 0-超时 */
static uint8_t SPI_WriteRead(SPI_TypeDef* SPIx, uint8_t data, uint32_t timeout)
{uint32_t retry = 0;                   /* Loop while DR register in not emplty */while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_TXE) == RESET) // 发送缓存标志位为空{retry++;if(retry > timeout) return 0;}           SPI_I2S_SendData(SPIx, data); // 通过外设SPI2发送一个数据retry = 0;/* Wait to receive a byte */while (SPI_I2S_GetFlagStatus(SPIx, SPI_I2S_FLAG_RXNE) == RESET) // 接收缓存标志位不为空{retry++;if(retry > timeout) return 0;}                             /* Return the byte read from the SPI bus */return SPI_I2S_ReceiveData(SPIx); // 通过SPI2返回接收数据
}
/*** @brief  SPI读写函数* @param  None* @retval 0-成功*/
static void SPI_CS_WritePin(SPI_TypeDef* SPIx, BitAction bitVal)
{if(SPIx == SPI1) {GPIO_WriteBit(SPI1_CS_GPIO_PORT, SPI1_CS_GPIO_PIN, bitVal);} else if(SPIx == SPI2) {GPIO_WriteBit(SPI2_CS_GPIO_PORT, SPI2_CS_GPIO_PIN, bitVal);}
}

SPI.h

#ifndef __SPI_AS_H
#define __SPI_AS_H#include "main.h"typedef struct {void (* SPI1_Init)(void);void (* SPI2_Init)(void);uint8_t (* WriteRead)(SPI_TypeDef *, uint8_t, uint32_t);void (* WriteCSPin)(SPI_TypeDef *, BitAction);
} SPIClassStruct;extern SPIClassStruct SPIClass;#endif

RC522.c

// Mifare RC522 RFID Card reader 13.56 MHz// MFRC522     STM32F103       DESCRIPTION
// CS (SDA)     PB0             SPI1_NSS    Chip select for SPI
// SCK          PA5             SPI1_SCK    Serial Clock for SPI
// MOSI         PA7             SPI1_MOSI   Master In Slave Out for SPI
// MISO         PA6             SPI1_MISO   Master Out Slave In for SPI
// IRQ          -               Irq
// GND          GND             Ground
// RST          3.3V            Reset pin (3.3V)
// VCC          3.3V            3.3V power
#include "RC522.h"/******template******/
// 0-255数字转换为字符  0xFF--"FF"
void char_to_hex(uint8_t data, uint8_t *retStr) {uint8_t digits[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};if (data < 16) {retStr[0] = '0';retStr[1] = digits[data];} else {retStr[0] = digits[(data & 0xF0)>>4];retStr[1] = digits[(data & 0x0F)];}
}
/*** @brief  扫描RFID卡* @param  cardID 四字节数组* @retval 0扫描到RFID卡*/
uint8_t RC522_cardScan(uint8_t *cardID)
{if(!MFRC522_Request(PICC_REQIDL, cardID)) {if(!MFRC522_Anticoll(cardID)) {#ifdef DEBUG_printfuint8_t cardIDString[8] = {0};for(uint8_t i = 0; i < 4; i++) {char_to_hex(cardID[i], cardIDString+i*2);}printf("card id:%s\n", cardIDString);
#endifreturn 0;}}return 1;
}
/********************/void SPI1_WriteReg(uint8_t address, uint8_t value) {cs_reset();SPISendByte(address);SPISendByte(value);cs_set();
}uint8_t SPI1_ReadReg(uint8_t address) {uint8_t val;cs_reset();SPISendByte(address);val = SPISendByte(0x00);cs_set();return val;
}void MFRC522_WriteRegister(uint8_t addr, uint8_t val) {addr = (addr << 1) & 0x7E;                                                           // Address format: 0XXXXXX0SPI1_WriteReg(addr, val);
}uint8_t MFRC522_ReadRegister(uint8_t addr) {uint8_t val;addr = ((addr << 1) & 0x7E) | 0x80;val = SPI1_ReadReg(addr);return val;
}uint8_t MFRC522_Check(uint8_t* id) {uint8_t status;status = MFRC522_Request(PICC_REQIDL, id);                         // Find cards, return card typeif (status == MI_OK) status = MFRC522_Anticoll(id);           // Card detected. Anti-collision, return card serial number 4 bytesMFRC522_Halt();                                                                                  // Command card into hibernation return status;
}uint8_t MFRC522_Compare(uint8_t* CardID, uint8_t* CompareID) {uint8_t i;for (i = 0; i < 5; i++) {if (CardID[i] != CompareID[i]) return MI_ERR;}return MI_OK;
}void MFRC522_SetBitMask(uint8_t reg, uint8_t mask) {MFRC522_WriteRegister(reg, MFRC522_ReadRegister(reg) | mask);
}void MFRC522_ClearBitMask(uint8_t reg, uint8_t mask){MFRC522_WriteRegister(reg, MFRC522_ReadRegister(reg) & (~mask));
}uint8_t MFRC522_Request(uint8_t reqMode, uint8_t* TagType) {uint8_t status;  uint16_t backBits;                                                                            // The received data bitsMFRC522_WriteRegister(MFRC522_REG_BIT_FRAMING, 0x07);      // TxLastBists = BitFramingReg[2..0]TagType[0] = reqMode;status = MFRC522_ToCard(PCD_TRANSCEIVE, TagType, 1, TagType, &backBits);if ((status != MI_OK) || (backBits != 0x10)) status = MI_ERR;return status;
}uint8_t MFRC522_ToCard(uint8_t command, uint8_t* sendData, uint8_t sendLen, uint8_t* backData, uint16_t* backLen) {uint8_t status = MI_ERR;uint8_t irqEn = 0x00;uint8_t waitIRq = 0x00;uint8_t lastBits;uint8_t n;uint16_t i;switch (command) {case PCD_AUTHENT: {irqEn = 0x12;waitIRq = 0x10;break;}case PCD_TRANSCEIVE: {irqEn = 0x77;waitIRq = 0x30;break;}default:break;}MFRC522_WriteRegister(MFRC522_REG_COMM_IE_N, irqEn | 0x80);MFRC522_ClearBitMask(MFRC522_REG_COMM_IRQ, 0x80);MFRC522_SetBitMask(MFRC522_REG_FIFO_LEVEL, 0x80);MFRC522_WriteRegister(MFRC522_REG_COMMAND, PCD_IDLE);// Writing data to the FIFOfor (i = 0; i < sendLen; i++) MFRC522_WriteRegister(MFRC522_REG_FIFO_DATA, sendData[i]);// Execute the commandMFRC522_WriteRegister(MFRC522_REG_COMMAND, command);if (command == PCD_TRANSCEIVE) MFRC522_SetBitMask(MFRC522_REG_BIT_FRAMING, 0x80);       // StartSend=1,transmission of data starts // Waiting to receive data to completei = 2000;    // i according to the clock frequency adjustment, the operator M1 card maximum waiting time 25msdo {// CommIrqReg[7..0]// Set1 TxIRq RxIRq IdleIRq HiAlerIRq LoAlertIRq ErrIRq TimerIRqn = MFRC522_ReadRegister(MFRC522_REG_COMM_IRQ);i--;} while ((i!=0) && !(n&0x01) && !(n&waitIRq));MFRC522_ClearBitMask(MFRC522_REG_BIT_FRAMING, 0x80);                                                              // StartSend=0if (i != 0)  {if (!(MFRC522_ReadRegister(MFRC522_REG_ERROR) & 0x1B)) {status = MI_OK;if (n & irqEn & 0x01) status = MI_NOTAGERR;if (command == PCD_TRANSCEIVE) {n = MFRC522_ReadRegister(MFRC522_REG_FIFO_LEVEL);lastBits = MFRC522_ReadRegister(MFRC522_REG_CONTROL) & 0x07;if (lastBits) *backLen = (n-1)*8+lastBits; else *backLen = n*8;if (n == 0) n = 1;if (n > MFRC522_MAX_LEN) n = MFRC522_MAX_LEN;for (i = 0; i < n; i++) backData[i] = MFRC522_ReadRegister(MFRC522_REG_FIFO_DATA);        // Reading the received data in FIFO}} else status = MI_ERR;}return status;
}uint8_t MFRC522_Anticoll(uint8_t* serNum) {uint8_t status;uint8_t i;uint8_t serNumCheck = 0;uint16_t unLen;MFRC522_WriteRegister(MFRC522_REG_BIT_FRAMING, 0x00);                                              // TxLastBists = BitFramingReg[2..0]serNum[0] = PICC_ANTICOLL;serNum[1] = 0x20;status = MFRC522_ToCard(PCD_TRANSCEIVE, serNum, 2, serNum, &unLen);if (status == MI_OK) {// Check card serial numberfor (i = 0; i < 4; i++) serNumCheck ^= serNum[i];if (serNumCheck != serNum[i]) status = MI_ERR;}return status;
} void MFRC522_CalculateCRC(uint8_t*  pIndata, uint8_t len, uint8_t* pOutData) {uint8_t i, n;MFRC522_ClearBitMask(MFRC522_REG_DIV_IRQ, 0x04);                                                   // CRCIrq = 0MFRC522_SetBitMask(MFRC522_REG_FIFO_LEVEL, 0x80);                                                 // Clear the FIFO pointer// Write_MFRC522(CommandReg, PCD_IDLE);// Writing data to the FIFO for (i = 0; i < len; i++) MFRC522_WriteRegister(MFRC522_REG_FIFO_DATA, *(pIndata+i));MFRC522_WriteRegister(MFRC522_REG_COMMAND, PCD_CALCCRC);// Wait CRC calculation is completei = 0xFF;do {n = MFRC522_ReadRegister(MFRC522_REG_DIV_IRQ);i--;} while ((i!=0) && !(n&0x04));                                                                                     // CRCIrq = 1// Read CRC calculation resultpOutData[0] = MFRC522_ReadRegister(MFRC522_REG_CRC_RESULT_L);pOutData[1] = MFRC522_ReadRegister(MFRC522_REG_CRC_RESULT_M);
}uint8_t MFRC522_SelectTag(uint8_t* serNum) {uint8_t i;uint8_t status;uint8_t size;uint16_t recvBits;uint8_t buffer[9]; buffer[0] = PICC_SElECTTAG;buffer[1] = 0x70;for (i = 0; i < 5; i++) buffer[i+2] = *(serNum+i);MFRC522_CalculateCRC(buffer, 7, &buffer[7]);       //??status = MFRC522_ToCard(PCD_TRANSCEIVE, buffer, 9, buffer, &recvBits);if ((status == MI_OK) && (recvBits == 0x18)) size = buffer[0]; else size = 0;return size;
}uint8_t MFRC522_Auth(uint8_t authMode, uint8_t BlockAddr, uint8_t* Sectorkey, uint8_t* serNum) {uint8_t status;uint16_t recvBits;uint8_t i;uint8_t buff[12]; // Verify the command block address + sector + password + card serial numberbuff[0] = authMode;buff[1] = BlockAddr;for (i = 0; i < 6; i++) buff[i+2] = *(Sectorkey+i);for (i=0; i<4; i++) buff[i+8] = *(serNum+i);status = MFRC522_ToCard(PCD_AUTHENT, buff, 12, buff, &recvBits);if ((status != MI_OK) || (!(MFRC522_ReadRegister(MFRC522_REG_STATUS2) & 0x08))) status = MI_ERR;return status;
}uint8_t MFRC522_Read(uint8_t blockAddr, uint8_t* recvData) {uint8_t status;uint16_t unLen;recvData[0] = PICC_READ;recvData[1] = blockAddr;MFRC522_CalculateCRC(recvData,2, &recvData[2]);status = MFRC522_ToCard(PCD_TRANSCEIVE, recvData, 4, recvData, &unLen);if ((status != MI_OK) || (unLen != 0x90)) status = MI_ERR;return status;
}uint8_t MFRC522_Write(uint8_t blockAddr, uint8_t* writeData) {uint8_t status;uint16_t recvBits;uint8_t i;uint8_t buff[18]; buff[0] = PICC_WRITE;buff[1] = blockAddr;MFRC522_CalculateCRC(buff, 2, &buff[2]);status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff, &recvBits);if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A)) status = MI_ERR;if (status == MI_OK) {// Data to the FIFO write 16Bytefor (i = 0; i < 16; i++) buff[i] = *(writeData+i);MFRC522_CalculateCRC(buff, 16, &buff[16]);status = MFRC522_ToCard(PCD_TRANSCEIVE, buff, 18, buff, &recvBits);if ((status != MI_OK) || (recvBits != 4) || ((buff[0] & 0x0F) != 0x0A)) status = MI_ERR;}return status;
}void MFRC522_Init(void) {MFRC522_Reset();MFRC522_WriteRegister(MFRC522_REG_T_MODE, 0x8D);MFRC522_WriteRegister(MFRC522_REG_T_PRESCALER, 0x3E);MFRC522_WriteRegister(MFRC522_REG_T_RELOAD_L, 30);           MFRC522_WriteRegister(MFRC522_REG_T_RELOAD_H, 0);MFRC522_WriteRegister(MFRC522_REG_RF_CFG, 0x70);               // 48dB gain    MFRC522_WriteRegister(MFRC522_REG_TX_AUTO, 0x40);MFRC522_WriteRegister(MFRC522_REG_MODE, 0x3D);MFRC522_AntennaOn();                                                                     // Open the antenna
}void MFRC522_Reset(void) {MFRC522_WriteRegister(MFRC522_REG_COMMAND, PCD_RESETPHASE);
}void MFRC522_AntennaOn(void) {uint8_t temp;temp = MFRC522_ReadRegister(MFRC522_REG_TX_CONTROL);if (!(temp & 0x03)) MFRC522_SetBitMask(MFRC522_REG_TX_CONTROL, 0x03);
}void MFRC522_AntennaOff(void) {MFRC522_ClearBitMask(MFRC522_REG_TX_CONTROL, 0x03);
}void MFRC522_Halt(void) {uint16_t unLen;uint8_t buff[4]; buff[0] = PICC_HALT;buff[1] = 0;MFRC522_CalculateCRC(buff, 2, &buff[2]);MFRC522_ToCard(PCD_TRANSCEIVE, buff, 4, buff, &unLen);
}

RC522.h

#ifndef __RC522_H
#define __RC522_H#include "main.h"// RC522 use SPIx define
#define RC522_SPI                   SPI1
// SPI write read define
#define SPISendByte(data)           SPIClass.WriteRead(RC522_SPI, data, 1000)
// SPI CS define
#define cs_reset()                  SPIClass.WriteCSPin(RC522_SPI, Bit_RESET)
#define cs_set()                    SPIClass.WriteCSPin(RC522_SPI, Bit_SET)// Status enumeration, Used with most functions
#define MI_OK                                           0
#define MI_NOTAGERR                                     1
#define MI_ERR                                          2// MFRC522 Commands
#define PCD_IDLE                                        0x00    // NO action; Cancel the current command
#define PCD_AUTHENT                                     0x0E    // Authentication Key
#define PCD_RECEIVE                                     0x08    // Receive Data
#define PCD_TRANSMIT                                    0x04    // Transmit data
#define PCD_TRANSCEIVE                                  0x0C    // Transmit and receive data,
#define PCD_RESETPHASE                                  0x0F    // Reset
#define PCD_CALCCRC                                     0x03    // CRC Calculate// Mifare_One card command word
#define PICC_REQIDL                                     0x26    // find the antenna area does not enter hibernation
#define PICC_REQALL                                     0x52    // find all the cards antenna area
#define PICC_ANTICOLL                                   0x93    // anti-collision
#define PICC_SElECTTAG                                  0x93    // election card
#define PICC_AUTHENT1A                                  0x60    // authentication key A
#define PICC_AUTHENT1B                                  0x61    // authentication key B
#define PICC_READ                                       0x30    // Read Block
#define PICC_WRITE                                      0xA0    // write block
#define PICC_DECREMENT                                  0xC0    // debit
#define PICC_INCREMENT                                  0xC1    // recharge
#define PICC_RESTORE                                    0xC2    // transfer block data to the buffer
#define PICC_TRANSFER                                   0xB0    // save the data in the buffer
#define PICC_HALT                                       0x50    // Sleep// MFRC522 Registers
// Page 0: Command and Status
#define MFRC522_REG_RESERVED00                  0x00
#define MFRC522_REG_COMMAND                     0x01
#define MFRC522_REG_COMM_IE_N                   0x02
#define MFRC522_REG_DIV1_EN                     0x03
#define MFRC522_REG_COMM_IRQ                    0x04
#define MFRC522_REG_DIV_IRQ                     0x05
#define MFRC522_REG_ERROR                       0x06
#define MFRC522_REG_STATUS1                     0x07
#define MFRC522_REG_STATUS2                     0x08
#define MFRC522_REG_FIFO_DATA                   0x09
#define MFRC522_REG_FIFO_LEVEL                  0x0A
#define MFRC522_REG_WATER_LEVEL                 0x0B
#define MFRC522_REG_CONTROL                     0x0C
#define MFRC522_REG_BIT_FRAMING                 0x0D
#define MFRC522_REG_COLL                        0x0E
#define MFRC522_REG_RESERVED01                  0x0F
// Page 1: Command
#define MFRC522_REG_RESERVED10                  0x10
#define MFRC522_REG_MODE                        0x11
#define MFRC522_REG_TX_MODE                     0x12
#define MFRC522_REG_RX_MODE                     0x13
#define MFRC522_REG_TX_CONTROL                  0x14
#define MFRC522_REG_TX_AUTO                     0x15
#define MFRC522_REG_TX_SELL                     0x16
#define MFRC522_REG_RX_SELL                     0x17
#define MFRC522_REG_RX_THRESHOLD                0x18
#define MFRC522_REG_DEMOD                       0x19
#define MFRC522_REG_RESERVED11                  0x1A
#define MFRC522_REG_RESERVED12                  0x1B
#define MFRC522_REG_MIFARE                      0x1C
#define MFRC522_REG_RESERVED13                  0x1D
#define MFRC522_REG_RESERVED14                  0x1E
#define MFRC522_REG_SERIALSPEED                 0x1F
// Page 2: CFG
#define MFRC522_REG_RESERVED20                  0x20
#define MFRC522_REG_CRC_RESULT_M                0x21
#define MFRC522_REG_CRC_RESULT_L                0x22
#define MFRC522_REG_RESERVED21                  0x23
#define MFRC522_REG_MOD_WIDTH                   0x24
#define MFRC522_REG_RESERVED22                  0x25
#define MFRC522_REG_RF_CFG                      0x26
#define MFRC522_REG_GS_N                        0x27
#define MFRC522_REG_CWGS_PREG                   0x28
#define MFRC522_REG__MODGS_PREG                 0x29
#define MFRC522_REG_T_MODE                      0x2A
#define MFRC522_REG_T_PRESCALER                 0x2B
#define MFRC522_REG_T_RELOAD_H                  0x2C
#define MFRC522_REG_T_RELOAD_L                  0x2D
#define MFRC522_REG_T_COUNTER_VALUE_H           0x2E
#define MFRC522_REG_T_COUNTER_VALUE_L           0x2F
// Page 3:TestRegister
#define MFRC522_REG_RESERVED30                  0x30
#define MFRC522_REG_TEST_SEL1                   0x31
#define MFRC522_REG_TEST_SEL2                   0x32
#define MFRC522_REG_TEST_PIN_EN                 0x33
#define MFRC522_REG_TEST_PIN_VALUE              0x34
#define MFRC522_REG_TEST_BUS                    0x35
#define MFRC522_REG_AUTO_TEST                   0x36
#define MFRC522_REG_VERSION                     0x37
#define MFRC522_REG_ANALOG_TEST                 0x38
#define MFRC522_REG_TEST_ADC1                   0x39
#define MFRC522_REG_TEST_ADC2                   0x3A
#define MFRC522_REG_TEST_ADC0                   0x3B
#define MFRC522_REG_RESERVED31                  0x3C
#define MFRC522_REG_RESERVED32                  0x3D
#define MFRC522_REG_RESERVED33                  0x3E
#define MFRC522_REG_RESERVED34                  0x3F#define MFRC522_DUMMY                           0x00        // Dummy byte
#define MFRC522_MAX_LEN                         16          // Buf len byte// RC522
uint8_t MFRC522_Check(uint8_t* id);
uint8_t MFRC522_Compare(uint8_t* CardID, uint8_t* CompareID);
void MFRC522_WriteRegister(uint8_t addr, uint8_t val);
uint8_t MFRC522_ReadRegister(uint8_t addr);
void MFRC522_SetBitMask(uint8_t reg, uint8_t mask);
void MFRC522_ClearBitMask(uint8_t reg, uint8_t mask);
uint8_t MFRC522_Request(uint8_t reqMode, uint8_t* TagType);
uint8_t MFRC522_ToCard(uint8_t command, uint8_t* sendData, uint8_t sendLen, uint8_t* backData, uint16_t* backLen);
uint8_t MFRC522_Anticoll(uint8_t* serNum);
void MFRC522_CalulateCRC(uint8_t* pIndata, uint8_t len, uint8_t* pOutData);
uint8_t MFRC522_SelectTag(uint8_t* serNum);
uint8_t MFRC522_Auth(uint8_t authMode, uint8_t BlockAddr, uint8_t* Sectorkey, uint8_t* serNum);
uint8_t MFRC522_Read(uint8_t blockAddr, uint8_t* recvData);
uint8_t MFRC522_Write(uint8_t blockAddr, uint8_t* writeData);
void MFRC522_Init(void);
void MFRC522_Reset(void);
void MFRC522_AntennaOn(void);
void MFRC522_AntennaOff(void);
void MFRC522_Halt(void);// user template
uint8_t RC522_cardScan(uint8_t *cardID);#endif

驱动下载地址:

https://download.csdn.net/download/m0_50669075/87672906

STM32工程模板、外设模板、模块模板下载地址:

stm32_template: STM32F103工程模板,外设模板,模块模板。模块模板包括:DHT11温湿度传感器,OLED屏幕,DS18B20温度传感器,DS1302时钟模块,红外测温模块,RFID模块,SIM900A短信模块,OneNET入网,ADXL345三轴传感器,离线语音识别模块,语音播报模块,甲醛传感器,PM2.5模块,SG90舵机,健康检测模块,消息队列示例,链表示例,分时调度系统示例等。

STM32驱动RC522-RFID模块相关推荐

  1. 基础篇010.2 STM32驱动RC522 RFID模块之二:STM32硬件SPI驱动RC522

    目录 1. 实验硬件及原理图 1.1 RFID硬件 1.2 硬件原理图 2. 单片机与RFID硬件模块分析 3. 利用STM32CubeMX创建MDK工程 3.1 STM32CubeMX工程创建 3. ...

  2. stm32读取目标芯片_使用stm32驱动RC522读IC卡(代码留言邮箱)

    RC522与PN532简介 关于STM32驱动方式 接线说明 程序烧录 查看卡号 总结 RC522与PN532简介 在写这篇文章之前有写过一篇有关于PN532的文章,RC522与PN532在使用上都可 ...

  3. STM32驱动W5100S网口模块实现UDP通讯

    本文博客链接:https://blog.csdn.net/zsj2016o/article/details/88883863 作者:zsj ,转载请注明. STM32驱动W5100S网口模块实现UDP ...

  4. STM32 驱动 ESP8266 WIFI 模块

    目录 1. 模块引脚 2. 测试模块是否正常 3. AT指令 ​4. ESP8266三种工作模式 5. 配置WIFI模块 6. STM32驱动WIFI模块 拿到一个野火的esp8266模块,驱一下试试 ...

  5. STM32驱动HC-SR04超声波模块

    STM32学习笔记--HC-SR04超声波测距模块 碰巧学校老师要求做个HC-SR04超声波的实验,笔者在完成实验报告的同时,也顺带完成一篇STM32驱动超声波模块记录. HC-SR04模块使用 ST ...

  6. STM32驱动RC522读卡完整资料分享,包含原理图、PCB、驱动工程文件

    一.原理图 二.PCB 三.驱动程序 main.c #include "delay.h" #include "sys.h" #include "rc5 ...

  7. stm32驱动Lora串口模块

    本文使用的硬件 stm32MCU+亿佰特-Lora串口模块,型号E32-433T20D 定义各配置字节 /*配置报文头部选项*/ #define HEAD_Save 0xC0//配置后掉电保存 #de ...

  8. STM32—驱动BT-06蓝牙模块传输数据

    文章目录 BT-06简介 数据透传 配置串口 USART1初始化函数 USART2初始化函数 USART2的NVIC配置 USART1串口重映射 BT-06简介 BT06蓝牙模块是专为智能无线数据传输 ...

  9. STM32驱动TEA5767收音机模块

    Tea5767是飞利浦公司出的一款集成化的收音机芯片,大四的时候机缘巧合遇到了这个芯片,用了一下,写点资料 主要特性 TEA5767HN是一款低功耗立体声收音IC,广泛应用于手机MP3 .MP 4 播 ...

  10. stm32驱动GT-U7 GPS

    文章目录 STM32驱动GT-U7 GPS模块 一些参数 用户手册 过程 问题 代码 STM32驱动GT-U7 GPS模块 淘宝链接:GT-U7 GPS 一些参数 可到淘宝链接上查看.(因为放的是图片 ...

最新文章

  1. 洛谷乐多赛 yyy loves Maths VI (mode)
  2. linux系统编程练手项目,精选 22 个 C++ 项目,编程小白练手首选!
  3. 基于matlab的fisher线性判别及感知器判别_基于嵌入表示的网络实体对齐方法进展概述...
  4. 开源人员任务分配_开源财富分配是否公平?
  5. 酷狗音乐、艺龙旅行等42款APP被曝违规收集用户信息
  6. git clone的速度慢到难以忍受问题的解决方法~
  7. Python+matplotlib数据可视化鼠标悬停自动标注功能实现
  8. 5.5.35 - mysql 同步_MySQL 5.6.35主从同步配置案例
  9. echarts多次使用SetOption时的数据问题
  10. struts的action访问servlet的IOC方式与非IOC方式
  11. 硅谷python_来自硅谷的Python最佳实践指南 | 极客时间
  12. 【生物信息】 系统发育树-有根树 转化 无根树-基于R语言
  13. response.setHeader()的用法详解及实现文件下载过程中出现问题的分析
  14. 粗虚线和细虚线_车道划分线上下两侧有粗虚线
  15. 微信小程序 - 解决 rich-text 富文本解析图片无法自适应宽高问题(图片超出屏幕宽度且不受控)
  16. 宜家IKEA EDI IFTMBF运输预定请求详解
  17. 【zotero】从知网万方维普WOS等数据库上导出格式引文-引文格式到zotero中
  18. java项目-第136期ssm超市收银管理系统-java毕业设计
  19. 搜索迅雷快传资源的方法~
  20. 视觉激光雷达信息融合与联合标定

热门文章

  1. 学个锤子 | .Net零基础逆向教程 第三课(壳与作业)
  2. threaded interrupt handler support
  3. openssl ca(签署和自建CA)
  4. 自动识别地址省市区、手机号、姓名,淘宝的地址自动识别
  5. 数据安全治理体系与技术研究
  6. python中使用qrcode库生成二维码时,填充logo变成黑白色的解决方法。
  7. Python 简易版图书管理系统
  8. Generative Adversarial Nets
  9. 成都大数据技术学习:饿了么元数据管理实践之路
  10. 简单介绍Unicode和utf编码