1、CubeMX 定义任意两个引脚,作为复位脚和片选脚,并对引脚作出如下配置:
GPlO output level --High
GPIO mode --Output Open Drain
GPIO Pull-up/Pull-down --No pull-up and no pull-down
Maximum output speed --LOW
User label --RC522_RST/RC522_CS

开启SPI功能,模式选择–>Full-Duplex Master(全双工),其他配置如下:
Basic Parameters
  Frame format-->Motorola
  Data size -->8 Bits
  First bit -->MSB First
Clock Parameters
Prescaler(for Baud Rate)-->32
Baud rate -->1.125MBits/s
Clock Polarity(CPOL) -->LOW
Clock Phase(CPHA) -->1 Edge
Advanced Parameters
CRC Calculation -->Disabled
NSS Signal Type -->Software

2、接线方式:
SPI_MISO(MUC)--> MISO(器件)
SPI_MOSI(MUC)--> MOSI(器件)
其他引脚一一对应

3、应用函数
MFRC_Init();//初始化
PCD_Reset();//器件复位
PCD_Request(PICC_REQALL, RxBuffer);//返回值为0,代表寻卡成功;并把卡类型存入RxBuffer中
PCD_Anticoll(RxBuffer); //把(十六进制)的4个字节卡号存储在数组RxBuffer中

4、完整例子在本代码尾部

