Общий протокол
Протокол I2C сложнее протокола последовательной связи, потому что поддерживает структурированный обмен между несколькими устройствами. Посмотрим, как он работает:
Контроллер → Target
Если контроллер хочет отправить данные target-устройству:
- Контроллер: передаёт START
- К: передаёт адрес target (7 бит) и восьмой бит R/W, установленный в WRITE (запись)
- Target: отвечает ACK (подтверждение)
- К: отправляет один байт
- T: отвечает ACK
- Повторить шаги 4 и 5 ноль или более раз
- К: передаёт STOP или начинает новую транзакцию чтения
ПРИМЕЧАНИЕ Адрес target мог бы быть 10-битным, а не 7-битным. Ничего другого при этом не изменилось бы.
Контроллер ← Target
Если контроллер хочет прочитать данные из target-устройства:
- К: передаёт START
- К: передаёт адрес target (7 бит) и восьмой бит R/W, установленный в READ (чтение)
- T: отвечает ACK
- T: отправляет байт
- К: отвечает ACK
- Повторить шаги 4 и 5 ноль или более раз
- К: передаёт STOP или начинает новую транзакцию записи
ПРИМЕЧАНИЕ Адрес target мог бы быть 10-битным, а не 7-битным. Ничего другого при этом не изменилось бы.
«Регистры устройства»
Многие target-устройства I2C внутри организованы как набор «регистров устройства», у каждого из которых есть 8-битный адрес и 8-битное содержимое. Обычно регистры записываются двухбайтовой записью: первый байт — адрес регистра, второй — новое значение регистра.
Так называемая «комбинированная» или «разделённая» транзакция может состоять из записи в target, после которой сразу же читается ответ от target, как показано на схеме выше. Обычно регистры устройства читаются именно так: сначала записывается адрес регистра, а затем сразу читается его текущее значение.
Некоторые target-устройства I2C могут читать и записывать несколько регистров с соседними адресами благодаря некой форме «автоинкремента адреса»: достаточно передать адрес первого регистра, а дальше устройство само увеличивает адрес для последующих чтений или записей.
I2C — сложный протокол, и существует много его вариаций и особенностей. Внимательно читайте руководство к вашему target-устройству, чтобы понять, что нужно сделать для связи с ним.