树莓派:如何使用spidev自定义片选引脚且不干扰默认CE引脚
树莓派自定义SPI片选引脚的解决方案
问题根源
树莓派默认的SPI控制器(spi0)仅提供2个硬件片选引脚(CE0对应spidev0.0、CE1对应spidev0.1),因此调用INA.open(0,2)会报错——系统不存在/dev/spidev0.2设备文件。而直接复用已有通道并设置no_cs仍干扰原有设备,是因为未正确隔离SPI实例或未禁用硬件片选控制。
方案一:软件片选(推荐,无需系统配置)
通过手动控制GPIO引脚作为片选,同时禁用spidev的硬件片选功能,彻底隔离多个SPI设备:
- 初始化GPIO与SPI实例
import spidev import RPi.GPIO as GPIO # 自定义片选引脚(GPIO23) INA_CS = 23 GPIO.setmode(GPIO.BCM) GPIO.setup(INA_CS, GPIO.OUT, initial=GPIO.HIGH) # 初始拉高,避免设备误触发 # 创建独立的SPI实例,禁用硬件片选 ina_spi = spidev.SpiDev() ina_spi.open(0, 0) # 可复用任意空闲通道(0,0或0,1) ina_spi.no_cs = True # 关键:让spidev不再控制硬件CE引脚
- 安全操作第三设备
操作时手动控制自定义CS引脚,确保同一时间仅目标设备被选中:
def operate_ina(send_data): # 拉低自定义CS,选中INA设备 GPIO.output(INA_CS, GPIO.LOW) # 执行SPI传输 recv_data = ina_spi.xfer2(send_data) # 拉高CS,释放设备 GPIO.output(INA_CS, GPIO.HIGH) return recv_data
- 注意事项
- 每个SPI设备必须使用独立的spidev实例,避免共用实例导致的硬件引脚冲突
- 多线程/多进程操作时,需用
threading.Lock()或类似机制同步SPI操作,防止多个设备同时被选中 - 退出程序前记得调用
GPIO.cleanup()释放引脚资源
方案二:启用更多硬件片选引脚(需系统配置)
若偏好硬件片选,可修改树莓派设备树启用额外的CE引脚:
- 修改系统配置
编辑/boot/config.txt,添加以下内容:
dtparam=spi=on dtoverlay=spi0-3cs # 启用spi0的3个硬件片选引脚
重启树莓派后,系统会生成/dev/spidev0.2设备文件,对应CE2引脚(默认映射到GPIO26,可通过树莓派引脚图确认)。
- 调整硬件连接
将INA设备的CS引脚接到CE2对应的GPIO引脚(而非GPIO23),之后即可正常调用:
ina_spi = spidev.SpiDev() ina_spi.open(0, 2) # 直接使用新增的硬件片选通道
内容的提问来源于stack exchange,提问作者Siddhant Samarth
相关产品推荐
相关产品推荐

