Raspberry Pi 4:Python3 smbus2 在所有 I2C 数据写入前添加 0x00

Posted

技术标签:

【中文标题】Raspberry Pi 4:Python3 smbus2 在所有 I2C 数据写入前添加 0x00【英文标题】:Raspberry Pi 4: Python3 smbus2 prepends 0x00 to all I2C data writes 【发布时间】:2021-05-14 17:16:54 【问题描述】:

我有工作的 C 和 Python3 代码,基于互联网上的简单示例,我可以正确地将数据从我的 Raspberry Pi4 发送到 Atmel SAM-E70 开发套件板。我连接了一个逻辑分析仪来查看正在发送的数据,对于我的 Python3 代码中的每个i2c_write_data_block(),smbus2 代码都会发送 7 位地址,然后是 0x00,然后是我想要的字节流发送。我的 C 代码发送相同的字节流,地址和数据之间没有 0x00。最后,使用 i2ctransfer() 从 shell 发送字节流也可以正常工作:没有额外的字节。

假设,可能是 smbus2 包正在尝试使用 10 位地址,但我找不到任何支持此假设的文档。事实上,我的发现表明 I2C 总线配置是通过配置文件执行的,这使我相信用于在 I2C 总线上进行通信的语言应该无关紧要——它具有相同的配置.

有没有其他人遇到过这种情况?

【问题讨论】:

这是 I²C 和 SMBus 协议 AFAIR 之间的区别。但是在 10 位地址的情况下,您应该在某处设置或重置一些位来触发它。我建议阅读文档。 据我所知,这些设备都设置为 7 位寻址。但这可能是 I2C 和 SMBUS 的差异。我将尝试使用不同的 I2C 封装。 【参考方案1】:

我在使用 smbus2 i2c_write_data_block() 函数时注意到了同样的事情。 为避免发送 0x00 起始字节,请使用 i2c_rdwr() 函数。

例子:

bus = SMBus(1)
address = 4
data = 'Some message'.encode()
msg = i2c_msg.write(address, data)
bus.i2c_rdwr(msg)

【讨论】:

我不再为出现此问题的公司工作,因此我没有硬件设置来验证您的答案 - 但我会检查您的答案是否最好。

以上是关于Raspberry Pi 4:Python3 smbus2 在所有 I2C 数据写入前添加 0x00的主要内容,如果未能解决你的问题,请参考以下文章

使用python3在Raspberry Pi上打开和关闭Tkinter GUI

Raspberry Pi 4B安装 OpenVINO™ 工具包

Rraspberry Pi 4B python3 安装opencv

能不能在 raspberry pi 上实现这样的网络设置

我如何让Raspberry Pi用python发送带有图片的电子邮件

拔出 Raspberry Pi 后导入模块时出现 Python EOFerror