Как работает шина i2c

Интерфейс I2C (или по другому IIC) — это достаточно широко распространённый сетевой последовательный интерфейс, придуманный фирмой Philips и завоевавший популярность относительно высокой скоростью передачи данных (обычно до 100 кбит/с, в современных микросхемах до 400 кбит/с), дешевизной и простотой реализации.

Как работает шина i2c

Физически сеть представляет собой двухпроводную шину, линии которой называются DATA и CLOCK (необходим ещё и третий провод — земля, но интерфейс принято называть двухпроводным по количеству сигнальных проводов). Соответственно, по линии DATA передаются данные, линия CLOCK служит для тактирования. К шине может быть подключено до 128 абонентов, каждый со своим уникальным номером. В каждый момент времени информация передаётся только одним абонентом и только в одну сторону.

Устройства I2C имеют выход с «открытым коллектором». Когда выходной транзистор закрыт — на соответствующей линии через внешний подтягивающий резистор устанавливается высокий уровень, когда выходной транзистор открыт — он притягивает соответствующую линию к земле и на ней устанавливается низкий уровень (смотрите рисунок). Резисторы имеют номинал от нескольких килоОм до нескольких десятков килоОм (чем выше скорость — тем меньше номинал резисторов, но больше энергопотребление). На рисунке треугольниками на входе показано, что входы высокоомные и, соответственно, влияния на уровни сигналов на линиях они не оказывают, а только «считывают» эти уровни. Обычно используются уровни 5В или 3,3В.

Любое устройство на шине I2C может быть одного из двух типов: Master (ведущий) или Slave (ведомый). Обмен данными происходит сеансами. «Мастер»-устройство полностью управляет сеансом: инициирует сеанс обмена данными, управляет передачей, подавая тактовые импульсы на линию Clock, и завершает сеанс.

Кроме этого, в зависимости от направления передачи данных и «Мастер» и «Слэйв»-устройства могут быть «Приёмниками» или «Передатчиками». Когда «Мастер» принимает данные от «Слэйва» — он является «Приёмником», а «Слэйв» — «Передатчиком». Когда же «Слэйв» принимает данные от «Мастера», то он уже является «Приёмником», а «Мастер» в этом случае является «Передатчиком».

Не надо путать тип устройства «Мастер» со статусом «Передатчика». Несмотря на то, что при чтении «Мастером» информации из «Слэйва», последний выставляет данные на шину Data, делает он это только тогда, когда «Мастер» ему это разрешит, установкой соответствующего уровня на линии Clock. Так что, хотя «Слэйв» в этом случае и управляет шиной Data, — самим обменом всё равно управляет «Мастер».

В режиме ожидания (когда не идёт сеанс обмена данными) обе сигнальные линии (Data и Clock) находятся в состоянии высокого уровня (притянуты к питанию).

Каждый сеанс обмена начинается с подачи «Мастером» так называемого Start-условия. «Старт-условие» — это изменение уровня на линии Data с высокого на низкий при наличии высокого уровня на линии Clock.

После подачи «Старт-условия» первым делом «Мастер» должен сказать с кем он хочет пообщаться и указать, что именно он хочет — передавать данные в устройство или читать их из него. Для этого он выдаёт на шину 7-ми битный адрес «Слэйв» устройства (по другому говорят: «адресует «Слэйв» устройство»), с которым хочет общаться, и один бит, указывающий направление передачи данных (0 — если от «Мастера» к «Слэйву» и 1 — если от «Слэйва» к «Мастеру»). Первый байт после подачи «Старт»-условия всегда всеми «Слэйвами» воспринимается как адресация.

Видео:Шина I2C.Скачать

Шина I2C.

Поскольку направление передачи данных указывается при открытии сеанса вместе с адресацией устройства, то для того, чтобы изменить это направление, необходимо открывать ещё один сеанс (снова подавать «Старт»-условие, адресовать это же устройство и указывать новое направление передачи).

