Как проверить шину 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 мультиметром во время обмена?
Только грубо: мультиметр усредняет быстрые импульсы, и при обмене покажет что-то между нулём и питанием. Посмотреть сами сигналы можно осциллографом или логическим анализатором; мультиметр полезен для проверки уровней в покое.
Источники
- 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 зависла в нуле — контроллер выдаёт девять тактов, за которые устройство должно отпустить линию, иначе аппаратный сброс или выключение питания
- Fluke. 114, 115 and 117 True-rms Multimeters, Users Manual (PN 2572573, July 2006, Rev. 1, 2/07) — постоянное напряжение: предел 6,000 В, погрешность 0,5 % + 2 единицы; входное сопротивление больше 10 МОм
Нашли ошибку?