You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32C3与RC522模块SPI连接故障求助(MicroPython环境)

解决方案:ESP32C3 + RC522 RFID模块连接问题修复

一、先理清ESP32C3引脚编号对应关系

首先要区分开发板丝印编号和MicroPython GPIO编号:

  • Seeed文档标注的D8/D9/D10是开发板丝印,对应的MicroPython GPIO编号为8、9、10,而非SPI(1)默认的6/7/2(默认引脚可重映射)。
  • 务必确保RC522的引脚与ESP32C3的GPIO一一对应,不要混淆丝印和GPIO编号。

二、硬件SPI正确初始化(优先推荐)

直接指定实际连线的GPIO初始化SPI1,避免使用默认引脚冲突。假设你的硬件连线为:

  • RC522 SCK → ESP32C3 GPIO8(丝印D8)
  • RC522 MOSI → ESP32C3 GPIO10(丝印D10)
  • RC522 MISO → ESP32C3 GPIO9(丝印D9)
  • RC522 RST → ESP32C3 GPIO4
  • RC522 SDA(CS) → ESP32C3 GPIO5

对应的初始化代码:

from mfrc522 import MFRC522
from machine import Pin, SPI

# 硬件SPI1初始化,指定实际连线的GPIO
spi = SPI(1, baudrate=500000, polarity=0, phase=0,
          sck=Pin(8), mosi=Pin(10), miso=Pin(9))
rdr = MFRC522(spi=spi, gpioRst=4, gpioCs=5)

print("Place card")
while True:
    (stat, tag_type) = rdr.request(rdr.REQIDL)
    if stat == rdr.OK:
        print('Card detected')
        (stat, raw_uid) = rdr.anticoll()
        if stat == rdr.OK:
            card_id = "uid: 0x%02x%02x%02x%02x" % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
            print(card_id)

三、软件SPI(SoftSPI)备用方案

若硬件SPI仍有问题,改用SoftSPI,可任意选择空闲GPIO:

from mfrc522 import MFRC522
from machine import Pin, SoftSPI

# 软件SPI自定义引脚,对应RC522的SCK/MOSI/MISO
sck = Pin(8, Pin.OUT)
mosi = Pin(10, Pin.OUT)
miso = Pin(9, Pin.IN)
spi = SoftSPI(baudrate=100000, polarity=0, phase=0, sck=sck, mosi=mosi, miso=miso)
rdr = MFRC522(spi=spi, gpioRst=4, gpioCs=5)

print("Place card")
while True:
    (stat, tag_type) = rdr.request(rdr.REQIDL)
    if stat == rdr.OK:
        print('Card detected')
        (stat, raw_uid) = rdr.anticoll()
        if stat == rdr.OK:
            card_id = "uid: 0x%02x%02x%02x%02x" % (raw_uid[0], raw_uid[1], raw_uid[2], raw_uid[3])
            print(card_id)

四、RC522库兼容性调整

当前库在ESP32C3上可能存在时序问题,做以下修改:

  1. 在_tocard方法中,增加循环等待超时时间,适配ESP32C3的运行速度:
    # 原代码
    i = 2000
    # 修改为
    i = 5000
    
  2. 确认_rreg方法的SPI读写逻辑正确(当前代码已符合要求,无需修改):
    def _rreg(self, reg):
        if self.cs is not None:
            self.cs.value(0)
        buf = self.rregBuf
        buf[0]=0xff & (((reg << 1) & 0x7e) | 0x80)
        self.spi.write(buf)
        val = self.spi.read(1)
        if self.cs is not None:
            self.cs.value(1)
        return val[0]
    

五、硬件排查要点

  • 供电:RC522必须使用3.3V供电,严禁接5V,避免烧坏模块或ESP32C3 GPIO。
  • 连线:检查所有引脚连接是否牢固,无虚焊、接触不良,重点排查MISO引脚(信号弱易导致通信失败)。
  • 天线:确认RC522的天线焊接良好,无脱落,天线是RFID卡读取的关键部件。

内容的提问来源于stack exchange,提问作者Tiger_JA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 06:52:01