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 中的错误 - 请参阅我的第二条评论。
我最近开始了一份工作,在我接受之前,我并没有明确编码的要求。我很享受它,但是学习曲线很大,因为我以前从未使用过 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 中的错误 - 请参阅我的第二条评论。