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

时间:2014-07-17 19:42:49

标签: python serial-port arduino raspberry-pi

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

任何人都可以告诉我如何改变以下内容,以便通过串行连接正确发送大于255的值吗?

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

1 个答案:

答案 0 :(得分:1)

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

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

这会向地址为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位寄存器编号。 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命令中。