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

Растягивание такта I²C

На шине I²C ведомое устройство может придержать линию SCL в нуле, если не успевает обработать данные. Ведущий обязан дождаться, пока линия поднимется. Это растягивание такта — законная пауза, которую поддерживают не все ведущие.

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

Растягивание такта (clock stretching) — механизм шины I²C, при котором ведомое устройство удерживает линию SCL в нуле, сообщая ведущему: «подожди». Ведущий отпускает SCL, но видит, что линия не поднялась, и ждёт, пока ведомое её отпустит.

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

ШинаОграничение растягивания
I²C Standard, Fast, Fast-mode Plusдлительность не ограничена
I²C High-speedтолько на уровне байта
I²C Ultra Fast-modeне поддерживается
SMBusустройство, держащее такт дольше 25–35 мс, считается зависшим

Пример использования — датчики влажности Sensirion SHT3x: в режиме однократного измерения с растягиванием такта датчик держит SCL, пока не закончит измерение, и сразу отдаёт результат. Сравнение датчиков — в статье «Датчики влажности».

Подвох в совместимости. Большинство простых ведомых растягивать такт не умеют, а некоторые ведущие — аппаратные или программные — не дожидаются отпускания SCL или ограничивают ожидание. Если устройство требует растягивания, а ведущий его не поддерживает, обмен срывается; тогда выбирают режим датчика без растягивания и опрос готовности. Работа шины, подтяжки и адресация — в статье «Интерфейс I²C».

Частые вопросы

Зачем ведомому растягивать такт?

Чтобы успеть: сохранить принятый байт, подготовить ответ или закончить измерение. Например, датчик Sensirion SHT3x умеет держать SCL в нуле, пока идёт измерение, и отдаёт результат, как только он готов, — ведущему не нужно ждать вслепую.

Почему датчик не работает с растягиванием такта?

Не все ведущие его поддерживают или ограничивают его длительность. По спецификации I²C длительность не ограничена, а на шине SMBus устройство, держащее такт дольше 25–35 мс, считается зависшим. Если ведущий не дожидается, используют режим датчика без растягивания и опрос готовности.

Как физически работает растягивание такта?

Линии I²C — открытый сток: ведущий отпускает SCL, ожидая единицу, но линия остаётся в нуле, потому что её держит ведомое. Ведущий видит это и ждёт, пока SCL поднимется подтяжкой. Короткого замыкания при этом нет.

Источники

  1. NXP Semiconductors. UM10204: I2C-bus specification and user manual, Rev. 7.0, 1 October 2021 — разд. 3.1.9: ведомое может держать SCL в нуле после приёма байта или на каждом бите, ведущий ждёт; длительность в I2C не ограничена; в режиме Hs — только на уровне байта, в UFm не поддерживается
  2. System Management Interface Forum. System Management Bus (SMBus) Specification, Version 3.3.1, 2024 — табл. 2: таймаут 25–35 мс — устройство, удерживающее такт дольше, считается зависшим; минимальная частота 10 кГц
  3. Sensirion. Datasheet SHT3x-DIS: Humidity and Temperature Sensor (Version 7, December 2022) — режим однократного измерения с растягиванием такта: датчик держит SCL, пока измерение не закончено

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