Интерфейс i2c что это

Подробное описание интерфейса I2C

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

Интерфейс i2c что это. Смотреть фото Интерфейс i2c что это. Смотреть картинку Интерфейс i2c что это. Картинка про Интерфейс i2c что это. Фото Интерфейс 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 — если от «Слэйва» к «Мастеру»). Первый байт после подачи «Старт»-условия всегда всеми «Слэйвами» воспринимается как адресация.

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

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

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

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

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

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

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

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

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

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

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

3) Диаграммы и тайминги.

Интерфейс i2c что это. Смотреть фото Интерфейс i2c что это. Смотреть картинку Интерфейс i2c что это. Картинка про Интерфейс i2c что это. Фото Интерфейс i2c что это
Интерфейс i2c что это. Смотреть фото Интерфейс 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

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

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

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

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

Источник

Шина I2C. Основные понятия

В данной статье рассматриваются основные характеристики и преимущества протокола последовательной связи I2C (Inter-Integrated Circuit).

Связь через алфавитную кашу

Неудивительно, что общей особенностью электронных систем является необходимость обмена информацией между двумя или тремя или десятью отдельными компонентами. Инженеры разработали ряд стандартных протоколов, которые помогают различным микросхемам успешно общаться, что становится очевидным, когда вы сталкиваетесь с потоком сокращений в разделе «Связь» в списке характеристик микроконтроллера или сигнального процессора: UART, USART, SPI, I2C, CAN. Каждый протокол имеет свои плюсы и минусы, и важно немного знать о каждом из них, чтобы вы могли принимать обоснованные решения при выборе компонентов или интерфейсов.

Эта статья посвящена шине I2C, которая обычно используется для связи между отдельными интегральными микросхемами, расположенными на одной печатной плате. Два других распространенных протокола, которые также входят в эту основную категорию – это UART (универсальный асинхронный приемник/передатчик) и SPI (последовательный периферийный интерфейс). Вам необходимо знать основные характеристики I2C, прежде чем вы сможете полностью понять сравнение этих трех интерфейсов, поэтому обсудим эту тему в конце статьи.

Много названий, а шина одна

Дополнительная путаница вносится, когда вы замечаете, что SMB или SMBus явно используется в качестве еще одного способа обращения к шине I2C. Фактически эти сокращения относятся к шине управления системой SMB (System Management Bus), которая отличается, хотя и почти идентична, от шины I2C. Оригинальный протокол I2C был разработан компанией Phillips Semiconductor, а спустя годы Intel определил протокол SMBus как расширение I2C. Эти две шины в значительной степени взаимозаменяемы; если вас интересуют незначительные отличия между ними, то смотрите страницу 57 спецификации шины управления системой SMB.

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

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

Интерфейс i2c что это. Смотреть фото Интерфейс i2c что это. Смотреть картинку Интерфейс i2c что это. Картинка про Интерфейс i2c что это. Фото Интерфейс i2c что это Возможные проблемы на шине

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

Обзор

Прежде чем вдаваться в детали, давайте рассмотрим ключевые характеристики I2C:

I2C против UART и SPI

Преимущества I2C можно резюмировать следующим образом:

А вот некоторые недостатки:

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

Возможно, вам придется сознательно избегать I2C, если пропускная способность является приоритетом; SPI поддерживает более высокие частоты тактового сигнала и минимизирует накладные расходы. Кроме того, разработка низкоуровнего аппаратного обеспечения для SPI (или UART) намного проще, поэтому, если вы работаете с FPGA и разрабатываете свой последовательный интерфейс с нуля, I2C, вероятно, стоит выбирать последним.

Заключение

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

Источник

Электроника для всех

Блог о электронике

Интерфейсная шина IIC (I2C)

Логический уровень
Как передаются отдельные биты понятно, теперь о том что эти биты значат. В отличии от SPI тут умная адресная структура. Данные шлются пакетами, каждый пакет состоит из девяти бит. 8 данных и 1 бит подтверждения/не подтверждения приема.

После адресного пакета идут пакеты с данными в ту или другую сторону, в зависимости от бита RW в заголовочном пакете.
Вот, например, Запись. В квадратиках идут номера битов. W=0

Интерфейс i2c что это. Смотреть фото Интерфейс i2c что это. Смотреть картинку Интерфейс i2c что это. Картинка про Интерфейс i2c что это. Фото Интерфейс i2c что это

Задача решается так:

Интерфейс i2c что это. Смотреть фото Интерфейс i2c что это. Смотреть картинку Интерфейс i2c что это. Картинка про Интерфейс i2c что это. Фото Интерфейс i2c что это
Вот и славно. Часы установлены и начали тикать. Но вот надо нам считать те же данные, а вдруг изменились?
С записью все понятно — записали вначале адрес, а потом следом записали данные. А умная микросхема все прекрасно поняла и рассовала по ячейкам. А с чтением? А с чтением все через задницу, в смысле через запись.

