stringtranslate.com

I²C

I 2 C ( Inter-Integrated Circuit ; произносится как « ай-скверд-си » или « ай-ту-си »), также известная как I2C или IIC , представляет собой синхронную , многоконтроллерную/многоцелевую (исторически называемую как ведущий/ведомый ), однопроводную , последовательную коммуникационную шину , изобретенную в 1982 году компанией Philips Semiconductors . Она широко используется для подключения низкоскоростных периферийных интегральных схем (ИС) к процессорам и микроконтроллерам для внутриплатной связи на короткие расстояния.

Несколько конкурентов, таких как Siemens , NEC , Texas Instruments , STMicroelectronics , Motorola , [1] Nordic Semiconductor и Intersil , представили на рынке совместимые с I 2 C продукты с середины 1990-х годов.

Шину I 2 C можно найти в широком спектре электронных приложений, где простота и низкая стоимость производства важнее скорости. Компоненты и системы ПК , которые используют I 2 C, — это последовательные EEPROM-устройства обнаружения присутствия (SPD) на двухрядных модулях памяти (DIMM), расширенные данные идентификации дисплея (EDID) для мониторов через разъемы VGA , DVI и HDMI , доступ к чипам NVRAM и т. д. Обычные приложения I2C включают считывание данных с аппаратных мониторов, датчиков, часов реального времени , управление исполнительными механизмами, доступ к низкоскоростным ЦАП и АЦП , управление простыми ЖК- или OLED- дисплеями, изменение настроек дисплея компьютера (например, подсветки, контрастности, оттенка, цветового баланса) через канал данных дисплея и изменение громкости динамика.

Особая сила I 2 C заключается в способности микроконтроллера управлять сетью чипов устройств с помощью всего двух универсальных контактов ввода-вывода и программного обеспечения. Многие другие технологии шин, используемые в аналогичных приложениях, такие как последовательная периферийная интерфейсная шина (SPI), требуют больше контактов и сигналов для подключения нескольких устройств.

Шина управления системой (SMBus), определенная Intel и Duracell в 1994 году, является подмножеством I 2 C, определяющим более строгое использование. Одной из целей SMBus является обеспечение надежности и совместимости. Соответственно, современные системы I 2 C включают некоторые политики и правила из SMBus, иногда поддерживая как I 2 C, так и SMBus, требуя лишь минимальной перенастройки либо путем использования командных, либо выходных контактов. Управление системой для ПК-систем использует SMBus, контакты которого распределены как в обычных разъемах PCI , так и в разъемах PCI Express .

Microchip MCP23008 8-битный I 2 C I/O расширитель в корпусе DIP-18 [2]

Дизайн

Пример схемы с одним контроллером ( микроконтроллером ), тремя целевыми узлами ( АЦП , ЦАП и микроконтроллер) и подтягивающими резисторами Rp

I 2 C использует только два сигнала : последовательную линию данных (SDA) и последовательную линию синхронизации (SCL). Оба являются двунаправленными и подтянуты резисторами . [3] Типичные используемые напряжения составляют +5  В или +3,3 В, хотя допускаются системы с другими напряжениями.

Эталонный дизайн I 2 C имеет 7-битное адресное пространство с редко используемым 10-битным расширением. [4] Обычные скорости шины  I 2 C — это стандартный режим 100 кбит/с и быстрый режим 400 кбит/с . Существует также низкоскоростной режим 10 кбит/с , но также допускаются произвольно низкие тактовые частоты. Более поздние версии I 2 C могут содержать больше узлов и работать на более высоких скоростях ( быстрый режим 400 кбит/с, быстрый режим 1 Мбит/с плюс, высокоскоростной режим 3,4  Мбит/с и  сверхбыстрый режим 5 Мбит/с ). Эти скорости более широко используются во встраиваемых системах, чем на ПК.

Обратите внимание, что скорости передачи данных указаны для передачи между контроллером (главным) и целью (подчиненным) без растяжения часов или других аппаратных накладных расходов. Накладные расходы протокола включают целевой адрес и, возможно, адрес регистра в целевом устройстве, а также побайтовые биты ACK/NACK. Таким образом, фактическая скорость передачи пользовательских данных ниже, чем предполагали бы эти пиковые скорости передачи данных. Например, если каждое взаимодействие с целью неэффективно позволяет передавать только 1 байт данных, скорость передачи данных будет меньше половины пиковой скорости передачи данных.

Число узлов, которые могут существовать на данной шине I 2 C, ограничено адресным пространством, а также общей емкостью шины 400  пФ , что ограничивает практические расстояния связи несколькими метрами. Относительно высокий импеданс и низкая помехоустойчивость требуют общего потенциала земли, что снова ограничивает практическое использование связью в пределах одной и той же платы ПК или небольшой системы плат.

Референсный дизайн

Вышеупомянутый референсный дизайн представляет собой шину с линиями синхронизации (SCL) и данных (SDA) с 7-битной адресацией. Шина имеет две роли для узлов, либо контроллер (ведущий), либо цель (ведомый):

Шина является многоконтроллерной, что означает, что может присутствовать любое количество узлов контроллера. Кроме того, роли контроллера и цели могут меняться между сообщениями (после отправки STOP).

Для данного шинного устройства может быть четыре потенциальных режима работы, хотя большинство устройств используют только одну роль и ее два режима:

В дополнение к битам данных 0 и 1 шина I 2 C допускает специальные сигналы START и STOP, которые действуют как разделители сообщений и отличаются от битов данных. (Это контрастирует с битами запуска и стоповыми битами, используемыми в асинхронной последовательной связи , которые отличаются от битов данных только своей синхронизацией.)

Контроллер изначально находится в режиме передачи контроллера, отправляя START, за которым следует 7-битный адрес цели, с которой он хочет связаться, за которым следует один бит, представляющий, хочет ли он записать (0) в цель или прочитать (1) из цели.

Если цель существует на шине, то она ответит битом ACK (активный низкий для подтверждения) для этого адреса. Затем контроллер продолжает либо в режиме передачи, либо в режиме приема (в соответствии с отправленным битом чтения/записи), а цель продолжает в дополнительном режиме (прием или передача соответственно).

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