После того, как «Мастер» скажет, к кому именно он обращается и укажет направление передачи данных, — начинается собственно передача: «Мастер» выдаёт на шину данные для «Слэйва» или получает их от него. Эта часть обмена (какие именно данные и в каком порядке «Мастер» должен выдавать на шину, чтобы устройство его поняло и сделало то, что ему нужно) уже определяется каждым конкретным устройством.

Заканчивается каждый сеанс обмена подачей «Мастером» так называемого Stop-условия, которое заключается в изменении уровня на линии Data с низкого на высокий, опять же при наличии высокого уровня на линии Clock. Если на шине сформировано Stop-условие, то закрываются все открытые сеансы обмена.

Внутри сеанса любые изменения на линии Data при наличии высокого уровня на линии Clock запрещены, поскольку в это время происходит считывание данных «Приёмником». Если такие изменения произойдут, то они в любом случае будут восприняты либо как «Старт»-условие (что вызовет прекращение обмена данными), либо как «Стоп»-условие (что будет означать окончание текущего сеанса обмена). Соответственно, во время сеанса обмена установка данных «Передатчиком» (выставление нужного уровня на линии Data) может происходить
только при низком уровне на линии Clock.

Несколько слов по поводу того, в чём в данном случае разница между «прекращением обмена данными» и «окончанием сеанса обмена». В принципе «Мастеру» разрешается, не закрыв первый сеанс обмена, открыть ещё один или несколько сеансов обмена с этим же (например, как было сказано выше, для изменения направления передачи данных) или даже с другими «Слэйвами», подав новое «Старт»-условие без подачи «Стоп»-условия для закрытия предыдущего сеанса. Управлять линией Data, для того, чтобы отвечать «Мастеру», в этом случае будет разрешено тому устройству, к которому «Мастер» обратился последним, однако старый сеанс при этом нельзя считать законченным. И вот почему. Многие устройства (например те же eeprom-ки 24Схх) для ускорения работы складывают данные, полученные от «Мастера» в буфер, а разбираться с этими полученными данными начинают только после получения сигнала об окончании сеанса обмена (то есть «Стоп-условия»).

Читайте также: Шины bridgestone московская область

То есть, например, если на шине висит 2 микросхемы eeprom 24Cxx и вы открыли сеанс записи в одну микросхему и передали ей данные для записи, а потом, не закрывая этот первый сеанс, открыли новый сеанс для записи в другую микросхему, то реальная запись и в первую и во вторую микросхему произойдёт только после формирования на шине «Стоп-условия», которое закроет оба сеанса. После получения данных от «Мастера» eeprom-ка складывает их во внутренний буфер и ждёт окончания сеанса, для того, чтобы начать собственно процесс записи из своего внутреннего буфера непосредственно в eeprom. То есть, если вы после после передачи данных для записи в первую микруху не закрыли этот сеанс, открыли второй сеанс и отправили данные для записи во вторую микруху, а потом, не сформировав «Стоп-условие», выключили питание, то реально данные не запишутся ни в первую микросхему, ни во вторую. Или, например, если вы пишете данные попеременно в две микрухи, то в принципе вы можете открыть один сеанс для записи в первую, потом другой сеанс для записи во вторую, потом третий сеанс для записи опять в первую и т.д., но если вы не будете закрывать эти сеансы, то в конце концов это приведёт к переполнению внутренних буферов и в итоге к потере данных.

Здесь можно привести такую аналогию: ученики в классе («слэйвы») и учитель («мастер»). Допустим учитель вызвал какого-то ученика (пусть будет Вася) к доске и попросил его решить какой-то пример. После того как Вася этот пример решил, учитель вызвал к доске Петю и начал спрашивать у него домашнее задание, но Васю на место не отпустил. Вот в этом случае вроде бы разговор с Васей закончен, — учитель разговаривает с Петей, но Вася стоит у доски и не может спокойно заниматься своими делами (сеанс общения с ним не закрыт).

