Wire.endTransmission() зависает

Я написал код, который передает данные по каналу I2C, идентификатор устройства и все остальное работает нормально. Единственная проблема заключается в том, что мой код зависает в Wire.endTrasnmission().

Обнаружил проблему, используя последовательные отладочные сообщения.

Странная вещь:

Когда я отсоединяю линию SCL (A5 на arduino Pro Mini), зависание исчезает, и код снова начинает функционировать.

Поиск привел меня на этот форум http://forum.arduino.cc/index.php?topic=66353.0

где парень рассказывает о фрагменте кода

if(hang)
unfreeze();

возможно ли это, если да, то где мне его разместить?

Наблюдение: Зависание исчезнет, если я отключу линию SCL на любом из подключаемых arduino, sam edoes не произойдет, если я отключу SDA.

, 👍5

Обсуждение

единственное место некоторый код для решения проблемы может быть там, где код все еще работает во время зависания: внутри библиотеки twi., @BrettAM

Я пытался изменить размер буфера, как указано на некоторых форумах, но все равно это не работает., @ArunMKumar

Загляните в [сторожевой таймер](http://www.nongnu.org/avr-libc/user-manual/group__avr__watchdog.html). Вы можете настроить его на сброс чипа, если таймер не был сброшен, например, в течение 2 секунд. Просто вызывайте wdt_reset() в каждом цикле., @Gerben


1 ответ


7

Идентификатор устройства и все остальное работает нормально. Единственная проблема заключается в том, что мой код застревает в Wire.endTransmission().

  • Ничего не передается до тех пор, пока вы не вызовете Wire.endTransmission(), так что именно там он будет зависать.

  • Вы не должны пытаться выполнять проводную передачу внутри ISR (если вы это делаете).

  • Существует альтернатива проводной библиотеке, которая отключает время ожидания, а не зависает. Он находится по адресу: Arduino I2C Master Library.

  • Убедитесь, что у вас есть подтягивающие резисторы на SDA и SCL. Обычно 4,7 К от обоих до +5 В.

  • Если ничего из этого не поможет, пожалуйста, опубликуйте свой код.

,

Ссылка на основную библиотеку Arduino I2C не работает. Теперь он на GitHub: https://github.com/rambo/I2C., @Casey

@Casey (вздыхает) Будем надеяться, что *эта* ссылка не исчезнет. Исправленный ответ. Спасибо., @Nick Gammon

@Casey С немного большей репутацией (например, 1000) вы сможете редактировать ответы и исправлять подобные вещи, что вполне приемлемо, если вы не меняете намерение ответа., @Nick Gammon

Я думаю, вы можете предложить правки с довольно низким повторением, я точно не знаю, каков этот порог., @Nick Gammon

Спасибо за это. Мне придется научиться редактировать, если SE когда-нибудь даст мне штаны для большого мальчика. Стоит отметить, что исходная библиотека DSS Circuits I2C находится на github (https://github.com/DSSCircuits/I2C-Master-Library), но она умерла 8 лет назад и была разветвлена и перенесена rambo (https:// github.com/rambo/I2C), на котором в этом году наблюдается некоторая активность., @Casey