Если контроллер хочет записать данные в цель, он многократно отправляет байт, а цель отправляет бит ACK. (В этой ситуации контроллер находится в режиме передачи контроллера, а цель — в режиме приема цели.)

Если контроллер хочет прочитать данные с цели, то он многократно получает байт от цели, при этом контроллер отправляет бит ACK после каждого байта, кроме последнего. (В этой ситуации контроллер находится в режиме приема контроллера, а цель — в режиме передачи цели.)

Транзакция I 2 C может состоять из нескольких сообщений. Контроллер завершает сообщение условием STOP, если это конец транзакции, или может отправить еще одно условие START, чтобы сохранить контроль над шиной для другого сообщения (транзакция «комбинированного формата»).

Протоколы сообщений

I 2 C определяет основные типы транзакций, каждая из которых начинается со СТАРТА и заканчивается СТОПОМ:

В комбинированной транзакции каждое чтение или запись начинается с START и целевого адреса. Условия START после первого также называются повторными битами START . Повторным START не предшествуют условия STOP, благодаря которым цели узнают, что следующее сообщение является частью той же транзакции.

Любая конкретная цель будет реагировать только на определенные сообщения, как указано в документации к продукту.

Системы Pure I 2 C поддерживают произвольные структуры сообщений. SMBus ограничен девятью из этих структур, такими как чтение слова N и запись слова N , включающими одну цель. PMBus расширяет SMBus с помощью группового протокола, позволяя отправлять несколько таких транзакций SMBus в одном объединенном сообщении. Завершающий STOP указывает, когда эти сгруппированные действия должны вступить в силу. Например, одна операция PMBus может перенастроить три источника питания (используя три разных целевых адреса I 2 C), и их новые конфигурации вступят в силу одновременно: когда они получат этот STOP.

За несколькими исключениями ни I 2 C, ни SMBus не определяют семантику сообщений, например, значение байтов данных в сообщениях. В остальном семантика сообщений зависит от продукта. Эти исключения включают сообщения, адресованные на общий адрес вызова I 2 C (0x00) или на адрес ответа на оповещение SMBus ; и сообщения, задействованные в протоколе разрешения адресов SMBus (ARP) для динамического распределения адресов и управления ими.

На практике большинство целей принимают модели управления запрос-ответ, где один или несколько байтов, следующих за командой записи, рассматриваются как команда или адрес. Эти байты определяют, как обрабатываются последующие записанные байты или как цель реагирует на последующие чтения. Большинство операций SMBus включают однобайтовые команды.

Пример сообщения: 24C32 EEPROM

STMicroelectronics M24C08-BN6: последовательная EEPROM с шиной I 2 C [5]

Одним из конкретных примеров является EEPROM типа 24C32 , который использует два байта запроса, которые называются Address High и Address Low. (Соответственно, эти EEPROM не могут использоваться чистыми хостами SMBus, которые поддерживают только однобайтовые команды или адреса.) Эти байты используются для адресации байтов в адресном пространстве EEPROM размером 32  кбит (или 4  кБ ). Такая же двухбайтовая адресация используется и более крупными EEPROM, такими как 24C512, которая хранит 512 кбит (или 64 кБ). Запись данных в эти EEPROM и чтение из них используют простой протокол: адрес записывается, а затем данные передаются до конца сообщения. Часть протокола, связанная с передачей данных, может вызвать проблемы в SMBus, поскольку байтам данных не предшествует счетчик, и за один раз можно передать более 32 байтов. Для решения этой проблемы на шине SMBus часто используются модули EEPROM I 2 C емкостью менее 32 кбит, например, 2 кбит 24C02, с неэффективной передачей однобайтовых данных.

В EEPROM записывается одно сообщение. После START контроллер отправляет адрес шины чипа с очищенным битом направления ( write ), затем отправляет двухбайтовый адрес данных в EEPROM, а затем отправляет байты данных для записи, начиная с этого адреса, за которым следует STOP. При записи нескольких байтов все байты должны находиться на одной 32-байтовой странице. Пока EEPROM занят сохранением этих байтов в памяти, он не будет отвечать на дальнейшие запросы I 2 C. (Это еще одна несовместимость с SMBus: устройства SMBus должны всегда отвечать на свои адреса шины.)

Чтобы начать чтение с определенного адреса в EEPROM, используется комбинированное сообщение. После START контроллер сначала записывает адрес шины этого чипа с очищенным битом направления ( write ), а затем два байта адреса данных EEPROM. Затем он отправляет (повторный) START и адрес шины EEPROM с установленным битом направления ( read ). Затем EEPROM ответит байтами данных, начиная с указанного адреса данных EEPROM — комбинированное сообщение: сначала запись, затем чтение. Контроллер выдает ACK после каждого считанного байта, кроме последнего байта, а затем выдает STOP. EEPROM увеличивает адрес после каждого переданного байта данных; многобайтовые чтения могут извлечь все содержимое EEPROM с помощью одного комбинированного сообщения.

Физический уровень

Шина I 2 C: R p — подтягивающие резисторы, R s — необязательные последовательные резисторы. [3]

На физическом уровне линии SCL и SDA представляют собой конструкцию шины с открытым стоком ( MOSFET ) или открытым коллектором ( BJT ), поэтому для каждой линии необходим подтягивающий резистор . Логический «0» выводится путем подтягивания линии к земле, а логическая «1» выводится путем оставления линии плавающей (выходное высокое сопротивление ), так что подтягивающий резистор подтягивает ее вверх. Линия никогда активно не управляется высоким уровнем. Такая проводка позволяет нескольким узлам подключаться к шине без коротких замыканий из-за конфликта сигналов. Высокоскоростные системы (и некоторые другие) могут использовать источник тока вместо резистора для подтягивания только SCL или как SCL, так и SDA, чтобы обеспечить более высокую емкость шины и обеспечить более быстрое время нарастания.

Важным следствием этого является то, что несколько узлов могут управлять линиями одновременно. Если какой-либо узел управляет линией на низком уровне, он будет на низком уровне. Узлы, которые пытаются передать логическую единицу (т.е. позволяют линии плавать на высоком уровне), могут обнаружить это и сделать вывод, что другой узел активен в то же время.

