Растягивание такта 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 поднимется подтяжкой. Короткого замыкания при этом нет.
Источники
- NXP Semiconductors. UM10204: I2C-bus specification and user manual, Rev. 7.0, 1 October 2021 — разд. 3.1.9: ведомое может держать SCL в нуле после приёма байта или на каждом бите, ведущий ждёт; длительность в I2C не ограничена; в режиме Hs — только на уровне байта, в UFm не поддерживается
- System Management Interface Forum. System Management Bus (SMBus) Specification, Version 3.3.1, 2024 — табл. 2: таймаут 25–35 мс — устройство, удерживающее такт дольше, считается зависшим; минимальная частота 10 кГц
- Sensirion. Datasheet SHT3x-DIS: Humidity and Temperature Sensor (Version 7, December 2022) — режим однократного измерения с растягиванием такта: датчик держит SCL, пока измерение не закончено
Нашли ошибку?
Смотрите также
- I²CSDA и SCL, START/STOP, ACK, адреса, скорости, расчёт подтяжек
- Открытый стокВыход только с транзистором к земле, единицу даёт подтяжка
- Адрес I²C7-битный адрес ведомого и байт адреса с битом R/W
- Датчики влажности SHT3x, HDC1080, HDC2080, BME280Точность, адреса, питание, отклик, дрейф, нагреватель, пересчёт и размещение