问题描述
我正在尝试使用 RaspBerry Pi 控制两个 Adafruit MAX31865 RTD 传感器。对于第一个在 /dev/spidev0 上工作的传感器,一切都很好,但是当我设置第二个 spi 接口时,我无法使代码工作。 ioctl 如何与第二个设备通信似乎存在低级问题。你可以在这里看到我使用的代码。
import board
import busio
import digitalio
import adafruit_max31865
import sqlite3
import time
import serial
spi_ext = busio.SPI(board.SCK,MOSI=board.MOSI,MISO=board.MISO)
cs_ext = digitalio.DigitalInOut(board.D5)
sensor_ext = adafruit_max31865.MAX31865(spi_ext,cs_ext,wires=2,rtd_nominal=1000.,ref_resistor=4300.)
SCK = board.SCK_1 # D21
MOSI = board.MOSI_1 # D20
MISO = board.MISO_1 # D19
D = board.D26
print(sensor_ext.resistance)
print('---')
spi_int = busio.SPI(SCK,MOSI=MOSI,MISO=MISO)
cs_int = digitalio.DigitalInOut(D) #board.D26)
sensor_int = adafruit_max31865.MAX31865(spi_mioc,cs_mioc,ref_resistor=4300.)
print(sensor_int.resistance)
1088.7786865234375
---
Traceback (most recent call last):
File "rtd_04.py",line 25,in <module>
rtd_nominal=1000.,ref_resistor=4300.)
File "/home/pi/.local/lib/python3.5/site-packages/adafruit_max31865.py",line 120,in __init__
config = self._read_u8(_MAX31865_CONfig_REG)
File "/home/pi/.local/lib/python3.5/site-packages/adafruit_max31865.py",line 144,in _read_u8
device.write(self._BUFFER,end=1)
File "/home/pi/.local/lib/python3.5/site-packages/busio.py",line 308,in write
return self._spi.write(buf,start,end)
File "/home/pi/.local/lib/python3.5/site-packages/adafruit_blinka/microcontroller/generic_linux/spi.py",line 81,in write
self._spi.mode = self.mode
File "/home/pi/.local/lib/python3.5/site-packages/Adafruit_PureIO/spi.py",line 355,in mode
self._ioctl(SPI._IOC_WR_MODE,mode)
File "/home/pi/.local/lib/python3.5/site-packages/Adafruit_PureIO/spi.py",line 224,in _ioctl
ioctl(self.handle,ioctl_bytes,arg)
OSError: [Errno 22] Invalid argument
注意事项和观察:
- 如果我进入 adafruit_max31865 的代码,并将 SPI 的硬编码相位从 1(下载 adafruit_max31865.py 时的硬编码值)更改为 0,那么我不会收到错误消息,但是sensor_ext.温度读数太小了 2 倍,sensor_int.temperature 返回 0。更改极性值似乎没有效果。
- 这不是硬件问题。如果我换掉两块板,那么连接到 spidev0 的板(代码中的 sensor_ext)始终可以工作,并且在初始化 spidev1 设备(代码中的 sensor_int)时出现错误。
- 在 ioctl(引发异常的调用)中发送到两个设备的
arg
和ioctl_bytes
值序列完全相同。第一个连接的self.handle
为 3,第二个连接的self.handle
为 5。如果我为3
硬编码self.handle
,则不会引发异常,但 {{ 1}} 总是返回print(sensor_int.resistance)
- 更改 CS 引脚(例如,更改为 D6)并不能解决问题。
作为参考,这里是 /boot/config.txt 中的相关行
0.0
更新
我已经使用 this post 中的代码测试了电路板。在这里,Python 正在手动翻转 GPIB 引脚,而不依赖于 ioctl。看来还是有问题。我的猜测是其中一根电线没有正确连接,或者可能有一个开放的连接(我不得不穿过其中一根电线,因为它不再导电,我认为连接真的是一个开路)。明天当我用万用表仔细观察时,我会发布更多。
更新 #2
我重新连接了两个传感器,以便它们共享 SCLK、MOSI 和 MISO,并且我只运行了两个芯片选择。一个来自dtparam=spi=on
dtoverlay=spi1-1cs
,另一个来自board.D5
。此解决方法允许我使用 spidev0 控制这两个设备
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)