I²C

Материал из Википедии — свободной энциклопедии
(перенаправлено с «I2C»)
Перейти к навигации Перейти к поиску

I²C (IIC, рус. ай-квадрат-си или ай-ту-си, англ. Inter-Integrated Circuit) — последовательная асимметричная шина для связи между интегральными схемами внутри электронных приборов. Использует две двунаправленные линии связи (SDA и SCL), применяется для соединения низкоскоростных периферийных компонентов с процессорами и микроконтроллерами (например, на материнских платах, во встраиваемых системах, в мобильных телефонах).

Разработана фирмой Philips Semiconductors в начале 1980-х как простая 8-битная шина внутренней связи для создания управляющей электроники. Была рассчитана на частоту 100 кГц.

Стандартизована в 1992 году, в первой версии к стандартному режиму 100 кбит/с добавлен скоростной режим 400 кбит/с (Fast-mode, Fm); за счёт 10-битной адресации становится возможным подключение на одну шину более 1000 устройств, количество которых ограничивается максимально допустимой ёмкостью шины — 400 пФ.

В стандарте версии 2.0 (1998 год) представлены высокоскоростной режим работы 3,4 Мбит/с (High-speed mode, Hs) и требования пониженного энергопотребления. Незначительно доработан в версии 2.1 (2000 год).

В версии 3 (2007 год) добавлен режим 1 Мбит/с (Fast-mode plus, Fm+) и механизм идентификации устройств (ID).

В версии 4 (2012 год) появился однонаправленный режим 5 Мбит/с (Ultra Fast-mode, UFm) с использованием двухтактной логики без подтягивающих резисторов, добавлена таблица предустановленных идентификаторов.

В версии 5 (2012 год) исправлены ошибки.

В версии 6 (2014 год) пересчитаны графики, определяющие величину подтягивающих резисторов в зависимости от ёмкости шины и рабочего напряжения[1].

Принцип подключения

[править | править код]
Пример схемотехники шины I2C. Показаны один ведущий (master) и три ведомых (slave) устройства. Подтягивающие резисторы Rp обязательны

Шина I2C синхронная, состоит из двух линий: данных (SDA) и тактирования (SCL). Есть ведущий (master) и ведомые (slave). Инициатором обмена всегда выступает ведущий, обмен между двумя ведомыми невозможен. Всего на одной двухпроводной шине может быть до 127 устройств.

Такты на линии SCL генерирует master. Линией SDA могут управлять как мастер, так и ведомый в зависимости от направления передачи. Единицей обмена информации является пакет, обрамленный уникальными условиями на шине, именуемыми стартовым и стоповым условиями. Мастер в начале каждого пакета передает один байт, где указывает адрес ведомого и направление передачи последующих данных. Данные передаются 8-битными словами. После каждого слова передается один бит подтверждения приема приемной стороной.

Принцип работы

[править | править код]
Тактировка последовательности передачи данных

I²C использует две двунаправленные линии, подтянутые к напряжению питания и управляемые через открытый коллектор или открытый сток — последовательная линия данных (SDA, англ. Serial DAta) и последовательная линия тактирования (SCL, англ. Serial CLock). Стандартные напряжения +5 В или +3,3 В, однако допускаются и другие.

Классическая адресация включает 7-битное адресное пространство с 16 зарезервированными адресами. Это означает, что разработчикам доступно до 112 свободных адресов для подключения периферии на одну шину.

Основной режим работы — 100 кбит/с; 10 кбит/с в режиме работы с пониженной скоростью. Также немаловажно, что стандарт допускает приостановку тактирования для работы с медленными устройствами.

Процесс передачи посылки. Состояние СТАРТ и СТОП

[править | править код]

Процедура обмена начинается с того, что ведущий формирует состояние СТАРТ: при ВЫСОКОМ уровне на линии SCL он генерирует переход сигнала линии SDA из ВЫСОКОГО состояния в НИЗКОЕ. Этот переход воспринимается всеми устройствами, подключенными к шине, как признак начала процедуры обмена. Генерация синхросигнала — это всегда обязанность ведущего; каждый ведущий генерирует свой собственный сигнал синхронизации при пересылке данных по шине.

