3.23. Основы I2C¶
I2C (Inter-Integrated Circuit, произносится «ай-квадрат-си» или «ай-ту-си») – это двухпроводная последовательная шина, предназначенная для связей на короткие расстояния между микросхемами на одной плате. По приоритетам она находится между SPI и UART: медленнее SPI, но экономичнее по выводам, и адресуемая (несколько устройств на одних и тех же двух проводах) там, где SPI требует отдельной линии CS на каждое устройство.
I2C – предпочтительная шина для низкоскоростных датчиков – акселерометров, датчиков температуры, датчиков влажности, магнитометров, часов реального времени, EEPROM – где экономия выводов и упрощение шины важнее голой пропускной способности.
3.23.1. Два провода, оба с открытым стоком¶
У шины I2C всего два сигнала:
SCL (последовательная тактовая частота). Управляется контроллером (большую часть времени).
SDA (последовательные данные). Управляется тем устройством, которое говорит в данный момент – контроллером во время адреса и исходящих данных, периферийным устройством во время чтения и битов ACK.
Обе линии имеют открытый сток: каждое устройство на шине может опустить линию к земле, но никогда не выдаёт высокий уровень. Два подтягивающих резистора на шине (обычно от 2.2 kΩ до 10 kΩ к шине питания) поднимают линии в высокий уровень, когда никто не тянет их вниз. Поведение по схеме «монтажное ИЛИ» следует отсюда – любое устройство, опускающее линию, побеждает, а высокий уровень означает просто «никто не говорит».
Внутренних подтягивающих резисторов микроконтроллера на его выводах SCL и SDA обычно не достаточно, чтобы самостоятельно служить подтяжкой шины; как правило, нужны внешние резисторы на шине. Многие отладочные платы датчиков уже содержат их; перед добавлением дополнительных проверьте техническое описание.
3.23.2. Транзакция¶
Каждая транзакция I2C имеет одну и ту же структуру:
Транзакция 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-битное адресное пространство охватывает 0x08 – 0x77; значения на краях зарезервированы для специальных целей. Адрес каждого устройства задаётся разработчиком микросхемы; многие компоненты позволяют изменять несколько младших битов на уровне платы (привязав вывод к высокому или низкому уровню), чтобы два одинаковых датчика могли находиться на одной шине.
Если два устройства имеют общий адрес, нет способа обратиться к одному из них, чтобы другое не вмешивалось, поэтому перед объединением компонентов проверьте техническое описание. i2c.scan() (рассматривается в I2C в коде) проходит по адресному пространству и сообщает, какие адреса отвечают, что является стандартным способом узнать, что находится на шине.
3.23.4. Сильные и слабые стороны¶
Сильные и слабые стороны шины определяют её нишу:
Два вывода для многих устройств. Одна пара SCL/SDA может обслуживать дюжину датчиков. SPI потребовал бы дополнительного вывода CS на каждое устройство.
Стандартные скорости.
100 kHz(«стандартный режим») и400 kHz(«быстрый режим») покрывают почти каждый датчик.1 MHzдостижима, но начинает предъявлять больше требований к ёмкости шины и подбору подтягивающих резисторов.Медленная по сравнению с SPI. Всему, что передаёт более нескольких сотен килобит в секунду, нужен SPI.
Конфликты адресов. Два устройства с одинаковым адресом на одной шине – аппаратная ошибка, которую протокол обойти не может.