我正在设置一个 Raspberry Pi 来记录来自 Sensirion SCD30 传感器的数据(CO 2、湿度和温度)。我的代码在 Python 3 中,使用 SMBus 库通过 Raspberry Pi GPIO 中的 I²C 引脚与传感器进行通信。有一个命令可以确定传感器是否准备好发送数据。
Sparkfun 链接到 Arduino 的 SCD30 库
该值0x0202
通过 I²C 发送,并返回三个字节的数据:
0x00 0x00 0x81 for data not ready
0x00 0x01 0xB0 for data ready
前两个字节是数据就绪值的 MSB 和 LSB。结合得当,它们应该是0x0000
和0x0001
。
第三个字节是前两个字节的 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)
它将返回上面演示的三个字节的列表。