Шина i2c что это

Обновлено: 03.07.2024

В данной статье рассматриваются только библиотеки iarduino предназначенные для работы с датчиками и модулями по шине I2C.

Библиотеки iarduino могут использовать как аппаратную, так и программную реализацию шины I2C
При этом выбранный тип реализации шины I2C не влияет на синтаксис функций и методов библиотек iarduino.

При работе с аппаратной шиной I2C, датчики подключаются к заранее указанным на плате (или в документации) выводам, так как прием/передача данных по шине осуществляется на физическом уровне (внутренними блоками микроконтроллера).

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

Аппаратная шина I2C:

По умолчанию библиотеки iarduino самостоятельно работают с аппаратной шиной I2C. Датчики подключаются к Arduino используя выводы SDA и SCL (они либо подписаны на плате, либо указаны в документации).

  • Пример:
  • Преимущества: Не требуется подключение дополнительных библиотек. Скетч занимает меньше памяти.
  • Недостатки: Поддерживаются не все платы.

Если перед подключением библиотек iarduino подключить библиотеку Wire, то библиотеки iarduino будут использовать методы и функции библиотеки Wire для работы с аппаратной шиной I2C. Датчики подключаются к Arduino используя выводы SDA и SCL (они либо подписаны на плате, либо указаны в документации).

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

  • Преимущества: Поддерживается множество плат.
  • Недостатки: Требуется больше памяти.

Программная реализация шины I2C:

Если перед подключением библиотек iarduino определить выводы pin_SW_SDA и pin_SW_SCL, то библиотеки iarduino реализуют программную шину I2C на назначенных выводах. Датчики подключаются к Arduino используя любые выводы назначенные Вами как SDA и SCL.

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

  • Преимущества: Возможна работа с модулями I2C на любых выводах Arduino.
  • Недостатки: Поддерживаются не все платы.
  • Примечание: Библиотеки iarduino не реализуют программную шину I2C для тех модулей с которыми они не работают.

Особенности:

Если перед подключением библиотек iarduino определить выводы pin_SW_SDA, pin_SW_SCL и подключить библиотеку Wire, то модули работающие с библиотеками iarduino будут использовать программную шину I2C на назначенных выводах.

Если до определения выводов pin_SW_SDA и pin_SW_SCL подключить хотя бы одну библиотеку iarduino, то все библиотеки iarduino будут использовать аппаратную шину I2C.

Краткий обзор и простой пример работы с интерфейсом I2C, на примере – CAT24C02 (EEPROM память, объем 256 Байт). Введение Описание протокола на русском языке с красивыми диаграммами работы можно посмотреть на сайте Easyelectronics. Возможности и описание модуля представлено в руководстве пользователя: RM0038: STM32L151xx and STM32L152xx advanced ARM-based 32-bit MCUs (Руководство пользователя). Пример Сам протокол не сложный, однако множество вариантов состояний (ошибок) требуют “запутанной” схемы их обработки, реализовать которые сходу у меня не получится, а уж об использовании ПДП (DMA) вообще можно не думать. Микросхема EEPROM памяти CAT24C02 в контексте интерфейса I2C является ведомым (Slave) устройством, следовательно модуль I2C необходимо настроить в режим ведущего (Master). В данном режиме микроконтроллер (для простоты описания) сам генерирует тактовые сигналы и инициирует передачу данных. В установленном на плате STM32L-Discovery микроконтроллере имеется два модуля I2C1 и I2C2, я выбрал первый, так как сигнальные линии второго “попадают” под ЖКИ индикатор, а мне хотелось бы его оставить для вывода отладочной информации. Правда, при этом пришлось отказаться от светодиодов, так как они оба подключены к линиям первого модуля, но паять (выпаивать) на плате ни чего не нужно. Определение линий:

Должны работать в режиме “открытый сток”, схема включения:

image

Для начала работы необходимо настроить линии ввода-вывода и разрешить тактирование модуля:

Далее необходимо выбрать частоту тактирования модуля.

Сам модуль подключен к выходу шины APB1 (PCLK1), через два предварительных делителя (обвел синим):

