Приветствую всех участников форума. Хочу поделиться следующей проблемой и по-возможности получить совет в её решении. Выполняя один проект, в котором две Ардуино общаются по шине i2c, столкнулся с глюками при симуляции в среде Proteus, а именно. Одна Ардуино выступает в роли мастера, другая в роли ведомого, так вот от мастера к ведомому проходят команды отлично и обрабатываются ведомым тоже отлично в событии onReceive(). Но когда пытаюсь запросить от ведомого несколько байт данных методом requestFrom(), то получаю какой-то бред. Причём даже стандартные примеры к библиотеке wire неправильно работают. Может кто сталкивался с подобной проблемой и смог её решить, подскажите... Проект очень сложный и искать другую среду для симуляции не вариант. Отлаживать в реальном железе очень тяжело, так как постоянно нужны поправки. Заранее благодарен!!!
Именно с I2C не сталкивался, но с рядом других вещей у меня странная вещь в протеусе - ардуина не работала, а микросхема ATmega328P работала отлично. Как такое может быть, если у них по идее одна слайс-модель - не спрашивайте, не знаю. Но факт такой был. Попробуйте Ваши дела на голой микросхеме, может прокатит.
А придется. И лучше всего для этого использовать внутрисхемный отладчик, ну или ЛА. Всё остальное - это фуфел. а это что? Что-то абдуриновское? I2C сложен, да, но прекрасно выкуривается. Все необходимые апноуты лежат на микрочипе.
Пробовал, к сожалению, не прокатило. Заметил несколько странностей: если в скетче мастера не писать Wire.begin(), то данные читаются с ведомого правильно, за исключением 1-го бита. В него всегда лезет число 255 при любых раскладах. Если же сделать всё по инструкции и инициализировать шину командой Wire.begin(), то при запросе байтов от ведомого получим вообще бред. Видимо всё-таки придётся отказаться от Протеуса. Честно говоря очень разочарован тем, что такой мощный симулятор лагает на такой ерунде, как i2c.
Сталкивался с такой проблемой при работе с Wire . Все дело в том, что буффер передачи ограничен в данной библиотеке. Решением было переписать пару строк внутри. В частности в WIre.h - #define BUFFER_LENGTH 32 -> #define BUFFER_LENGTH 96 В этой-же библиотеке внутри папки Utility внутри twi.h - #define TWI_BUFFER_LENGTH 32 - #define TWI_BUFFER_LENGTH 96. Так же расширил буффер в самой библиотеке I2C аналогичным образом. Надеюсь поможет, попробуй.
Спасибо за совет, но дело не в буфере. Проблема наблюдается даже при передаче одного байта. Более-менее корректно отрабатывает tinkercad, не его минус в том, что нельзя добавлять свои библиотеки.