Python/Raspbian - 为什么对象 SPI 属性 (_spi_seq) 在 Buster python 3.7.3 而不是 Jessie python 3.4.2 上发生变化 - 可能是 spidev 问题

Python/Raspbian - why does object SPI property (_spi_seq) change on Buster python 3.7.3 but not Jessie python 3.4.2 - probably spidev issue

我最近开始了一份工作,在我接受之前,我并没有明确编码的要求。我很享受它,但是学习曲线很大,因为我以前从未使用过 OOP。这个问题让我很困惑,所以任何帮助都将不胜感激 - 即使它只是表明我错过了显而易见的事情!

我目前正在尝试更新 Raspberry Pi 3B 运行ning 旧版本 Raspbian Jessie 上的代码,以便它 运行 在 Buster 上。代码超过 10,000 行,但这个简化的片段说明了 运行ning on Buster 时许多问题的根本原因。该代码使用 SPI 与 pcb 上的另一个芯片通信。另一个芯片是用寄存器编程的,CUSTAT 就是其中之一。所有寄存器都存在同样的问题。我相信这不是 SPI 问题 - 通信已经过检查并且有效。

密码是:

#!/usr/bin/python3

import spidev, time
import RPi.GPIO as GPIO

DEV_OE   = 18   #GPIO24
SPI_MOSI = 19   #GPIO10
SPI_MISO = 21   #GPIO9
SPI_SCK  = 23   #GPIO11
SPI_CE0  = 24   #GPIO8
SPI_CE1  = 26   #GPIO7

PROFILER = 40   #GPIO21

PINS_OUT = [DEV_OE, PROFILER]

def rpi_init():
    GPIO.setwarnings(False)
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(PINS_OUT, GPIO.OUT)
    GPIO.output(DEV_OE, 1)


def SPI_init():
    global spi
    spi = spidev.SpiDev(0,0)
    spi.max_speed_hz=(500000)

def SPI_xfer(bytelist):
    rxed = spi.xfer(bytelist)
    return rxed

class Reg8_Variable():
    def __init__(self, name, spi_seq):
        self._spi_seq = spi_seq
        self._value = "None"
        self.name = name

    def read_from_CPLD(self):
        #byteseq = [0x01, 0x00] 
        byteseq = self._spi_seq
        print ("byteseq", byteseq)
        rxed = SPI_xfer(byteseq)
        print ("SPI received ", rxed)
        self._value = rxed[1]

CUSTAT = Reg8_Variable("CUSTAT", [0x01, 0x00])

if __name__ == "__main__":
    print("start")
    rpi_init() #sets up GPIO pins
    SPI_init() #initialises SPI comms protocol
    for i in range(5):
        print (i, CUSTAT.name, CUSTAT._value, CUSTAT._spi_seq)
        CUSTAT.read_from_CPLD()
        print (i, CUSTAT.name, CUSTAT._value, CUSTAT._spi_seq)
        time.sleep(2)

When it 运行s on Buster using python 3.7.3 当read_from_CPLD为[=时,CUSTAT._spi_seq的值改为读取SPI的值54=]。预期行为是 CUSTAT._spi_seq 停留在 [0x01, 0x00]。 CUSTAT.value 应读取 0x01 或 0x05,具体取决于是否按下了 pcb 上的开关。输出是

start
0 CUSTAT None [1, 0]
byteseq [1, 0]
SPI received  [0, 5]
0 CUSTAT 5 [0, 5]
1 CUSTAT 5 [0, 5]
byteseq [0, 5]
SPI received  [0, 0]
1 CUSTAT 0 [0, 0]
2 CUSTAT 0 [0, 0]
byteseq [0, 0]
SPI received  [0, 0]
2 CUSTAT 0 [0, 0]
3 CUSTAT 0 [0, 0]
byteseq [0, 0]
SPI received  [0, 0]
3 CUSTAT 0 [0, 0]
4 CUSTAT 0 [0, 0]
byteseq [0, 0]
SPI received  [0, 0]
4 CUSTAT 0 [0, 0]

注释掉 byteseq = self._spi_seq 并将其替换为 byteseq = [0x01, 0x00] 给出以下正确输出:

start
0 CUSTAT None [1, 0]
byteseq [1, 0]
SPI received  [0, 5]
0 CUSTAT 5 [1, 0]
1 CUSTAT 5 [1, 0]
byteseq [1, 0]
SPI received  [0, 5]
1 CUSTAT 5 [1, 0]
2 CUSTAT 5 [1, 0]
byteseq [1, 0]
SPI received  [0, 1]
2 CUSTAT 1 [1, 0]
3 CUSTAT 1 [1, 0]
byteseq [1, 0]
SPI received  [0, 5]
3 CUSTAT 5 [1, 0]
4 CUSTAT 5 [1, 0]
byteseq [1, 0]
SPI received  [0, 5]
4 CUSTAT 5 [1, 0]

运行 Jessie 上 python 3.4.2 的原始代码(byteseq = self._spi_seq)在下面给出了正确的输出:

start
0 CUSTAT None [1, 0]
byteseq [1, 0]
SPI received  [0, 5]
0 CUSTAT 5 [1, 0]
1 CUSTAT 5 [1, 0]
byteseq [1, 0]
SPI received  [0, 5]
1 CUSTAT 5 [1, 0]
2 CUSTAT 5 [1, 0]
byteseq [1, 0]
SPI received  [0, 5]
2 CUSTAT 5 [1, 0]
3 CUSTAT 5 [1, 0]
byteseq [1, 0]
SPI received  [0, 1]
3 CUSTAT 1 [1, 0]
4 CUSTAT 1 [1, 0]
byteseq [1, 0]
SPI received  [0, 5]
4 CUSTAT 5 [1, 0]

硬件是一样的——我只是把 Pi 上的 SD 卡关掉了。是什么导致 python 3.4.2 和 3.7.3 之间的行为差​​异?

抱歉问了这么长的问题,在此先感谢您的帮助。

编辑: 所以我有一个解决方法。将代码更改为:

def read_from_CPLD(self):
    byteseq = self._spi_seq.copy()
    print ("byteseq", byteseq)
    rxed = SPI_xfer(self._spi_seq)
    print ("SPI received ", rxed)
    self._value = rxed[1]
    self._spi_seq = byteseq.copy()

给出了预期的响应。但是,我仍然不明白是什么导致 _spi_seq 列表被更改以及为什么只在 3.7.3 而不是 3.4.2.

非常感谢收到任何解释。

根本原因是 spidev 中的错误 - 请参阅我的第二条评论。