image

Контроллер поддерживает два режима обмена: стандартный (Standard Speed — up to 100 kHz) и быстрый (Fast Speed (up to 400 kHz).

В зависимости от режима обмена частота тактирования модуля должна быть не ниже:

  • 2 MHz в стандартном режиме
  • 4 MHz в быстром режиме

Текущее значение частоты PCLK1 необходимо прописать в регистр (I2C_CR2):

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

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

2,097 МГц / 100 кГц = 10;

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

Для правильной работы необходимо задать в “тактах” частоты тактирования модуля максимально возможное время установления, по спецификации для стандартного режима максимальное время равно 1000 нс.

Период тактовой частоты равен (1 / 2,097 МГц = 476 нс), следовательно время максимальное нарастания:

1000 нс / 476 нс = 2 + 1 (плюс единица – небольшой запас) = 3

Как я понял данный параметр задает момент времени по которому производятся выборка состояния линий.

Всё, базовая настройка произведена.

Углубляемся в протокол обмена

Диаграмма работы в режиме произвольного чтения данных из EEPROM памяти:

image

Как видим необходимо:

  • сформировать сигнал “Старт”
  • передать адрес ведомого устройства
  • передать адрес ячейки памяти
  • сформировать сигнал “Повторный Старт”
  • передать адрес ведомого устройства
  • считать данные
  • послать сигнал “Стоп”

Первый режим — запись данных (от “Старт” до “Повторный Старт”).

Второй режим — чтение данных (от “Повторный Старт” до “Стоп”).

Диаграмма работы в ведущего в режиме — запись данных:

image

У микросхемы EEPROM памяти ширина адреса 7 бит (верхняя диаграмма).

“Пройдемся” по данному режиму параллельно с программным кодом.

Формирование сигнала “Старт”:

После формирования дожидаемся возникновения события EV5 (см. выше), т.е. установки бита:

Пока я не рассматриваю (не обрабатываю) исключительные ситуации (ошибки, коллизии) возникающие на линии.

Адрес ведомого состоит из:

  • бит 0 – говорит о направлении передачи последующих данных (0- от ведущего к ведомогу / 1 – от ведомого к ведущему)
  • биты 1-7 – задают адрес ведомого (для EEPROM 0x50)

Перед передачей необходимо прочитать регистр SR1, для сброса бита SB.

Ожидаем окончания передачи адреса (событие EV6) и сбрасываем бит ADDR (чтением SR1 и SR2):

Для примера считаем значение десятой ячейки EEPROM памяти:

Ожидаем окончания передачи:

Диаграмма работы в ведущего в режиме – чтение данных:

image

Действия аналогичны предыдущему режиму, поэтому сразу код:

После формируем сигнал “Стоп”

Хух, Прочитали один байтик

Запись одного байта проще:

image

В связи с тем, что при записи нужного адреса ячейки памяти мы уже находимся в режиме запись.

I²C (англ. Inter-Integrated Circuit Bus ) – последовательная шина данных для связи интегральных схем, использующая две двунаправленные линии связи (SDA и SCL). Используется для соединения низкоскоростных периферийных компонентов с материнской платой, встраиваемыми системами и мобильными телефонами. Двухпроводной последовательный интерфейс, разработанный корпорацией Philips.

Шина I2C широко используется в бытовой электронике, передаче данных и промышленной электронике. Простая двунаправленная 2-проводная шина для эффективного управления и взаимодействия различных блоков телевизоров, она стала применяться для связи между собой однокристальных микроконтроллеров, ЖКИ-индикаторов, портов ввода-вывода, микросхем памяти (особенно энергонезависимой), аналого-цифровых и цифро-аналоговых преобразователях, цепях цифровой настройки, DTMF кодеров и декодеров, часов реального времени и т.д

Содержание

История

История шины I²C в том виде, в котором она представлена сейчас, началась в 1992 году, когда фирмой Pilips была выпущена её первая спецификация версии 1.0. Эта спецификация исключила возможность задания адреса slave-устройства программным способом как наиболее сложную процедуру. Наряду со стандартным режимом скорости передачи данных 100 кбит/с (low-speed) был введен режим быстрой передачи со скоростью 400 кбит/с (fast-speed) . Появился также режим 10-разрядной адресации. Версия 2.0, выпущенная в 1998 году, ввела в спецификацию шины быстродействующий режим (HS-mode) со скоростью передачи до 3,4 Мбит/c. Причем требования предписали вводить обязательную возможность совместимости с режимами low-speed и fast-speed. К моменту появления версии 2.0 шина I²C распространилась по всему миру, став международным стандартом. Было разработано более 1000 интегральных схем, лицензия на официальное использование спецификации приобретена более чем 50 фирмами. Версия 2.1, датируемая 2000 годом, включает себя не значительные модификации.

Введение в спецификацию I²C

Обычно для многих приборов выдвигаются следующие критерии:

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

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

Концепция шины

Все операции по шине I²C осуществляются при помощи двух проводов:

  • линия последовательных данных (SDA):
  • линия синхронизации (SCL).

Каждый элемент определяется своим уникальным адресом, в который входит группа приборов и номер конкретного прибора. Группа определяет, является ли это микроконтроллером, LCD-индикатором, памятью или чем-то еще. Например, все устройства памяти имеют код 0Ah, таймеры и часы реального времени - 0Dh, устройства телетекста - 02h и т.д. Любой элемент, инициирующий передачу, является мастером, любой адресуемый элемент является подчиненным. В системах с несколькими мастерами, один и тот же элемент может в разное время выступать или как мастер или как подчиненный.

Терминология шины I²C

  • Передатчик - элемент, который посылает данные в шину.
  • Приемник - элемент, который получает данные из шины.
  • Master - элемент, который инициализирует передачу, генерирует сигналы синхронизации, и завершает передачу.
  • Slave (подчиненный) - элемент, адресованный мастером
  • Multi-master - система с более чем одним мастером.
  • Арбитраж - процедура, гарантирующая, что, если больше чем один мастер одновременно пробуют управлять шиной, только один из них получит полное управление шиной и обеспечит передачу данных без ошибок.
  • Синхронизация - синхронизация передачи данных между элементами.

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


Общие характеристики

SDA и SCL - двунаправленные линии с открытым стоком (коллектором), соединенные с положительным питающим напряжением через резистор (рис.2). Когда шина свободна, обе линии находятся в состоянии “1”. Данные могут передаваться по шине I2 C со скоростью до 100 kbit/s в стандартном режиме, или до 400 kbit/s в быстром режиме. Число интерфейсов, соединенных с шиной исключительно зависит от емкости шины, максимальное значение которой - 400pF.


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

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

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

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


ПЕРЕДАЧА БИТА

Из-за разнообразия различных технологий (CMOS, NMOS,биполярные приборы) которые могут быть использованы с шиной I²C, уровни логического “0” и “1” не установлены и зависят от величины питающего напряжения VDD. Для передачи одного бита данных используется один импульс сигнала синхронизации, при этом уровень на линии SDA должен быть неизменным в течение высокого уровня на линии SCL, и может изменяться только при низком уровне на SCL. Исключениями служат два особых состояния - START и STOP.


START и STOP

Существуют два особых состояния шины I²C - start и stop, которые служат для индикации начала и конца передачи и соответственно перехода шины в неактивное состояние. Следует отметить, что до тех пор, пока не установлено состояние start, сигналы на линиях SDA и SCL могут быть совершенно произвольными . Это позволяет, в частности, использовать одну линию SDA и несколько линий SLC (например, при нехватке, адресов на одной шине). Состояние START - переход от “1” к “0” на линии SDA при “1” на линии SCL. Состояние STOP - переход от “0” к “1” на линии SDA при “1” на линии SCL. Эти два состояния всегда генерируются мастером. Детектирование состояний start и stop в специализированных элементах обычно производится аппаратно. При полностью программной реализации шины I²C в микроконтроллерах без аппаратной I²C-части необходимо как минимум 2 раза проверять состояние линии SDA.


ПЕРЕДАЧА ДАННЫХ


ПОДТВЕРЖДЕНИЕ


СИНРОНИЗАЦИЯ

Каждое мастер-устройство генерирует собственные сигналы синхронизации на линии SCL. Данные на линии SDA действительны только течение ВЫСОКОГО уровня SCL. Синхронизация осуществляется благодаря “монтажному-И” на линии SCL. Это означает, что состояние “0” на линии SCL будет длиться до тех пор, пока все мастер-устройства не освободят линию синхронизации. Линия SCL будет, следовательно, задержана в уровне “0” элементом с самым длинным уровнем “0”. Элементы с более коротким уровнем “0” при этом входят в состояние ожидания.


Мастер может начинать передачу только, если шина свободна. Два или больше мастера могут генерировать состояние START практически одновременно, поэтому необходим арбитраж между ними, для того чтобы выяснить, кто же их них все-таки был первым. Для этого используется линия SDA - благодаря тому, что она, как и SCL выполнена по схеме “монтажное-И”.


ЛОГИЧЕСКИЙ УРОВЕНЬ

Служебныйпакет.jpg

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

Сам адрес состоит из семи бит (вот почему до 127 устройств на шине), а восьмой бит означает что будет делать Slave на следующем байте — принимать или передавать данные. Девятым битом идет бит подтверждения ACK. Если Slave услышал свой адрес и считал полностью, то на девятом такте он придавит линию SDA в 0, сгенерировав ACK — то есть Понял! Мастер, заметя это, понимает, что все идет по плану и можно продолжать. Если Slave не обнаружился, прозевал адрес, неправильно принял байт, сгорел или еще что с ним случилось, то, соответственно, SDA на девятом такте будет прижать некому и ACK не получится. Будет NACK.

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

Служебныйпакет1.jpg

Чтение практически также, но есть одна тонкость. При приеме последнего байта надо дать ведомому понять, что в его услугах больше не нуждаемся и отослать NACK на последнем байте. Если отослать ACK то после стопа Master не отпустит линию — такой уж там конечный автомат. Так что прием двух байтов будет выглядеть так (R=1):

Служебныйпакет2.jpg

Есть еще одно состояние, как повторный старт. Это когда мы не объявляя STOP вкатываем на шину еще один START. После него мы можем обратиться к другому устройству не освобождая шину. Но чаще идет обращение к тому же самому устройству и это связано с особенностями организации памяти.

Применение

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

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

  • доступ к модулям памяти NVRAM;
  • доступ к низкоскоростным ЦАП/АЦП;
  • регулировка контрастности, насыщенности и цветового баланса мониторов;
  • регулировка звука в динамиках;
  • управление светодиодами, в том числе в мобильных телефонах;
  • чтение информации с датчиков мониторинга и диагностики оборудования, например, термостат центрального процессора или скорость вращения вентилятора охлаждения;
  • чтение информации с часов реального времени (кварцевых генераторов);
  • управление включением/выключением питания системных компонент;
  • информационный обмен между микроконтроллерами;

Пример системы с шиной I²C На рисунке: (a) Высокоинтегрированный телевизор

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

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

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


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

Недостатки

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

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

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

Разработка

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

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

В настоящее время ассортимент продукции Philips включает более 150 КМОП и биполярных I²C-совместимых устройств, функционально предназначенных для работы во всех трёх вышеперечисленных категориях электронного оборудования. Все I²C-совместимые устройства имеют встроенный интерфейс, который позволяет им связываться друг с другом по шине I²C. Это конструкторское решение разрешает множество проблем сопряжения различных устройств, которые обычно возникают при разработке цифровых систем.

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

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

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

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

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

Шина IPMB, основанная на использовании двух I²C с целью резервирования и являющаяся основой интерфейса IPMI, применяется в высоконадёжных системах стандартов AdvancedTCA и MicroTCA.

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

I²C (и-квадрат-це, ай-ту-си, ай-сквэрд-си), Inter-Integrated Circuit - последовательная шина обмена данными между интегральными схемами. Изобретена и в начале 80-х компанией Philips Semiconductor (теперь NXP), передача данных осуществляется по двум проводам в обе стороны. Ведущий и ведомый могут выполнять как роль приёмника, так и передатчика. Для возможности соединения более двух устройств используются адресация. Опрашивать адреса шины может только ведущий. Адрес последовательно выводится на линию SDA сразу после сигнала Start. В этой статье речь пойдёт только о 7-ми битной адресации, так же не будет затронута тема нескольких ведущих. На каждом устройстве, поддерживающем I²C обычно обозначены два вывода: SDA и SCL. SDA (serial data) - означает последовательные данные, SCL (serial clock) - последовательное тактирование. Эти выводы являются выводами открытого коллектора или открытого стока, это означает что ведущий и ведомый могут только притягивать электрический потенциал к земле, поэтому на каждой линии должны быть подтягивающие резисторы. Сопротивление резисторов рассчитывается в зависимости от паразитной ёмкости линии.

Подключение:

Шина поддерживает подключение до 112 устройств (при 7-ми битной адресации) по двум проводам (плюс GND и Vcc), может иметь несколько ведущих и ведомых. При использовании нескольких ведущих, каждый из них должен поддерживать этот режим и уметь определять состояние занятой шины.

I²C на Arduino

Arduino UNO R3/Piranha UNO

На Arduino UNO R3/Piranha UNO шина I2C находится на выводах A4, A5. Также в эти выводы продублированы на колодке с цифровыми выводами рядом с кнопкой Reset.


Piranha ULTRA

На Piranha ULTRA шина I²C не занимает аналоговые выводы A4, A5 и находится на цифровой колодке рядом с кнопкой Reset, выводы обозначены SDA и SCL


Arduino MEGA R3

На Arduino MEGA R3 шина I²C находится на цифровой колодке на крайних выводах, близких к разъёму USB и на выводах 20, 21. Выводы объединены.


Примеры для Arduino

Работа с шиной с использованием встроенной библиотеки Wire Arduino IDE на примере Trema-модуля LED Матрицы 8x8 - i2c

В этом примере на матрицу выводится изображение стрелки. Стоит заметить, ко всем нашим модулям написаны библиотеки с высокоуровневым интерфейсом и вовсе не обязательно работать с матрицей на низком уровне. Подробнее о работе с библиотекой матрицы можно узнать по этой ссылке.

I²C на Raspberry Pi

На Raspberry Pi I²C выводы это 3-й и 5-й выводы колодки, GPIO2 и GPIO3 по номенклатуре BCM и выводы 8, 9 по номенклатуре WiringPi.


Примеры для Raspberry

Работа с шиной с использованием модуля smbus для Python на примере Trema-модуля Матрицы 8x8 - i2c. Для работы с шиной её необходимо включить в настройках Raspberry при помощи утилиты raspi-config . Ссылка на подробное описание как это сделать.

Так же как и в примере с Arduino, в этом примере на матрицу выводится изображение стрелки. Стоит заметить, к Trema-модулю LED Матрица 8x8 - i2c написана библиотека с высокоуровневым интерфейсом и вовсе не обязательно работать с матрицей на низком уровне. Подробнее о работе с библиотекой матрицы можно узнать по этой ссылке

Подробнее о шине I²C:

Резисторы, ёмкость и длина линий шины

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

При использовании шины на модулях не существует принятого стандарта установки подтягивающих резисторов на ведущем или ведомом. У Arduino подтягивающие резисторы отсутствуют и для работы с шиной нужен хотя бы один модуль с ними. У Raspberry Pi на плате установлены подтягивающие резисторы номиналом 1,7 килоОм и для неё нет необходимости в подтяжке на модулях.

Сигналы и специальные биты шины

В состоянии покоя линии шины находятся на верхнем потенциале (обычно 3,3 В или 5 В, но могут быть и другие напряжения). Бездействие устройства, по умолчанию, воспринимается как логическая 1. Для простоты понимания можно рассмотреть аналогию: Вообразим верхний потенциал как уровень воды, а нижний как дно. Представьте, что Вы на рыбалке - попловок в состоянии покоя остаётся на поверхности, когда клюёт - идёт ко дну. Так же и в здесь, при обмене данными линии прижимаются в нулевому потециалу. Далее рассмотрим поочереди сингалы и специальные биты.

Устанавливаемые только ведущим

  • Start - сигнал начала обмена данными. Линия тактирования SCL отпущена (логическая 1), ведущий пижимает линию данных SDA (переход из логической 1 в логический 0). После этого обмен данными происходит побайтово. Первый байт - семь бит адреса ведомого и бит направления (запись или чтение). Последующие байты - данные. после этого сигнала шина считается занятой.

Краткое обозначание сигнала S - заглавная буква S латинского алфавита.

  • Бит Read - Если ведущий желает получить данные, он устанавливает логическую 1 сразу после адреса, информируя ведомого о том, что данные будут считываться (управление линией данных передаётся ведомому).

Краткое обозначание R - заглавная буква R латинского алфавита.

  • Бит Write - Если ведущий желает записать данные, он устанавливает логический 0 сразу после адреса для информирования ведомого о том что данные будут записываться (управление линией данных остаётся у ведущего).

Краткое обозначение W̅ - заглавная буква W латинского алфавита с чертой сверху.

  • Stop - сигнал окончания обмена данными. Ведущий прекращат тактирование, линия тактирования SCL отпущена (логическая 1), линия данных SDA переведена ведущим из логического 0 в логическую 1. После этого сигнала шина считается свободной.

Краткое обозначение P - заглавная буква P латинского алфавита.

  • Restart - сигнал продолжения обмена данными (используется взамен сигналу Stop с последующим Start для продолжения опрашивания шины ). Используется в основном при наличии нескольких ведущих на шине, чтобы управление не перешло другому ведущему после сигнала Stop. Линия тактирования SCL отпущена ведущим, линия данных SDA переведена ведущим из логической 1 в логический 0.

Обозначается Sr - заглавная буква S и строчная буква r латинского алфавита.

Устанавливаемые ведущим и ведомым

Данные биты может устанавливат как ведущий, так и ведомый. В такой ситуации устанавливающее устройство или модуль (ведущий или ведомый) называют передатчиком, а считывающее устройство - приёмником.

  • Бит ACK - (сокращ. англ. acknowledged - подтверждено) каждый девятый импульс тактирования передатчик (ведущий или ведомый) отпускает линию данных. Если линия была прижата приёмником (логический 0) - принятые данные верны, передача может быть продолжена или закончена.

Обозначается A - заглавная буква A латинского алфавита

  • Бит NACK - (сокращ. англ. not acknowledged - не подтверждено) каждый девятый импульс тактирования передатчик (ведущий или ведомый) отпускает линию данных. Если линия была отпущена принимающим или принимающего нет на шине (логическая 1) - принятые данные неверны, произошла ошибка, передача не может быть продолжена. Обозначается A̅ - заглавная буква A латинского алфавита с чертой сверху.

Обмен данными

При обмене данными тактированием занимается только ведущий, а ведомый может удерживать линию тактирования только если не успевает за ведущим, так называемое растягивание тактирования (clock-stretching). Не все модули поддерживают удержание. Установка бита на линии данных может происходит в момент, когда линия тактирования прижата, а считывания, когда линия отпущена (подтянута к Vcc), но в большинстве случаев это происходит по фронту волны на линии тактирования.

Рассмотрим пример простого обмена данными:

Запись в регистры ведомого. Данные взяты из примеров, приведённых выше.

После сигнала Start и указания адреса ведущий записывает адрес регистра с которого будет производиться дальнейшая запись. Стоит заметить, что у ведомого есть внутренний счётчик и каждый последующий байт после подтверждения будет записан в следующий регистр. Таким образом байт со значением 0x00 будет записан в регистр 0x11, байт со значением 0x18 будет записан в регистр 0x12, байт со значением 0x3C будет записан в регистр 0x13 и т. д. В этом примере биты ACK устанавливает ведомый.

Вот так сигналы этого примера выглядят на осциллографе:

Чтение из регистров ведомого. Предположим, мы хотим прочитать байт из регистра 0x13.

Скорость

Первоначальный стандарт I²C был реализован на скорости 100 кГц. С тех пор появились и другие реализации шины, но большинство устройств работают на этой скорости. Так же известны случаи когда скорость шины специально снижена, чтобы увеличить расстояние передачи и уменьшить чувствительность к помехам. Не все модули могут работать на сниженной скорости.

При создании некоторых проектов, требуется разделить выполняемые задачи между несколькими arduino.

В этом уроке мы научимся соединять две arduino по аппаратной шине I2C.


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

  • Реализуется возможность подключения до 126 устройств.
    (не рекомендуется присваивать устройствам адреса 0x00 и 0x7F)
  • Не требуются дополнительные модули.
  • Все устройства одинаково подключаются к шине.
  • Каждое ведомое устройство имеет свой уникальный адрес на шине.

Недостатки:

  • Код программы немного сложнее чем для шины UART.

Нам понадобится:

    х 3шт.
  • LCD дисплей LCD1602 IIC/I2C(синий) или LCD1602 IIC/I2C(зелёный) х 1шт. х 3шт. x 2шт. x 1шт. x 1шт. x 1шт. х 4шт.

Для реализации проекта нам необходимо установить библиотеки:

  • Библиотека LiquidCrystal_I2C_V112 (для подключения дисплеев LCD1602 по шине I2C).
  • Библиотека iarduino_I2C_connect (для удобства соединения нескольких arduino по шине I2C).

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki - Установка библиотек в Arduino IDE, а о том, как работать с LCD дисплеями, на странице Wiki - Работа с символьными ЖК дисплеями.

Видео:

Схема подключения:

На шине i2С находятся 4 устройства: 3 arduino и 1 LCD дисплей. Все устройства шины I2C соединены через Trema I2C Hub. Для подключения Arduino используются аппаратные выводы шины I2C.

    - к цифровому выводу D2 подключена trema кнопка. - к цифровому выводу D2 подключена trema кнопка. - к цифровому выводу D13 подключён trema светодиод, к аналоговому выводу A0 подключён Trema потенциометр. - является устройством slave 0x27.

Схема соединения нескольких Arduino по шине I2C

На шине I2C не используются дополнительные подтягивающие резисторы (для линий SDA и SCL), так как они интегрированы в LDC I2C дисплее.

Код программы:

Arduino master:
Arduino slave 0x01:
Arduino slave 0x02:

Алгоритм работы:

  • Arduino master проверяет состояние собственной кнопки.
  • Arduino master опрашивает две Arduino Slave.
    • Arduino Slave 0x01 возвращает состояние кнопки.
    • Arduino Slave 0x02 возвращает значение падения напряжения плеча потенциометра.
    • Arduino Slave 0x02 включает или выключает светодиод, в соответствии с полученными данными.

    Настройка параметров шины I2C:

    Максимальная, аппаратно реализуемая частота передачи данных, может достигать 1/16 от тактовой частоты.

    Библиотека Wire позволяет устанавливать скорость передачи данных через функцию setClock(), которую требуется вызвать до функции begin().

    Библиотека Wire позволяет аппаратно подключить Arduino к шине I2C с указанием роли Arduino на шине: ведущий или ведомый.

    • Wire.setClock(400000); // скорость передачи данных 400 кБит/с.
    • Wire.begin(); // подключение к шине I2C в роли ведущего.
    • Wire.begin(адрес); // подключение к шине I2C в роли ведомого, с указанием адреса.

    Функции библиотеки iarduino_I2C_connect:

    В библиотеке iarduino_I2C_connect реализованы 4 функции: 2 для ведущего и 2 для ведомого.

    На ведущем устройстве доступны функции readByte() и writeByte(). Указывая в качестве параметров функций, адрес ведомого устройства и номер регистра, можно побайтно читать и записывать данные.

    Читайте также: