Raspberry Pi 在 spidev1 上控制 MAX31865 引发 OSError:[Errno 22] 无效参数

问题描述

我正在尝试使用 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(引发异常的调用)中发送到两个设备的 argioctl_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 (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...