3.23. Основы I2C

I2C (Inter-Integrated Circuit, произносится «ай-квадрат-си» или «ай-ту-си») – это двухпроводная последовательная шина, предназначенная для связей на короткие расстояния между микросхемами на одной плате. По приоритетам она находится между SPI и UART: медленнее SPI, но экономичнее по выводам, и адресуемая (несколько устройств на одних и тех же двух проводах) там, где SPI требует отдельной линии CS на каждое устройство.

I2C – предпочтительная шина для низкоскоростных датчиков – акселерометров, датчиков температуры, датчиков влажности, магнитометров, часов реального времени, EEPROM – где экономия выводов и упрощение шины важнее голой пропускной способности.

3.23.1. Два провода, оба с открытым стоком

У шины I2C всего два сигнала:

  • SCL (последовательная тактовая частота). Управляется контроллером (большую часть времени).

  • SDA (последовательные данные). Управляется тем устройством, которое говорит в данный момент – контроллером во время адреса и исходящих данных, периферийным устройством во время чтения и битов ACK.

Обе линии имеют открытый сток: каждое устройство на шине может опустить линию к земле, но никогда не выдаёт высокий уровень. Два подтягивающих резистора на шине (обычно от 2.2 до 10 к шине питания) поднимают линии в высокий уровень, когда никто не тянет их вниз. Поведение по схеме «монтажное ИЛИ» следует отсюда – любое устройство, опускающее линию, побеждает, а высокий уровень означает просто «никто не говорит».

Внутренних подтягивающих резисторов микроконтроллера на его выводах SCL и SDA обычно не достаточно, чтобы самостоятельно служить подтяжкой шины; как правило, нужны внешние резисторы на шине. Многие отладочные платы датчиков уже содержат их; перед добавлением дополнительных проверьте техническое описание.

3.23.2. Транзакция

Каждая транзакция I2C имеет одну и ту же структуру:

Дорожки SCL и SDA. SDA падает, пока SCL находится в высоком уровне (START), затем SCL тактирует байты на SDA -- 7-битный байт адреса с битом чтения/записи и битом ACK, затем байт регистра и ACK, затем байт данных и NACK, затем SDA поднимается, пока SCL в высоком уровне (STOP).

Транзакция I2C: START, 7-битный адрес + R/W, ACK, регистр, ACK, данные, NACK, STOP.

Обмен разворачивается бит за битом:

  • START. Контроллер опускает SDA, пока SCL ещё в высоком уровне. Этот необычный фронт сообщает каждому устройству на шине, что вот-вот начнётся транзакция.

  • Адрес + R/W. Контроллер выдаёт 7-битный адрес периферийного устройства, за которым следует один бит чтения/записи (0 для записи, 1 для чтения).

  • ACK / NACK. После каждого байта приёмник удерживает SDA на один такт, чтобы подтвердить ACK (низкий уровень) или NACK (высокий уровень). На байте адреса периферийное устройство подтверждает приём, если узнаёт собственный адрес; если ни одно устройство не подтвердило, контроллер видит NACK и понимает, что такого адреса на шине нет.

  • Байты данных. За каждым следует ACK от приёмника. При записи периферийное устройство подтверждает каждый байт; при чтении контроллер подтверждает каждый байт, который хочет получить дальше, и выдаёт NACK на последний байт, чтобы сообщить периферийному устройству об остановке.

  • STOP. Контроллер отпускает SDA в высокий уровень, пока SCL в высоком уровне, завершая транзакцию.

Повторный старт (repeated start) – это второй START, выданный без STOP между ними – контроллер меняет направление (адрес записи, затем адрес чтения) на том же периферийном устройстве, не освобождая шину.

3.23.3. Адресация

7-битное адресное пространство охватывает 0x080x77; значения на краях зарезервированы для специальных целей. Адрес каждого устройства задаётся разработчиком микросхемы; многие компоненты позволяют изменять несколько младших битов на уровне платы (привязав вывод к высокому или низкому уровню), чтобы два одинаковых датчика могли находиться на одной шине.

Если два устройства имеют общий адрес, нет способа обратиться к одному из них, чтобы другое не вмешивалось, поэтому перед объединением компонентов проверьте техническое описание. i2c.scan() (рассматривается в I2C в коде) проходит по адресному пространству и сообщает, какие адреса отвечают, что является стандартным способом узнать, что находится на шине.

3.23.4. Сильные и слабые стороны

Сильные и слабые стороны шины определяют её нишу:

  • Два вывода для многих устройств. Одна пара SCL/SDA может обслуживать дюжину датчиков. SPI потребовал бы дополнительного вывода CS на каждое устройство.

  • Стандартные скорости. 100 kHz («стандартный режим») и 400 kHz («быстрый режим») покрывают почти каждый датчик. 1 MHz достижима, но начинает предъявлять больше требований к ёмкости шины и подбору подтягивающих резисторов.

  • Медленная по сравнению с SPI. Всему, что передаёт более нескольких сотен килобит в секунду, нужен SPI.

  • Конфликты адресов. Два устройства с одинаковым адресом на одной шине – аппаратная ошибка, которую протокол обойти не может.