树莓派B型I2C引脚接RC522与指纹模块功能冲突问题咨询
问题排查与解决方案
核心根因定位
- 你的硬件存在明确的总线资源冲突,指纹模块接的Pin3(GPIO2/SDA)、Pin5(GPIO3/SCL)是树莓派默认I2C1总线引脚,RC522读卡器使用SPI总线(Pin23为SPI时钟、Pin24为SPI片选),当前配置和代码逻辑存在两个核心问题:
/boot/config.txt存在大量重复、冲突的总线配置,同时开启i2c0、i2c1、重复声明i2c开启参数,还设置了极低的I2C波特率10000,SPI和I2C的驱动初始化时会争抢GPIO寄存器控制权- Python代码中两个外设的读操作没有做互斥处理,
reader.read()执行时会占用SPI总线和底层GPIO操作句柄,直接打断指纹模块的I2C通信触发报错
分步解决步骤
- 修正
/boot/config.txt冗余配置,删除重复冲突项,修改后保留以下相关配置即可:
dtparam=audio=on
dtoverlay=w1-gpio
enable_uart=1
dtoverlay=pi3-disable-bt
dtparam=spi=on
dtparam=i2c_arm=on
dtparam=i2c_arm_baudrate=400000
删除重复的i2c0、i2c1、i2c开启声明,将I2C波特率从10000提升到标准的400000,避免低速总线通信被SPI操作打断。
- 修改Python代码增加总线访问互斥,保证同一时间只有一个外设操作GPIO资源,参考逻辑如下:
import threading # 全局GPIO操作锁 gpio_lock = threading.Lock() # RFID读操作封装 def read_rfid(): with gpio_lock: id, text = reader.read() return id, text # 指纹模块读操作封装 def read_fingerprint(): with gpio_lock: # 原有指纹模块读取逻辑 return fp_result
执行时按单次RFID读取→单次指纹读取的顺序交替执行,不要并行调用两个外设的读接口。
- 硬件接线二次校验:
确认RC522的接线完全符合SPI标准,没有误接Pin3、Pin5:RC522的SCK接Pin23、MOSI接Pin19、MISO接Pin21、SDA接Pin24、RST可接任意空闲GPIO,供电统一接3.3V和GND。
验证方案
修改配置后重启树莓派,先单独运行两个外设的测试脚本确认各自功能正常,再运行整合后的加锁代码,即可解决互斥报错问题。
内容的提问来源于stack exchange,提问作者Omar N Shamali
相关产品推荐
相关产品推荐

