gpt4 book ai didi

python - 使用 Raspberry Pi Python SMBus 乱序接收 I²C 字节

转载 作者:太空狗 更新时间:2023-10-29 18:08:00 28 4
gpt4 key购买 nike

我正在设置 Raspberry Pi 以记录来自 Sensirion SCD30 传感器的数据(CO2、湿度和温度)。我的代码使用 Python 3,使用 SMBus 库通过 Raspberry Pi 的 GPIO 中的 I²C 引脚与传感器通信。有一个命令可以确定传感器是否准备好发送数据。

Link to SCD30 interface datasheet

Link to SCD30 library for Arduino by Sparkfun

0x0202 通过 I²C 发送,返回三个字节的数据:

0x00 0x00 0x81 for data not ready
0x00 0x01 0xB0 for data ready

前两个字节是数据就绪值的 MSB 和 LSB。如果组合得当,它们应该是 0x00000x0001

第三个字节是前两个字节的CRC8。这是使用 0x31 的多项式和 0xFF 的初始化计算的。

大约一半的时间,字节以错误的顺序发送。它不是MSB LSB CRC,而是发送MSB CRC LSB。例如,如果数据准备就绪,它可能会发送 0x00, 0xB0, 0x01 而不是 0x00, 0x01, 0xB0。我不明白为什么会这样,我担心发送数据时存在一些损坏或问题。我可以更改代码以识别 CRC 是否是第二个字节,但我想找到潜在的问题。

我正在使用 smbus 库发送和接收 I²C 数据。这是我发送命令和读取数据的代码:

bus = smbus.SMBus(0)
I2C_ADDRESS = 0x61

def sendCommand(self, cmd): # Sends a 2 byte command (cmd)
data = [0]*2
data[0] = cmd >> 8 # Splits 2 byte command into MSB and LSB
data[1] = cmd & 0xFF
bus.write_i2c_block_data(I2C_ADDRESS, data[0], data[1:])

def readRegister(self, reg, length): # Sends 2 byte command (reg) and receives (length) bytes
sendCommand(reg)
data = bus.read_i2c_block_data(I2C_ADDRESS, 0, length)
return data

对于我上面给出的示例,我将运行以下代码:

ready = readRegister(0x0202, 3)  # Returns a list of 3 bytes
print(ready)

它会返回上面演示的三个字节的列表。

最佳答案

你有什么样的工具和技能?

(我的第一 react 是搜索 SCD30 勘误表,但我找不到,快速网络搜索也没有发现任何类似问题。)

如果您有示波器或逻辑分析仪,请查看 SCL 和 SDA,并确认问题出在 Raspberry Pi 上(也可能出在传感器上)。

您能否更换设置中的任何硬件组件 - 只是为了消除出现故障的可能性。

你能用 C 语言重写代码吗(使用/dev/i2c-x),看看问题是否仍然存在——这会告诉你问题出在 I²C 主控、接线、SCD30 芯片的内核驱动程序或在库 smbus 或位于您的代码段和内核驱动程序之间的其他软件中。

祝你好运

关于python - 使用 Raspberry Pi Python SMBus 乱序接收 I²C 字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52236700/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com