Перейти к содержанию

Как проверить шину I2C?

Обновлено Редакция GAW

Почти все неисправности I²C видны уже по уровням линий в покое. По спецификации NXP UM10204 SDA и SCL подключены к питанию через подтягивающие резисторы, а выходы всех устройств — с открытым стоком: они умеют только прижимать линию к нулю. Поэтому на свободной шине обе линии должны быть в высоком уровне.

Порядок проверки

Что видноЧто это значитЧто делать
SDA и SCL около питания в покоешина свободна, подтяжки на местезапускать сканер
Обе линии около 0 Внет подтягивающих резисторов или линия замкнутапроверить подтяжки и монтаж
SDA в нуле, SCL в единицеведомый завис посреди передачидевять тактов SCL, затем сброс или выключение питания
SCL в нулекакое-то устройство держит тактаппаратный сброс или выключение питания устройств
Уровни в норме, сканер ничего не нашёлнет питания устройства, перепутаны SDA и SCL, неверная скоростьпроверить питание и разводку

Уровни меряют мультиметром на пределе 6 В относительно общего провода: его входное сопротивление больше 10 МОм почти не нагружает подтяжки в несколько килоом. Номинал подтягивающих резисторов под ёмкость и скорость шины подберёт калькулятор подтяжек I2C.

Сканер шины

Сканер по очереди посылает каждому адресу START, адрес с битом записи и STOP и запоминает тех, кто ответил подтверждением. Перебирают адреса 0x08–0x77: две группы по восемь адресов — 0000 XXX и 1111 XXX — по UM10204 зарезервированы. Скетч сканера для Arduino и разбор ответов — в статье «Шина I²C», а как выглядит каждая транзакция на линиях, нарисует конструктор транзакции I2C.

Если сканер нашёл, например, 0x27, а в даташите модуля указано 0x4E, ошибки нет: в даташите записан байт адреса со сдвигом на один бит. Подробно об этом — термин «Адрес I2C».

Похожие вопросы

Почему сканер I2C перебирает адреса только от 0x08 до 0x77?

Потому что по спецификации NXP две группы по восемь адресов зарезервированы: 0000 XXX (общий вызов, START-байт, CBUS, код режима Hs) и 1111 XXX (10-битная адресация и идентификатор устройства). Обычным устройствам остаются адреса 0x08–0x77.

Что делать, если SDA постоянно в нуле?

Скорее всего, ведомое устройство зависло посреди передачи и держит линию. По UM10204 контроллер должен выдать девять тактов SCL — за них устройство должно отпустить SDA. Если не помогло, нужен аппаратный сброс устройства или выключение его питания.

Можно ли проверить I2C мультиметром во время обмена?

Только грубо: мультиметр усредняет быстрые импульсы, и при обмене покажет что-то между нулём и питанием. Посмотреть сами сигналы можно осциллографом или логическим анализатором; мультиметр полезен для проверки уровней в покое.

Источники

  1. NXP Semiconductors. UM10204: I2C-bus specification and user manual, Rev. 7.0, 1 October 2021 — разд. 3.1.1: SDA и SCL — двунаправленные линии, подключённые к питанию через источник тока или подтягивающий резистор; на свободной шине обе линии в высоком уровне; выходы устройств — открытый сток или коллектор; скорости до 100 кбит/с, 400 кбит/с, 1 Мбит/с и 3,4 Мбит/с; число устройств ограничивает ёмкость шины; разд. 3.1.12: две группы по восемь адресов, 0000 XXX и 1111 XXX, зарезервированы; разд. 3.1.16: если SCL зависла в нуле — аппаратный сброс устройств или выключение питания; если SDA зависла в нуле — контроллер выдаёт девять тактов, за которые устройство должно отпустить линию, иначе аппаратный сброс или выключение питания
  2. Fluke. 114, 115 and 117 True-rms Multimeters, Users Manual (PN 2572573, July 2006, Rev. 1, 2/07) — постоянное напряжение: предел 6,000 В, погрешность 0,5 % + 2 единицы; входное сопротивление больше 10 МОм

Нашли ошибку?