Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Общий протокол

Протокол I2C сложнее протокола последовательной связи, потому что поддерживает структурированный обмен между несколькими устройствами. Посмотрим, как он работает:

Контроллер → Target

Если контроллер хочет отправить данные target-устройству:

  1. Контроллер: передаёт START
  2. К: передаёт адрес target (7 бит) и восьмой бит R/W, установленный в WRITE (запись)
  3. Target: отвечает ACK (подтверждение)
  4. К: отправляет один байт
  5. T: отвечает ACK
  6. Повторить шаги 4 и 5 ноль или более раз
  7. К: передаёт STOP или начинает новую транзакцию чтения

ПРИМЕЧАНИЕ Адрес target мог бы быть 10-битным, а не 7-битным. Ничего другого при этом не изменилось бы.

Контроллер ← Target

Если контроллер хочет прочитать данные из target-устройства:

  1. К: передаёт START
  2. К: передаёт адрес target (7 бит) и восьмой бит R/W, установленный в READ (чтение)
  3. T: отвечает ACK
  4. T: отправляет байт
  5. К: отвечает ACK
  6. Повторить шаги 4 и 5 ноль или более раз
  7. К: передаёт STOP или начинает новую транзакцию записи

ПРИМЕЧАНИЕ Адрес target мог бы быть 10-битным, а не 7-битным. Ничего другого при этом не изменилось бы.

«Регистры устройства»

Многие target-устройства I2C внутри организованы как набор «регистров устройства», у каждого из которых есть 8-битный адрес и 8-битное содержимое. Обычно регистры записываются двухбайтовой записью: первый байт — адрес регистра, второй — новое значение регистра.

Так называемая «комбинированная» или «разделённая» транзакция может состоять из записи в target, после которой сразу же читается ответ от target, как показано на схеме выше. Обычно регистры устройства читаются именно так: сначала записывается адрес регистра, а затем сразу читается его текущее значение.

Некоторые target-устройства I2C могут читать и записывать несколько регистров с соседними адресами благодаря некой форме «автоинкремента адреса»: достаточно передать адрес первого регистра, а дальше устройство само увеличивает адрес для последующих чтений или записей.

I2C — сложный протокол, и существует много его вариаций и особенностей. Внимательно читайте руководство к вашему target-устройству, чтобы понять, что нужно сделать для связи с ним.