Что такое шина I2C. Как устроен протокол I2C. Как происходит передача данных по I2C. Какие преимущества у интерфейса I2C. Где применяется интерфейс I2C.
Что такое интерфейс I2C
I2C (Inter-Integrated Circuit) — это последовательный протокол связи, разработанный компанией Philips в начале 1980-х годов. Этот интерфейс предназначен для соединения различных цифровых устройств, таких как микроконтроллеры, датчики, память и другие компоненты на одной плате.
Основные особенности интерфейса I2C:
- Использует всего 2 линии для передачи данных — SDA (линия данных) и SCL (линия тактового сигнала)
- Поддерживает подключение нескольких устройств к одной шине (до 128 устройств)
- Работает по принципу «ведущий-ведомый» (master-slave)
- Обеспечивает двунаправленную передачу данных
- Поддерживает скорости передачи от 100 кбит/с до 5 Мбит/с
Как устроен протокол I2C
Протокол I2C основан на следующих ключевых элементах:
Линии SDA и SCL
- SDA (Serial Data) — линия для передачи данных
- SCL (Serial Clock) — линия тактового сигнала
В режиме ожидания обе линии находятся в высоком логическом уровне за счет подтягивающих резисторов.
Адресация устройств
Каждое устройство на шине I2C имеет уникальный 7-битный адрес. Это позволяет подключать до 128 устройств. Некоторые устройства имеют фиксированные адреса, у других адрес может настраиваться.
Принцип «ведущий-ведомый»
На шине I2C всегда есть одно главное устройство (master), которое инициирует передачу данных, и одно или несколько подчиненных устройств (slave). Ведущее устройство генерирует тактовый сигнал и управляет обменом данными.
Как происходит передача данных по I2C
Передача данных по шине I2C происходит в следующей последовательности:
- Ведущее устройство генерирует состояние СТАРТ (START condition)
- Передается 7-битный адрес ведомого устройства и бит направления передачи (чтение/запись)
- Ведомое устройство отправляет бит подтверждения (ACK)
- Происходит передача данных побайтно, каждый байт подтверждается битом ACK
- После завершения передачи ведущее устройство генерирует состояние СТОП (STOP condition)
Давайте рассмотрим подробнее основные этапы обмена данными по I2C.
Состояние СТАРТ
Передача данных всегда начинается с генерации ведущим устройством состояния СТАРТ. Это происходит путем перевода линии SDA из высокого состояния в низкое при высоком уровне на линии SCL.
Передача адреса
После состояния СТАРТ передается 7-битный адрес ведомого устройства и 8-й бит, определяющий операцию чтения (1) или записи (0). Адрес передается старшим битом вперед.
Подтверждение приема (ACK)
Передача данных
Данные передаются побайтно, начиная со старшего бита. После передачи каждого байта принимающая сторона должна отправить бит подтверждения (ACK).
Состояние СТОП
Для завершения передачи данных ведущее устройство генерирует состояние СТОП путем перевода линии SDA из низкого состояния в высокое при высоком уровне на линии SCL.
Какие преимущества у интерфейса I2C
Интерфейс I2C обладает рядом важных преимуществ:
- Простота реализации — требуется всего 2 линии связи
- Возможность подключения множества устройств к одной шине
- Поддержка устройств с разным напряжением питания
- Низкое энергопотребление
- Помехоустойчивость за счет синхронизации данных по фронту тактового сигнала
- Возможность горячего подключения устройств
Где применяется интерфейс I2C
Благодаря своим преимуществам, интерфейс I2C нашел широкое применение в различных областях:
- Мобильные устройства и планшеты
- Встраиваемые системы
- Бытовая электроника
- Автомобильная электроника
- Измерительное оборудование
- Системы «умный дом»
I2C используется для подключения различных компонентов, таких как:
- Датчики (температуры, давления, освещенности и др.)
- Часы реального времени
- EEPROM память
- АЦП и ЦАП
- ЖК-дисплеи
- Аудиокодеки
Особенности программирования устройств с интерфейсом I2C
При разработке программного обеспечения для устройств с интерфейсом I2C следует учитывать некоторые особенности:
Инициализация шины
Перед началом работы необходимо выполнить инициализацию шины I2C, включающую настройку выводов микроконтроллера и параметров передачи данных.
Генерация состояний СТАРТ и СТОП
Для корректной работы протокола важно правильно формировать состояния СТАРТ и СТОП в начале и конце передачи данных.
Обработка подтверждений
После передачи каждого байта данных необходимо проверять наличие бита подтверждения от приемника. В случае отсутствия подтверждения следует прекратить передачу.
Тайм-ауты
Рекомендуется использовать механизмы тайм-аутов для предотвращения зависаний в случае проблем на шине.
Обработка коллизий
При реализации многомастерной шины необходимо предусмотреть механизмы обнаружения и разрешения коллизий при одновременной передаче данных несколькими ведущими устройствами.
Заключение
Интерфейс I2C является простым и эффективным решением для организации связи между различными цифровыми устройствами. Несмотря на относительно невысокую скорость передачи данных, его широкие возможности и простота реализации обеспечили ему популярность во многих областях электроники.
Понимание принципов работы I2C и особенностей его программирования позволяет разработчикам создавать надежные и эффективные устройства с использованием этого интерфейса.
анализ сигналов шины I2C / Хабр
Как я уже неоднократно упоминал в своих публикациях, любительские проекты финансируются из семейного бюджета, и радиолюбитель, обычно, не может себе позволить покупку дорогостоящего измерительного оборудования. Приходится довольствоваться тем, что есть. Или тем, что удаётся взять попользоваться «на время». А иногда от безысходности радиолюбителю приходится «сверлить пилой и пилить буравчиком».
Недавно я испытал потребность выяснить, что на самом деле передаётся в разрабатываемом мной устройстве по шине I2C. Это был тот счастливый момент, когда можно было себе позволить «пилить пилой».
Как происходит обмен данными между устройствами по протоколу I2C можно узнать здесь. Для анализа сигналов на шине I2C можно применить, как цифровой двухканальный осциллограф с памятью, так и логический анализатор.
При работе с радиоэлектронной аппаратурой осциллограф является наиболее универсальным инструментом. Современные цифровые осциллографы обладают рядом полезных свойств, позволяющих производить, в том числе, и анализ сигналов шины I2C.
В данном случае мне достался «на время» цифровой двухканальный осциллограф с памятью Rigol DS1102 (цена на сайте производителя $461). У этого прибора есть два канала измерения с полосой пропускания до 100 MHz и частотой выборки сигнала 1 GSa/s.
К сигналу SCL был подключен Ch2. К сигналу SDA был подключен Ch3. Для обоих каналов был установлен масштаб 1.00 V/дел. Масштаб развёртки – 10 us/дел. Для наглядности луч первого канала смещён в верхнюю половину экрана, а луч второго канала – в нижнюю.
В меню Trigger осциллограф был настроен на однократное измерение с запуском по достижению передним фронтом в канале Ch2 уровня 1.00 V:
После включения тестируемого оборудования была нажата большая красная кнопка Run/Stop. Осциллограф встал в режим ожидания, затем запустился. Через несколько секунд запись была остановлена вручную.
Полученная осциллограмма записывалась на внешний носитель поэкранно:
Произведём разбор записанных сигналов. На первом экране мы видим отображение настроек прибора и осциллограмму сигналов SCL (верхняя часть) и SDA (нижняя часть экрана), на которой читаем слева направо:
- сигнал START: ведущее устройство выставляет низкий уровень сначала на шине SDA, а затем на шине SCL;
- 7-bit адрес: читаем 0x60 (1100000) на шине SDA по передним фронтам SCL;
- признак режима записи: читаем на шине SDA низкий уровень по следующему переднему фронту SCL;
- сигнал ACK: ведущее устройство после передачи байта переключается на приём по шине SDA, на SDA устанавливается высокий уровень, ведомое устройство по заднему фронту SCL выставляет на SDA низкий уровень (собственно, сигнал ACK), который ведущее устройство считывает по переднему фронту SCL;
- сигнал STOP: ведущее устройство выставляет высокий уровень сначала на шине SCL, а затем на шине SDA
Подобным образом, медленно, но верно, можно произвести вручную дешифровку остальных частей записи.
Дешифрацию протокола можно произвести более простым методом, используя логический анализатор и соответствующее программное обеспечение.
Для использования в качестве логического анализатора мне был любезно предоставлен коллегами Saleae Logic 8 (цена на сайте производителя $399). В качестве программного обеспечения использовалась демо-версия Saleae Logic 1.2.18, взятая с официального сайта. Устанавливая данное программное обеспечение, я принял лицензионное соглашение с условием, в том числе, не использовать данное программное обеспечение с оборудованием сторонних производителей.
В программе был включен анализатор протокола I2C. Для сигнала SCL был назначен канал CH0, а для сигнала SDA – канал Ch2. Частота выборки сигнала 24 MSa/s.
Запуск был настроен по «переднему» фронту CH0. Для отображения данных был выбран шестнадцатеричный формат.
После включения тестируемого оборудования была нажата большая зелёная кнопка Start, и через несколько секунд на экран вывелась диаграмма:
Максимум пользы в применении логического анализатора я вижу в том, что программа сама дешифрует полученные данные. Результаты дешифровки заносятся построчно в окно Decoded Protocols. При выборе в окне строки данных, программа показывает расположение этих данных на диаграмме.
Для сравнения вариантов я «склеил» в графическом редакторе четыре снимка экрана осциллографа и фрагмент диаграммы логического анализатора:
Start обозначен зеленым кружочком, Stop – красным кружочком. На диаграмме сначала происходит проверка наличия на шине устройства с адресом 0x60, а затем производится запись в регистр 0xB7 этого устройства значения 0x80.
Если подходить к сравнению вариантов «с пристрастием», то можно заметить, что на диаграмме логического анализатора (частота выборки 24 MSa/s) присутствует «джиттер» сигнала SCL, которого нет, как такового, на осциллограмме с частотой выборки 1 GSa/s. В остальном картина совпадает, а логическим анализатором ещё и производится правильная дешифрация данных в автоматическом режиме.
При выборе «или-или» в «сухом остатке» имеем, в случае осциллографа, дорогое универсальное устройство, не такое удобное для анализа шины, как логический анализатор, но за сопоставимые с ним деньги. В этих условиях лично я, как инженер «старой закалки», приобрёл бы цифровой осциллограф.
Однако, если бы существовало программное обеспечение с лицензионным соглашением, позволяющим использование недорогих клонов популярных логических анализаторов, типа Saleae Logic 8 или DSLogic Plus…
Недорогие клоны популярных логических анализаторов, и не только их, поддерживает программное обеспечение open source проекта sigrok.
Было собрано рабочее место:
После чего начались «танцы с бубном». На Windows 10 запустилась только 32-разрядная версия PulseView. Наличие в системе недорогого китайского клона Saleae Logic (цена на сайте продавца $7) она не определила.
После этого, в Zadig для устройства Logic были установлены драйверы WinUSB, и после повторного сканирования оно определилось в Zadig, как устройство fx2latw:
После этого для устройства fx2latw в Zadig снова были установлены драйверы WinUSB, и только после этого PulseView увидела в списке устройство «Saleae Logic». Устройство было подключено.
После подключения устройства были произведены следующие настройки программы (слева направо по панели инструментов, начиная с надписи «Saleae Logic»):
- выставлено Pre-trigger capture ratio = 2% по нажатию кнопки с ключом и отвёрткой;
- отключены лишние входы по нажатию кнопки с красным щупом;
- выставлен объем записи 100 К выборок;
- выставлена частота выборки 24 MHz;
- включен анализатор протокола I2C по нажатию кнопки с жёлто-зелёным значком.
Далее в панели слева от каналов:
- каналам присвоены соответствующие сигналам текстовые метки;
- условием запуска назначен задний фронт сигнала SDA;
- сигналам I2C назначены соответствующие каналы.
После включения тестируемого оборудования была нажата кнопка Run. Получен уже знакомый результат:
Похоже, «танцы с бубном» того стоили!
UPD: После ручной установки в Диспетчере устройств для устройства USB Logic драйвера libusb-win32 программа PulseView начала стабильно определять наличие в системе «Saleae Logic» без манипуляций с Zadig.
Краткие выводы:
В статье была описана методика проведения анализа сигналов шины I2C с помощью цифрового осциллографа с памятью и логических анализаторов с пакетами прикладного программного обеспечения.
Универсальным методом анализа сигналов, но недешёвым и небыстрым, является применение цифрового осциллографа с памятью.
Быстрым и бюджетным методом анализа сигналов, но с нетривиальной задачей подключения оборудования, является применение недорогого клона логического анализатора в связке с PulseView.
Буду рад, если своей публикацией помог сэкономить читателям время и деньги.
В следующей публикации расскажу, как измерял частоту, на которой запустился кварцевый резонатор в синтезаторе частоты, без частотомера. Но это уже другая история…
Больше информации в моём телеграм-канале «Проект Селенит»
Поиск неисправностей в системной шине I2C
Поиск неисправностей в системной шине I2C
Ремонт видеомагнитофонов.
В. Н. Кривилев
Поиск неисправностей в системной шине I2C
Напряжение питания как к линии SDA, так и к линии SCL подводится через нагрузочные резисторы. Значение этого напряжения обычно составляет от 4,5 В до 5,5 В и должно точно соответствовать приведенному в сервисной документации уровню. Поиск неисправностей, поэтому следует начинать с измерения питающего шину напряжения. К прекращению обмена информацией в шине могут привести также колебания питающего напряжения питания, особенно в тех случаях, когда появляется какая-нибудь нерегулярная неисправность. Пульсации могут составлять всего лишь несколько милливольт, поэтому в сомнительных случаях проверку питающего системную шину напряжения надо проводить с помощью осоцилографа.
Обычно на входах блоков, подключаемых к системной шине, или перед микросхемами в этих блоках располагают еще и развязывающие резисторы. С помощью измерения напряжения на этих резисторах можно установить наличие короткого замыкания в соответствующем блоке. Если такая неисправность присутствует, то измеренное напряжение на выводе резистора, со стороны подключенного блока или микросхемы, имеет существенно более низкое значение, чем на другом выводе резистора. Если же в проверяемых узлах короткое замыкание отсутствует, то падение амплитуды сигнала на соответствующих развязывающих резисторах незначительное из-за достаточно низкого их номинала (от 100 Ом до 1 кОм). Поиск неисправностей усложняется, когда отдельные узлы и схемы подключены к системной шине без развязывающих резисторов, так как в этом случае любой неисправный узел может полностью заблокировать обмен информацией по системной шине. В этом случае придется последовательно отсоединять подключенные к шине отдельные узлы и схемы.
Уже измерение напряжения до и после нагрузочных резисторов может дать указание на вероятную неисправность в одном из устройств, подключенных к системной шине, если падение напряжения на этих резисторах слишком велико.
Необходима также проверка наличия сигналов в линиях SCL и SDA шины. Отсутствие сигнала синхронизации в линии SCL указывает на необходимость проверки работоспособности центрального управляющего устройства, а также внешнего кварцевого резонатора тактового генератора ЦУУ. Неисправности частотозадающих элементов тактового генератора могут быть причиной отличия тактовой частоты от номинальной, что также может привести к нарушению обмена информацией в шине.
Тактовый сигнал может представлять собой синусоидальный сигнал, либо сигнал прямоугольной или трапециевидной формы.
Наличие импульсных сигналов номинальной амплитуды в линии SDA-шины само по себе не дает достоверной информации о правильности обмена данными между узлами ВМ, подключенными к системной шине, но при их наличии можно условно считать, что обмен данными в системе происходит правильно.
компания © http://teleremont.ru, teleremont@narod. ru |
I2C Primer: Что такое I2C? (Часть 1)
от Сал Афзал
Введение:
Шина Inter-Integrated Circuit (I 2 C) представляет собой двухпроводной последовательный интерфейс, изначально разработанный корпорацией Phillips для использования в потребительских товарах. Это двунаправленная шина, которая легко реализуется в любом процессе ИС (NMOS, CMOS, биполярный) и обеспечивает простую связь между ИС. Соединения сведены к минимуму за счет использования последовательной линии передачи данных (SDA), последовательной линии синхронизации (SCL) и общего заземления для передачи всех сообщений. я 2 C получил широкое признание и даже послужил прототипом шины управления системой (SMBus), которая является подмножеством I 2 C.
Дизайн
I 2 Протокол связи C соответствует иерархии ведущий/ведомый, в которой ведущий определяется как устройство, которое синхронизирует шину, обращается к ведомым устройствам и записывает или считывает данные в регистры ведомых устройств и из них. Ведомые устройства — это устройства, которые отвечают только на запрос ведущего через свой уникальный адрес. Следовательно, крайне важно избегать дублирования адресов среди ведомых устройств. Ведомые устройства никогда не инициируют передачу данных.
Шина C I 2 использует только две двунаправленные линии, последовательную линию передачи данных (SDA) и последовательную линию синхронизации (SCL). I 2 C-совместимые устройства подключаются к шине с открытым коллектором или штырями с открытым стоком, которые переводят линию в НИЗКИЙ уровень. Когда нет передачи данных, I 2 C линии шины простаивают в состоянии HIGH; линии пассивно тянутся высоко.
Передача происходит путем переключения линий путем нажатия на НИЗКИЙ уровень и отпускания ВЫСОКИЙ. Биты тактируются по спаду тактовых импульсов. Стандартная скорость передачи данных составляет 100 кбит/с, а скорость передачи в быстром режиме — 400 кбит/с.
<img src=’https://www. analog.com/-/media/analog/en/landing-pages/technical-articles/i2c-primer-what-is-i2c-part -1-/36684.png?la=en&w=435′ alt=’Рисунок 1: Обобщенная схема подключения I2C’>
Рис. 1: Обобщенная схема I 2 C
Шина I 2 C может поддерживать несколько устройств, как ПОДЧИНЕННЫХ, так и ГЛАВНЫХ, и единственным ограничением является емкость шины (400 пФ) и адресное пространство (128 уникальных адресов) по мере добавления дополнительных устройств.
Протокол передачи данных
I 2 C Пакеты данных организованы в 8-битные байты, содержащие адрес подчиненного устройства, номер регистра и данные для передачи. Передача по шине представляет собой операцию чтения или записи. Протоколы чтения и записи основаны на ряде подпротоколов, таких как условия запуска и остановки, повторяющиеся стартовые биты, адресный байт, биты передачи данных и биты подтверждения/неподтверждения.
Условия запуска и остановки
Как следует из названия, условие запуска всегда возникает в начале передачи и инициируется ГЛАВНЫМ устройством. Это делается для пробуждения бездействующих устройств SLAVE на шине. Это один из двух случаев, когда линии SDA разрешено изменять состояние при высоком уровне SCL. Чтобы обозначить условие запуска, линия SDA переходит из состояния HIGH в состояние LOW, а SCL находится в состоянии HIGH.
<img src=’https://www.analog.com/-/media/analog/en/landing-pages/technical-articles/i2c-primer-what-is-i2c-part -1-/36685.png?la=en&w=435′ alt=’Рис. 2. Переходы между условиями начала и окончания’>
Рисунок 2: Переходы между условиями запуска и остановки
Подобно начальному условию, остановочное условие возникает в конце передачи данных и также генерируется ГЛАВНЫМ. Это означает конец передачи и является командой, сообщающей ведомым устройствам, что они должны вернуться в состояние ожидания, освободить линию SDA и больше не отправлять данные по шине. Это второй случай, когда линии SDA разрешено изменять состояние, когда SCL находится в состоянии HIGH. Линия SDA переходит из состояния LOW в состояние HIGH, в то время как SCL находится в состоянии HIGH, чтобы обозначить состояние остановки.
Во всех остальных случаях линия SDA изменяет состояние только тогда, когда линия SCL имеет НИЗКИЙ уровень.
Повторный запуск
Условие запуска может повторяться во время передачи без необходимости предварительного завершения условием остановки. Это особый случай, называемый повторным запуском, и он используется для изменения направления передачи данных, повторения попыток передачи, синхронизации нескольких ИС или даже управления последовательной памятью.
<img src=’https://www.analog.com/-/media/analog/en/landing-pages/technical-articles/i2c-primer-what-is-i2c-part -1-/36686.png?la=en&w=435′ alt=’Рисунок 3: Повторное начальное условие, по сути, является начальным условием в середине транзакции I2 C без предшествующего StopCondition’>
Рисунок 3. Повторное условие запуска по существу является условием запуска в середине транзакции I 2 C без предшествующего условия остановки
Байт адреса
Адрес подчиненного устройства отправляется в 8-битном байтовом формате, старший бит идет первым, но последний бит указывает, будет ли транзакция читать или писать подчиненному устройству. По сути, старшие 7 бит составляют адрес ведомого устройства, а 8-й бит служит битом команды READ/WRITE#. Таким образом, существует адресное пространство из 128 уникальных адресов для адресации до 128 ведомых устройств. Часто раз.
Например, после условия запуска ГЛАВНЫЙ отправляет адресный байт, который соответствует уникальному адресу ВЕДОМОГО устройства на шине. Каждое устройство на шине имеет свои фиксированные или запрограммированные адреса. ПОДЧИНЕННЫЕ устройства на шине I 2 C реагируют на команду запуска, активно прослушивая первые семь битов первого отправленного байта. Если первые семь битов совпадают с адресом ВЕДОМОГО устройства, он продолжает чтение 8-го бита (бит READ/WRITE#) байта адреса. Все остальные ПОДЧИНЕННЫЕ устройства игнорируют оставшуюся часть транзакции. НИЗКИЙ бит в бите READ/WRITE# указывает, что ГЛАВНЫЙ будет записывать данные на адресованное ВЕДОМОЕ устройство, а высокий МАСТЕР будет считывать данные с ВЕДОМОГО устройства. Как только адресный байт будет прочитан соответствующим ПОДЧИНЕННЫМ устройством, он подтвердит эту передачу, отправив бит подтверждения, установив НИЗКИЙ уровень SDA в течение смежного периода ВЫСОКОГО импульса тактового сигнала, а затем примет на себя роль подчиненного передатчика или подчиненного получателя в зависимости от СЧИТЫВАНИЯ. Бит /WRITE# отправлен.
С этого момента и далее, если стоповый бит не отправлен, ПОДЧИНЕННЫЙ УСТРОЙСТВО предполагает, что, поскольку он уже был адресован, все коммуникации направлены на него.
Биты подтверждения и не подтверждения (ACK/NACK)
В качестве обратной связи после передачи каждого байта принимающее устройство отправляет бит подтверждения или не подтверждения. Бит подтверждения генерируется приемником, удерживая линию SDA в низком уровне в течение периода HIGH SCL, в то время как бит Not Acknowledge генерируется, когда приемник оставляет линию SDA пассивно поднятой на HIGH и никак не реагирует. Этот факт подразумевает, что в ответ на байт адреса все несопоставленные SLAVE посылают бит Not Acknowledge, не отвечая.
ACK используется для обозначения того, что байт (адрес или данные) был успешно передан и получен и что передача может продолжаться до следующей передачи байта, условия остановки или повторного запуска (рис. 4). NACK обычно используется приемником, чтобы указать, произошла ли где-то ошибка при передаче данных. Это используется для подачи сигнала передающему устройству немедленно прекратить передачу или сделать еще одну попытку, отправив повторное начало.
<img src=’https://www.analog.com/-/media/analog/en/landing-pages/technical-articles/i2c-primer-what-is-i2c-part-1-/ 36687.png?w=435 ‘ alt=’Рисунок 4: Начальное условие, за которым следует 7-битный адрес 0x64 и набор команд записи. Подчиненный отвечает подтверждением.’>
Рис. 4. Условие запуска, за которым следует 7-битный адрес 0 × 64 и набор команд записи. Ведомый отвечает подтверждением.
ГЛАВНЫЙ также пошлет NACK после последнего байта передачи, который он хочет прочитать от ВЕДОМОГО, чтобы указать, что ВЕДОМЫЙ должен прекратить передачу.
Биты данных
Биты данных кодируют фактически передаваемые данные и передаются в 8-битном байтовом формате, начиная с MSB, и каждый бит синхронизируется с тактовым сигналом (SCL). Количество байтов в передаче не ограничено, но за каждым байтом должно следовать подтверждение, которое генерируется получателем данных.
&lt;img src=’https://www.analog.com/-/media/analog/en/landing-pages/technical-articles/i2c-primer-what-is-i2c-part -1-/36688.png?la=en&w=435′ alt=’Рисунок 5: Битовый переход битов данных’&gt;
Рисунок 5: Битовый переход битов данных
Для передачи битов данные на линии SDA должны оставаться стабильными в течение периода ВЫСОКОГО тактового сигнала. Линия данных может иметь переход HIGH или LOW только тогда, когда тактовый сигнал LOW. Таким образом, приемник считывает бит данных на линии данных, пока SCL имеет ВЫСОКИЙ уровень, а передатчик устанавливает каждый новый бит данных, пока SCL имеет НИЗКИЙ уровень.
Командный байт
При записи или чтении из определенного регистра в SLAVE, мастер должен сначала указать на конкретный регистр, записав адрес регистра после обращения к SLAVE. Хотя адрес регистра можно рассматривать как байт данных, во избежание путаницы его часто классифицируют как командный байт. См., например, рис. 6 и 7.
Запись на устройство
На Рисунке 6 показана адресация и запись данных ГЛАВНЫМ передатчиком на ВЕДОМЫЙ приемник с 7-битным адресом. Первым отправленным битом является бит START, который инициирует обмен данными. Байт адреса следует за последующими тактовыми импульсами. В этот момент времени все ПОДЧИНЕННЫЕ устройства на шине прослушивают адрес своего устройства, который составляет первые семь бит байта адреса. ПОДЧИНЕННОЕ устройство, обнаружившее совпадение адресов, продолжает прослушивать последний бит (бит READ/WRITE#), чтобы понять, хочет ли ведущий читать с подчиненного устройства или записывать на него. Все остальные ПОДЧИНЕННЫЕ устройства игнорируют дальнейшую связь, отправляя NACK, который по определению ничего не делает.
<img src=’https://www.analog.com/-/media/analog/en/landing-pages/technical-articles/i2c-primer-what-is-i2c-part-1-/ 36689.png?w=435 ‘ alt=’Рисунок 6: Успешная передача байта записи I2C’>
Рисунок 6: Успешная передача байта записи I2C
В ответ на распознавание своего адреса и команду записи адресованное устройство отвечает отправкой бита подтверждения (ACK) в качестве обратной связи ВЕДУЩЕМУ устройству о том, что на шине присутствует ПОДЧИНЕННОЕ устройство с правильным адресом и ожидает дальнейшей связи. Затем MASTER продолжает передачу данных, отправляя данные в байтовом формате. Если ГЛАВНЫЙ записывает в определенный регистр в ВЕДОМОМ устройстве, то он записывает соответствующий командный байт перед отправкой данных. После каждой передачи байта SLAVE отвечает отправкой ACK. Как только ГЛАВНЫЙ заканчивает передачу всех данных, он завершает передачу, отправляя условие СТОП.
Чтение с устройства
На рис. 7 показано, как ГЛАВНЫЙ обращается к ПОДЧИНЕННОМУ и пытается считать с него данные. Передача снова инициируется МАСТЕРОМ с условием СТАРТ, после чего адрес передается в последующих тактовых импульсах. Адресованное устройство продолжает прослушивать передачу, читая бит READ/WRITE, и отвечает битом подтверждения. Как только SLAVE отправляет подтверждение, он берет на себя управление SDA и отправляет данные MASTER. В ответ на каждый переданный байт МАСТЕР отправляет бит подтверждения. Когда MASTER больше не хочет получать данные, он отвечает NACK после последнего байта, который он хочет получить, а затем возобновляет управление шиной и отправляет условие STOP для завершения передачи.
Обратите внимание, что в то время как управление линией SDA передается от ГЛАВНОГО к ПОДЧИНЕННОМУ и обратно, линия SCL ВСЕГДА контролируется ГЛАВНЫМ, т. е. данные постоянно поступают и выводятся ГЛАВНЫМ.
&lt;img src=’https://www. analog.com/-/media/analog/en/landing-pages/technical-articles/i2c-primer-what-is-i2c-part -1-/36690.png?la=en&w=435′ alt=’Рисунок 7: Успешная передача чтения I2C’&gt;
Рисунок 7: Успешный I 2 C Чтение передачи
Объединение протоколов передачи
Можно комбинировать протоколы чтения и записи в различных вариациях для выполнения некоторых сложных I 2 C транзакций. ГЛАВНЫЙ может записывать, а затем читать с того же ведомого или давать новый адрес для связи с другим ВЕДОМЫМ устройством в рамках одной транзакции I 2 C, данные могут изменить направление таким образом, что устройство, на которое выполнялась запись, теперь считывание данных. Все это достигается с помощью бита Repeated Start.
Например, LTC2946, который является монитором энергопотребления, может получить команду на вывод данных из определенного регистра. Для этого требуется транзакция I 2 C, которая сначала обращается к LTC2946, отправляет байт команды (байт данных, содержащий определенный адрес регистра для чтения), выполняет повторный запуск, снова отправляет адрес устройства с установленным битом READ, а затем считывает данные. В этой транзакции мастер сначала писал в LTC2946, сообщая ему, из какого регистра он хочет прочитать данные, а затем направление потока данных менялось, когда ГЛАВНЫЙ выполнял повторный запуск с битом ЧТЕНИЕ, установленным в байте адреса ВЕДОМОГО. Рисунок 8 взят из LTC29.46 и показывает этот общий протокол.
&lt;img src=’https://www.analog.com/-/media/analog/en/landing-pages/technical-articles/i2c-primer-what-is-i2c-part -1-/36691.png?la=en&w=435′ alt=’Рисунок 8: Протокол чтения байтов SDA последовательной шины LTC2946’&gt;
Рис. 8. Протокол чтения байтов SDA последовательной шины LTC2946
Где
- S = стартовый бит
- P = Стоповый бит
- Ч = Чтение бита
- W\ = бит записи
- А = Подтвердить
- А\ = Не квитировать
На рис. 9 показан пример записи в регистр в LTC2946. После условия запуска отправляется адрес устройства, а затем байт команды записывается в ведомое устройство (обратите внимание на бит READ/WRITE#). Как только ведомое устройство подтверждает, данные записываются в SLAVE.
&lt;img src=’https://www.analog.com/-/media/analog/en/landing-pages/technical-articles/i2c-primer-what-is-i2c-part -1-/36692.png?la=en&w=435′ alt=’Рисунок 9: Последовательная запись главного устройства в два разных подчиненных устройства’&gt;
Рис. 9. Ведущее устройство последовательно записывает данные в два разных подчиненных устройства
Аналогично. На рис. 10 показан пример, когда ведущий записывает данные в два разных подчиненных устройства.
&lt;img src=’https://www.analog.com/-/media/analog/en/landing-pages/technical-articles/i2c-primer-what-is-i2c-part -1-/36693.png?la=en&w=435′ alt=’Рисунок 10: Последовательная запись главного устройства на два разных подчиненных устройства’>
Рис. 10. Ведущее устройство последовательно записывает данные в два разных подчиненных устройства
вещи, которые мы не освещали
Существуют дополнительные протоколы I 2 C, такие как Quick Command, Extended Address Mode, Arbitration, Multi-Master и Clock Stretching, которые мы не затрагивали в этой статье. Эти темы выходят за рамки обсуждения в этой записи блога и не нужны для начала связи с устройством LTC, поддерживающим I 2 C.
.Автор
Сал Афзал
Сал Афзал (Sal Afzal) — директор по разработке приложений группы Power Systems Management компании Analog Devices. Сэл имеет степень бакалавра электротехники Университета штата Сан-Хосе. Он разработал аппаратное обеспечение для самых разных рынков, включая центры обработки данных, автомобилестроение и промышленность. Он специализируется на защите электропитания и управлении силовым трактом.
Введение в микропроцессорные системы – UW–Madison
Обзор
Шина Inter-Integrated Circuit, или I2C, представляет собой интерфейс, присутствующий в большинстве микропроцессоров, и широко используется при проектировании встроенных систем. Шина I2C используется для связи с периферийными устройствами почти так же, как интерфейсы SPI и UART.
Ключевой особенностью, которая отличает I2C от UART и SPI, является то, что шина I2C может поддерживать несколько управляющих и подчиненных устройств на одной шине. Возможность поддерживать несколько устройств на одной шине позволяет нам уменьшить количество внешних выводов на микропроцессоре, уменьшая стоимость и размер устройства.
Источник: TM4C123GH6PM Техническое описание, раздел 16.3
Конструкция контактов
Шина I2C состоит из двух сигналов: линии данных (SDA) и линии синхронизации (SCL). Эти контакты сконфигурированы как контакты с открытым стоком (или открытым коллектором). Вывод с открытым стоком состоит из одного транзистора, который соединяет выходной вывод с землей, когда транзистор включен. Когда транзистор закрыт, выходной контакт остается неподключенным, а подтягивающий резистор подтягивает линию к VCC (логическая 1).
Вывод с открытым стоком делает его хорошим выбором для двунаправленной шины данных, где несколько устройств инициируют передачу данных. Если одно устройство пытается поместить на линию логическую 1, а другое устройство пытается подавать на линию логический 0, подтягивающий резистор ограничивает ток и предотвращает короткое замыкание.
Стандартные контакты GPIO (тотемный столб) не предотвратят короткое замыкание. Стандартные выводы GPIO активно управляют логическими 1 и 0 в сигнале без использования подтягивающего резистора. Если бы два разных устройства управляли противоположными логическими значениями сигнала, это привело бы к короткому замыканию, которое могло бы повредить оба устройства. По этой причине стандартные выводы GPIO не используются для двунаправленной передачи данных.
Типологии шин I2C могут быть очень сложными. У одной шины I2C может быть несколько подчиненных и несколько монархов. Мы будем иметь дело только с самой базовой топологией шины: один монарх и несколько подчиненных устройств.
Описание сигналов
«Шина I2C использует только два сигнала: SDA и SCL, называемые I2CSDA и I2CSCL на микроконтроллерах. SDA — это двунаправленная последовательная линия данных, а SCL — двунаправленная последовательная линия синхронизации. Шина считается незанятой, когда обе линии имеют высокий уровень.
Каждая транзакция на шине I2C состоит из девяти битов, состоящих из восьми битов данных и одного бита подтверждения. Количество байтов на передачу не ограничено, но за каждым байтом данных должен следовать бит подтверждения, а данные должны передаваться первыми со старшим битом. Когда приемник не может получить еще один полный байт, он может удерживать линию синхронизации SCL на низком уровне и переводить передатчик в состояние ожидания. Передача данных продолжается, когда приемник отключает часы SCL»
Источник: Лист данных TM4C123GH6PM, раздел 16.3.1
SDA можно изменять только при низком уровне вероятности нежелательной почты. Когда SCL высокий, SDA не должен изменяться.
Формат данных
В данных, передаваемых через интерфейс I2C, используются многие из тех же концепций, что и в интерфейсах SPI и UART. Данные передаются старшим битом первым. Данные, отправляемые по I2c, формируются в соответствии с условиями запуска и остановки. Данные могут быть прочитаны и записаны с внешнего устройства путем указания внутренних адресов регистров в периферийном устройстве.
Ключевое отличие от интерфейса I2C заключается в том, что каждый байт данных должен быть подтвержден или подтвержден принимающим устройством для завершения транзакции данных. ACK необходим, когда на одной шине I2C присутствует много устройств. ACK указывает передатчику, что он успешно обменивается данными с другим устройством и может сохранять право владения шиной, пока не завершится транзакция данных.
Условие запуска
На линии SDA и SCL устанавливается высокий уровень, когда на шине нет активности. Чтобы сигнализировать о начале транзакции данных, устройство, инициирующее передачу данных, установит низкий уровень на линии SDA, в то время как SCL все еще высокий.
Подтверждения
Все транзакции шины имеют обязательный тактовый цикл подтверждения, который генерируется монархом. Во время цикла подтверждения передатчик (который может быть монархом или подчиненным) освобождает линию SDA. Чтобы подтвердить транзакцию, получатель должен отключить SDA в течение тактового цикла подтверждения.
Когда подчиненный получатель не подтверждает подчиненный адрес, подчиненный должен оставить SDA высоким, чтобы монарх мог сгенерировать условие STOP и прервать текущую передачу.
Если устройство монарха действует как получатель во время передачи, оно отвечает за подтверждение каждой передачи, сделанной подчиненным. Поскольку монарх контролирует количество байтов в передаче, он сигнализирует об окончании данных подчиненному передатчику, не генерируя подтверждение для последнего байта данных. Затем подчиненный передатчик должен отпустить SDA, чтобы монарх мог сгенерировать состояние STOP или повторное условие START.
Источник: TM4C123GH6PM Лист данных, раздел 16.3.1.4
На изображении ниже показан ACK. ACK генерируется, когда линия данных освобождается передатчиком на 9-м такте. ACK происходит, если получатель переводит SDA в низкий уровень до следующего положительного фронта SCL. Если SDA не переводится в низкий уровень к следующему такту, передача данных прерывается.
Условие остановки
Монарх указывает, что транзакция завершится созданием условия остановки. Условие останова возникает, когда SCL имеет высокий уровень, а SDA переходит от низкого к высокому уровню.
Адреса устройств I2C
Поскольку шина I2C не является двухточечным соединением, необходим механизм, позволяющий различать, какая пара устройств в данный момент передает данные. Для решения этой проблемы каждому устройству присваивается адрес на шине I2C. Когда устройство монарха хочет отправить/получить данные от определенного устройства, первый передаваемый байт является адресом подчиненного устройства, к которому осуществляется доступ.
Адрес подчиненного устройства состоит из идентификатора устройства, указанного в техническом паспорте устройства. В дополнение к идентификатору устройства многие устройства имеют один или несколько контактов аппаратного адреса, которые позволяют поддерживать несколько одинаковых подчиненных устройств на одной и той же шине I2C. Каждому контакту аппаратного адреса будет присвоен адрес с помощью подтягивающих/понижающих резисторов, чтобы установить уникальный адрес для каждого устройства.
Мы будем использовать приведенный выше фрагмент схемы, чтобы определить адрес I2C модуля расширения ввода-вывода MCP23017. Глава 5 таблицы данных MCP23017 дает нам следующую информацию о том, как определить адрес.
Источник: MCP23017
Используя этот рисунок, мы видим, что старшие 4 бита адреса равны 0100 2 . Биты 3-1 устанавливаются с использованием значений, поставляемых на контактах аппаратного адреса. Используя схему, эти биты будут установлены на 000 2 . Бит 0 всегда указывает, выполняется ли чтение или запись устройства. Чтобы написать в MCP23017, указанный выше, монарх должен начать транзакцию с байтом, равным 0x40.