Ошибка связи между ATtiny85 и Arduino через I2C с использованием TinyWireS

Я пытаюсь установить связь между Arduino и AtTiny85 с I2C, используя библиотеку TinyWireS. Мне нужно только 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;
}

1 ответ

Комментарий Максимилиана Герхардта наполовину прав. Вы не должны включать <usiTwiSlave.h> второй раз. Заголовок библиотеки TinyWireS не использует #ifdef-#def скобки. Обычно это гарантирует, что ничего не будет скомпилировано более одного раза. Адрес дается библиотеке через параметр begin() функция. Поэтому я думаю, что в примере с ведомым устройством это просто совпадение, что определение адреса стоит перед включением.

Кстати, я сделал одну библиотеку из библиотеки TinyWireS и TinyWireM. Если вы заинтересованы, проверьте это: https://github.com/lucullusTheOnly/TinyWire

И к вашему сведению: протокол I2C/TwoWire имеет зарезервированные адреса, и 1 является одним из них. Это может вызвать проблемы при добавлении другого устройства в шину.

Другие вопросы по тегам