Коротко о главном
При зависании I²C сначала выясните, какая линия остаётся в низком состоянии и какое событие этому предшествовало. Перезапуск программы ещё не доказывает устранение причины. Восстановлению нужны определённые ограничения и зарегистрированный итоговый результат.
Сохраните состояние до сброса
Запишите адрес, последнюю операцию, состояние драйвера и уровни SDA и SCL. Отличайте отсутствие ACK от постоянно занятой линии. Если приложение бесконечно повторяет запрос, исходная причина может потеряться среди последующих сообщений.
Воспроизведите проблему одной транзакцией. Отметьте, появляется ли она при включении, после сброса MCU или изменения напряжения. Такой порядок помогает отделить проблему последовательности событий от постоянной ошибки подключения и сохранить понятный исходный сценарий.
Проверьте питание вместе с сигналами
Проверьте питание и сброс датчика, а также напряжение подтяжек. Работающий контроллер не означает готовность всех участников. Уточните, может ли преобразователь уровней или другой компонент удерживать линию и сохраняется ли его питание.
Сравните сигналы у контроллера и датчика. Зафиксируйте имеющиеся подтяжки и ёмкости соединений вместо безусловного уменьшения сопротивления. Допустимые электрические параметры определяются компонентами и выбранным режимом шины; случайный успешный запуск не подтверждает весь диапазон условий.
Ограничьте процедуру восстановления
NXP описывает девять тактов при удержании SDA; для удерживаемой SCL могут потребоваться аппаратный сброс или перезапуск питания. Применимость зависит от схемы. NXP — UM10204 I²C-bus specification
На время восстановления запретите новые транзакции. При нескольких контроллерах согласуйте владение шиной. Не переводите открытые линии просто в активно управляемую единицу. Ограничьте количество попыток и выдайте определённую ошибку, если освободить линию не удалось.
Повторно синхронизируйте датчик
Освобождение шины не гарантирует правильной конфигурации датчика. Проверьте идентификатор и важные регистры, при необходимости восстановите настройки. До этого помечайте измерения как недействительные и только затем возвращайтесь к обычному опросу.
Пример испытания: контроллер перезапускается посреди передачи, а датчик остаётся под питанием. Проверьте обнаружение прерывания, ограниченную процедуру восстановления и результат: достоверные данные либо явно распознаваемая ошибка. Сохраните условия, чтобы испытание можно было повторить после изменения драйвера.
Что записать для испытания восстановления
- Уровни SDA/SCL и последнюю транзакцию.
- Состояния питания и сброса участников.
- Предел попыток и максимальное время ожидания.
- Результат проверки конфигурации датчика.
- Недействительные измерения и повторные ошибки.
Частые вопросы
Всегда ли помогает снижение частоты I²C?
Нет. Оно может прояснить некоторые временные проблемы, но не исправляет отсутствующее питание или постоянно удерживаемую линию. Сопоставляйте измерения до и после изменения.
Нужно ли повторять восстановление бесконечно?
Нет. Задайте подходящий изделию предел и определённое состояние отказа. Бесконечный цикл способен заблокировать другие задачи и скрыть исходную неисправность.
Технические источники
Услуга по теме