Skip to content

NFC接口的RC522模块

1. RC522模块介绍

RC522是意法半导体公司生产的一款NFC模块,支持ISO14443A/B标准,可以用于读取和写入M1卡、CPU卡等非接触式智能卡。RC522模块具有以下特点:

  • 支持ISO14443A/B标准
  • 支持M1卡、CPU卡等非接触式智能卡
  • 支持读写操作
  • 支持防冲突功能
  • 支持加密功能
  • 支持多种通信协议

2. RC522模块的接线

RC522模块的接线如下:

管脚功能接线说明
1VCC3.3V供电
2GNDGND地线
3RSTGPIO复位线(可以不接)
4SDA(SS)GPIO数据线(片选线)
5SCKGPIO时钟线
6MOSIGPIO数据输出线
7MISOGPIO数据输入线
8IRQNC中断线(可以不接)

需要说明

  • SDA(SS) 引脚作为SPI接口的 SS片选引脚,在SPI模式下,作为片选引脚,在I2C模式下,作为数据线.
  • RST 引脚作为复位引脚,如果使用软件复位的话,这个引脚可以不接.

3. RC522模块操作

3.1 引入对应的组件库

对于rc522的操作,比较复杂,为了更好的控制芯片,我们直接引用对应的组件库.
RC522组件库

  • 进入python3虚拟环境 get_idf(我自己写的脚本) 进入 python3虚拟环境
  • 引入组件库: idf.py add-dependency "abobija/rc522"

3.2 对应的C代码.

直接通过组件的命令,创建一个rc522的demo工程,然后修改对应的代码,就可以实现对应的操作了.

python
idf.py create-project-from-example "abobija/rc522:basic"

这条命令.就会自动创建一个demo工程用于对于基本的rc522的操作.

c
#include <esp_log.h>
#include "rc522.h"
#include "driver/rc522_spi.h"
#include "rc522_picc.h"

static const char *TAG = "rc522-basic-example";

// 引脚的定义
#define RC522_SPI_BUS_GPIO_MISO    (7)
#define RC522_SPI_BUS_GPIO_MOSI    (6)
#define RC522_SPI_BUS_GPIO_SCLK    (5)
#define RC522_SPI_SCANNER_GPIO_SDA (4)
#define RC522_SCANNER_GPIO_RST     (-1) // soft-reset

static rc522_spi_config_t driver_config = {
    .host_id = SPI2_HOST,
    .bus_config = &(spi_bus_config_t){
        .miso_io_num = RC522_SPI_BUS_GPIO_MISO,
        .mosi_io_num = RC522_SPI_BUS_GPIO_MOSI,
        .sclk_io_num = RC522_SPI_BUS_GPIO_SCLK,
    },
    .dev_config = {
        .spics_io_num = RC522_SPI_SCANNER_GPIO_SDA,
    },
    .rst_io_num = RC522_SCANNER_GPIO_RST,
};

static rc522_driver_handle_t driver;
static rc522_handle_t scanner;

static void on_picc_state_changed(void *arg, esp_event_base_t base, int32_t event_id, void *data)
{
    rc522_picc_state_changed_event_t *event = (rc522_picc_state_changed_event_t *)data;
    rc522_picc_t *picc = event->picc;

    if (picc->state == RC522_PICC_STATE_ACTIVE) {
        rc522_picc_print(picc);
    }
    else if (picc->state == RC522_PICC_STATE_IDLE && event->old_state >= RC522_PICC_STATE_ACTIVE) {
        ESP_LOGI(TAG, "Card has been removed");
    }
}

void app_main()
{
    rc522_spi_create(&driver_config, &driver);
    rc522_driver_install(driver);

    rc522_config_t scanner_config = {
        .driver = driver,
    };

    rc522_create(&scanner_config, &scanner);
    rc522_register_events(scanner, RC522_EVENT_PICC_STATE_CHANGED, on_picc_state_changed, NULL);
    rc522_start(scanner);
}

4. RC522模块高级使用方法

RC522组件库中,还提供了一些高级的使用方法:
找到更多有趣的例子(如memory_dump),请转到examples文件夹。