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