我想用我的树莓派通过I2C从我的Arduino Mega (以及另一个项目中的Arduino Micro )读取一块数据。代码必须用Perl编写,因为它是我的Home-Automation-Server的一种插件。
我正在使用Device::SMBus接口,并且连接正常,我能够写入和读取单字节。我甚至可以使用寄存器地址为0x00的writeBlockData。我随机发现这个地址是有效的。
但是当我想要readBlockData时,似乎没有寄存器地址起作用。
有没有人知道正确的寄存器地址,或者这甚至不是导致错误的问题?
提前感谢
发布于 2017-08-12 03:30:12
首先,您要读取哪个(哪些)寄存器?下面是一个使用我的RPi::I2C软件的示例(它应该与您正在使用的发行版非常相似),同时还有一个草图,其中包含一组配置为读/写的伪寄存器。
首先是Perl代码。它读取两个字节(设置为寄存器80的引脚A0的analogRead()的输出),然后将这两个字节位移位为16位整数,以获得引脚的完整0-1023值:
use warnings;
use strict;
use RPi::I2C;
my $arduino_addr = 0x04;
my $arduino = RPi::I2C->new($arduino_addr);
my @bytes = $arduino->read_block(2, 80);
my $a0_value = ($bytes[0] << 8) | $bytes[1];
print "$a0_value\n";这是一个完整的Arduino sketch,您可以查看它,它设置了六个左右的伪寄存器,当指定了每个寄存器时,Arduino将写入或读取相应的数据。如果未指定寄存器,则对0x00寄存器进行操作。
Arduino上的I2C总是在执行onReceive()之前执行onRequest()调用(在使用Wire时),所以我设置了一个全局变量reg来保存寄存器值,我在onReceive()中断中填充了该值,然后在onRequest()调用中使用该值向您指定的伪寄存器发送数据。
草图本身并没有真正做任何有用的事情,我只是将其作为一个示例。它实际上是我的RPi::WiringPi发行版的automated unit test platform的一部分。
https://stackoverflow.com/questions/45636845
复制相似问题