使用Raspberry Pi Python SMBus接收无序的I²C字节

2024-09-29 19:28:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在设置一个树莓Pi来记录Sensirion SCD30传感器的数据(CO2、湿度和温度)。我的代码是python3,使用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

前两个字节是data ready值的MSB和LSB。正确组合,它们应该是0x0000和{}。在

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

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

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

^{pr2}$

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

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

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


Tags: 数据代码命令fordata字节pilink
3条回答

SMBus库是不对的,因为SCD30需要比Linux i2c-dev库提供的更长的I²C命令。在

我们成功地使用pigpiod通过Python与传感器对话。我们的SCD30代码和安装说明(以及时钟拉伸问题的解决方案)可以找到here on GitHub。在

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

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

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

你能更换任何硬件组件的设置-只是为了消除一些奇怪的机会出错。在

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

祝你好运

可能是上拉电阻的问题。在

参见I²C Bus Pull-up Resistor Calculation

上拉电阻计算

强上拉(小电阻)会阻止IC上的I²C引脚驱动低电平。集成电路的输入缓冲器可以将VOL电平读作有效的逻辑低电平,它决定了最小上拉电阻[RP(min)]。RP(min)是VCC、VOL(max)和IOL的函数。在

Rp(最小值)=(VCC-VOL(最大值))/IOL

由于I²C标准上升时间规格,最大上拉电阻受总线电容(Cb)的限制。如果上拉电阻值过高,I²C线路在拉低之前可能不会上升到逻辑高电平。从时间t=0开始,RC电路对振幅VCC的电压阶跃的响应用the time constant RC表示。在

相关问题 更多 >

    热门问题