Aeo*_*lus 11 python sensor i2c raspberry-pi smbus
我正在设置Raspberry Pi来记录Sensirion SCD30传感器的数据(CO2,湿度和温度).我的代码在python3中,使用SMBus库通过Pi的GPIO中的I2C引脚与传感器通信.有一个命令可以确定传感器是否准备好发送数据.
该值0x0202通过I2C发送,并返回3个字节的数据:
0x00 0x00 0x81 for data not ready
0x00 0x01 0xB0 for data ready
Run Code Online (Sandbox Code Playgroud)
前两个字节是MSB和数据就绪值的LSB.正确结合他们应该0x0000和0x0001.第三个字节是前两个字节的CRC8.这是用多项式0x31和初始化计算的0xFF.
大约一半的时间,字节以错误的顺序发送.而不是MSB LSB CRC发送MSB CRC LSB.例如,如果数据准备就绪,则可能发送0x00, 0xB0, 0x01而不是0x00, 0x01, 0xB0.我无法弄清楚为什么会发生这种情况,我担心发送数据时会出现一些损坏或问题.我可以更改代码以识别CRC是否是第二个字节,但我想找到潜在的问题.
我正在使用smbus库发送和接收I2C数据.这是我发送命令和读取数据的代码:
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
Run Code Online (Sandbox Code Playgroud)
对于我上面给出的示例,我将运行以下代码:
ready = readRegister(0x0202, 3) # returns a list of 3 bytes
print(ready)
Run Code Online (Sandbox Code Playgroud)
并将返回上面演示的3个字节的列表.
你有什么样的工具和技能?
\n\n(我的第一反应是搜索 SCD30 勘误表,但我找不到任何内容,快速网络搜索也没有发现任何类似的问题。)
\n\n如果您有示波器或逻辑分析仪,请查看 SCL 和 SDA,并确认问题出在 Raspberry Pi 上(也可能出在传感器上)。
\n\n您可以更换设置的任何硬件组件吗?只是为了消除出现故障的可能性。
\n\n您可以用 C 重写代码(使用 /dev/i2c-x),看看问题是否仍然存在 - 这要么告诉您问题出在 I\xc2\xb2C 主控、接线、SCD30 芯片的内核驱动程序中或者smbus位于代码段和内核驱动程序之间的库或其他软件中。
祝你好运
\n| 归档时间: |
|
| 查看次数: |
1058 次 |
| 最近记录: |