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