2

我想通过 I2C 使用我的 Raspberry Pi 从我的 Arduino Mega(以及另一个项目中的 Arduino Micro)中读取数据块。代码必须在 Perl 中,因为它是我的 Home-Automation-Server 的插件。

我正在使用Device::SMBus接口并且连接正常,我能够写入和读取单个字节。我什至可以writeBlockData与注册地址一起使用0x00。我随机发现这个地址有效。

但是当我想要时readBlockData,似乎没有注册地址起作用。

有谁知道正确的寄存器地址,或者这甚至不是导致错误的问题?

提前致谢

4

1 回答 1

1

首先,您要读取哪个寄存器?这是一个使用我的RPi::I2C软件的示例(它应该与您正在使用的发行版非常相似),以及一个配置了一堆用于读/写的伪寄存器的草图。

首先,Perl 代码。它读取两个字节(设置为 registeranalogRead()的引脚的输出),然后将这两个字节移位为 16 位整数以获得引脚的完整 0-1023 值:A080

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 草图,您可以查看它设置了六个左右的伪寄存器,当指定每个寄存器时,Arduino 会写入或读取适当的数据。如果未指定寄存器,则对0x00寄存器进行操作。

Arduino 上的 I2C 总是onReceive()先调用onRequest()(使用时Wire),所以我设置了一个全局变量reg来保存寄存器值,我将其填充到onReceive()中断中,然后在onRequest()调用中使用它来向您发送数据在您指定的伪寄存器上。

草图本身并没有真正做任何有用的事情,我只是把它作为一个例子。它实际上是我的RPi::WiringPi发行版的自动化单元测试平台的一部分。

于 2017-08-11T19:30:11.780 回答