При использовании на SCL это называется растяжением часов и является механизмом управления потоком для целей. При использовании на SDA это называется арбитражем и гарантирует, что в каждый момент времени будет только один передатчик.

В состоянии бездействия обе линии имеют высокий уровень. Чтобы начать транзакцию, SDA понижается, в то время как SCL остается высоким. Незаконно [3] : 14  передавать маркер остановки, отпуская SDA, чтобы снова поднять его на высокий уровень (хотя такое «пустое сообщение» обычно безвредно), поэтому следующим шагом является понижение уровня SCL.

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

Пока SCL низкий, передатчик (изначально контроллер) устанавливает SDA на желаемое значение и (после небольшой задержки, необходимой для распространения значения) позволяет SCL плавать на высоком уровне. Затем контроллер ждет, пока SCL действительно станет высоким; это будет задержано конечным временем нарастания сигнала SCL ( постоянная времени RC подтягивающего резистора и паразитная емкость шины) и может быть дополнительно задержано растяжением тактовой частоты цели.

После того, как SCL становится высоким, контроллер ждет минимальное время (4 мкс для стандартной скорости I 2 C), чтобы убедиться, что приемник увидел бит, затем снова понижает его. Это завершает передачу одного бита.

После каждых 8 бит данных в одном направлении в другом направлении передается бит «подтверждения». Передатчик и приемник меняются ролями для одного бита, и исходный приемник передает обратно один бит «0» (ACK). Если передатчик видит вместо этого бит «1» (NACK), он узнает, что:

Во время битов подтверждения направление меняет только линия SDA; SCL всегда управляется контроллером.

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

Растягивание часов с помощью SCL

Одной из наиболее важных особенностей протокола I 2 C является растяжение тактовой частоты. Адресованное целевое устройство может удерживать линию тактовой частоты (SCL) на низком уровне после получения (или отправки) байта, указывая на то, что оно еще не готово обрабатывать больше данных. Контроллер, который взаимодействует с целью, может не закончить передачу текущего бита, но должен ждать, пока линия тактовой частоты действительно не станет высокой. Если цель растягивает тактовую частоту, линия тактовой частоты все еще будет на низком уровне (потому что соединения являются открытыми стоками ). То же самое верно, если второй, более медленный контроллер пытается управлять тактовой частотой в то же время. (Если имеется более одного контроллера, все, кроме одного, обычно проигрывают арбитраж.)

Контроллер должен подождать, пока линия синхронизации не перейдет на высокий уровень, и дополнительное минимальное время (4 мкс для стандартного I 2 C 100 кбит/с), прежде чем снова понизить уровень синхронизации.

Хотя контроллер также может удерживать линию SCL на низком уровне так долго, как он пожелает (это не разрешено с версии 6 протокола – подраздел 3.1.1), термин «растягивание тактовой частоты» обычно используется только тогда, когда это делают цели. Хотя теоретически любой тактовый импульс может быть растянут, обычно используются интервалы до или после бита подтверждения. Например, если целью является микроконтроллер , его интерфейс I 2 C может растягивать тактовую частоту после каждого байта, пока программное обеспечение не решит, отправлять ли положительное подтверждение или NACK.

Растяжение тактовой частоты — единственный случай в I 2 C, когда цель управляет SCL. Многим целям не нужно растяжение тактовой частоты, и они, таким образом, рассматривают SCL как строго вход без схемы для его управления. Некоторые контроллеры, например, те, что находятся внутри пользовательских ASIC, могут не поддерживать растяжение тактовой частоты; часто эти устройства будут помечены как «двухпроводной интерфейс», а не I 2 C.

Чтобы обеспечить минимальную пропускную способность шины , SMBus устанавливает ограничения на то, насколько далеко могут быть растянуты часы. Хосты и целевые устройства, придерживающиеся этих ограничений, не могут блокировать доступ к шине дольше, чем на короткое время, что не является гарантией, предоставляемой чистыми системами I 2 C.

Арбитраж с использованием SDA

Каждый контроллер отслеживает шину на предмет стартовых и стоповых битов и не начинает сообщение, пока другой контроллер держит шину занятой. Однако два контроллера могут начать передачу примерно в одно и то же время; в этом случае происходит арбитраж. Режим передачи цели также может быть арбитражным, когда контроллер адресует несколько целей, но это встречается реже. В отличие от протоколов (таких как Ethernet ), которые используют случайные задержки отката перед выдачей повторной попытки, I 2 C имеет детерминированную политику арбитража. Каждый передатчик проверяет уровень линии данных (SDA) и сравнивает его с ожидаемыми уровнями; если они не совпадают, этот передатчик проиграл арбитраж и выходит из этого взаимодействия протокола.

Если один передатчик устанавливает SDA на 1 (не подает сигнал), а второй передатчик устанавливает его на 0 (заземляет), то линия становится низкой. Затем первый передатчик замечает, что уровень линии отличается от ожидаемого, и делает вывод, что другой узел передает. Первый узел, заметивший такую ​​разницу, проигрывает арбитраж: он прекращает подачу SDA. Если это контроллер, он также прекращает подачу SCL и ждет STOP; затем он может попытаться повторно передать все свое сообщение. Тем временем другой узел не заметил никакой разницы между ожидаемым и фактическим уровнями на SDA и поэтому продолжает передачу. Он может сделать это без проблем, потому что до сих пор сигнал был именно таким, как он ожидал; никакой другой передатчик не нарушил его сообщение.

Если два контроллера отправляют сообщение двум разным целям, тот, кто отправляет меньший целевой адрес, всегда «выигрывает» арбитраж на этапе адреса. Поскольку два контроллера могут отправлять сообщения на один и тот же целевой адрес, а адреса иногда ссылаются на несколько целей, арбитраж иногда должен продолжаться на этапах данных.

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

Один случай, который должен быть тщательно обработан в реализациях I 2 C с несколькими контроллерами, — это когда контроллеры общаются друг с другом. Один контроллер может проиграть арбитраж входящему сообщению и должен вовремя сменить свою роль с контроллера на цель, чтобы подтвердить свой собственный адрес.

