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.
@ArunMKumar, 👍5
Обсуждение1 ответ
Идентификатор устройства и все остальное работает нормально. Единственная проблема заключается в том, что мой код застревает в 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
- Пайка несовмещенных выводов Arduino Pro Mini
- Несколько РАЗРЫВОВ I2C с подтягивающими резисторами не работают
- Сбой при записи данных MPU-6050 на SD-карту
- Raspberry Pi, Teensy и Arduino на i2c
- Arduino зависает (вероятно, из-за I2C). Нужна помощь в написании надежного сценария.
- Arduino отключает шину i2c
- Отправка и получение различных типов данных через I2C в Arduino
- Как работают функции вне цикла void?
единственное место некоторый код для решения проблемы может быть там, где код все еще работает во время зависания: внутри библиотеки twi., @BrettAM
Я пытался изменить размер буфера, как указано на некоторых форумах, но все равно это не работает., @ArunMKumar
Загляните в [сторожевой таймер](http://www.nongnu.org/avr-libc/user-manual/group__avr__watchdog.html). Вы можете настроить его на сброс чипа, если таймер не был сброшен, например, в течение 2 секунд. Просто вызывайте wdt_reset() в каждом цикле., @Gerben