В случае, если «Слэйв» во время сеанса обмена не успевает обрабатывать данные, — он может растягивать процесс обмена, удерживая линию Clock в состоянии низкого уровня, поэтому «Мастер» должен проверять возврат линии Clock к высокому уровню после того, как он её отпустит. Хотелось бы подчеркнуть, что не стоит путать состояние, когда «Слэйв» не успевает принимать или посылать данные, с состоянием, когда он просто занят обработкой данных, полученных в результате сеанса обмена. В первом случае (во время обмена данными) он может растягивать обмен, удерживая линию Clock, а во втором случае (когда сеанс обмена с ним закончен) он никакие линии трогать не имеет права. В последнем случае он просто не будет отвечать на «обращение» к нему от «Мастера».

Внутри сеанса передача состоит из пакетов по девять бит, передаваемых в обычной положительной логике (то есть высокий уровень — это 1, а низкий уровень — это 0). Из них 8 бит передаёт «Передатчик» «Приёмнику», а последний девятый бит передаёт «Приёмник» «Передатчику». Биты в пакете передаются старшим битом вперёд. Последний, девятый бит называется битом подтверждения ACK (от английского слова acknowledge — подтверждение). Он передаётся в инвертированном виде, то есть 0 на линии соответствует наличию бита подтверждения, а 1 — его отсутствию. Бит подтверждения может сигнализировать как об отсутствии или занятости устройства (если он не установился при адресации), так и о том, что «Приёмник» хочет закончить передачу или о том, что команда, посланная «Мастером», не выполнена.

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

Видео:Введение в шину I2CСкачать

Введение в шину I2C

Вот собственно и всё. На рисунках ниже всё это описание показано в графической форме.

Как работает шина i2c
Как работает шина i2c

ПараметрОбозн.Мин.знач.Комментарий
Свободная шинаtBUF4,7 мксэто минимальное время, в течении которого обе линии должны находиться в свободном состоянии перед подачей «Старт»-условия
Фиксация
«Старт»- условия
tHD;STA4,0 мксминимальное время от подачи «Старт»- условия до начала первого такта передачи
Готовность
«Стоп»- условия
tSU;STO4,0 мксминимальное время, через которое можно подавать «Стоп»- условие после освобождения шины Clock
Длительность LOW полупер. шины ClocktLOW4,7 мксминимальная длительность полупериода установки данных (когда на шине Clock низкий уровень)
Длительность HIGH полупер. шины ClocktHIGH4,0 мксминимальная длительность полупериода считывания данных (когда на шине Clock высокий уровень)
Удержание данныхtHD;DAT0то есть данные на шину Data можно выставлять сразу после спада на линии Clock
Готовность данныхtSU;DAT250 нсто есть поднимать уровень на шине Clock можно не ранее 250 нс после установки данных на шине Data

Читайте также: Давление в шинах шкода рапид 2016

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

Программная реализация мастер-абонента шины I2C в режиме single-master, библиотеки процедур: для PIC, для AVR

Программа для устройства копирования микросхем памяти 24Cxx (здесь можно посмотреть пример использования приведённых выше библиотек для реализации режима I2C-Master на PIC-контроллере)

Программа 2 для контроллера I2C-шлюза, режим Slave из терминалки ПК (а тут посмотреть пример того, как можно сделать I2C-Slave на контроллере AVR)

Шина I2C — назначение, устройство, передача данных, адресация

Создавая электронную схему, многие разработчики сталкиваются с необходимостью применения большого количества промежуточных микросхем для согласования, выборки и адресации отдельных ее блоков. Чтобы свести количество вспомогательных микросхем к минимуму, компания Филипс еще в 80-е годы предложила использовать сетевой последовательный интерфейс с двухпроводной двунаправленной шиной I2C, предназначенную специально для управления несколькими микросхемами в рамках одного устройства.

