Ошибка связи между 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 является одним из них. Это может вызвать проблемы при добавлении другого устройства в шину.