使用i2C在RaspberryPi和Arduino之间进行通信。在我的Python代码中,我有以下内容,其中foo表示0-255之间的整数
问题是当值大于255时,根据我的理解,这大于单个字节。
任何人都可以告诉我如何改变以下内容,以便通过串行连接正确发送大于255的值吗?
bus = smbus.SMBus(1)
bus.write_byte(0x04, foo)
答案 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命令中。