Как работает шина i2c

Сегодня одна только компания Филипс выпускает более сотни I2C-совместимых устройств для электронного оборудования самого разного назначения: памяти, систем видеопроцессоров, аналого-цифровых и цифро-аналоговых преобразователей, драйверов дисплеев и т. д.

Как работает шина i2c

Видео:Лекция 308. Шина I2CСкачать

Лекция 308.  Шина I2C

Шина I2C представляет собой модификацию последовательного протокола обмена данными, способную в обычном «быстром» режиме передавать последовательные 8-битные данные на скоростях от 100 до 400 кбит/с. Процесс обмена данными реализуется здесь всего по двум проводам (не считая общего провода): линия данных SDA и линия синхронизации SCL.

Шина становится двунаправленной благодаря тому, что каскады выходов подключенных к шине устройств имеют открытые коллекторы или стоки, воспроизводя таким образом монтажное «И». В результате шина сводит к минимуму количество связей между микросхемами, на плате остается меньше необходимых контактов и дорожек. Сама плата в итоге получается проще, компактнее и технологичнее в производстве.

Данный протокол позволяет исключить дешифраторы адреса и прочую внешнюю логику согласования. Число микросхем, могущих одновременно работать с шиной I2C, ограничено ее емкостью — максимум 400 пФ.

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

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

В каждый момент действия шины I2C только одно устройство может выступать ведущим, оно формирует на линию SCL сигнал. Ведущий может быть либо ведущим-приемником, либо ведущим-передатчиком.

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

Синхронизация пары устройств обеспечивается тем, что все устройства присоединены к шине формируя монтажное «И». В первоначальном состоянии сигналы SDA и SCL — высокого уровня.

Обмен начинается с генерации ведущим состояния «СТАРТ»: на линии SDA сигнал переходит из высокого — в низкое состояние, пока на линии SCL стабильный высокий уровень. Данную ситуацию все устройства, подключенные к шине, воспринимают как команду к началу обмена.

Каждый ведущий создает индивидуальный сигнал синхронизации на линии SCL, когда передает данные по шине.

Обмен заканчивается формирование ведущим состояния «СТОП»: на линии SDA сигнал изменяется от низкого — к высокому состоянию, пока на линии SCL стабильный высокий уровень.

Видео:Лекция "Интерфейсы (часть II). I2C. 1-Wire"Скачать

Лекция "Интерфейсы (часть II). I2C. 1-Wire"

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

Как только состояние «СТАРТ» объявлено, ведущий переводит линию SCL в состояние низкого уровня, и посылает на линию SDA старший бит первого байта сообщения. Количество байт в одном сообщение не ограничено. Изменения на линии SDA разрешены только при низком уровне сигнала на SCL-линии. Данные действительны и не должны изменяться лишь при высоком состоянии синхроимпульса.

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

Итак, отправка 8 бит данных от передатчика — к приемнику завершается формированием дополнительного импульса на линии SCL, когда принимающее устройство выставляет сигнал низкого уровня на линию SDA, показывая что байт целиком им принят.

Читайте также: Летние шины matador 175 65 r14

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

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

Если прием осуществляет ведущий-приемник, то он обязан сообщить по завершении передачи ведомому-передатчику — не подтверждением последнего байта. Ведомый передатчик освобождает линию данных для того чтобы ведущий мог выдать сигнал «СТОП» либо повторный сигнал «СТАРТ».

Синхронизация устройств обеспечивается тем, что подключения к линии SCL выполняются по принципу монтажного «И».

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

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

Видео:I2C. Краткая теория с примером. STM32 CubeIDE.Скачать

I2C. Краткая теория с примером. STM32 CubeIDE.

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

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

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

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

Как работает шина i2c

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

