Embedded-IIC заблокирована обработка проблем

I2C на самом деле не очень стабильный протокол связи.

С одной стороны, это протокол связи с несколькими устройствами, и каждый узел связи работает с шиной, но I2C-адрес каждого устройства отличается. Состояние всей шины и устройств на каждой шине связаны.

Когда в устройстве возникает проблема, это может повлиять на всю шину, вызвать проблему с шиной и серьезно вызвать сбой связи во всей шине.

С другой стороны, большая часть обмена данными, обрабатываемого I2C, представляет собой операцию чтения и записи регистра периферийного чипа (например, микросхемы зарядки, чипа NFC, EEPROM и т. д.) Этот протокол связи прикладного уровня относительно прост, и ключ заключается в том, что кадр данных не проверяется. , отправленные данные вступят в силу после их получения.

На физическом уровне связи I2C имеет только механизм ACK, и нет функции проверки достоверности данных.Как только форма сигнала передачи будет затронута, возникнут ошибки данных, но ни отправитель, ни получатель не знают об этом.

Другими словами, связь по шине I2C легко нарушить. Распространенная ситуация заключается в том, что если контакты I2C выставлены наружу, например, подключены к разъему, а затем частое подключение и отключение разъема может вызвать ошибки передачи данных по шине I2C; и когда продукт протестирован на электростатический разряд, он также может Это вызовет ошибку связи по шине I2C.

Возможные ошибки включают ошибку схемы контроллера I2C, ошибку драйвера I2C, ошибку уровня программного приложения и т. д. Ошибка на уровне программного приложения может быть вызвана ненормальным рабочим состоянием периферийного чипа или ненормальным рабочим состоянием основного чипа управления.

Например, я столкнулся с микросхемой зарядного устройства, управляемой I2C, и соединение между основной микросхемой управления и основной микросхемой управления осуществляется через разъем на базе. Проблемы могут легко возникнуть, когда устройства часто подключаются и отключаются от базы, вызывая зарядку и остановку. Поскольку контакты SCL и SDA не разъединяются и не подключаются одновременно, эти два контакта расположены в два ряда, а два ряда наперстков не являются плоскими. другой свяжется или отключится позже. В частности, когда соединение отключено, это может повлиять на текущую связь I2C и может произойти ошибка зарядки.

Для этой проблемы позже был уменьшен объем данных I2C-связи и добавлена ​​защита в связи.Перед отправкой данных оценивалась стабильность соединения, и передача немедленно останавливалась, если во время передачи возникала ошибка.

Есть еще одна проблема,это тоже проблема подключения I2C к зарядному устройству и измерительной IC.Этот не отключается,но во время дроп-теста,из-за вибрации,произошла ошибка на шине I2C.SDA снесло вниз, не может общаться и влияет на зарядку.

Когда что-то пошло не так, я также пробовал некоторые операции восстановления, такие как использование GPIO для подтягивания SDA, но это не сработало. Позже, согласно другим проектам, возникли аналогичные проблемы, и было обнаружено, что, поскольку в батарее использовалась микросхема датчика Maxim, передача I2C прерывалась из-за механической вибрации, плохого соединения и т. д., и SDA всегда отключался. Просто позаимствовал.

===Разделительная линия===

Решение проблем с шиной I2C

Протокол I2C был изобретен Филиппом, предшественником NXP.

Когда при обмене данными по шине I2C возникает ошибка, SDA I2C блокируется и устанавливается на низкий уровень.

Посмотреть спецификацию I2C: https://www.nxp.com/docs/en/user-guide/UM10204.pdf

глава:

3.1.16 Очистка шины

В маловероятном случае, когда часы (SCL) зависли на НИЗКОМ уровне, предпочтительной процедурой является сброс шины с помощью сигнала аппаратного сброса, если ваши устройства I2C имеют входы аппаратного сброса. Если устройства I2C не имеют входов аппаратного сброса, выключите и снова включите питание устройств, чтобы активировать обязательную внутреннюю схему сброса при включении питания (POR).

Если на линии данных (SDA) застрял НИЗКИЙ уровень, контроллер должен отправить девять тактовых импульсов. Устройство, которое держало шину в НИЗКОМ состоянии, должно освободить ее где-то в течение этих девяти тактов. Если нет, то используйте аппаратный сброс или выключите питание, чтобы очистить шину.

3.1.16 Сброс шины

В маловероятном случае, когда сигнал тактового генератора (SCL) застрял на низком уровне, если ваше устройство I2C имеет вход сброса аппаратного обеспечения, лучший способ — использовать сигнал сброса аппаратного обеспечения для сброса шины. Если устройство I2C не имеет входа аппаратного сброса, выключите и снова включите устройство, чтобы активировать обязательную внутреннюю схему сброса при включении питания (POR).

Если линия данных (SDA) застряла на низком уровне, мастер I2C должен отправить 9 тактовых импульсов. Устройство, которое устанавливает низкий уровень сигнала SDA, должно освободить сигнал SDA в какой-то момент в течение этих 9 тактов. Если нет, используйте аппаратный сброс или перезагрузку, чтобы сбросить ошибку шины.

Поэтому, когда SDA I2C принудительно отключается определенным устройством, описанный выше метод можно использовать для устранения ошибки шины I2C, отправив 9 тактовых циклов через ведущее устройство I2C.

Конечно, это временное решение.От источника оно может снизить частоту обмена данными I2C, уменьшить количество отправляемых данных и улучшить электрическую стабильность цепи I2C.Эти меры можно использовать для снижения вероятности шин I2C. проблемы.

Supongo que te gusta

Origin blog.csdn.net/guoqx/article/details/131202482
Recomendado
Clasificación