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

Повторный START (repeated START)

Чтобы прочитать регистр датчика по I²C, контроллер сначала записывает номер регистра, а потом читает данные. Между этими частями он не отпускает шину, а сразу выдаёт новое условие START. Его называют повторным.

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

Повторный START (repeated START, обозначение Sr) — условие START на шине I²C, которое контроллер выдаёт, не завершая текущий обмен условием STOP. Электрически оно не отличается от обычного START, но шина при этом остаётся занятой: NXP в UM10204 так и пишет — START и повторный START функционально одинаковы.

Зачем он нужен

Типичный случай — чтение регистра датчика или памяти:

  1. START, адрес ведомого с R/W = 0 (запись), ACK.
  2. Номер регистра, ACK.
  3. Повторный START, тот же адрес с R/W = 1 (чтение), ACK.
  4. Байты данных; последний ведущий не подтверждает (NACK), затем STOP.

UM10204 называет это комбинированным форматом: при смене направления повторяются условие START и адрес, а бит R/W меняется на противоположный. Если ведущий был приёмником, перед повторным START он отвечает NACK. Как такая транзакция выглядит на линиях, показывает конструктор транзакции I²C.

Почему не STOP и START

TI в руководстве SLVA704 объясняет: STOP отпускает шину, и в системе с несколькими контроллерами её может захватить другой. Повторный START сохраняет шину за текущим контроллером. Если два контроллера всё же начали обмен одновременно, их разводит арбитраж, в том числе в ситуации, когда один выдаёт Sr, а другой — бит данных.

Спецификация SMBus использует повторный START в протоколах чтения, например READ WORD, и предупреждает, что не все устройства I²C его понимают.

Не путать с условием START после STOP: тогда между обменами шина свободна, а перед новым START шина должна быть свободна не меньше tBUF.

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

Чем повторный START отличается от обычного?

Электрически ничем: SDA переходит из единицы в ноль, пока SCL в единице. Отличие в том, что ему не предшествует STOP, поэтому шина остаётся занятой. NXP прямо пишет, что START и повторный START функционально одинаковы, и обозначает повторный как Sr.

Можно ли вместо повторного START послать STOP и START?

Если устройство сохраняет номер регистра после STOP, то да; так ли это, зависит от конкретной микросхемы. Но в системе с несколькими контроллерами после STOP шину может захватить другой контроллер. Требует ли устройство именно Sr, указывает его даташит.

Почему перед повторным START ведущий отвечает NACK?

Если ведущий читал данные, он не подтверждает последний байт, чтобы ведомый отпустил SDA. Иначе ведомый продолжит выдавать следующий бит, и сформировать условие START на SDA не получится. Этого требует UM10204 для комбинированного формата.

Источники

  1. NXP Semiconductors. UM10204: I2C-bus specification and user manual (Rev. 7.0, 1 October 2021) — разд. 3.1.4: шина остаётся занятой, если вместо STOP сформирован повторный START (Sr); функционально S и Sr одинаковы; разд. 3.1.10: контроллер может выдать Sr и обратиться к другому ведомому без STOP; комбинированный формат — при смене направления повторяются START и адрес с инвертированным R/W; контроллер-приёмник перед Sr отвечает NACK; разд. 3.1.8: арбитраж между Sr одного контроллера и битом данных или STOP другого; табл. 10: tBUF — время свободной шины между STOP и START
  2. Texas Instruments. Understanding the I2C Bus (SLVA704A, June 2015, rev. October 2026) — разд. 2.1.2: повторный START выглядит как START, но происходит до STOP, пока шина занята; заменяет пару STOP–START, чтобы в системе с несколькими контроллерами не потерять шину
  3. System Management Interface Forum. System Management Bus (SMBus) Specification, Version 3.3.1 (20 Oct 2024) — прил. B.5: протоколы чтения SMBus (например, READ WORD) используют повторный START, который понимают не все устройства I²C

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