При передаче посылок по шине I²C каждый ведущий генерирует свой синхросигнал на линии SCL. После формирования состояния СТАРТ ведущий опускает состояние линии SCL в НИЗКОЕ состояние и выставляет на линию SDA старший бит первого байта сообщения. Количество байт в сообщении не ограничено. Спецификация шины I²C разрешает изменения на линии SDA только при НИЗКОМ уровне сигнала на линии SCL. Данные действительны и должны оставаться стабильными только во время ВЫСОКОГО состояния синхроимпульса. Для подтверждения приёма байта от ведущего-передатчика ведомым-приёмником в спецификации протокола обмена по шине I²C вводится специальный бит подтверждения, выставляемый на шину SDA после приёма 8 бит данных.

Процедура обмена завершается тем, что ведущий формирует состояние СТОП — переход состояния линии SDA из НИЗКОГО состояния в ВЫСОКОЕ при ВЫСОКОМ состоянии линии SCL. Состояния СТАРТ и СТОП всегда вырабатываются ведущим. Считается, что шина занята после фиксации состояния СТАРТ. Шина считается освободившейся через некоторое время после фиксации состояния СТОП.

Подтверждение

[править | править код]

Таким образом, передача 8 бит данных от передатчика к приёмнику завершаются дополнительным циклом (формированием 9-го тактового импульса линии SCL), при котором приёмник выставляет низкий уровень сигнала на линии SDA, как признак успешного приёма байта.

Подтверждение при передаче данных обязательно, кроме случаев окончания передачи ведомой стороной. Соответствующий импульс синхронизации генерируется ведущим. Передатчик отпускает (переводит в НИЗКОЕ состояние) линию SDA на время синхроимпульса подтверждения. Приёмник должен удерживать линию SDA в течение ВЫСОКОГО состояния синхроимпульса подтверждения в стабильном НИЗКОМ состоянии.

В том случае, когда ведомый-приёмник не может подтвердить свой адрес (например, когда он выполняет в данный момент какие-либо функции реального времени), линия данных должна быть оставлена в ВЫСОКОМ состоянии. После этого ведущий может выдать состояние СТОП для прерывания пересылки данных. Если в пересылке участвует ведущий-приёмник, то он должен сообщить об окончании передачи ведомому-передатчику путём неподтверждения последнего байта. Ведомый-передатчик должен освободить линию данных для того, чтобы позволить ведущему выдать состояние СТОП или повторить состояние СТАРТ.

Синхронизация

[править | править код]

Синхронизация выполняется с использованием подключения к линии SCL по правилу монтажного И. Это означает, что ведущий не имеет монопольного права на управление переходом линии SCL из НИЗКОГО состояния в ВЫСОКОЕ. В том случае, когда ведомому необходимо дополнительное время на обработку принятого бита, он имеет возможность удерживать линию SCL в низком состоянии до момента готовности к приёму следующего бита. Таким образом, линия SCL будет находиться в НИЗКОМ состоянии на протяжении самого длинного НИЗКОГО периода синхросигналов.

Устройства с более коротким НИЗКИМ периодом будут входить в состояние ожидания на время, пока не кончится длинный период. Когда у всех задействованных устройств кончится НИЗКИЙ период синхросигнала, линия SCL перейдет в ВЫСОКОЕ состояние. Все устройства начнут проходить ВЫСОКИЙ период своих синхросигналов. Первое устройство, у которого кончится этот период, снова установит линию SCL в НИЗКОЕ состояние. Таким образом, НИЗКИЙ период синхролинии SCL определяется наидлиннейшим периодом синхронизации из всех задействованных устройств, а ВЫСОКИЙ период определяется самым коротким периодом синхронизации устройств.

Механизм синхронизации может быть использован приёмниками как средство управления пересылкой данных на байтовом и битовом уровнях.

На уровне байта, если устройство может принимать байты данных с большой скоростью, но требует определенное время для сохранения принятого байта или подготовки к приёму следующего, то оно может удерживать линию SCL в НИЗКОМ состоянии после приёма и подтверждения байта, переводя таким образом передатчик в состояние ожидания.

На уровне битов устройство, такое, как микроконтроллер без встроенных аппаратных цепей I²C или с ограниченными цепями, может замедлить частоту синхроимпульсов путём продления их НИЗКОГО периода. Таким образом скорость передачи любого ведущего адаптируется к скорости медленного устройства.

Адресация в шине I²C

[править | править код]

Каждое устройство, подключённое к шине, может быть программно адресовано по уникальному адресу. Для выбора приёмника сообщения ведущий использует уникальную адресную компоненту в формате посылки. При использовании однотипных устройств ИС часто имеют дополнительный селектор адреса, который может быть реализован как в виде дополнительных цифровых входов селектора адреса, так и в виде аналогового входа. При этом адреса таких однотипных устройств оказываются разнесены в адресном пространстве устройств, подключенных к шине.

В обычном режиме используется 7-битная адресация.

Процедура адресации на шине I²C заключается в том, что первый байт после сигнала СТАРТ определяет, какой ведомый адресуется ведущим для проведения цикла обмена. Исключение составляет адрес «Общего вызова», который адресует все устройства на шине. Когда используется этот адрес, все устройства в теории должны послать сигнал подтверждения. Однако устройства, которые могут обрабатывать «общий вызов», на практике встречаются редко.

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

После того, как адрес послан, каждое устройство в системе сравнивает первые семь бит после сигнала СТАРТ со своим адресом. При совпадении устройство полагает себя выбранным как ведомый-приёмник или как ведомый-передатчик, в зависимости от бита направления.

Адрес ведомого может состоять из фиксированной и программируемой части. Часто случается, что в системе имеется несколько однотипных устройств (к примеру, ИМС памяти, или драйверов светодиодных индикаторов), поэтому при помощи программируемой части адреса становится возможным подключить к шине максимально возможное количество таких устройств. Количество программируемых битов в адресе зависит от количества свободных выводов микросхемы. Иногда используется один вывод с аналоговой установкой программируемого диапазона адресов[2]. При этом в зависимости от потенциала на этом адресном выводе ИМС, возможно смещение адресного пространства драйвера так, чтобы однотипные ИМС не конфликтовали между собой на общей шине.

Все специализированные ИМС, поддерживающие работу в стандарте шины I²C, имеют набор фиксированных адресов, перечень которых указан производителем в описаниях контроллеров.

Комбинация бит 11110ХХ адреса зарезервирована для 10-битной адресации.

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

Во время первого байта данных можно передавать адрес в памяти, который записывается во внутренний регистр-защёлку. После повторения сигнала СТАРТа и адреса ведомого выдаются данные из памяти. Все решения об авто-инкременте или декременте адреса, к которому произошёл предыдущий доступ, принимаются конструктором конкретного устройства. Поэтому в любом случае лучший способ избежать неконтролируемой ситуации на шине перед использованием новой (или ранее не используемой) ИМС — следует тщательно изучить паспорт изделия или справочное руководство.

В любом случае по спецификации шины все разрабатываемые устройства должны сбрасывать логику шины при получении сигнала СТАРТ или повторный СТАРТ и подготавливаться к приёму адреса.

Тем не менее, основные проблемы с использованием I²C шины возникают именно из-за того, что разработчики, «начинающие» работать с I²C шиной, не учитывают того факта, что ведущий (часто — микропроцессор) не имеет монопольного права ни на одну из линий шины.

Применение

[править | править код]

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

Список возможных применений:

Примеры систем с шиной I²C
Примеры систем с шиной I²C

На рисунке:
(a) Высокоинтегрированный телевизор

  1. Микроконтроллер
  2. ФАПЧ-синтезатор
  3. Флеш-память
  4. Мультисистемный декодер сигналов цветности
  5. Стереодекодер звука
  6. Улучшитель сигнала картинки
  7. Hi-Fi аудиопроцессор
  8. Аналоговый видеопроцессор
  9. Декодер телетекста
  10. ИМС сигналов OSD

(b) базовая станция радиотелефона стандарта DECT

  1. Генератор DTMF
  2. Интерфейс телефонной линии
  3. Кодек АДИКМ
  4. Пакетный контроллер
  5. Микроконтроллер

Разработка

[править | править код]

Каждая электронная система включает в себя три различных типа узлов:

  • узел управления;
  • узлы общего назначения, такие, как буферы ЖКИ, порты ввода-вывода, устройства памяти (ОЗУ, ЭСППЗУ) или преобразователи данных;
  • специфические узлы, например, схемы цифровой настройки и обработки сигнала для радио- и видеосистем, генераторы тонального набора для телефонии.

На дешёвых устройствах I²C часто эмулируется программно с использованием технологии Bit-banging.

Преимущества и недостатки

[править | править код]

Преимущества

[править | править код]
  • необходим всего один микроконтроллер для управления набором устройств;
  • используется всего два проводника для подключения многих устройств;
  • возможна одновременная работа нескольких ведущих (master) устройств, подключенных к одной шине I²C;
  • стандарт предусматривает «горячее» подключение и отключение устройств в процессе работы системы;
  • встроенный в микросхемы фильтр подавляет всплески, обеспечивая целостность данных.
