Зависает библиотека Wire

kost82
Offline
Зарегистрирован: 30.11.2015

Читаю данные из внешней EEPROM типа at24c64. Почему то некоторые микросхемы читаются отлично, а некоторые подвешивают ардуино при чтении. Схему проверял, соединения хорошие, скетчи пробовал разные: примеры чтения/записи из библиотеки, сканер шины I2C, скорость соединения по i2c пробовал разную выставлять (Wire.setClock(clockFrequency)) - результат один и тот же. Зависает после Wire.endTransmission() наглухо.
Поискал по форумам - оказалось, что глюки стандартной библиотеки Wire не только у меня.
Вопрос в следующем: посоветуйте пожалуйста библиотеку взамен стандартной, в которой проблемы с зависанием нет и которая лично Вам нравится (может там плюшки полезные есть). Желательно чтобы для ESP8266 тоже подходила. Либо может обновления стандартной библиотеки есть?
Спасибо.

rkit
Offline
Зарегистрирован: 23.11.2016

Со стандартной библиотекой всё в порядке. Проблема в целостности сигнала. Если ты сделаешь библиотеку толерантную к плохому сигналу, то будешь получать плохие данные, что еще хуже зависания.

Dumper
Offline
Зарегистрирован: 21.09.2020

У меня есть какая-то. Ей всегда и пользуюсь. Стандартная или нет - не знаю. Знаю, что в каком-то месте костыль ставился. Работает безотказно. Могу заделиться.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Скорее всего, ты просто читаешь/пишешь неправильно. 

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

Косяк там один - размер буфера. Всё остальное там происходит в железе.

rkit
Offline
Зарегистрирован: 23.11.2016

Нет в железе тайм-аута. Поэтому если потерян или выскочил где-то лишний импульс, то в определенных условиях шина зависает, а библиотека ее упорно ждет. Это известная проблема и решается нерукожопой проводкой.

Upper
Offline
Зарегистрирован: 23.06.2020

kost82 пишет:
Либо может обновления стандартной библиотеки есть? Спасибо.

В стандартной библиотеке есть setWireTimeout и слова, что возможно в будущих версиях тайм-аут будет установлен по умолчанию в 25000 мкс, а пока он по умолчанию 0 т.е отключен.

Но если использовать тайм-ауты (что в общем более правильно), то надо переписывать программу для контроля и обработки возможных тайм-аутов.

Komandir
Komandir аватар
Offline
Зарегистрирован: 18.08.2018

rkit void twi_setTimeoutInMicros(uint32_t, bool);

просто надо использовать все возможности !

Если схема кривая, то это уже клиника ...