Здравствуйте, столкнулся с проблемой. IDE отказывается компилировать стандартный скетч для модуля Troyka i2c Hub на Arduino Duo на базе ARM. Скетч из примера спокойно работает на Уно. Очень нужно завести на Дуо, помогите пожалуйста. Код (C++): // библиотека для работы с I²C хабом #include <TroykaI2CHub.h> // создаём объект для работы с хабом // адрес по умолчанию 0x70 TroykaI2CHub splitter; // можно создавать несколько объектов с разными адресами // подробнее читайте на: // http://wiki.amperka.ru/продукты:troyka-i2c-hub void setup() { // открываем последовательный порт Serial.begin(115200); // ждём открытия порта while(!Serial) { } // печатаем сообщение об успешной инициализации Serial-порта Serial.println("Serial init OK"); // начало работы с I²C хабом splitter.begin(); Serial.println("Splitter init OK"); // ждём одну секунду delay(1000); } void loop() { // счётчик цикла for (int i = 0; i < 8; i++) { // переключаем по очереди каналы splitter.setBusChannel(i); // выводим номер канала Serial.print("Set channel "); Serial.print(i); Serial.println(":"); // запускаем I²C сканер startScanerI2C(); // ждём одну секунду delay(1000); } } void startScanerI2C() { // переменная состояние ответа byte state; // переменная хранения текущего адреса byte address; // переменная для хранения количества найденых I²C устройств int countDevices = 0; // печатем о начале поиска Serial.println("Scanning..."); // перебираем по очереди все адреса от 0 до 127 for (address = 1; address < 127; address++ ) { // начинаем передачу данных по текущем адресу Wire.beginTransmission(address); // завершаем передачу данных state = Wire.endTransmission(); // если пришедший байт равен нулю if (state == 0) { // на адресе есть устройство // печатаем об этом Serial.print("I2C device found at address 0x"); // если адрес меньше 16, печатем ноль if (address < 16) { Serial.print("0"); } // печатаем текущий адрес в 16 разрядной системе исчесления Serial.print(address, HEX); Serial.println(" !"); // инкрементируем кол-во найденых устройств countDevices++; } } // если не найдено ни одного I²C устройства // печатаем об этом if (countDevices == 0) { Serial.println("No I²C devices found"); } else { // печатаем о завершении процесса Serial.println("Done"); } } Выдает следующую ошибку: Код (C++): Compiling .pio\build\due\FrameworkArduino\USB\CDC.cpp.o Compiling .pio\build\due\FrameworkArduino\USB\PluggableUSB.cpp.o Compiling .pio\build\due\FrameworkArduino\USB\USBCore.cpp.o Compiling .pio\build\due\FrameworkArduino\WInterrupts.c.o *** [.pio\build\due\lib227\TroykaI2CHub\TroykaI2CHub.cpp.o] Error 1 C:\Users\Pavel\.platformio\packages\framework-arduino-sam\cores\arduino\USB\USBCore.cpp: In function 'void USB_ISR()': C:\Users\Pavel\.platformio\packages\framework-arduino-sam\cores\arduino\USB\USBCore.cpp:688:21: warning: this 'else' clause does not guard... [-Wmisleading-indentatio n] else ^~~~ C:\Users\Pavel\.platformio\packages\framework-arduino-sam\cores\arduino\USB\USBCore.cpp:690:9: note: ...this statement, but the latter is misleadingly indented as if it were guarded by the 'else' UDD_Send8(EP0, 0); ^~~~~~~~~ ========================== [FAILED] Took 1.31 seconds ========================== Я так понимаю проблема скомпилировать этот файл библиотеки TroykaI2CHub.cpp Код (C++): #include "TroykaI2CHub.h" TroykaI2CHub::TroykaI2CHub(uint8_t i2cHubAddr) { _i2cHubAddr = i2cHubAddr; } TroykaI2CHub::~TroykaI2CHub() { } void TroykaI2CHub::begin() { Wire.begin(); setBusChannel(DEFAULT_CHANNEL); } void TroykaI2CHub::setBusChannel(uint8_t channel) { if (channel >= COUNT_CHANNEL) { return false; } Wire.beginTransmission(_i2cHubAddr); Wire.write(channel | ENABLE_MASK); Wire.endTransmission(); }
Вряд ли в таком простом коде TroykaI2CHub.cpp может что-то платформозависимое ломаться. Есть похожий вопрос в https://github.com/arduino/ArduinoCore-sam/issues/103 и исправление https://github.com/fubian/ArduinoCore-sam/commit/7eb6eeb167d515ccc1c66a08e0fcbe1449c6bd27 Смотрите, что там в вашем Platformio за версия USBCore.cpp
То, что Вы привели, к ошибке компилирования TroykaI2CHub.cpp не имеет ни какого отношения. Смотрите выше в выводе компиляции. Но на приведённое предупреждение тоже стоит обратить внимание.
Вот это в обычном Arduino IDE выдает: Код (C++): In file included from C:\Users\Pavel\AppData\Local\Arduino15\packages\arduino\hardware\sam\1.6.12\cores\arduino/Arduino.h:44:0, from C:\Users\Pavel\Documents\Arduino\libraries\TroykaI2CHub\src\TroykaI2CHub.h:14, from C:\Users\Pavel\Documents\Arduino\libraries\TroykaI2CHub\src\TroykaI2CHub.cpp:11: C:\Users\Pavel\Documents\Arduino\libraries\TroykaI2CHub\src\TroykaI2CHub.cpp: In member function 'void TroykaI2CHub::setBusChannel(uint8_t)': C:\Users\Pavel\AppData\Local\Arduino15\packages\arduino\hardware\sam\1.6.12\cores\arduino/wiring_constants.h:34:15: error: return-statement with a value, in function returning 'void' [-fpermissive] #define false 0x0 ^ C:\Users\Pavel\Documents\Arduino\libraries\TroykaI2CHub\src\TroykaI2CHub.cpp:27:16: note: in expansion of macro 'false' return false; ^ exit status 1 Ошибка компиляции для платы Arduino Due (Programming Port).
Хм... слона я не заметил. Попробуйте исправить тип возвращаемого значения в setBusChannel в TroykaI2CHub.cpp Код (C++): bool TroykaI2CHub::setBusChannel(uint8_t channel) { if (channel >= COUNT_CHANNEL) { return false; } Wire.beginTransmission(_i2cHubAddr); Wire.write(channel | ENABLE_MASK); Wire.endTransmission(); return true; } и в TroykaI2CHub.h Код (C++): bool setBusChannel(uint8_t channel);