В крайне редком случае, когда два контроллера одновременно отправляют идентичные сообщения, оба будут считать коммуникацию успешной, но цель увидит только одно сообщение. По этой причине, когда к цели могут получить доступ несколько контроллеров, каждая команда, распознанная целью, либо должна быть идемпотентной , либо должно быть гарантировано, что она никогда не будет выдана двумя контроллерами одновременно. (Например, команда, выданная только одним контроллером, не обязательно должна быть идемпотентной, и не обязательно, чтобы конкретная команда была идемпотентной, если некоторый механизм взаимного исключения гарантирует, что только один контроллер может быть вынужден выдать эту команду в любой момент времени.)

Арбитраж в SMBus

В то время как I 2 C осуществляет арбитраж только между контроллерами, SMBus использует арбитраж в трех дополнительных контекстах, где несколько целей отвечают контроллеру, и один из них передает свое сообщение.

Арбитраж в PMBus

Версия PMBus 1.3 расширяет протокол ответа на оповещение SMBus в своем протоколе «чтения зоны». [6] Цели могут быть сгруппированы в «зоны», и все цели в зоне могут быть адресованы для ответа, при этом их ответы маскируются (исключают нежелательную информацию), инвертируются (так что нужная информация отправляется как 0 бит, что выигрывает арбитраж) или переупорядочиваются (так что наиболее значимая информация отправляется первой). Арбитраж гарантирует, что ответ с наивысшим приоритетом будет первым возвращенным контроллеру.

PMBus резервирует адреса I 2 C 0x28 и 0x37 для чтения и записи зон соответственно.

Различия между режимами

Существует несколько возможных режимов работы для связи I 2 C. Все они совместимы в том смысле, что стандартный режим 100 кбит/с может использоваться всегда, но объединение устройств с разными возможностями на одной шине может вызвать проблемы, как указано ниже:

Некоторые поставщики предоставляют так называемый нестандартный режим Turbo со скоростью до 1,4 Мбит/с.

Во всех режимах тактовая частота контролируется контроллером(ами), а шина с большей длиной, чем обычно, может работать на более низкой скорости, чем номинальная, за счет понижения тактовой частоты .

Взаимосвязи цепей

16-битная плата АЦП с интерфейсом I 2 C

I 2 C популярен для сопряжения периферийных схем с системами прототипирования, такими как Arduino и Raspberry Pi . I 2 C не использует стандартизированный разъем, однако разработчики плат создали различные схемы разводки для соединений I 2 C. Чтобы свести к минимуму возможные повреждения из-за подключения 0,1-дюймовых разъемов в обратном направлении, некоторые разработчики предложили использовать чередующиеся сигнальные и силовые соединения следующих схем разводки: (GND, SCL, VCC, SDA) или (VCC, SDA, GND, SCL). [7]

Подавляющее большинство приложений используют I 2 C в том виде, в котором он был изначально разработан — периферийные ИС напрямую подключены к процессору на той же печатной плате, и, следовательно, на относительно коротких расстояниях менее 1 фута (30 см), без разъема. Однако, используя дифференциальный драйвер, альтернативная версия I 2 C может обмениваться данными на расстоянии до 20 метров (возможно, более 100 метров) по CAT5 или другому кабелю. [8] [9]

Несколько стандартных разъемов передают сигналы I 2 C. Например, разъем UEXT передает I 2 C; 10-контактный разъем iPack передает I 2 C; [10] разъем 6P6C Lego Mindstorms NXT передает I 2 C; [11] [12] [13] [14] некоторые люди используют разъемы 8P8C и кабель CAT5, обычно используемые для физического уровня Ethernet , вместо этого для передачи дифференциально-кодированных сигналов I 2 C [15] или усиленных несимметричных сигналов I 2 C; [16] и каждый разъем HDMI и большинство разъемов DVI и VGA передают данные DDC2 по I 2 C.

Буферизация и мультиплексирование

Когда в системе много устройств I 2 C, может возникнуть необходимость включить буферы шины или мультиплексоры для разделения больших сегментов шины на более мелкие. Это может быть необходимо для поддержания емкости сегмента шины ниже допустимого значения или для того, чтобы позволить мультиплексору разделять несколько устройств с одинаковым адресом. Существует много типов мультиплексоров и буферов, и все они должны учитывать тот факт, что линии I 2 C определены как двунаправленные. Мультиплексоры могут быть реализованы с помощью аналоговых коммутаторов, которые могут связывать один сегмент с другим. Аналоговые коммутаторы поддерживают двунаправленную природу линий, но не изолируют емкость одного сегмента от другого или не обеспечивают возможности буферизации.

Буферы могут использоваться для изоляции емкости на одном сегменте от другого и/или для передачи I 2 C по более длинным кабелям или трассам. Буферы для двунаправленных линий, таких как I 2 C, должны использовать одну из нескольких схем для предотвращения защелкивания. I 2 C является открытым стоком, поэтому буферы должны управлять низким уровнем на одной стороне, когда они видят низкий уровень на другой. Один из методов предотвращения защелкивания заключается в том, чтобы буфер имел тщательно выбранные входные и выходные уровни таким образом, чтобы выходной уровень его драйвера был выше его входного порога, предотвращая его самосрабатывание. Например, буфер может иметь входной порог 0,4 В для обнаружения низкого уровня, но выходной низкий уровень 0,5 В. Этот метод требует, чтобы все другие устройства на шине имели совместимые пороги, и часто означает, что несколько буферов, реализующих эту схему, не могут быть включены последовательно друг с другом.

В качестве альтернативы существуют другие типы буферов, которые реализуют усилители тока или отслеживают состояние (т. е. какая сторона установила шину на низком уровне) для предотвращения защелкивания. Метод состояния обычно означает, что непреднамеренный импульс создается во время передачи, когда одна сторона устанавливает шину на низком уровне, затем другая устанавливает ее на низком уровне, затем первая сторона освобождается (это обычное явление во время подтверждения I 2 C).

Совместное использование SCL между несколькими шинами

При наличии одного контроллера возможно, что несколько шин I 2 C будут совместно использовать одну и ту же линию SCL. [17] [18] Пакеты на каждой шине отправляются либо один за другим, либо одновременно. Это возможно, поскольку связь на каждой шине может быть разделена на чередующиеся короткие периоды с высоким SCL, за которыми следуют короткие периоды с низким SCL. И такт может быть растянут, если одной шине требуется больше времени в одном состоянии.