/*************笔记****************
***********************************/#include "cmsis_os.h"
#include "stm32f1xx_hal.h"
#include "rc522.h"
extern SPI_HandleTypeDef hspi1;#define RS522_RST(N) HAL_GPIO_WritePin(RC522_RST_GPIO_Port, RC522_RST_Pin, N==1?GPIO_PIN_SET:GPIO_PIN_RESET)
#define RS522_NSS(N) HAL_GPIO_WritePin(RC522_CS_GPIO_Port, RC522_CS_Pin, N==1?GPIO_PIN_SET:GPIO_PIN_RESET)/**************************************************************************************
* 函数名称:MFRC_Init
* 功能描述:MFRC初始化
* 说    明:MFRC的SPI接口速率为0~10Mbps
***************************************************************************************/
void MFRC_Init(void)
{RS522_NSS(1);RS522_RST(1);
}/**************************************************************************************
* 函数名称: SPI_RW_Byte
* 功能描述: 模拟SPI读写一个字节
* 入口参数: -byte:要发送的数据
* 出口参数: -byte:接收到的数据
***************************************************************************************/
static uint8_t ret;
uint8_t SPI2_RW_Byte(uint8_t byte)
{HAL_SPI_TransmitReceive(&hspi1, &byte, &ret, 1, 10);return   ret;
}/**************************************************************************************
* 函数名称:MFRC_WriteReg
* 功能描述:写一个寄存器
* 入口参数:-addr:待写的寄存器地址
*           -data:待写的寄存器数据
***************************************************************************************/
void MFRC_WriteReg(uint8_t addr, uint8_t data)
{uint8_t AddrByte;AddrByte = (addr << 1 ) & 0x7E; //求出地址字节RS522_NSS(0);                   //NSS拉低SPI2_RW_Byte(AddrByte);         //写地址字节SPI2_RW_Byte(data);             //写数据RS522_NSS(1);                   //NSS拉高
}/**************************************************************************************
* 函数名称:MFRC_ReadReg
* 功能描述:读一个寄存器
* 入口参数:-addr:待读的寄存器地址
* 出口参数:无
* 返 回 值:-data:读到寄存器的数据
* 说    明:无
***************************************************************************************/
uint8_t MFRC_ReadReg(uint8_t addr)
{uint8_t AddrByte, data;AddrByte = ((addr << 1 ) & 0x7E ) | 0x80;   //求出地址字节RS522_NSS(0);                               //NSS拉低SPI2_RW_Byte(AddrByte);                     //写地址字节data = SPI2_RW_Byte(0x00);                  //读数据RS522_NSS(1);                               //NSS拉高return data;
}/**************************************************************************************
* 函数名称:MFRC_SetBitMask
* 功能描述:设置寄存器的位
* 入口参数:-addr:待设置的寄存器地址
*           -mask:待设置寄存器的位(可同时设置多个bit)
***************************************************************************************/
void MFRC_SetBitMask(uint8_t addr, uint8_t mask)
{uint8_t temp;temp = MFRC_ReadReg(addr);                  //先读回寄存器的值MFRC_WriteReg(addr, temp | mask);           //处理过的数据再写入寄存器
}/**************************************************************************************
* 函数名称:MFRC_ClrBitMask
* 功能描述:清除寄存器的位
* 入口参数:-addr:待清除的寄存器地址
*           -mask:待清除寄存器的位(可同时清除多个bit)
***************************************************************************************/
void MFRC_ClrBitMask(uint8_t addr, uint8_t mask)
{uint8_t temp;temp = MFRC_ReadReg(addr);                  //先读回寄存器的值MFRC_WriteReg(addr, temp & ~mask);          //处理过的数据再写入寄存器
}/**************************************************************************************
* 函数名称:MFRC_CalulateCRC
* 功能描述:用MFRC计算CRC结果
* 入口参数:-pInData:带进行CRC计算的数据
*           -len:带进行CRC计算的数据长度
*           -pOutData:CRC计算结果
* 出口参数:-pOutData:CRC计算结果
***************************************************************************************/
void MFRC_CalulateCRC(uint8_t *pInData, uint8_t len, uint8_t *pOutData)
{//0xc1 1        2           pInData[2]uint8_t temp;u32 i;MFRC_ClrBitMask(MFRC_DivIrqReg, 0x04);                  //使能CRC中断MFRC_WriteReg(MFRC_CommandReg, MFRC_IDLE);              //取消当前命令的执行MFRC_SetBitMask(MFRC_FIFOLevelReg, 0x80);               //清除FIFO及其标志位for(i = 0; i < len; i++)                                //将待CRC计算的数据写入FIFO{MFRC_WriteReg(MFRC_FIFODataReg, *(pInData + i));}MFRC_WriteReg(MFRC_CommandReg, MFRC_CALCCRC);           //执行CRC计算i = 100000;do{temp = MFRC_ReadReg(MFRC_DivIrqReg);                //读取DivIrqReg寄存器的值i--;}while((i != 0) && !(temp & 0x04));                      //等待CRC计算完成pOutData[0] = MFRC_ReadReg(MFRC_CRCResultRegL);         //读取CRC计算结果pOutData[1] = MFRC_ReadReg(MFRC_CRCResultRegM);
}/**************************************************************************************
* 函数名称:MFRC_CmdFrame
* 功能描述:MFRC522和ISO14443A卡通讯的命令帧函数
* 入口参数:-cmd:MFRC522命令字
*           -pIndata:MFRC522发送给MF1卡的数据的缓冲区首地址
*           -InLenByte:发送数据的字节长度
*           -pOutdata:用于接收MF1卡片返回数据的缓冲区首地址
*           -pOutLenBit:MF1卡返回数据的位长度
* 出口参数:-pOutdata:用于接收MF1卡片返回数据的缓冲区首地址
*           -pOutLenBit:用于MF1卡返回数据位长度的首地址
* 返 回 值:-status:错误代码(MFRC_OK、MFRC_NOTAGERR、MFRC_ERR)
* 说    明:无
***************************************************************************************/
char MFRC_CmdFrame(uint8_t cmd, uint8_t *pInData, uint8_t InLenByte, uint8_t *pOutData, uint16_t *pOutLenBit)
{uint8_t lastBits;uint8_t n;u32 i;char status = MFRC_ERR;uint8_t irqEn   = 0x00;uint8_t waitFor = 0x00;/*根据命令设置标志位*/switch(cmd){case MFRC_AUTHENT:                  //Mifare认证irqEn = 0x12;waitFor = 0x10;                 //idleIRq中断标志break;case MFRC_TRANSCEIVE:               //发送并接收数据irqEn = 0x77;waitFor = 0x30;                 //RxIRq和idleIRq中断标志break;}/*发送命令帧前准备*/MFRC_WriteReg(MFRC_ComIEnReg, irqEn | 0x80);    //开中断MFRC_ClrBitMask(MFRC_ComIrqReg, 0x80);          //清除中断标志位SET1MFRC_WriteReg(MFRC_CommandReg, MFRC_IDLE);      //取消当前命令的执行MFRC_SetBitMask(MFRC_FIFOLevelReg, 0x80);       //清除FIFO缓冲区及其标志位/*发送命令帧*/for(i = 0; i < InLenByte; i++)                  //写入命令参数{MFRC_WriteReg(MFRC_FIFODataReg, pInData[i]);}MFRC_WriteReg(MFRC_CommandReg, cmd);            //执行命令if(cmd == MFRC_TRANSCEIVE){MFRC_SetBitMask(MFRC_BitFramingReg, 0x80);  //启动发送}i = 300000;                                     //根据时钟频率调整,操作M1卡最大等待时间25msdo{n = MFRC_ReadReg(MFRC_ComIrqReg);i--;}while((i != 0) && !(n & 0x01) && !(n & waitFor));     //等待命令完成MFRC_ClrBitMask(MFRC_BitFramingReg, 0x80);          //停止发送/*处理接收的数据*/if(i != 0){if(!(MFRC_ReadReg(MFRC_ErrorReg) & 0x1B)){status = MFRC_OK;if(n & irqEn & 0x01){status = MFRC_NOTAGERR;}if(cmd == MFRC_TRANSCEIVE){n = MFRC_ReadReg(MFRC_FIFOLevelReg);lastBits = MFRC_ReadReg(MFRC_ControlReg) & 0x07;if (lastBits){*pOutLenBit = (n - 1) * 8 + lastBits;}else{*pOutLenBit = n * 8;}if(n == 0){n = 1;}if(n > MFRC_MAXRLEN){n = MFRC_MAXRLEN;}for(i = 0; i < n; i++){pOutData[i] = MFRC_ReadReg(MFRC_FIFODataReg);}}}else{status = MFRC_ERR;}}MFRC_SetBitMask(MFRC_ControlReg, 0x80);               //停止定时器运行MFRC_WriteReg(MFRC_CommandReg, MFRC_IDLE);            //取消当前命令的执行return status;
}/**************************************************************************************
* 函数名称:PCD_Reset
* 功能描述:PCD复位
***************************************************************************************/
void PCD_Reset(void)
{/*硬复位*/RS522_RST(1);osDelay(2);RS522_RST(0);osDelay(2);RS522_RST(1);osDelay(2);/*软复位*/MFRC_WriteReg(MFRC_CommandReg, MFRC_RESETPHASE);osDelay(2);/*复位后的初始化配置*/MFRC_WriteReg(MFRC_ModeReg, 0x3D);              //CRC初始值0x6363MFRC_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%ASKPCD_AntennaOff();                               //关天线osDelay(2);PCD_AntennaOn();                                //开天线
}/**************************************************************************************
* 函数名称:PCD_AntennaOn
* 功能描述:开启天线,使能PCD发送能量载波信号
* 说    明:每次开启或关闭天线之间应至少有1ms的间隔
***************************************************************************************/
void PCD_AntennaOn(void)
{uint8_t temp;temp = MFRC_ReadReg(MFRC_TxControlReg);if (!(temp & 0x03)){MFRC_SetBitMask(MFRC_TxControlReg, 0x03);}
}/**************************************************************************************
* 函数名称:PCD_AntennaOff
* 功能描述:关闭天线,失能PCD发送能量载波信号
* 说    明:每次开启或关闭天线之间应至少有1ms的间隔
***************************************************************************************/
void PCD_AntennaOff(void)
{MFRC_ClrBitMask(MFRC_TxControlReg, 0x03);
}/***************************************************************************************
* 函数名称:PCD_Init
* 功能描述:读写器初始化
***************************************************************************************/
void PCD_Init(void)
{MFRC_Init();      //MFRC管脚配置PCD_Reset();      //PCD复位  并初始化配置PCD_AntennaOff(); //关闭天线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.56MHZCmdFrameBuf[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;
}/***************************************************************************************
* 函数名称: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;
}/***************************************************************************************
* 函数名称:PCD_Select
* 功能描述:选卡
* 入口参数:-pSnr:卡片序列号,4字节
* 出口参数:无
* 返 回 值:-status:错误代码(PCD_OK、PCD_NOTAGERR、PCD_ERR)
* 说    明:无
***************************************************************************************/
char PCD_Select(uint8_t *pSnr)
{char status;uint8_t i;uint16_t unLen;uint8_t CmdFrameBuf[MFRC_MAXRLEN];CmdFrameBuf[0] = PICC_ANTICOLL1;CmdFrameBuf[1] = 0x70;CmdFrameBuf[6] = 0;for(i = 0; i < 4; i++){CmdFrameBuf[i + 2] = *(pSnr + i);CmdFrameBuf[6]  ^= *(pSnr + i);}MFRC_CalulateCRC(CmdFrameBuf, 7, &CmdFrameBuf[7]);MFRC_ClrBitMask(MFRC_Status2Reg, 0x08);status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 9, CmdFrameBuf, &unLen);if((status == PCD_OK) && (unLen == 0x18)){status = PCD_OK;}else{status = PCD_ERR;}return status;
}/***************************************************************************************
* 函数名称:PCD_AuthState
* 功能描述:验证卡片密码
* 入口参数:-AuthMode:验证模式
*                   PICC_AUTHENT1A:验证A密码
*                   PICC_AUTHENT1B:验证B密码
*           -BlockAddr:块地址(0~63)
*           -pKey:密码
*           -pSnr:卡片序列号,4字节
* 出口参数:无
* 返 回 值:-status:错误代码(PCD_OK、PCD_NOTAGERR、PCD_ERR)
* 说    明:验证密码时,以扇区为单位,BlockAddr参数可以是同一个扇区的任意块
***************************************************************************************/
char PCD_AuthState(uint8_t AuthMode, uint8_t BlockAddr, uint8_t *pKey, uint8_t *pSnr)
{char status;uint16_t unLen;uint8_t i, CmdFrameBuf[MFRC_MAXRLEN];CmdFrameBuf[0] = AuthMode;CmdFrameBuf[1] = BlockAddr;for(i = 0; i < 6; i++){CmdFrameBuf[i + 2] = *(pKey + i);}for(i = 0; i < 4; i++){CmdFrameBuf[i + 8] = *(pSnr + i);}status = MFRC_CmdFrame(MFRC_AUTHENT, CmdFrameBuf, 12, CmdFrameBuf, &unLen);if((status != PCD_OK) || (!(MFRC_ReadReg(MFRC_Status2Reg) & 0x08))){status = PCD_ERR;}return status;
}/***************************************************************************************
* 函数名称:PCD_WriteBlock
* 功能描述:读MF1卡数据块
* 入口参数:-BlockAddr:块地址
*           -pData: 用于保存待写入的数据,16字节
* 出口参数:无
* 返 回 值:-status:错误代码(PCD_OK、PCD_NOTAGERR、PCD_ERR)
* 说    明:无
***************************************************************************************/
char PCD_WriteBlock(uint8_t BlockAddr, uint8_t *pData)
{char status;uint16_t unLen;uint8_t i, CmdFrameBuf[MFRC_MAXRLEN];CmdFrameBuf[0] = PICC_WRITE;CmdFrameBuf[1] = BlockAddr;MFRC_CalulateCRC(CmdFrameBuf, 2, &CmdFrameBuf[2]);status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 4, CmdFrameBuf, &unLen);if((status != PCD_OK) || (unLen != 4) || ((CmdFrameBuf[0] & 0x0F) != 0x0A)){status = PCD_ERR;}if(status == PCD_OK){for(i = 0; i < 16; i++){CmdFrameBuf[i] = *(pData + i);}MFRC_CalulateCRC(CmdFrameBuf, 16, &CmdFrameBuf[16]);status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 18, CmdFrameBuf, &unLen);if((status != PCD_OK) || (unLen != 4) || ((CmdFrameBuf[0] & 0x0F) != 0x0A)){status = PCD_ERR;}}return status;
}/***************************************************************************************
* 函数名称:PCD_ReadBlock
* 功能描述:读MF1卡数据块
* 入口参数:-BlockAddr:块地址
*           -pData: 用于保存读出的数据,16字节
* 出口参数:-pData: 用于保存读出的数据,16字节
* 返 回 值:-status:错误代码(PCD_OK、PCD_NOTAGERR、PCD_ERR)
* 说    明:无
***************************************************************************************/
char PCD_ReadBlock(uint8_t BlockAddr, uint8_t *pData)
{char status;uint16_t unLen;uint8_t i, CmdFrameBuf[MFRC_MAXRLEN];CmdFrameBuf[0] = PICC_READ;CmdFrameBuf[1] = BlockAddr;MFRC_CalulateCRC(CmdFrameBuf, 2, &CmdFrameBuf[2]);status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 4, CmdFrameBuf, &unLen);if((status == PCD_OK) && (unLen == 0x90)){for(i = 0; i < 16; i++){*(pData + i) = CmdFrameBuf[i];}}else{status = PCD_ERR;}return status;
}/***************************************************************************************
* 函数名称:PCD_Value
* 功能描述:对MF1卡数据块增减值操作
* 入口参数:
*           -BlockAddr:块地址
*           -pValue:四字节增值的值,低位在前
*           -mode:数值块操作模式
*                  PICC_INCREMENT:增值
*                PICC_DECREMENT:减值
* 出口参数:无
* 返 回 值:-status:错误代码(PCD_OK、PCD_NOTAGERR、PCD_ERR)
* 说    明:无
***************************************************************************************/
char PCD_Value(uint8_t mode, uint8_t BlockAddr, uint8_t *pValue)
{//0XC1        1           Increment[4]={0x03, 0x01, 0x01, 0x01};char status;uint16_t unLen;uint8_t i, CmdFrameBuf[MFRC_MAXRLEN];CmdFrameBuf[0] = mode;CmdFrameBuf[1] = BlockAddr;MFRC_CalulateCRC(CmdFrameBuf, 2, &CmdFrameBuf[2]);status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 4, CmdFrameBuf, &unLen);if((status != PCD_OK) || (unLen != 4) || ((CmdFrameBuf[0] & 0x0F) != 0x0A)){status = PCD_ERR;}if(status == PCD_OK){for(i = 0; i < 16; i++){CmdFrameBuf[i] = *(pValue + i);}MFRC_CalulateCRC(CmdFrameBuf, 4, &CmdFrameBuf[4]);unLen = 0;status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 6, CmdFrameBuf, &unLen);if(status != PCD_ERR){status = PCD_OK;}}if(status == PCD_OK){CmdFrameBuf[0] = PICC_TRANSFER;CmdFrameBuf[1] = BlockAddr;MFRC_CalulateCRC(CmdFrameBuf, 2, &CmdFrameBuf[2]);status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 4, CmdFrameBuf, &unLen);if((status != PCD_OK) || (unLen != 4) || ((CmdFrameBuf[0] & 0x0F) != 0x0A)){status = PCD_ERR;}}return status;
}/***************************************************************************************
* 函数名称:PCD_BakValue
* 功能描述:备份钱包(块转存)
* 入口参数:-sourceBlockAddr:源块地址
*                -goalBlockAddr   :目标块地址
* 出口参数:无
* 返 回 值:-status:错误代码(PCD_OK、PCD_NOTAGERR、PCD_ERR)
* 说    明:只能在同一个扇区内转存
***************************************************************************************/
char PCD_BakValue(uint8_t sourceBlockAddr, uint8_t goalBlockAddr)
{char status;uint16_t  unLen;uint8_t CmdFrameBuf[MFRC_MAXRLEN];CmdFrameBuf[0] = PICC_RESTORE;CmdFrameBuf[1] = sourceBlockAddr;MFRC_CalulateCRC(CmdFrameBuf, 2, &CmdFrameBuf[2]);status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 4, CmdFrameBuf, &unLen);if((status != PCD_OK) || (unLen != 4) || ((CmdFrameBuf[0] & 0x0F) != 0x0A)){status = PCD_ERR;}if(status == PCD_OK){CmdFrameBuf[0] = 0;CmdFrameBuf[1] = 0;CmdFrameBuf[2] = 0;CmdFrameBuf[3] = 0;MFRC_CalulateCRC(CmdFrameBuf, 4, &CmdFrameBuf[4]);status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 6, CmdFrameBuf, &unLen);if(status != PCD_ERR){status = PCD_OK;}}if(status != PCD_OK){return PCD_ERR;}CmdFrameBuf[0] = PICC_TRANSFER;CmdFrameBuf[1] = goalBlockAddr;MFRC_CalulateCRC(CmdFrameBuf, 2, &CmdFrameBuf[2]);status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 4, CmdFrameBuf, &unLen);if((status != PCD_OK) || (unLen != 4) || ((CmdFrameBuf[0] & 0x0F) != 0x0A)){status = PCD_ERR;}return status;
}/***************************************************************************************
* 函数名称:PCD_Halt
* 功能描述:命令卡片进入休眠状态
* 返 回 值:-status:错误代码(PCD_OK、PCD_NOTAGERR、PCD_ERR)
***************************************************************************************/
char PCD_Halt(void)
{char status;uint16_t unLen;uint8_t CmdFrameBuf[MFRC_MAXRLEN];CmdFrameBuf[0] = PICC_HALT;CmdFrameBuf[1] = 0;MFRC_CalulateCRC(CmdFrameBuf, 2, &CmdFrameBuf[2]);status = MFRC_CmdFrame(MFRC_TRANSCEIVE, CmdFrameBuf, 4, CmdFrameBuf, &unLen);return status;
}///*********************************************
//函数名:StartIDCardTask
//功  能:处理ID卡相关功能
//备  注:【ID读卡器】
//类型码:06
//**********************************************/
//void StartIDcardTask(void const * argument)
//{//    uint8_t RxBuffer[32], TxBuffer[32];
//    char IDcard[10];
//    char __IDcard[10] = "4ba18a25";
//    char IDcard__[10] = "3957ee5c";
//    static int IDCard_Err_Num = 0;
//    char status = 1;
//    /*RS522初始化*/
//    MFRC_Init();
//    PCD_Reset();
//    osDelay(350);//    for(;;)
//    {//        /*获取卡号*/
//        status = PCD_Request(PICC_REQALL, RxBuffer);//返回值为0,代表寻卡成功;并把卡类型存入tempbuf中//        if(status == PCD_OK)
//        {//            /*防冲突,返回卡号*/
//            PCD_Anticoll(RxBuffer);   //把(十六进制)的4个字节卡号存储在数组tempbuf中
//            sprintf(IDcard, "%x%x%x%x", RxBuffer[0], RxBuffer[1], RxBuffer[2], RxBuffer[3]);
//            /*****开始进行卡号判断******/
//            if(strcmp(__IDcard, IDcard) == 0 || strcmp(IDcard__, IDcard) == 0) //卡号判断正确
//            {//                sendmsg(huart1, TxBuffer, "%d,02,06,%s,\r\n", Address, IDcard); //把卡号发给串口1方便调试
//                IDcard[0] = 0x00; //清空字符串
//                beep_play();//蜂鸣器鸣叫
//                Open_Door();//开门
//            }
//            else
//            {//                IDCard_Err_Num++;//卡号不匹配,标志位自增
//                sendmsg(huart1, TxBuffer, "%d,01,06,01,%s,%d\r\n", Address, IDcard, IDCard_Err_Num); //错误,卡号不匹配
//                beep_ring(1000);//蜂鸣器鸣叫
//                if(IDCard_Err_Num >= 5) //5次报警
//                {//                    beep_ring(1000);//蜂鸣器鸣叫
//                    SIM800L_CallNum (my_phone);//拨打电话
//                    sendmsg(huart1, TxBuffer, "%d,02,06,01,Call phone\r\n", Address); //错误,卡号不匹配,并报警
//                    IDCard_Err_Num = 0;
//                }//            }
//        }
//        if(status != PCD_OK)
//        {//            PCD_Reset();
//        }
//        osMessagePut(QueWdtHandle, 0x08, 10);
//        osDelay(300);
//    }
//}
#ifndef _RC522_H
#define _RC522_H
#include "main.h"
#include "stm32f1xx_hal.h"/***********************************************************************************
*                               MFRC522驱动程序                                    *
************************************************************************************/
/*MFRC522寄存器定义*/
//PAGE0
#define MFRC_RFU00                  0x00
#define MFRC_CommandReg             0x01
#define MFRC_ComIEnReg              0x02
#define MFRC_DivlEnReg              0x03
#define MFRC_ComIrqReg              0x04
#define MFRC_DivIrqReg              0x05
#define MFRC_ErrorReg               0x06
#define MFRC_Status1Reg             0x07
#define MFRC_Status2Reg             0x08
#define MFRC_FIFODataReg            0x09
#define MFRC_FIFOLevelReg           0x0A
#define MFRC_WaterLevelReg          0x0B
#define MFRC_ControlReg             0x0C
#define MFRC_BitFramingReg          0x0D
#define MFRC_CollReg                0x0E
#define MFRC_RFU0F                  0x0F
//PAGE1
#define MFRC_RFU10                  0x10
#define MFRC_ModeReg                0x11
#define MFRC_TxModeReg              0x12
#define MFRC_RxModeReg              0x13
#define MFRC_TxControlReg           0x14
#define MFRC_TxAutoReg              0x15 //中文手册有误
#define MFRC_TxSelReg               0x16
#define MFRC_RxSelReg               0x17
#define MFRC_RxThresholdReg         0x18
#define MFRC_DemodReg               0x19
#define MFRC_RFU1A                  0x1A
#define MFRC_RFU1B                  0x1B
#define MFRC_MifareReg              0x1C
#define MFRC_RFU1D                  0x1D
#define MFRC_RFU1E                  0x1E
#define MFRC_SerialSpeedReg         0x1F
//PAGE2
#define MFRC_RFU20                  0x20
#define MFRC_CRCResultRegM          0x21
#define MFRC_CRCResultRegL          0x22
#define MFRC_RFU23                  0x23
#define MFRC_ModWidthReg            0x24
#define MFRC_RFU25                  0x25
#define MFRC_RFCfgReg               0x26
#define MFRC_GsNReg                 0x27
#define MFRC_CWGsCfgReg             0x28
#define MFRC_ModGsCfgReg            0x29
#define MFRC_TModeReg               0x2A
#define MFRC_TPrescalerReg          0x2B
#define MFRC_TReloadRegH            0x2C
#define MFRC_TReloadRegL            0x2D
#define MFRC_TCounterValueRegH      0x2E
#define MFRC_TCounterValueRegL      0x2F
//PAGE3
#define MFRC_RFU30                  0x30
#define MFRC_TestSel1Reg            0x31
#define MFRC_TestSel2Reg            0x32
#define MFRC_TestPinEnReg           0x33
#define MFRC_TestPinValueReg        0x34
#define MFRC_TestBusReg             0x35
#define MFRC_AutoTestReg            0x36
#define MFRC_VersionReg             0x37
#define MFRC_AnalogTestReg          0x38
#define MFRC_TestDAC1Reg            0x39
#define MFRC_TestDAC2Reg            0x3A
#define MFRC_TestADCReg             0x3B
#define MFRC_RFU3C                  0x3C
#define MFRC_RFU3D                  0x3D
#define MFRC_RFU3E                  0x3E
#define MFRC_RFU3F                  0x3F/*MFRC522的FIFO长度定义*/
#define MFRC_FIFO_LENGTH            64 /*MFRC522传输的帧长定义*/
#define MFRC_MAXRLEN                18                /*MFRC522命令集,中文手册P59*/
#define MFRC_IDLE                   0x00    //取消当前命令的执行
#define MFRC_CALCCRC                0x03    //激活CRC计算
#define MFRC_TRANSMIT               0x04    //发送FIFO缓冲区内容
#define MFRC_NOCMDCHANGE            0x07    //无命令改变
#define MFRC_RECEIVE                0x08    //激活接收器接收数据
#define MFRC_TRANSCEIVE             0x0C    //发送并接收数据
#define MFRC_AUTHENT                0x0E    //执行Mifare认证(验证密钥)
#define MFRC_RESETPHASE             0x0F    //复位MFRC522/*MFRC522通讯时返回的错误代码*/
#define MFRC_OK                     (char)0
#define MFRC_NOTAGERR               (char)(-1)
#define MFRC_ERR                    (char)(-2)/*MFRC522函数声明*/
void MFRC_Init(void);
void MFRC_WriteReg(uint8_t addr, uint8_t data);
uint8_t MFRC_ReadReg(uint8_t addr);
void MFRC_SetBitMask(uint8_t addr, uint8_t mask);
void MFRC_ClrBitMask(uint8_t addr, uint8_t mask);
void MFRC_CalulateCRC(uint8_t *pInData, uint8_t len, uint8_t *pOutData);
char MFRC_CmdFrame(uint8_t cmd, uint8_t *pInData, uint8_t InLenByte, uint8_t *pOutData, uint16_t *pOutLenBit);/***********************************************************************************
*                           MFRC552与MF1卡通讯接口程序                             *
************************************************************************************/
/*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                //休眠/*PCD通讯时返回的错误代码*/
#define PCD_OK                  (char)0             //成功
#define PCD_NOTAGERR            (char)(-1)          //无卡
#define PCD_ERR                 (char)(-2)          //出错/*PCD函数声明*/
void PCD_Init(void);
void PCD_Reset(void);
void PCD_AntennaOn(void);
void PCD_AntennaOff(void);
char PCD_Request(uint8_t RequestMode, uint8_t *pCardType);  //寻卡,并返回卡的类型
char PCD_Anticoll(uint8_t *pSnr);                           //防冲突,返回卡号
char PCD_Select(uint8_t *pSnr);                             //选卡
char PCD_AuthState(uint8_t AuthMode, uint8_t BlockAddr, uint8_t *pKey, uint8_t *pSnr); //验证密码(密码A和密码B)
char PCD_WriteBlock(uint8_t BlockAddr, uint8_t *pData);   //写数据
char PCD_ReadBlock(uint8_t BlockAddr, uint8_t *pData);    //读数据
char PCD_Value(uint8_t mode, uint8_t BlockAddr, uint8_t *pValue);
char PCD_BakValue(uint8_t sourceBlockAddr, uint8_t goalBlockAddr);
char PCD_Halt(void);#endif