Обычный режим предполагает семибитную адресацию. Адресация работает так: после команды «СТАРТ» ведущий посылает первый байт, в котором определяется то, какой именно ведомый требуется для взаимодействия ведущему. Существует и адрес общего вызова, определяющий все устройства шины, на него все устройства (теоретически) отвечают подтверждением, но практически такое встречается редко.

Итак, первые семь битов самого первого байта — это адрес ведомого. Младший бит, восьмой, показывает направление отправки данных. Если там «0», то информация будет записываться ведущим в этого ведомого. Если «1», информация будет считываться ведущим с данного ведомого.

По завершении пересылки ведущим байта с адресом, каждый ведомый сравнивает свой адрес с ним. У кого адрес совпадает — тот ведомый и определяет себя как ведомый-передатчик или ведомый-приемник, в зависимости от значения младшего бита байта с адресом.

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

Иногда достаточно одного вывода с аналоговой установкой диапазона программируемых адресов, например SAA1064 – драйвер светодиодного индикатора, имеющий именно такую реализацию. Потенциал на определенном выводе определяет смещение адресного пространства микросхемы так, чтобы микросхемы одного типа не конфликтовали, работая на одной шине. Все микросхемы с поддержкой шины I2C содержат набор адресов, которые производитель указывает в документации.

Видео:I2C интерфейсСкачать

I2C интерфейс

Комбинация «11110ХХ» зарезервирована для адресации по 10 битам. Если представить обмен данными от команды «СТАРТ» до команды «СТОП», это будет выглядеть так:

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

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

Если Вам понравилась эта статья, поделитесь ссылкой на неё в социальных сетях. Это сильно поможет развитию нашего сайта!

  • Свежие записи
    • Нужно ли менять пружины при замене амортизаторов
    • Скрипят амортизаторы на машине что делать
    • Из чего состоит стойка амортизатора передняя
    • Чем стянуть пружину амортизатора без стяжек
    • Для чего нужны амортизаторы в автомобиле

    💥 Видео

    Что такое I2C ??? Подключаем GY-521 и Oled 96*16 к STM 32Скачать

    Что такое I2C ??? Подключаем GY-521 и Oled 96*16 к STM 32

    Видеоуроки по Arduino. I2C и processing (7-я серия, ч1)Скачать

    Видеоуроки по Arduino. I2C и processing (7-я серия, ч1)

    25 Шина I2CСкачать

    25 Шина I2C

    Шина данных i2c - декодируем/синхронизируем с помощью осциллографа Lecroy!Скачать

    Шина данных i2c - декодируем/синхронизируем   с помощью осциллографа Lecroy!

    Подключение нескольких устройств, датчиков по I2C (АйТуСи) шинеСкачать

    Подключение нескольких устройств, датчиков по I2C (АйТуСи) шине

    Логический анализатор шины i2cСкачать

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

    Урок 24. Узнаём адреса устройств на шине I2CСкачать

    Урок 24. Узнаём адреса устройств на шине I2C

    Подключение нескольких устройств по шине i2cСкачать

    Подключение нескольких устройств по шине i2c

    Шина I2CСкачать

    Шина I2C

    Урок 9. Адреса модулей на шине I2C. Arduino (что такое I2C, адресация, как изменить адрес модуля)Скачать

    Урок 9. Адреса модулей на шине I2C. Arduino (что такое I2C, адресация, как изменить адрес модуля)

    STM32: Интерфейсная шина I2C. Подключаем HDC1080.Скачать

    STM32: Интерфейсная шина I2C. Подключаем HDC1080.

    I2c шина в iPhone, способы диагностики, причины циклического перезапуска.Скачать

    I2c шина в iPhone, способы диагностики, причины циклического перезапуска.

    Как подключить несколько I²C с одинаковыми адресами. Железки АмперкиСкачать

    Как подключить несколько I²C с одинаковыми адресами. Железки Амперки

    Установщик адресов Flash-i2cСкачать

    Установщик адресов Flash-i2c
Поделиться или сохранить к себе:
Технарь знаток