gpt4 book ai didi

Python SMBus write_byte 和大于 1 字节 (255) 的值

转载 作者:太空宇宙 更新时间:2023-11-03 18:17:18 26 4
gpt4 key购买 nike

使用 i2C 在 RaspberryPi 和 Arduino 之间进行通信。在我的 Python 代码中,我有以下内容,其中 foo 表示 0-255 之间的整数。
问题是当该值大于 255 时,根据我的理解,它大于一个字节。

谁能告诉我如何更改以下内容,以便通过串行连接正确发送大于 255 的值?

bus = smbus.SMBus(1)
bus.write_byte(0x04, foo)

最佳答案

这可能取决于您要写入的设备,但是:

my_data = (0x10, 0x11, 0x20, 0x32)
bus.write_i2c_block_data(dev_address, dev_reg, my_data)

这会将数据 block 发送到地址为 dev_address 的设备以注册 dev_reg,并将数据八位位组(字节)发送到 my_data 中。

dev_reg 中没有什么神奇之处,它通常只是 SMBus 中的命令/寄存器八位字节,即它是地址后发送的第一个字节。

<小时/>

如果您只想发送 16 位(整数 i)到地址为 dev_address 的设备,您可以使用:

bus.write_i2c_block_data(dev_address, i & 0xff, ((i >> 8) & 0xff,))

该命令实际上组合了第二个参数(设备寄存器)和有效负载(八位位组列表)并将它们组合在一起发送。通常第一个数据八位字节是命令或寄存器号。这里,16 位字的第一个八位字节(最低有效八位字节)在设备寄存器的位置发送,第二个八位字节(最高有效八位字节)在有效负载中发送。

但是,对于这种特定情况,您还可以使用 write_byte_data 调用:

bus.write_byte_data(dev_address, i & 0xff, (i >> 8) & 0xff)

这两个函数调用都适用于每个设备除了设备地址之外还有一个 8 位寄存器号的协议(protocol)。 I2C只规定每个设备有一个7位地址,其余的由应用程序决定。

因此,上述说明的枯萎应该发送:

<start>
<7-bit address> + <write bit>
<8-bit byte>
<8-bit byte>
<stop>

通常第一个 8 位八位字节是设备寄存器。

如果您想从设备读取某些内容,简单的情况是:

<start>
<device address> + <read bit>
<read octet #1>
...
<stop>

但是,您经常希望将注册号传达给设备,在这种情况下您需要发送:

<start>
<device address> + <write bit>
<8 bits: register number>
<start>
<device address> + <read bit>
<read octet #1>
...
<stop>

由于这些交互有点复杂,因此它们被封装在 API 命令中。

关于Python SMBus write_byte 和大于 1 字节 (255) 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24812185/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com