0

我正在尝试使用 TinyWireS 库通过 I2C 在 Arduino 和 AtTiny85 之间进行通信。我只需要 Arduino 向 AtTiny 发送命令,它不需要回话。

Arduino 正在使用 Wire 库,它工作正常,但是每当我尝试编译 AtTiny85 代码时,它都会出现以下错误:

libraries\TinyWireS\TinyWireS.cpp.o (symbol from plugin): In function `usi_onReceiverPtr':

(.text+0x0): multiple definition of `usi_onReceiverPtr'

sketch\ATtiny_Servo.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here

libraries\TinyWireS\TinyWireS.cpp.o (symbol from plugin): In function `usi_onReceiverPtr':

(.text+0x0): multiple definition of `usi_onRequestPtr'

sketch\ATtiny_Servo.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here

libraries\TinyWireS\TinyWireS.cpp.o (symbol from plugin): In function `usi_onReceiverPtr':

(.text+0x0): multiple definition of `_onTwiDataRequest'

sketch\ATtiny_Servo.ino.cpp.o (symbol from plugin):(.text+0x0): first defined here

collect2.exe: error: ld returned 1 exit status

exit status 1
Error compiling for board ATtiny25/45/85.

这是我的代码:

#include <TinyWireS.h>
#include <usiTwiSlave.h>
#define output (4)
#define I2C_SLAVE_ADDR (1)


void setup() {
  // put your setup code here, to run once:
  TinyWireS.begin(I2C_SLAVE_ADDR);
  pinMode(output, OUTPUT);
}

volatile byte msg = 0;

void loop() {
  if(TinyWireS.available())
    msg = TinyWireS.receive();

  if(msg == 1)
    digitalWrite(output, HIGH);
  else if(msg == 0)
    digitalWrite(output, LOW);
  else
    msg = 0;
}
4

1 回答 1

0

Maximilian Gerhardt 的评论说对了一半。你不应该包括<usiTwiSlave.h>第二次。TinyWireS 库的标头不使用#ifdef-#def括号。这通常可以确保编译一次以上。地址通过函数的参数提供给库begin()。所以我认为,在从属示例中,地址定义位于包含之前只是巧合。

顺便说一句:我从 TinyWireS 和 TinyWireM 库中创建了一个库。如果您有兴趣,请查看: https ://github.com/lucullusTheOnly/TinyWire

仅供参考:I2C/TwoWire 协议有保留地址,1 是其中之一。当向总线添加另一个设备时,这可能会出现问题。

于 2017-11-24T22:58:06.980 回答