Преимуществами являются одновременное использование целевых устройств с одним и тем же адресом и экономия соединений или более высокая пропускная способность за счет одновременного использования нескольких линий передачи данных.

Таблица состояний линии

В этих таблицах показаны различные атомарные состояния и битовые операции, которые могут иметь место во время сообщения I 2 C.

Структура адресации

7-битная адресация

10-битная адресация

Зарезервированные адреса в 7-битном адресном пространстве

Две группы по 8 адресов в каждой зарезервированы для специальных функций:

Кроме того, оставшиеся 112 адресов предназначены для определенных классов устройств, а некоторые из них дополнительно зарезервированы либо соответствующими стандартами, либо общим использованием.

SMBus резервирует некоторые дополнительные адреса. В частности, 0001 000зарезервирован для хоста SMBus, который может использоваться устройствами с поддержкой контроллера, 0001 100является «адресом ответа на оповещение SMBus», который опрашивается хостом после внеполосного прерывания, и 1100 001является адресом по умолчанию, который изначально используется устройствами с возможностью динамического назначения адресов.


Незарезервированные адреса в 7-битном адресном пространстве

Хотя MSB 1111 зарезервирован для идентификатора устройства и 10-битной целевой (ведомой) адресации, он также используется устройствами, зависящими от отображения VESA DDC , такими как указательные устройства . [22]

Формат транзакции

Транзакция I 2 C состоит из одного или нескольких сообщений . Каждое сообщение начинается с символа начала, а транзакция заканчивается символом остановки. Символы начала после первого, которые начинают сообщение, но не транзакцию, называются повторяющимися символами начала .

Каждое сообщение является чтением или записью. Транзакция, состоящая из одного сообщения, называется транзакцией чтения или записи. Транзакция, состоящая из нескольких сообщений, называется комбинированной транзакцией. Наиболее распространенной формой последней является сообщение записи, предоставляющее информацию об адресе внутри устройства, за которым следует сообщение чтения.

Многие устройства I 2 C не различают объединенную транзакцию и те же сообщения, отправленные как отдельные транзакции, но не все. Протокол идентификатора устройства требует одной транзакции; целям запрещено отвечать, если они наблюдают символ остановки. Режимы конфигурации, калибровки или самотестирования, которые заставляют цель реагировать необычно, также часто автоматически завершаются в конце транзакции.

Временная диаграмма

Последовательность передачи данных
Последовательность передачи данных
  1. Передача данных инициируется с помощью начального условия (S), сигнализируемого понижением уровня SDA, в то время как уровень SCL остается высоким.
  2. SCL понижается, а SDA устанавливает уровень первого бита данных, сохраняя при этом SCL низким (во время синей полосы).
  3. Данные выбираются (принимаются), когда SCL повышается для первого бита (B1). Чтобы бит был действительным, SDA не должен изменяться между нарастающим фронтом SCL и последующим падающим фронтом (все время зеленой полосы).
  4. Этот процесс повторяется, SDA переходит, когда SCL низкий, а данные считываются, когда SCL высокий (B2 через Bn).
  5. За последним битом следует тактовый импульс, во время которого SDA понижается для подготовки к стоповому биту.
  6. Условие остановки (P) сигнализируется, когда повышается SCL, а затем повышается SDA.

Чтобы избежать ложного обнаружения маркера, существует минимальная задержка между падающим фронтом SCL и изменением SDA, а также между изменением SDA и нарастающим фронтом SCL. Обратите внимание, что сообщение I 2 C, содержащее n бит данных (включая подтверждения), содержит n + 1 тактовых импульсов.

Разработка программного обеспечения

I 2 C подходит для программного обеспечения "драйвера шины". Программное обеспечение для подключенных устройств написано для вызова "драйвера шины", который управляет фактическим низкоуровневым оборудованием I 2 C. Это позволяет коду драйвера для подключенных устройств легко переноситься на другое оборудование, включая дизайн bit-banging.

Пример бит-бэнга I2протокол С

Ниже приведен пример бит-бэнга протокола I 2 C в качестве контроллера I 2 C (ведущего). Пример написан на псевдо- C . Он иллюстрирует все функции I 2 C, описанные ранее (растягивание тактовой частоты, арбитраж, бит старт/стоп, ack/nack). [24]