Интерфейс i2c что это. Смотреть фото Интерфейс i2c что это. Смотреть картинку Интерфейс i2c что это. Картинка про Интерфейс i2c что это. Фото Интерфейс i2c что это

Скриншот с осциллографа RIGOL 1042CD

Вроде бы все, практический пример с AVR будет потом, а пока помедитируйте над диаграммой работы конечного автомата TWI передатчика ATmega8. Скоро я вас буду этим грузить!

Интерфейс i2c что это. Смотреть фото Интерфейс i2c что это. Смотреть картинку Интерфейс i2c что это. Картинка про Интерфейс i2c что это. Фото Интерфейс i2c что это

Страшна? 😉 На самом деле там все не так брутально. Можно обойтись вообще парой десятков строк кода на ассемблере.

Спасибо. Вы потрясающие! Всего за месяц мы собрали нужную сумму в 500000 на хоккейную коробку для детского дома Аистенок. Из которых 125000+ было от вас, читателей EasyElectronics. Были даже переводы на 25000+ и просто поток платежей на 251 рубль. Это невероятно круто. Сейчас идет заключение договора и подготовка к строительству!

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

200 thoughts on “Интерфейсная шина IIC (I2C)”

(1) OpenID работает криво. Я зашёл как blacklion.livejournal.com и всё равно справа-сверху «войти» (а не «выйти») и не даю комментировать. Пришлось регистрироваться и теперь тут два меня.

(2) Софтового мастера сделать не сложно. А вот слейва как-то просто не получается.

Щас попробую с опен ид поиграться.

Более того, многие предпочитают делать софтовый И2С мастер чтобы не заморачиваться с встроенным в TWI конечным автоматом.

Более того, многие предпочитают делать софтовый И2С мастер чтобы не заморачиваться с встроенным в TWI конечным автоматом.
Я когда первый раз подходил к электронике смотрел на PIC (зачем я это делал!? Зачем на PIC?!) так реализовал мастера в качестве упражнения за вечер. А вот слейва так и не осилил…

Я сделал софтового слейва на AT89C2051, но работало жутко медленно.

плюсадин. я уже раз 5 жаловался что логины глючат 😀 нашел выход, что залогинился, пару минуток подождал и рефреш. работает, но бесит :\

DI HALT спасибо за статью. Давно ждал рассказ про I2C. 🙂

У меня их почти полный аналог ICL12008 ваще работать не хотят — не отзываются на свой адрес, не дают ACK

и у тебя, Брут? я изъебался с их инициализацией — не пашут и все. взял ds, который считал сгоревшим и не рабочим, по по недоразумению не выкинул — и он заработал. в топку эти ISL, от лукавого они..

А у меня 5 штук их лежит — сэмплы. Надо бы в ST гневный мессадж накатать. МОл чо вы за говно нам подсунули?

Да, есть такое дело 🙂 Вообще при начале работы с IIC девайсом, желательно вдоль и поперек изучить Datasheet к нему. В свое время тоже поломал голову с m41 от ST. Вроде все пишется, все читается, но часы стоят и все тут. Оказалось там есть хитрый битик, который при пропадании всего питания — Vcc и Vbat, останавливает часы и пока его не сбросишь они не пойдут.
Ну и еще обычный прикол с часами, что не все могут работать при отключенной батарейке — даже если Vcc есть, внутри у них стоит контроль, который проверяет разницу между напругой и Vbat, и если Vbat нет, то часы просто ни на что не отвечают 🙂

p.s. а про NACK в конце чтения это да, самые популярные грабли наверно. Кстати для отлаживания шины если нет крутого осцила, можно прикрутить I2C Sniffer на Atmega8 — оч удобная штука, она в консоли показывает полностью весь обмен в удобоваримом виде.

А чё с ним было голову ломать? Кстати, m41t56 рекомендую, простые и удобные I2C часы. Про битик я давно знал — он у всех часовых изделий от ST присутствует. Наверное, как совместимость с m48t08 — который с батареей на борту. Чтобы батарею не сажать, пока таймкипер лежит на складе, они глушат часы.

О)) На самом деле классная тема! Мне бы сначала с простым UARTом разобраться, а потом только к творению Philips)) Буду ждать исходников…

Отличная статья! А есть последняя диаграмма только в чуть лучшем качестве? А то буквы трудно различить.

Красные пути — нормальная работа
Синие — возможные косяки.

Источник

I2C интерфейс

Интерфейс i2c что это. Смотреть фото Интерфейс i2c что это. Смотреть картинку Интерфейс i2c что это. Картинка про Интерфейс i2c что это. Фото Интерфейс i2c что это
Интерфейс I2C является широко распространенным и популярным стандартом передачи данных между устройствами. Данный интерфейс поддерживают множество различных датчиков и микросхем, наиболее известные это микросхемы EEPROM памяти серии 24cXX. Для передачи данных используются всего две линии, которые представляют собой шину данных, причем на одну шину можно подключать несколько различных устройств. В этой статье я приведу описание интерфейса и реализацию на программном уровне.

Описание интерфейса I2C