MF_RC522中文资料.pdf

单片机 STM32 HAL 射频读卡器 RC522相关推荐

  1. 温湿度传感器驱动SHT85 单片机STM32 HAL库

    功能介绍:读取传感器SHT85数据,转换成温度.湿度 .饱和水蒸气含量. 注意事项: SDA脚设置为开漏输出,外部上拉电阻10k.或者设置成推挽,软件切换SDA输入输出. 调试时可适当加长延时时间. ...

  2. 单片机 STM32 HAL 网络模块 ENC28J60

    文章目录 一. 简介 二.特性 三.示例代码 一. 简介 ENC28J60 是带有行业标准串行外设接口(Serial Peripheral Interface,SPI)的独立以太网控制器.它可作为任何 ...

  3. 单片机 STM32 HAL IO扩展 PCA9555

    描述 这个用于两线双向总线(I 2 C)的16位扩展器设计用于2.3V至5.5VV CC 运行.通过I 2 C接口[串行时钟(SCL),串行数据(SDA)],它为大多数微控制器系列产品提供通用远程I ...

  4. 单片机 STM32 HAL 步进电机 Motor

    /*************笔记**************** 1.CubeMX 定义任意四个引脚,作为ABCD相,并对引脚作出如下配置:GPlO output level --HighGPIO m ...

  5. 单片机 STM32 HAL PCF8574 例子代码

    #include "extgpio.h" #include "pcf8574.h" #include "74hc595.h" /****** ...

  6. 单片机 STM32 HAL 温湿度 DS18B20

    /*************笔记**************** 1.CubeMX 定义任意一个引脚,作为数据脚,并对引脚作出如下配置:GPlO output level --LOWGPIO mode ...

  7. 单片机 STM32 HAL 液晶屏 LCD16032

    笔记: 1.采用串行输出 2.器件 [16 NC(PSB)]引脚需要接地, H:并口通信 L:串口通信 3.LCD_CS_Pin LCD_CS_GPIO_Port //片选控制,0,无效 1有效 LC ...

  8. C8051F 30x单片机低成本射频读卡器方案

    C8051F 30x单片机低成本射频读卡器方案 时间:2009-02-26 09:56:48 来源:edmchina 作者: 该方案采用超低功耗SOC型单片机C8051F30X,流水线指令结构,70% ...

  9. STM32 HAL库 串口DMA(收发)和STM32串口中断接收(接收时间管理机制)+ESP8266 wifi模组通信问题

    一.HAL库 串口 DMA+ESP8266模组通信问题 用STM32 HAL库串口的DMA发送和空闲中断接收处理数据,单片机发送AT指令给ESP8266 wifi模组问题:单片机连续几次给wifi模组 ...

最新文章

  1. HashSet中的add()方法( 零 )(详尽版)
  2. @Transactional事务几点注意
  3. Android用shareUserID实现多个Activity显示在同一界面
  4. hadoop-1.1.2 在Windows环境下的部署
  5. SAP Spartacus org unit table不同区域focus然后回车的行为差异
  6. 【渝粤教育】国家开放大学2019年春季 1332中文学科论文写作 参考试题
  7. Java开发环境搭建详解
  8. [css] 一个项目中有很多无用的css代码,怎么找到并清除这些无用的代码?
  9. SpringMVC 中设置日期字符串转换格式
  10. java综合案例_综合实例 - Java House - BlogJava
  11. centos中多台主机免密登录_centos免密码使用密钥登录
  12. Python 字符串和列表的转化 ,简单到尖叫
  13. html中加入数据库,HTML中如何连接数据库?
  14. 三菱伺服电机选型技巧
  15. 初学verilog必看
  16. 如何理解「外汇储备导致人民币货币增加」?
  17. idea试用许可证过期的问题
  18. strlen()函数计算方法
  19. 用java简单写一个信息管理系统(尚硅谷项目二)
  20. 牛油果怎么催熟 牛油果催熟法

热门文章

  1. android dex加载过程,8.1版本dex加载流程笔记--第二篇:DexFile::Open流程与简单脱壳原理...
  2. 基于php的同学校友录网站
  3. oracle undoautotune,Oracle隐藏参数:_undo_autotune
  4. Qt实战:云曦聊天室篇
  5. 照我思索,你的电脑百毒不侵 (转)
  6. React 前端面试宝典
  7. 屏幕录制的免费工具camstudio
  8. 运算符优先级(由高到低)
  9. Vue audio音乐列表循环播放
  10. STM32F030C8T6单片机PWM呼吸灯寄存器配置