// Аппаратно-специфические функции поддержки, которые ДОЛЖНЫ быть настроены:#определить I2CSPEED 100void I2C_delay ( void ); bool read_SCL ( void ); // Возвращает текущий уровень линии SCL, 0 или 1  bool read_SDA ( void ); // Возвращает текущий уровень линии SDA, 0 или 1  void set_SCL ( void ); // Не управлять SCL (установить вывод в высокое сопротивление)  void clear_SCL ( void ); // Активно подаем сигнал SCL на низкий уровень  void set_SDA ( void ); // Не управлять SDA (установить вывод в высокое сопротивление)  void clear_SDA ( void ); // Активно подавать сигнал SDA на низкий уровень  недействительный арбитраж_проигран ( void ); bool started = false ; // глобальные данные    недействительный i2c_start_cond ( недействительный ) { если ( начало ) {    // если запущено, выполнить условие перезапуска // устанавливаем SDA на 1 set_SDA (); I2C_delay (); set_SCL (); while ( read_SCL () == 0 ) { // Растягивание часов      // Вам следует добавить тайм-аут к этому циклу } // Время настройки повторного запуска, минимум 4,7 мкс I2C_delay (); } если ( read_SDA () == 0 ) {     арбитраж_проигран (); } // SCL высокий, устанавливаем SDA с 1 на 0. clear_SDA (); I2C_delay (); clear_SCL (); запущено = правда ;  }недействительный i2c_stop_cond ( недействительный ) { // устанавливаем SDA на 0 clear_SDA (); I2C_delay (); set_SCL (); // Растягивание часов в то время как ( read_SCL () == 0 ) {     // добавляем тайм-аут к этому циклу. } // Время установки стопового бита, минимум 4 мкс I2C_delay (); // SCL высокий, устанавливаем SDA с 0 на 1 set_SDA (); I2C_delay (); если ( read_SDA () == 0 ) {     арбитраж_проигран (); } начато = ложь ;  }// Записать бит на шину I2Cvoid i2c_write_bit ( логический бит )  { если ( бит ) {   set_SDA (); } еще {   clear_SDA (); } // Задержка распространения изменений SDA I2C_delay (); // Установите высокий уровень SCL, чтобы указать, что доступно новое допустимое значение SDA set_SCL (); // Ожидание считывания значения SDA целевым объектом, минимум 4 мкс для стандартного режима I2C_delay (); while ( read_SCL () == 0 ) { // Растягивание часов      // Вам следует добавить тайм-аут к этому циклу } // SCL высокая, теперь данные действительны // Если SDA высокий, проверьте, что никто другой не управляет SDA если ( бит && ( read_SDA () == 0 )) {       арбитраж_проигран (); } // Сбросьте SCL до низкого значения для подготовки к следующему изменению clear_SCL ();}// Прочитать бит из шины I2Cbool i2c_read_bit ( void ) { логический бит ;  // Позвольте целевому диску управлять данными set_SDA (); // Ожидание записи значения SDA целевым устройством, минимум 4 мкс для стандартного режима I2C_delay (); // Установите высокий уровень SCL, чтобы указать, что доступно новое допустимое значение SDA set_SCL (); while ( read_SCL () == 0 ) { // Растягивание часов      // Вам следует добавить тайм-аут к этому циклу } // Ожидание записи значения SDA целевым устройством, минимум 4 мкс для стандартного режима I2C_delay (); // SCL высокий, считываем бит бит = read_SDA ();   // Установите низкий уровень SCL для подготовки к следующей операции clear_SCL (); возврат бита ; }// Записать байт на шину I2C. Возвращает 0, если получено подтверждение от цели.bool i2c_write_byte ( bool send_start ,   бул send_stop ,  беззнаковый символьный байт )  { беззнаковый бит ;  бул нак ;  если ( send_start ) {   i2c_start_cond (); } для ( бит = 0 ; бит < 8 ; ++ бит ) {         i2c_write_bit (( байт & 0x80 ) != 0 );     байт <<= 1 ;   } nack = i2c_read_bit ();   если ( send_stop ) {   i2c_stop_cond (); } вернуться назад ; }// Считать байт с шины I2Cбеззнаковый символ i2c_read_byte ( bool nack , bool send_stop )     { беззнаковый символьный байт = 0 ;     беззнаковый символьный бит ;   для ( бит = 0 ; бит < 8 ; ++ бит ) {         байт = ( байт << 1 ) | i2c_read_bit ();       } i2c_write_bit ( нет ); если ( send_stop ) {   i2c_stop_cond (); } возврат байта ; }недействительный I2C_delay ( недействительный ) {  изменчивое целое v ;   целое число i ;  для ( i = 0 ; i < I2CSPEED / 2 ; ++ i ) {           в ; }}

Поддержка операционной системы

Инструменты разработки

При разработке или устранении неисправностей систем, использующих I 2 C, может быть важна видимость на уровне аппаратных сигналов.

Хост-адаптеры

Существует ряд аппаратных решений I 2 C хост-адаптера для создания контроллера I 2 C или целевого соединения с хост-компьютерами, работающими под управлением Linux , Mac или Windows . Большинство вариантов представляют собой адаптеры USB -to-I 2 C. Не все из них требуют фирменных драйверов или API .

Анализаторы протоколов

Анализаторы протокола I 2 C — это инструменты, которые берут образцы данных с шины I 2 C и декодируют электрические сигналы, чтобы обеспечить более высокое представление данных, передаваемых по шине.

Логические анализаторы

При разработке и/или устранении неполадок шины I 2 C проверка аппаратных сигналов может быть очень важна. Логические анализаторы — это инструменты, которые собирают, анализируют, декодируют и сохраняют сигналы, чтобы люди могли просматривать высокоскоростные формы сигналов в свободное время. Логические анализаторы отображают временные метки каждого изменения уровня сигнала, что может помочь обнаружить проблемы протокола. Большинство логических анализаторов имеют возможность декодировать сигналы шины в данные протокола высокого уровня и отображать данные ASCII.

Популярные кабельные системы

На различных готовых модулях имеются некоторые основные разъемы и распиновки: [29]

Ограничения

Назначение целевых адресов является слабым местом I 2 C. Семи бит слишком мало для предотвращения коллизий адресов между многими тысячами доступных устройств. Что смягчает проблему коллизий адресов между разными поставщиками, а также позволяет подключаться к нескольким идентичным устройствам, так это то, что производители выделяют контакты, которые могут использоваться для установки целевого адреса на один из нескольких вариантов адреса на устройство. Обычно используются два или три контакта, и во многих устройствах есть три или более вариантов разводки на адресный контакт. [34] [35] [36]

10-битные адреса I 2 C пока не получили широкого распространения, и многие операционные системы хостов их не поддерживают. [37] Также не поддерживается сложная схема SMBus "ARP" для динамического назначения адресов (за исключением карт PCI с наличием SMBus, для которых она требуется).

Автоматическая конфигурация шины — это связанная проблема. Заданный адрес может использоваться несколькими различными несовместимыми с протоколом устройствами в различных системах, и вряд ли какие-либо типы устройств могут быть обнаружены во время выполнения. Например, 0x51может использоваться 24LC02 или 24C32 EEPROM с несовместимой адресацией; или PCF8563 RTC , который невозможно надежно отличить от любого из них (без изменения состояния устройства, что может быть недопустимо). Единственные надежные механизмы конфигурации, доступные хостам, включают в себя внеполосные механизмы, такие как таблицы, предоставляемые системной прошивкой, в которых перечислены доступные устройства. Опять же, эта проблема может быть частично решена с помощью ARP в системах SMBus, особенно когда используются идентификаторы поставщиков и продуктов; но это не получило широкого распространения. Версия Rev. 3 спецификации I 2 C добавляет механизм идентификатора устройства.

I 2 C поддерживает ограниченный диапазон скоростей. Хосты, поддерживающие многомегабитные скорости, редки. Поддержка скорости Fm+ 1 Мбит/с более распространена, поскольку ее электроника представляет собой простые варианты того, что используется на более низких скоростях. Многие устройства не поддерживают скорость 400 кбит/с (отчасти потому, что SMBus еще не поддерживает ее). Узлы I 2 C, реализованные в программном обеспечении (вместо выделенного оборудования), могут даже не поддерживать скорость 100 кбит/с; поэтому весь диапазон, определенный в спецификации, редко бывает пригоден для использования. Все устройства должны хотя бы частично поддерживать самую высокую используемую скорость, иначе они могут ложно обнаружить свой адрес устройства.