Способ подключения

Адресация

В интерфейсе предусмотрена программная адресация устройств подключенных к шине, наиболее распространена длина адреса в 7 бит, теоретически это позволяет подключать на шину до 127 устройств, но часть адресов по спецификации зарезервированы и не могут использоваться разработчиками. Каждое устройство имеет свой уникальный адрес, который заложен производителем и указан в технической документации. Адрес устройства может быть фиксированным, или с возможностью аппаратной настройки, в этом случае устройство имеет дополнительные входы, в зависимости от уровня напряжения на входах (высокое или низкое), можно получить различные адреса. Обычно количество входов варьируется от 1-го до 3-х, которые задают значения определенных битов 7-битного адреса. Аппаратная настройка адреса предусмотрена для возможности подключения нескольких однотипных устройств на одну шину.

Также интерфейс предусматривает более редкую 10-битную адресацию, под которую зарезервирован 7-битный адрес 11110XX (XX-зависят от значения адреса), в этом случае сначала предается зарезервированный адрес, в котором два последних бита представляют собой старшие биты 10-битного адреса, затем передаются младшие 8 бит адреса. При использовании данной адресации на шину можно подключать более 1000 устройств.

Условия “Старт” и “Стоп”

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

Аналогично, сеанс передачи данных завершается специальным условием “Стоп”, это переключение линии SDA с низкого логического уровня на высокий, при высоком уровне на линии SCL. Данные условия генерирует ведущий (микроконтроллер).

Исходя из условий “Старт” и “Стоп”, во время передачи данных линия SDA может переключаться только при низком уровне на линии SCL, то есть установка новых данных на линии SDA возможна только после спада уровня на SCL. В течение импульса тактирования (высокий уровень на SCL), состояние линии SDA не должно меняться, в это время выполняется считывание данных на SDA.

Формат передачи данных

Данные по интерфейсу передаются побайтно, старшим битом вперед, за каждым переданным байтом (8 бит) следует бит подтверждения, устройство (ведущий или ведомый) принявшее байт данных, устанавливает низкий уровень на линии SDA на следующем тактовом импульсе SCL, тем самым подтверждая получение байта. В это время передающее устройство должно опрашивать линию SDA, ожидая ответ об успешном получении байта. Ниже на картинке представлена диаграмма передачи данных по шине I2C:
Интерфейс i2c что это. Смотреть фото Интерфейс i2c что это. Смотреть картинку Интерфейс i2c что это. Картинка про Интерфейс i2c что это. Фото Интерфейс i2c что это
Сначала передается байт с 7-битным адресом ведомого, значение 8-го бита (R/W) определяет направление передачи данных, нулевое значение соответствует записи данных, то есть передача от ведущего к ведомому. Если бит направления равен 1, то выполняется чтение данных из ведомого.

Ведомый сравнивает переданный адрес со своим и при совпадении откликается, устанавливая низкий уровень на линии SDA (бит подтверждения). Ведущий, получив подтверждение, начинает передавать байты с данными, или принимает их, в зависимости от направления передачи. На следующей картинке более подробно представлены различные варианты передачи данных по шине I2C:
Интерфейс i2c что это. Смотреть фото Интерфейс i2c что это. Смотреть картинку Интерфейс i2c что это. Картинка про Интерфейс i2c что это. Фото Интерфейс i2c что это
После передачи адреса ведомого, передается адрес регистра, над которым будут производиться операции чтения/записи. Каждое устройство обладает своим набором внутренних регистров, назначение которых указано в технической документации.

Запись одного байта состоит из следующей последовательности: условие “Старт” – адрес ведомого (бит R/W сброшен) – адрес внутреннего регистра ведомого – данные (1 байт) – условие “Стоп”. Запись нескольких байтов практически ничем не отличается, после отправки первого байта данных, передаются остальные байты, сеанс заканчивается условием “Стоп”. При этом данные записываются в регистры последовательно, начиная с заданного адреса, обычно ведомый выполняет автоматический инкремент адреса внутренних регистров.

Для чтения одного байта данных, необходимо сначала передать адрес ведомого и адрес требуемого регистра, при этом бит направления должен быть сброшен на запись, после чего повторно передается условие “Старт”, затем снова адрес ведомого, в этот раз с установленным битом направления на чтение. Далее выполняется прием байта данных от ведомого, для окончания сеанса передачи ведущий не выдает подтверждения, то есть на линии SDA остается высокий уровень на время бита подтверждения, далее следует условие “Стоп”. Чтение нескольких байтов выглядит аналогично, ведущий выдает подтверждение после каждого принятого байта, за исключением последнего байта. Как и в случае записи, ведомый выполняет автоматический инкремент адреса, начиная с заданного.

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

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

Скорость передачи данных

По спецификации интерфейс поддерживает три скоростных режима передачи:

Стандартный режим до 100 Кбит/сек поддерживают все устройства, возможность функционирования на больших скоростях необходимо уточнять в технической документации на устройство.

Программная реализация интерфейса I2C

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

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *