分享免费的编程资源和教程

网站首页 > 技术教程 正文

快速学会RC522读写射频M1卡(一)-点亮LED

goqiw 2024-11-07 11:06:18 技术教程 26 ℃ 0 评论

学习目标

使用M1卡控制开发板LED,实现LED的开关功能

实验器材

STM32开发板、RFID-RC522模块、M1卡

实验步骤

我购买的MF522模块有SPI通讯、IIC通讯、UASRT串口通信,我购买的模块采用SPI通讯模式与单片机进行通讯。首先配置单片机的SPI通讯,我们使用STM32CUBE配置图如下:

接线

单片机与RC522模块之间的接线可按照下图进行管脚连接,我用的单片机为STM32单片机的SPI1模块。其中RCC522模块中的SS为SPI片选、RST为模块的复位引脚,高电平有效。


单片机操作RC522模块主要有以下流程:初始化->寻卡->获取ID->选卡->密码验证->操作卡片这几个步骤(关于这些流程的具体含义大家可以点下面链接视频有详细描述:快速上手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(二)—制作开关卡

本文暂时没有评论,来添加一个吧(●'◡'●)

欢迎 发表评论:

最近发表
标签列表