В любом устройстве с I2C-линиями, стоит мастеру первым делом дергать SCL ножкой 9 раз
План по восстановлению I2C шины в случае припадка
- Случай 1. Не страшно. Мы и есть слейв девайс
- Случай 2. Страшнее. Любая помеха на линии или непредвиденный мультимастерринг может привести к “зависшему” состоянию любого девайса
В случае 1
- Нужно понять, что именно мы зависли и нужно предпринять действие
- Сбросить клок, питание с периферии I2C, переконфигурировать ножки
- Запустить процесс конфигурации заново
- Очистить объект, связанный с данным I2C
- После успешного старта – запускаем прерывания
В случае 2
Есть 2 варианта
Страшнее, но решаемо
- Зависла линия SDA
- Сбросить клок, питание с периферии I2C, переконфигурировать ножки
- Отправить на линию 9 тиков клока. В один из тиков, зависшая периферия должна отпустить ножку данных.
3.1 ПРОВЕРИТЬ, что линия SDA отпущена. Если линия застряла и не восстановилась – нужен POR - Запустить процесс конфигурации заново
- После успешного старта – запускаем прерывания
Страшно, вырубай
- Зависла линия SCL
Если у нас нет физических линий nRESET к I2C девайсам – эта ситуация выглядит самой плохой. Единственное возможное решение – POR всего устройства.
Литература
Даташит на PCAL. Раздел 9.5
Про I2C-шину от TI
Comment