Преимущества для конструкторов
  • поскольку такие микросхемы подключаются непосредственно к шине без каких-либо дополнительных цепей, появляется возможность модификации и модернизации системы прототипа путём подключения и отключения устройств от шины;
  • блоки на функциональной схеме соответствуют микросхемам, переход от функциональной схемы к принципиальной происходит быстро;
  • нет нужды разрабатывать шинные интерфейсы, так как шина уже интегрирована в микросхемы;
  • интегрированная адресация устройств и протокол передачи данных позволяют системе быть полностью программно определяемой;
  • одни и те же типы микросхем могут быть часто использованы в разных приложениях;
  • время разработки снижается, так как конструкторы быстро знакомятся с часто используемыми функциональными блоками и соответствующими микросхемами;
  • микросхемы могут быть добавлены или убраны из системы без оказания влияния на другие микросхемы, подключенные к шине (если их работа независима);
  • простая диагностика сбоев и отладка; нарушения в работе могут быть немедленно отслежены;
  • время разработки программного обеспечения может быть снижено за счет использования библиотеки повторно используемых программных модулей.

Недостатки

[править | править код]
  • ограничение на ёмкость линии — 400 пФ;
  • несмотря на простоту протокола, программирование контроллера I²C затруднено из-за изобилия возможных нештатных ситуаций на шине. По этой причине большинство систем используют I²C c единственным ведущим (Master) устройством, и распространённые драйверы поддерживают только монопольный режим обмена по I²C;
  • трудность локализации неисправности, если одно из подключенных устройств ошибочно устанавливает на шине состояние низкого уровня.

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

[править | править код]
  • В Linux поддержка I²C обеспечивается специальным модулем для каждого устройства, совместимого с этим стандартом. Файл заголовков для написания клиента I²C — /usr/include/linux/i2c.h. В OpenBSD также добавлена поддержка основных микроконтроллеров и сенсоров I²C;
  • В Sinclair QDOS[англ.] и Minerva QL поддержка осуществляется через набор расширений фирмы TF Services;
  • В AmigaOS доступ к устройствам I²C осуществляется с помощью библиотеки i2c.library, написанной Вильгельмом Нойкером;
  • eCos поддерживает I²C для нескольких архитектур.
  • Материнские платы EPIA-M поддерживают I²C на уровне форм-фактора Mini-ITX.

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

[править | править код]

На основе I²C разработаны шины подключения компьютерной периферии ACCESS.bus[англ.], шины обмена данными между компьютером и монитором DDC, шины управления системными функциями SMBus и другие. В этих технологиях возможно использование различных напряжений, частоты обмена и отдельных линий прерываний.

SMBus, предложенный Intel в 1995 году, является подмножеством I²C, определяющим более строгое использование. Одной из целей SMBus является повышение надежности и совместимости. Соответственно, современные I²C-системы включают в себя некоторые политики и правила SMBus, иногда поддерживающие как I²C, так и SMBus, требующие минимальной реконфигурации либо с помощью команды, либо с использованием вывода pin.

Шина IPMB[англ.]*, основанная на I²C, допускает использование двух шин I²C с целью резервирования и реализует интерфейс IPMI в магистрально-модульных системах стандартов AdvancedTCA и MicroTCA.

TWI (Two Wire Interface) или TWSI (Two Wire Serial Interface) суть, та же самая шина I²C, но использует другое название по лицензионным причинам (патенты на I²C уже отменены, 1 октября 2006 года отменены и лицензионные отчисления за использование протокола I²C; однако отчисления сохраняются для выделения эксклюзивного подчинённого адреса на шине I²C.) Подобное название использует Atmel в своих микроконтроллерах AVR.

Совместимый с I²C протокол использует шина для подключения видеокамер — Serial Camera Control Bus (SCCB), фирмы OmniVision.

  • I²S
  • 1-Wire
  • LIN
  • SPI (Serial Peripheral Interface)
  • i3c[англ.]
  • USI (Universal Serial Interface, универсальный последовательный интерфейс) — последовательный интерфейс в микроконтроллерах AVR (наряду с TWI), который позволяет передавать данные от ведущего устройства к ведомому и обратно с большой скоростью. USI может работать в трехпроводном и в двухпроводном режимах; двухпроводной режим напоминает I2C, а трехпроводной - SPI.

Примечания

[править | править код]
  1. I²C-bus specification and user manual. Rev. 6 — 4 April 2014 Архивная копия от 11 мая 2013 на Wayback Machine (англ.) NXP Semiconductors N.V.
  2. как это, к примеру, реализовано в ИМС SAA1064