rc522引脚功能(快速学会RC522读写射频M1卡)
rc522引脚功能(快速学会RC522读写射频M1卡)单片机与RC522模块之间的接线可按照下图进行管脚连接,我用的单片机为STM32单片机的SPI1模块。其中RCC522模块中的SS为SPI片选、RST为模块的复位引脚,高电平有效。接线实验步骤我购买的MF522模块有SPI通讯、IIC通讯、UASRT串口通信,我购买的模块采用SPI通讯模式与单片机进行通讯。首先配置单片机的SPI通讯,我们使用STM32CUBE配置图如下:SPI通讯配置
学习目标
使用M1卡控制开发板LED,实现LED的开关功能
实验器材
STM32开发板、RFID-RC522模块、M1卡
实验步骤
我购买的MF522模块有SPI通讯、IIC通讯、UASRT串口通信,我购买的模块采用SPI通讯模式与单片机进行通讯。首先配置单片机的SPI通讯,我们使用STM32CUBE配置图如下:
SPI通讯配置
接线
单片机与RC522模块之间的接线可按照下图进行管脚连接,我用的单片机为STM32单片机的SPI1模块。其中RCC522模块中的SS为SPI片选、RST为模块的复位引脚,高电平有效。
管脚接线图
RC522的管脚定义图
单片机操作RC522模块主要有以下流程:初始化->寻卡->获取ID->选卡->密码验证->操作卡片这几个步骤(关于这些流程的具体含义大家可以点下面链接视频有详细描述:快速上手RC522读卡模块(一))。其中每一步都有对应的操作函数,具体见下图。
单片机操作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(二)—制作开关卡。