Что такое интерфейс I2C и как он работает. Какие преимущества дает использование I2C в микроконтроллерных системах. Как организовать обмен данными по шине I2C. На что обратить внимание при проектировании систем с I2C.
Что такое интерфейс I2C и зачем он нужен
I2C (Inter-Integrated Circuit) — это последовательный интерфейс для связи между интегральными схемами. Он был разработан компанией Philips в начале 1980-х годов для обеспечения простого способа соединения различных компонентов внутри электронных устройств.
Основные особенности I2C:
- Использует всего 2 линии — данных (SDA) и тактовую (SCL)
- Поддерживает подключение множества устройств к одной шине
- Обеспечивает адресацию устройств
- Позволяет реализовать двунаправленный обмен данными
- Поддерживает различные скорости передачи (от 100 кбит/с до 5 Мбит/с)
Благодаря своей простоте и эффективности, I2C получил широкое распространение в микроконтроллерных системах для подключения различной периферии — датчиков, АЦП/ЦАП, EEPROM, часов реального времени и т.д.
Принцип работы шины I2C
Как работает передача данных по I2C? Рассмотрим основные принципы:
- На шине есть одно ведущее устройство (мастер) и одно или несколько ведомых (slave)
- Мастер инициирует обмен данными и генерирует тактовый сигнал
- Каждое ведомое устройство имеет уникальный 7-битный адрес
- Передача начинается с условия START и заканчивается условием STOP
- Данные передаются 8-битными пакетами с подтверждением приема
Типичная последовательность обмена данными по I2C выглядит так:
- Мастер формирует условие START
- Передает адрес ведомого устройства и бит направления передачи (чтение/запись)
- Ведомое устройство подтверждает прием адреса
- Происходит обмен данными байтами с подтверждениями
- Мастер завершает передачу условием STOP
Преимущества использования I2C в микроконтроллерных системах
Почему I2C так популярен среди разработчиков встраиваемых систем? Вот ключевые преимущества:
- Минимальное количество линий связи (всего 2 провода)
- Возможность подключения множества устройств к одной шине
- Простота наращивания системы без изменения схемы
- Низкое энергопотребление
- Поддержка в большинстве современных микроконтроллеров
- Широкий выбор готовых микросхем с I2C интерфейсом
Это позволяет создавать гибкие и масштабируемые системы, легко добавляя новую функциональность без существенных изменений схемы и прошивки.
Организация обмена данными по шине I2C
Как правильно организовать обмен данными по I2C? Вот основные моменты, на которые стоит обратить внимание:
- Подтягивающие резисторы на линиях SDA и SCL (обычно 4.7 кОм)
- Соблюдение временных параметров (тактовая частота, задержки)
- Обработка ситуаций отсутствия ответа от устройства
- Реализация повторных попыток передачи при ошибках
При программировании обмена по I2C важно учитывать особенности конкретных устройств, внимательно изучая их даташиты.
Типичные применения I2C в электронных устройствах
В каких ситуациях чаще всего используется интерфейс I2C? Вот наиболее распространенные варианты применения:
- Подключение датчиков (температуры, влажности, освещенности и т.д.)
- Работа с энергонезависимой памятью (EEPROM)
- Управление ЖК-дисплеями и OLED-матрицами
- Взаимодействие с часами реального времени
- Подключение АЦП и ЦАП
- Управление светодиодными драйверами
- Коммуникация между микроконтроллерами в сложных системах
Благодаря простоте реализации и широкой поддержке, I2C часто становится оптимальным выбором для подобных задач.
Особенности проектирования систем с использованием I2C
На что обратить внимание при проектировании устройств с I2C интерфейсом? Вот ключевые моменты:
- Выбор оптимальной топологии подключения устройств
- Расчет суммарной емкости линий и подтягивающих резисторов
- Экранирование сигнальных линий для защиты от помех
- Согласование уровней напряжения при работе с устройствами разных типов
- Обеспечение требуемой пропускной способности шины
- Реализация механизмов защиты от сбоев и зависаний
Грамотный учет этих факторов позволит создать надежную и эффективную систему на базе I2C.
Программная реализация обмена по I2C
Как реализовать обмен данными по I2C на программном уровне? Рассмотрим основные этапы:
- Инициализация I2C интерфейса микроконтроллера
- Формирование условия START
- Передача адреса устройства и бита направления
- Ожидание подтверждения от ведомого
- Передача/прием байтов данных
- Формирование условия STOP
Большинство современных микроконтроллеров имеют встроенные аппаратные модули I2C, что значительно упрощает программирование. Для работы с ними обычно используются специальные библиотеки.
Пример кода для передачи данных по I2C (Arduino):
«`cpp #includeЭтот простой пример демонстрирует базовую последовательность действий при передаче данных по I2C. В реальных проектах код будет более сложным, учитывающим особенности конкретных устройств и обработку ошибок.
Отладка и диагностика проблем в системах с I2C
Какие инструменты и методы можно использовать для отладки систем с I2C интерфейсом? Вот основные подходы:
- Использование логических анализаторов для просмотра сигналов на шине
- Применение специализированных I2C анализаторов протокола
- Программная отладка с выводом информации о состоянии обмена
- Проверка уровней напряжения и временных параметров осциллографом
- Тестирование системы с помощью эмуляторов I2C устройств
При возникновении проблем важно проверить правильность подключения, адресацию устройств, настройки скорости передачи и корректность передаваемых команд.
Интерфейс I2C – RoboCraft
Наконец, подобрались к I2C. Давно хотелось, но всё никак. Тема интересная, а возможности периферии общающейся по этому протоколу могут существенно расширить возможности микроконтроллерной системы. I2C, в отличии от SPI, позволяет наращивать функционал, добавлять новые блоки без изменения в схеме и не задействуя новые выводы МК — настоящий конструктор — стыкуй что и сколько надо =)
I2C (Inter-Integrated Circuit — примерно «Схема внутренней связи» =), читается “и-два-цэ” — последовательная шина выдуманная в недрах Philips ещё в 80-х годах прошлого века. Задумывалась, как простая шина для связи блоков внутри устройства — получилось, и на удивление удачно=)
Сегодня, каждый производитель выпускающий МК уровнем чуть выше нулевого суёт туда аппаратный I2C, правда Philips запатентавал название и до 2007 года все выдумывали своим велосипедам имена кто во что горазд: у ATmega, например, этот модуль завётся 2-wire Serial Interface.
Производители законченных блоков и модулей, зачастую, используют именно I2C для общения с внешним миром (блоки телевизоров, магнитол, дисплеи, некоторые камеры в мобильных телефонах и т. п.), а микросхем периферии вообще на любой вкус: АЦП/ЦАП памяти разнообразные, часы реального времени, расширители вводо-выводов, гироскопы, акселерометры, компасы, драйверы светодиодов и матриц, ШИМ-контроллеры, синтезаторы частот и вообще, по-моему, всё что душе угодно.
Затыков у этой чудо шины два: скорость работы и ограничение на число адресов в сети.
Классически это 100 кбит/с и 128 устройств.
Но стандарт 1992 года предусматривает скорости как 100 кбит/с (low-speed), так и 400 кбит/с (fast-speed) и уже 10-битную адресацию т.е. максимум — 1203 адреса.
А стандартом от 1998, раскрутили аж до 3.4 Мбит/с (Hs-mode).
Но производители живут в прошлом веке и заглянув в датащит на атмеги увидим, что модуль 2-wire Serial Interface может раскочегарится до 400 кГц и адресовать только 127 устройств =\
Так же, есть зарезервированные 8 служебных адресов, так что, на деле, устройств может быть только 120.
Ну и хрен с ними, мне лично — за глаза, да и мороки с этим Hs-mode значительно.
Адреса, обычно, жёстко “прошиты” в микросхему (см. датащиты), но частенько несколько бит адреса “выводят” на ножки — перемычками (на питание или землю) можно задать эти биты и подключить несколько одинаковых микросхем на одну шину.
Физически, шина I2C представляет собой два провода (не считая земли и питания =), притянутые к плюсу резисторами 1-10к (так и только так!).
Один провод — шина данных(SDA — Serial DAta), второй — тактирование(SCS — Serial CLock).
И всё!
Работает тоже почти бесхитростно:
На линии обычно есть один Мастер (Master) — МК и некоторое количество Слейвов (Slave) — периферийных устройств (возможна и многомастерная “архитектура”, но об этом позже).
Так как линии у нас подтянуты к питанию, то устройствам остаётся только прижимать их к земле, когда хочется передать нолик и просто отпустить — чтоб единицу.
Отсюда важный вывод о совместной работе устройств с таким включением (называется — монтажное “И”) — если кто-то выставил ноль — остальным придётся с этим смириться =)
Итак, тактирование (дрыганье SCL) всегда осуществляет мастер, передачу начинает тоже всегда он, предварительно уточнив, что линия свободна (единички на SDA и SCL), формирует СТАРТ-условие (S) — прижимает линию SDA (1->0), при еденице на SCL,
Потом, надо передать адрес того устройства к которому мы хотим обратиться.
При передаче по I2C есть два правила:
Во-первых, данные считываются только при единичном состоянии SCL, а меняться могут, только при нулевом состоянии SCL (выставили-держим-протолкнули-выставили следующий-держим-…).
Во-вторых, данные идут головой вперёд — начиная со старшего бита(MSB)
7 битов адреса, восьмой — признак R/W — если хотим читать 1, записать 0.
Прожевав восьмой бит, ведомая микросхема должна сказать уверенное “Ага”, если всё понятно — послать сигнал подтверждения (ack, acknowledge) — прижав линию SDA (отпущенную ведущим) на время 9-го такта на SCL. Мастер с интересом это дело выслушает (и тактично подождёт если туговатая микросхема не сразу отпустит SDA)
Если ack нет (называется nack) — значит ведомому что-то не понятно, тогда нужно(можно) сформировать СТОП и повторить передачу.
Затем, мастер либо посылает байт данных слейву, и снова дожидается подтверждения,
либо принимает от него байт и уже сам выдаёт подтверждение. Байт данных может быть несколько, но все они когда-нибудь закончатся, и мастер должен будет сформировать СТОП-условие(P). Для этого надо отпустить линию SDA (0->1), не трогая SCL .
полный “текст” обращения (кликабельно):
Всё просто=)
СТАРТ-адрес(запись/чтение)-подтверждение-данные-подтверждение-СТОП
А если мастер читал данные, то, прочитав последний интересующий байт должен вместо последнего asc передать nack. Только такое вот, невежливое, завершение диалога понимает многие (или все? — см. датащиты) периферийные микросхемы.
Так же, туговатая микросхема может придерживать линию SCL, демонстрируя, что не успевает глотать недожёванное, так что, перед подачей очередного такта, мастер должен проверить свободно ли, и если нет — подождать.
Есть ещё такой режим — комбинированный. Это когда мастер, прочитав что-нибудь, не освобождая линию,(не формируя СТОП) генерит прям сразу ещё один СТАРТ и лезет писать. Такой хамский старт называется повторным — ПОВСТАРТ (repeated Start, Sr). Делается это, обычно, для указания «внутреннего» адреса периферийной микросхемы — например: послали адрес EEPROM-ины, сказали что намерены читать, потом ПОВСТАРТ и адрес ячейки откуда хотим считать
Есть ещё режим много-мастерной(multi-master) работы — тут сильно выручает соединение “монтажное И”.
А для реализации, непосредственно демократии, на шине действуют ещё и правила джунглей синхронизации и арбитража. Эти правила построены на непрерывном самоконтроле мастерами результатов своей деятельности — отпустит линию — и тут же смотрит — отпустилась? Если — отпустилась, то всё хорошо и он тут пока главный, если нет (кто-то держит линию) — есть мастера потолще, надо свалить.
Естественно, каждый мастер перед началом бурной деятельности по раздаче команд и чтению данных проверяет не занимает ли линию кто-нибудь столь же мастеровитый, и если занимает то тактично ждёт просветов.
А если одновременно, сразу несколько, посмотрели — свободно — воздуха побольше набрали и давай…вещать?
Тут они начинают мериться=)
Во-первых, тактирование. Естественно, все мастера ломанутся дёргать SCL самостоятельно, они ж мастера=) Вот только пока самые резвые (начавшие первыми) сгенерировав первый такт, отпустят линию — более тормозные и неторопливые будут её держать, отпуская по одному, пока не найдётся самый главный тормоз — начавший вещать последним, он то и продолжит, а остальные останутся нервно ждать.
Но, может так случится, что два особо однояйцевых мастера синхронно сгенерят СТАРТ условие. Тогда опять начнётся затяжной заплыв с мериньем. Будут гнать в линию SDA свои нолики и единицы синхронно, пока не обнаружится разница в задуманном — тот кто захочет выставить единицу будет традиционно обломан тем, кто решил в этот момент послать нолик. Обламавшийся перейдёт в ожидание, а тот кто сказал 0 первым — продолжит.
В общем, “0” в I2C решает, на этом всё и держится =)
Дополнительно, для погружения в тему, рекомендую книжку:
Семёнов Б.Ю. «Шина I2C в радиотехнических конструкциях»
А также, перевод стандарта
Далее: Программирование Arduino — библиотека Wire — для работы с I2C
Ccылки
http://easyelectronics.ru/interface-bus-iic-i2c.html
http://ru.wikipedia.org/wiki/I2C
По теме
1-Wire
SPI
Использование I2C в высокоуровневом приложении — Azure Sphere
- Статья
- Чтение занимает 3 мин
Azure Sphere поддерживает Inter-Integrated (I2C) в главном режиме. I2C — это последовательная шина, которая подключает низкоскоростные периферийные устройства к микроконтроллерам. I2C использует модель с несколькими главными или несколькими подчиненными устройствами, где основное устройство управляет набором подчиненных устройств. I2C часто используется с периферийными устройствами, для которых требуется простое упрощенное взаимодействие с микроконтроллером, например настройка элементов управления, коммутаторов питания и датчиков.
Приложения могут получать доступ к периферийным устройствам через I2C, вызывая API Applibs I2C для выполнения операций с главным интерфейсом I2C. В примере LSM6DS3 I2C описывается настройка оборудования для I2C на устройстве MT3620 и использование I2C в приложении.
Требования i2C
Приложения, использующие I2C, должны включать соответствующие файлы заголовков для I2C и добавлять параметры I2C в манифест приложения.
Все приложения должны задать целевое оборудование и включить соответствующий файл заголовка определения оборудования.
#define I2C_STRUCTS_VERSION 1 #include <applibs/i2c.h> #include "path-to-your-target-hardware.h"
Объявите I2C_STRUCTS_VERSION
определение препроцессора перед включением файла заголовка. Указывает версию структуры, используемую приложением.
Замените path-to-your-target-hardware.h путем к файлу заголовка для оборудования.
Параметры манифеста приложения
Чтобы использовать API-интерфейсы I2C, I2cMaster
В коде используйте константы, определенные для оборудования, для идентификации интерфейсов I2C. Компилятор преобразует эти значения в необработанные значения при сборке приложения.
Например, ниже приведен фрагмент манифеста приложения, который предназначен для эталонной платы разработки MT3620 (RDB) и настраивает два основных интерфейса I2C:
"I2cMaster": [ "$MT3620_RDB_HEADER2_ISU0_I2C", "$MT3620_RDB_HEADER4_ISU1_I2C" ],
В следующем фрагменте показано, как указать те же главные интерфейсы I2C в приложении, предназначенном для начального набора Avnet MT3620:
"I2cMaster": [ "$AVNET_MT3620_SK_ISU0_I2C", "$AVNET_MT3620_SK_ISU1_I2C" ]
Открытие главного интерфейса I2C
Перед выполнением операций с главным интерфейсом I2C его необходимо открыть, вызвав I2CMaster_Open функцию.
Обновление параметров главного интерфейса I2C
После открытия главного интерфейса можно изменить параметры:
- Чтобы изменить скорость шины для операций в главном интерфейсе, вызовите I2CMaster_SetBusSpeed
- Чтобы изменить время ожидания для операций, вызовите I2CMaster_SetTimeout
Выполнение операций чтения и записи в главном интерфейсе I2C
Azure Sphere поддерживает несколько вариантов выполнения операций чтения и записи с помощью I2C. Все эти параметры являются блокирующими синхронными операциями.
Для односторонних операций записи или чтения можно вызвать I2CMaster_Write илиI2CMaster_Read. Это самый простой способ выполнения операций с главным интерфейсом I2C, так как он указывает только одну операцию и включает адрес подчиненного устройства в вызов функции.
Вы можете вызвать I2CMaster_WriteThenRead для выполнения объединенной операции записи и чтения в одной транзакции шины без прерывания выполнения другой транзакции.
Для взаимодействия с некоторыми интерфейсами POSIX можно вызывать функции чтения POSIX (2) и write(2) для выполнения односторонних транзакций. Необходимо вызвать I2CMaster_SetDefaultTargetAddress, чтобы задать адрес подчиненного устройства перед вызовом read(2) или write(2).
Эти функции можно вызывать для выполнения 0-байтных операций записи, чтобы проверить наличие подчиненного устройства. Если операция чтения или записи завершается сбоем, приложение должно обработать повторную отправку запроса.
Закрытие интерфейса I2C
Чтобы закрыть интерфейс, необходимо вызвать стандартную функцию POSIX close().
Поддержка MT3620
В этом разделе описываются параметры I2C, которые применяются только при запуске Azure Sphere на MT3620.
Спецификации I2C для микросхемы MT3620 перечислены в разделе «Состояние поддержки MT3620». В руководстве пользователя по плате разработки MT3620 описывается макет контактов и функции для подключения.
Папка HardwareDefinitions в каталоге установки пакета SDK microsoft Azure Sphere содержит определения общих до плат разработки, модулей и микросхем Azure Sphere. Он содержит файлы заголовков и JSON, которые определяют главные интерфейсы для MT3620, MT3620 RDB, а также другое оборудование MT3620. По умолчанию папка HardwareDefinitions находится в
Windows и /opt/azurespheresdk/HardwareDefinitions
Linux.
- При настройке платы разработки MT3620 можно использовать любой порт ISU в качестве главного интерфейса I2C. При использовании порта ISU в качестве главного интерфейса I2C нельзя использовать тот же порт, что и интерфейс SPI или UART.
- 10-разрядные адреса подчиненных устройств не поддерживаются в MT3620; Поддерживаются только 7-разрядные адреса.
- MT3620 поддерживает скорость шины 100 КГц, 400 КГц и 1 МГц, но не 3,4 Мгц.
- 0-байтовое чтение I2C не поддерживается в MT3620.
- При использовании I2C в высокоуровневом приложении периферийное устройство I2C использует только контакты SCL и SDA в периферийном блоке ISU, а другие контакты могут использоваться в качестве GPIO в том же высокоуровневом приложении. Список неиспользуемых пин-кодов ISU, которые можно повторно использовать для GPIO, см. на периферийных устройствах ввода-вывода.
ОШИБКА — 404 — НЕ НАЙДЕНА
- Главная
- ЭТО ЛОВУШКА!
Наши серверные гномы не смогли найти страницу, которую вы ищете.
Похоже, вы неправильно набрали URL-адрес в адресной строке или перешли по старой закладке.
Возможно, некоторые из них могут вас заинтересовать?
Гнездо/разъем питания цилиндра постоянного тока
В наличии ПРТ-00119
2
Избранное Любимый 22
Список желаний
Нагреватель Loomia 5V — 7.2V
В наличии COM-17858
55,95 $ $53,15
Избранное Любимый 5
Список желаний
MIKROE VCP Monitor Click
Нет в наличии ПРТ-19496
21,95 $
Избранное Любимый 0
Список желаний
Pixhawk 6C с модулем питания PM02 и GPS M8N
Нет в наличии РОБ-20497
314,99 $
Избранное Любимый 1
Список желаний
10 основных ошибок проектирования, которых следует избегать при разработке электронного оборудования
28 июля 2021 г.
Ознакомьтесь с третьей частью серии гостевых блогов Джона Тила из Predictable Designs.
Избранное Любимый 1
Сделай сам крысиные бега в паб с доской LTE GNSS Breakout Board
12 августа 2021 г.
Как только Роб и Авра получат сообщение с GPS-координатами, кто быстрее доберется до нужного места? Они узнают об этом, используя поезда, самолеты, велосипеды, лезвия и, конечно же, новый SparkFun LTE GNSS Breakout с SARA-R5.
Избранное Любимый 0
Учебное пособие по сервоприводу для хобби
26 мая 2016 г.
Сервоприводы — это двигатели, которые позволяют точно управлять вращением выходного вала, открывая всевозможные возможности для робототехники и других проектов.
Избранное Любимый 24
- Электроника SparkFun®
- 6333 Dry Creek Parkway, Niwot, Colorado 80503
- Настольный сайт
- Ваш счет
- Авторизоваться
- регистр
ОШИБКА — 404 — НЕ НАЙДЕНА
- Главная
- Проблема?
Наши серверные гномы не смогли найти страницу, которую вы ищете.
Похоже, вы неправильно набрали URL-адрес в адресной строке или перешли по старой закладке.
Возможно, некоторые из них могут вас заинтересовать?
Shapeoko Z-Plus — XXL
В наличии ТОЛ-18481
250,00 $
Избранное Любимый 1
Список желаний
МИКРОЕ БЛЕ 6 Click
Нет в наличии WRL-19430
26,95 $
Избранное Любимый 0
Список желаний
Shapeoko 4 Standard — без стола, с маршрутизатором
В наличии ТОЛ-19736
1 605,00 $
Избранное Любимый 0
Список желаний
Гистограмма MIKROE 3 Нажмите
Нет в наличии COM-19893
14,95 $
Избранное Любимый 0
Список желаний
Удаленный промышленный датчик VOC, использующий Ethernet
24 марта 2022 г.