Устройствам разрешено растягивать тактовые циклы в соответствии со своими конкретными потребностями, что может ограничить полосу пропускания, необходимую более быстрым устройствам, и увеличить задержки при обращении к другим адресам устройств. Емкость шины также накладывает ограничение на скорость передачи, особенно когда источники тока не используются для уменьшения времени нарастания сигнала.

Поскольку I 2 C является общей шиной, существует вероятность, что любое устройство выйдет из строя и повесит всю шину. Например, если какое-либо устройство удерживает линию SDA или SCL на низком уровне, это не позволяет контроллеру отправлять команды START или STOP для сброса шины. Таким образом, в конструкции часто включают сигнал сброса, который обеспечивает внешний метод сброса устройств шины. Однако многие устройства не имеют выделенного вывода сброса, что вынуждает разработчика встраивать схему, позволяющую выключать и включать устройства, если их необходимо сбросить.

Из-за этих ограничений (управление адресами, конфигурация шины, потенциальные неисправности, скорость) лишь немногие сегменты шины I 2 C имеют хотя бы дюжину устройств. Вместо этого для систем характерно наличие нескольких меньших сегментов. Один может быть выделен для использования с высокоскоростными устройствами для управления питанием с малой задержкой. Другой может использоваться для управления несколькими устройствами, где задержка и пропускная способность не являются важными проблемами; еще один сегмент может использоваться только для чтения микросхем EEPROM, описывающих дополнительные карты (например, стандарт SPD, используемый с DRAM-накопителями).

В системах с очень низким энергопотреблением подтягивающие резисторы могут использовать больше мощности, чем вся остальная конструкция вместе взятая. В таких системах резисторы часто питаются от переключаемого источника напряжения, например, DIO от микроконтроллера. Подтягивающие резисторы также ограничивают скорость шины и имеют небольшую дополнительную стоимость. Поэтому некоторые разработчики обращаются к другим последовательным шинам, которым не нужны подтягивающие резисторы, например, I3C или SPI .

Производные технологии

I 2 C является основой для ACCESS.bus , интерфейса VESA Display Data Channel (DDC), шины управления системой (SMBus), шины управления питанием (PMBus) и шины управления интеллектуальной платформой (IPMB, один из протоколов IPMI ). Эти варианты имеют различия в диапазонах напряжения и тактовой частоты, а также могут иметь линии прерывания .

Системы высокой доступности ( AdvancedTCA , MicroTCA ) используют 2-канальный избыточный I 2 C для управления полкой. В этих системах требуется возможность использования нескольких контроллеров I 2 C.

TWI (Two-Wire Interface) или TWSI (Two-Wire Serial Interface) — это по сути та же шина, реализованная на различных процессорах типа «система на кристалле» от Atmel и других поставщиков. [38] Поставщики используют название TWI, хотя I 2 C не является зарегистрированной торговой маркой по состоянию на 2014-11-07. [39] Защита торговой марки существует только для соответствующего логотипа (см. верхний правый угол), а патенты на I 2 C в настоящее время истекли. [ требуется цитата ] Согласно Microchip Technology , TWI и I2C имеют несколько различий. Одно из них заключается в том, что TWI не поддерживает байт START. [40]

В некоторых случаях использование термина «двухпроводной интерфейс» указывает на неполную реализацию спецификации I 2 C. Отсутствие поддержки арбитража или растяжения тактовой частоты является одним из распространенных ограничений, которое все еще полезно для одного контроллера, взаимодействующего с простыми целями, которые никогда не растягивают тактовую частоту.

Стандарт интерфейса датчика MIPI I3C (I3C) является развитием I 2 C, разрабатываемого в 2017 году. [41]

Пересмотры

Смотрите также

Ссылки

  1. ^ "Финансовые пресс-релизы-NXP". investors.nxp.com . Получено 29.04.2018 .
  2. ^ "MCP23008". Microchip . 26 мая 2021 г. Архивировано из оригинала 26 мая 2021 г.
  3. ^ abcde "Спецификация шины I2C Rev 7" (PDF) . NXP Semiconductors . 1 октября 2021 г. Архивировано из оригинала (PDF) 6 октября 2022 г.
  4. ^ "7-битная, 8-битная и 10-битная адресация ведомого устройства I2C". Total Phase . Архивировано из оригинала 2013-06-01 . Получено 2018-04-29 .
  5. ^ "8-Кбит последовательная шина I2C EEPROM (PDF)" (PDF) . STMicroelectronics . Октябрь 2017. Архивировано (PDF) из оригинала 2019-10-18 . Получено 19 ноября 2019 .
  6. ^ Использование протоколов ZONE_READ и ZONE_WRITE (PDF) (замечание по применению). Редакция 1.0.1. Форум по интерфейсу системного управления. 2016-01-07. AN001. Архивировано (PDF) из оригинала 2017-09-22.
  7. ^ "Есть ли какое-либо окончательное руководство по распиновке I2C? Не ищу "СТАНДАРТ"". StackExchange.
  8. ^ Примечание по применению NXP AN11075: Управление сигналами шины I2C по витой паре с помощью PCA9605 (PDF) , 16.08.2017, заархивировано из оригинала (PDF) 16.08.2017
  9. ^ Васкес, Джошуа (2017-08-16), Спрыгнув с доски: Введение в I2C по длинным проводам, архивировано из оригинала 2017-08-16
  10. ^ Формат штабелируемых плат iPack, 2017-08-19, архивировано из оригинала 2017-08-19
  11. ^ Феррари, Марио; Феррари, Джулио (2018-04-29). Создание роботов с LEGO Mindstorms NXT. Syngress. стр. 63–64. ISBN 9780080554334. Архивировано из оригинала 2018-04-29.
  12. ^ Гаспери, Майкл; Хурбейн, Филипп (2010), «Глава 13: Связь по шине I2C», Extreme NXT: Расширение LEGO MINDSTORMS NXT до следующего уровня , ISBN 9781430224549
  13. ^ Фило. "NXT connector plug" Архивировано 20.08.2017 на Wayback Machine
  14. ^ Сиван Толедо. «I2C-интерфейс, часть 1: добавление цифровых портов ввода-вывода». Архивировано 12 августа 2017 г. на Wayback Machine . 2006 г.
  15. ^ «Надежная отправка I2C по кабелям Cat5» Архивировано 18 августа 2017 г. на Wayback Machine
  16. ^ "Разъемы и кабели шины I2C" Архивировано 18 августа 2017 г. на Wayback Machine
  17. ^ "Несколько шин I2C · Testato/SoftwareWire Wiki". GitHub .
  18. ^ «Совместное использование шины I2C | Microchip».
  19. ^ "Таблица распределения адресов I2C" (PDF) (Руководство по выбору). Philips Semiconductors . 1999-08-24. Архивировано из оригинала (PDF) 2017-10-16 . Получено 2017-10-01 .
  20. ^ Справочник данных IC12: Периферийные устройства I2C, код заказа Philips 9397 750 00306
  21. ^ "System Management Bus (SMBus) Specification" (PDF) . Версия 3.0. Форум по интерфейсу системного управления. 2014-12-20. С. 81–82. Архивировано (PDF) из оригинала 2016-01-29 . Получено 2017-12-01 .
  22. ^ ab "VESA Display Data Channel Command Interface (DDC/CI) Standard" (PDF) . Версия 1.1. VESA . ​​2004-10-29. стр. 15–16. Архивировано (PDF) из оригинала 2016-09-09 . Получено 2017-12-01 .
  23. ^ "Спецификация интерфейса интеллектуального управления платформой второго поколения V2.0" (PDF) . Версия документа 1.1. Intel, NEC, Hewlett-Packard и Dell. 2013-10-01. стр. 563. Архивировано (PDF) из оригинала 2016-03-27 . Получено 2017-12-01 . 7-битная часть адреса подчиненного устройства для BMC — 0010_000b
  24. ^ Драйвер TWI Master Bit Band; Atmel; июль 2012 г. Архивировано 29 марта 2017 г. на Wayback Machine .
  25. ^ Компонент i2c.resource Архивировано 24 июля 2011 г. на Wayback Machine для AmigaOS 4.x.
  26. ^ Тео де Раадт (29 мая 2015 г.). "/sys/dev/i2c/i2c_scan.c#probe_val". Перекрестная ссылка BSD суперпользователя . OpenBSD . Проверено 4 марта 2019 г.static u_int8_t probe_val[256];
  27. ^ Константин А. Муренин (2010-05-21). "5.2. Сканирование шины I 2 C через i2c_scan.c". Аппаратные датчики OpenBSD — мониторинг окружающей среды и управление вентиляторами ( диссертация MMath ). Университет Ватерлоо : UWSpace. hdl :10012/5234. Идентификатор документа: ab71498b6b1a60ff817b29d56997a418.
  28. ^ Введение в HID через I2C
  29. ^ https://hackaday.com/2022/05/04/the-connector-zoo-i2c-ecosystems/
  30. ^ https://www.sparkfun.com/qwiic
  31. ^ https://learn.adafruit.com/introducing-adafruit-stemma-qt
  32. ^ https://www.cable-tester.com/i2c-pin-out-grove-from-seeed-studio/
  33. ^ https://www.cable-tester.com/i2c-pin-out-from-gradity-dfrobot/
  34. ^ LTC4151 компании Linear Technology, архивировано 09.08.2017 на Wayback Machine , имеет два контакта для выбора адреса, каждый из которых может быть подключен к высокому или низкому уровню или оставаться неподключенным, что обеспечивает 9 различных адресов.
  35. ^ MAX7314 Максима, архив 2017-07-13 на Wayback Machine, имеет один вывод для выбора адреса, который может быть подключен к высокому или низкому уровню или к SDA или SCL, предлагая 4 различных адреса.
  36. ^ UCD9224 компании TI, архив 2017-11-07 на Wayback Machine, использует два канала АЦП, различающих двенадцать уровней каждый, для выбора любого допустимого 7-битного адреса.
  37. ^ Delvare, Jean (2005-08-16). "Re: [PATCH 4/5] add i2c_probe_device and i2c_remove_device". linux-kernel (список рассылки). Архивировано из оригинала 2016-08-17.
  38. ^ avr-libc: Пример использования двухпроводного интерфейса (TWI) Архивировано 27.05.2007 на Wayback Machine .
  39. ^ "TESS -- Ошибка". tmsearch.uspto.gov . Получено 29.04.2018 .[ постоянная мертвая ссылка ]
  40. ^ "Что такое TWI? Как настроить TWI для связи I2C" (PDF) . Microchip Technology. 2018.
  41. ^ Торнтон, Скотт (29.11.2017). "Улучшенная межинтегральная схема (I3C)". Советы по микроконтроллерам . Архивировано из оригинала 03.02.2018.
  42. Патент США 4689740, «Двухпроводная шинная система, включающая провод синхронизации и провод данных для соединения нескольких станций», выдан 25 августа 1987 г., передан корпорации Philips США. 
  43. ^ «Philips подает в суд еще на восемь компаний за нарушение патента на шину I2C». EE Times . 17 октября 2001 г. Архивировано из оригинала 2 апреля 2021 г.
  44. Спецификация шины I2C версии 2.0; Philips Semiconductors; декабрь 1998 г.; Архивировано.
  45. Спецификация шины I2C версии 2.1; Philips Semiconductors; январь 2000 г.; Архивировано.
  46. Спецификация шины I2C, версия 3; NXP Semiconductors; 19 июня 2007 г.; Архивировано.
  47. Спецификация шины I2C, версия 4; NXP Semiconductors; 13 февраля 2012 г.; Архивировано.
  48. Спецификация шины I2C, версия 5; NXP Semiconductors; 9 октября 2012 г.; Архивировано.
  49. ^ "Спецификация шины I2C Rev 6" (PDF) . NXP Semiconductors . 4 апреля 2014 г. Архивировано из оригинала (PDF) 26 апреля 2021 г.

Дальнейшее чтение

Внешние ссылки