Scl sda что это
Общие сведения:
Подключение:
Шина поддерживает подключение до 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
В этом примере на матрицу выводится изображение стрелки. Стоит заметить, ко всем нашим модулям написаны библиотеки с высокоуровневым интерфейсом и вовсе не обязательно работать с матрицей на низком уровне. Подробнее о работе с библиотекой матрицы можно узнать по этой ссылке.
I²C на Raspberry Pi
На Raspberry Pi I²C выводы это 3-й и 5-й выводы колодки, GPIO2 и GPIO3 по номенклатуре BCM и выводы 8, 9 по номенклатуре WiringPi.
Примеры для Raspberry
Подробнее о шине I²C:
Резисторы, ёмкость и длина линий шины
В официальном описании от NXP ничего не сказано о максимальной длине шины, но не стоит этим злоупотреблять. Шина была придумана для обмена информации между интегральными схемами в пределах одной платы одного устройства. В расчёт бралась только паразитная ёмкость линии, которая сказывается на скорости нарастания фронта волны. От этой ёмкости зависит номинал подтягивающих резисторов. Можно подобрать резисторы так, чтобы фронт волны нарастал согласно спецификации и при 100-метровой длине проводов, но это не избавляет от помех, которые влечёт за собой несимметричная электрическая реализация. Опять же, при слишком маленьком сопротивлении качество сигнала улучшается, но при этом растёт ток который необходимо пропускать устройствам через выводы для притяжки линий.
При использовании шины на модулях не существует принятого стандарта установки подтягивающих резисторов на ведущем или ведомом. У Arduino подтягивающие резисторы отсутствуют и для работы с шиной нужен хотя бы один модуль с ними. У Raspberry Pi на плате установлены подтягивающие резисторы номиналом 1,7 килоОм и для неё нет необходимости в подтяжке на модулях.
Сигналы и специальные биты шины
Устанавливаемые только ведущим
Устанавливаемые ведущим и ведомым
Обмен данными
При обмене данными тактированием занимается только ведущий, а ведомый может удерживать линию тактирования только если не успевает за ведущим, так называемое растягивание тактирования (clock-stretching). Не все модули поддерживают удержание. Установка бита на линии данных может происходит в момент, когда линия тактирования прижата, а считывания, когда линия отпущена (подтянута к Vcc), но в большинстве случаев это происходит по фронту волны на линии тактирования.
Рассмотрим пример простого обмена данными:
Запись в регистры ведомого. Данные взяты из примеров, приведённых выше.
После сигнала Start и указания адреса ведущий записывает адрес регистра с которого будет производиться дальнейшая запись. Стоит заметить, что у ведомого есть внутренний счётчик и каждый последующий байт после подтверждения будет записан в следующий регистр. Таким образом байт со значением 0x00 будет записан в регистр 0x11, байт со значением 0x18 будет записан в регистр 0x12, байт со значением 0x3C будет записан в регистр 0x13 и т. д. В этом примере биты ACK устанавливает ведомый.
Вот так сигналы этого примера выглядят на осциллографе:
Чтение из регистров ведомого. Предположим, мы хотим прочитать байт из регистра 0x13.
После сигнала Start и указания адреса ведущий записывает адрес регистра, который необходимо прочитать. Далее следует сигнал Restart (или Stop, затем Start). Ведущий снова выводит адрес ведомого, но уже с битом Read (чтения). Ведомый устанавливает бит ACK и во время следующих 8-ти импульсов тактирования выводит данные на линию SDA. На девятом импульсе уже ведущий устанавливает бит ACK (или NACK, если данные не удалось прочитать) и завершает обмен сигналом Stop.
Скорость
Первоначальный стандарт I²C был реализован на скорости 100 кГц. С тех пор появились и другие реализации шины, но большинство устройств работают на этой скорости. Так же известны случаи когда скорость шины специально снижена, чтобы увеличить расстояние передачи и уменьшить чувствительность к помехам. Не все модули могут работать на сниженной скорости.
Интерфейс I2C и Arduino
Инструкция по использованию протокола I 2 C совместно с Arduino
Нам понадобится:
1 Описание интерфейса I2C
Последовательный протокол обмена данными IIC (также называемый I2C – Inter-Integrated Circuits, межмикросхемное соединение) использует для передачи данных две двунаправленные линии связи, которые называются шина последовательных данных SDA (Serial Data) и шина тактирования SCL (Serial Clock). Также имеются две линии для питания. Шины SDA и SCL подтягиваются к шине питания через резисторы.
В сети есть хотя бы одно ведущее устройство (Master), которое инициализирует передачу данных и генерирует сигналы синхронизации. В сети также есть ведомые устройства (Slave), которые передают данные по запросу ведущего. У каждого ведомого устройства есть уникальный адрес, по которому ведущий и обращается к нему. Адрес устройства указывается в паспорте (datasheet). К одной шине I2C может быть подключено до 127 устройств, в том числе несколько ведущих. К шине можно подключать устройства в процессе работы, т.е. она поддерживает «горячее подключение».
Описание интерфейса I2C
Давайте рассмотрим временную диаграмму обмена по протоколу I2C. Есть несколько различающихся вариантов, рассмотрим один из распространённых. Воспользуемся логическим анализатором, подключённым к шинам SCL и SDA.
Мастер инициирует обмен. Для этого он начинает генерировать тактовые импульсы и посылает их по линии SCL пачкой из 9-ти штук. Одновременно на линии данных SDA он выставляет адрес устройства, с которым необходимо установить связь, которые тактируются первыми 7-ми тактовыми импульсами (отсюда ограничение на диапазон адресов: 2 7 = 128 минус нулевой адрес). Следующий бит посылки – это код операции (чтение или запись) и ещё один бит – бит подтверждения (ACK), что ведомое устройство приняло запрос. Если бит подтверждения не пришёл, на этом обмен заканчивается. Или мастер продолжает посылать повторные запросы.
Это проиллюстрировано на рисунке ниже. Задача такая: подключиться к ведомому устройству с адресом 0x27 и передать ему строку «SOLTAU.RU». В первом случае, для примера, отключим ведомое устройство от шины. Видно, что мастер пытается установить связь с устройством с адресом 0x27, но не получает подтверждения (NAK). Обмен заканчивается.
Попытка мастера установить соединение с ведомым по I2C
Теперь подключим к шине I2C ведомое устройство и повторим операцию. Ситуация изменилась. На первый пакет с адресом пришло подтверждение (ACK) от ведомого. Обмен продолжился. Информация передаётся также 9-битовыми посылками, но теперь 8 битов занимают данные и 1 бит – бит подтверждения получения ведомым каждого байта данных. Если в какой-то момент связь оборвётся и бит подтверждения не придёт, мастер прекратит передачу.
Временная диаграмма обмена по протоколу I2C
2 Реализация I2Cв Arduino
Arduino использует для работы по интерфейсу I2C два порта. Например, в Arduino UNO и Arduino Nano аналоговый порт A4 соответствует SDA, аналоговый порт A5 соответствует SCL.
Реализация I2C в Arduino UNO и Nano
Для других моделей плат соответствие выводов такое:
Плата | Пин SDA | Пин SCL |
---|---|---|
Arduino Uno, Nano, Pro и Pro Mini | A4 | A5 |
Arduino Mega | 20 | 21 |
Arduino Leonardo | 2 | 3 |
Arduino Due | 20, SDA1 | 21, SCL1 |
3 Библиотека «Wire» для работы с IIC
Для облегчения обмена данными с устройствами по шине I2C для Arduino написана стандартная библиотека Wire. Она имеет следующие функции:
Функция | Назначение |
---|---|
begin(address) | инициализация библиотеки и подключение к шине I2C; если не указан адрес, то присоединённое устройство считается ведущим; используется 7-битная адресация; |
requestFrom() | используется ведущим устройством для запроса определённого количества байтов от ведомого; |
beginTransmission(address) | начало передачи данных к ведомому устройству по определённому адресу; |
endTransmission() | прекращение передачи данных ведомому; |
write() | запись данных от ведомого в ответ на запрос; |
available() | возвращает количество байт информации, доступных для приёма от ведомого; |
read() | чтение байта, переданного от ведомого ведущему или от ведущего ведомому; |
onReceive() | указывает на функцию, которая должна быть вызвана, когда ведомое устройство получит передачу от ведущего; |
onRequest() | указывает на функцию, которая должна быть вызвана, когда ведущее устройство получит передачу от ведомого. |
4 Подключение I2C устройствак Arduino
Давайте посмотрим, как работать с шиной I2C с помощью Arduino.
Сначала соберём схему, как на рисунке. Будем управлять яркостью светодиода, используя цифровой 64-позиционный потенциометр AD5171 (см. техническое описание), который подключается к шине I2C. Адрес, по которому мы будем обращаться к потенциометру – 0x2c (44 в десятичной системе).
Подключение цифрового потенциометра к Arduino по шине I2C
5 Управление устройством по шине IIC
Рассмотрим диаграммы информационного обмена с цифровым потенциометром AD5171, представленные в техническом описании:
Рассмотрим диаграммы чтения и записи цифрового потенциометра AD5171
Нас тут интересует диаграмма записи данных в регистр RDAC. Этот регистр используется для управления сопротивлением потенциометра.
Откроем из примеров библиотеки «Wire» скетч: Файл Образцы Wire digital_potentiometer. Загрузим его в память Arduino.
После включения вы видите, как яркость светодиода циклически нарастает, а потом гаснет. При этом мы управляем потенциометром с помощью Arduino по шине I2C.
По ссылкам внизу статьи, в разделе похожих материалов (по тегу), можно найти дополнительные примеры взаимодействия с различными устройствами по интерфейсу IIC, в том числе примеры чтения и записи.
6 Дополнительно о шине I2C
Доступно и интересно рассказывает о шине I2C Джереми Блюм в своём видео:
Электроника для всех
Блог о электронике
Интерфейсная шина IIC (I2C)
Логический уровень
Как передаются отдельные биты понятно, теперь о том что эти биты значат. В отличии от SPI тут умная адресная структура. Данные шлются пакетами, каждый пакет состоит из девяти бит. 8 данных и 1 бит подтверждения/не подтверждения приема.
После адресного пакета идут пакеты с данными в ту или другую сторону, в зависимости от бита RW в заголовочном пакете.
Вот, например, Запись. В квадратиках идут номера битов. W=0
Задача решается так:
С записью все понятно — записали вначале адрес, а потом следом записали данные. А умная микросхема все прекрасно поняла и рассовала по ячейкам. А с чтением? А с чтением все через задницу, в смысле через запись.
Скриншот с осциллографа RIGOL 1042CD
Вроде бы все, практический пример с AVR будет потом, а пока помедитируйте над диаграммой работы конечного автомата TWI передатчика ATmega8. Скоро я вас буду этим грузить!
Страшна? 😉 На самом деле там все не так брутально. Можно обойтись вообще парой десятков строк кода на ассемблере.
Спасибо. Вы потрясающие! Всего за месяц мы собрали нужную сумму в 500000 на хоккейную коробку для детского дома Аистенок. Из которых 125000+ было от вас, читателей EasyElectronics. Были даже переводы на 25000+ и просто поток платежей на 251 рубль. Это невероятно круто. Сейчас идет заключение договора и подготовка к строительству!
А я встрял на три года, как минимум, ежемесячной пахоты над статьями :)))))))))))) Спасибо вам за такой мощный пинок.
200 thoughts on “Интерфейсная шина IIC (I2C)”
(1) OpenID работает криво. Я зашёл как blacklion.livejournal.com и всё равно справа-сверху «войти» (а не «выйти») и не даю комментировать. Пришлось регистрироваться и теперь тут два меня.
(2) Софтового мастера сделать не сложно. А вот слейва как-то просто не получается.
Щас попробую с опен ид поиграться.
Более того, многие предпочитают делать софтовый И2С мастер чтобы не заморачиваться с встроенным в TWI конечным автоматом.
Более того, многие предпочитают делать софтовый И2С мастер чтобы не заморачиваться с встроенным в TWI конечным автоматом.
Я когда первый раз подходил к электронике смотрел на PIC (зачем я это делал!? Зачем на PIC?!) так реализовал мастера в качестве упражнения за вечер. А вот слейва так и не осилил…
Я сделал софтового слейва на AT89C2051, но работало жутко медленно.
плюсадин. я уже раз 5 жаловался что логины глючат 😀 нашел выход, что залогинился, пару минуток подождал и рефреш. работает, но бесит :\
DI HALT спасибо за статью. Давно ждал рассказ про I2C. 🙂
У меня их почти полный аналог ICL12008 ваще работать не хотят — не отзываются на свой адрес, не дают ACK
и у тебя, Брут? я изъебался с их инициализацией — не пашут и все. взял ds, который считал сгоревшим и не рабочим, по по недоразумению не выкинул — и он заработал. в топку эти ISL, от лукавого они..
А у меня 5 штук их лежит — сэмплы. Надо бы в ST гневный мессадж накатать. МОл чо вы за говно нам подсунули?
Да, есть такое дело 🙂 Вообще при начале работы с IIC девайсом, желательно вдоль и поперек изучить Datasheet к нему. В свое время тоже поломал голову с m41 от ST. Вроде все пишется, все читается, но часы стоят и все тут. Оказалось там есть хитрый битик, который при пропадании всего питания — Vcc и Vbat, останавливает часы и пока его не сбросишь они не пойдут.
Ну и еще обычный прикол с часами, что не все могут работать при отключенной батарейке — даже если Vcc есть, внутри у них стоит контроль, который проверяет разницу между напругой и Vbat, и если Vbat нет, то часы просто ни на что не отвечают 🙂
p.s. а про NACK в конце чтения это да, самые популярные грабли наверно. Кстати для отлаживания шины если нет крутого осцила, можно прикрутить I2C Sniffer на Atmega8 — оч удобная штука, она в консоли показывает полностью весь обмен в удобоваримом виде.
А чё с ним было голову ломать? Кстати, m41t56 рекомендую, простые и удобные I2C часы. Про битик я давно знал — он у всех часовых изделий от ST присутствует. Наверное, как совместимость с m48t08 — который с батареей на борту. Чтобы батарею не сажать, пока таймкипер лежит на складе, они глушат часы.
О)) На самом деле классная тема! Мне бы сначала с простым UARTом разобраться, а потом только к творению Philips)) Буду ждать исходников…
Отличная статья! А есть последняя диаграмма только в чуть лучшем качестве? А то буквы трудно различить.
Красные пути — нормальная работа
Синие — возможные косяки.
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
I²C (Inter-Integrated Circuit Bus)
Авторство | ||
Портнова А.С. | ||
Согласовано: 15.04.2016 |
Type | Bus | ||
---|---|---|---|
Production history | |||
Designer | Philips Semiconductor, known today as NXP Semiconductors | ||
Designed | 1982 ; 39 years ago ( 1982 ) | ||
Data | |||
Data signal | Open-Drain | ||
Width | 1 bit (SDA) + clock (SCL) | ||
Bitrate | 0.1 / 0.4 / 1.0 / 3.4 / 5.0 Mbit/s (depending on mode) | ||
Protocol | Serial, Half Duplex |
I²C (англ. Inter-Integrated Circuit Bus ) – последовательная шина данных для связи интегральных схем, использующая две двунаправленные линии связи (SDA и SCL). Используется для соединения низкоскоростных периферийных компонентов с материнской платой, встраиваемыми системами и мобильными телефонами. Двухпроводной последовательный интерфейс, разработанный корпорацией Philips.
Шина I2C широко используется в бытовой электронике, передаче данных и промышленной электронике. Простая двунаправленная 2-проводная шина для эффективного управления и взаимодействия различных блоков телевизоров, она стала применяться для связи между собой однокристальных микроконтроллеров, ЖКИ-индикаторов, портов ввода-вывода, микросхем памяти (особенно энергонезависимой), аналого-цифровых и цифро-аналоговых преобразователях, цепях цифровой настройки, DTMF кодеров и декодеров, часов реального времени и т.д
Содержание
История
Введение в спецификацию I²C
Обычно для многих приборов выдвигаются следующие критерии:
Последовательная структура шины удовлетворяет этим условиям. Хотя последовательные шины не имеют такой производительности как параллельные шины, они требуют меньшего количества проводов и меньшего количества выводов микросхемы.Элементы, общающиеся друг с другом по последовательной шине должны иметь некоторый протокол, который определяет логику функционирования, избегает всех возможностей беспорядка, потерь данных и блокирования информации, при этом быстрые элементы должны быть способны связаться с медленными элементами.
Концепция шины
Все операции по шине I²C осуществляются при помощи двух проводов:
Терминология шины I²C
I²C является многопрофильным master шины. Это означает, что еще одно устройство, способное контролировать шину можно подключить к нему. Так как в качестве master обычно являются микроконтроллеры, давайте рассмотрим случай передачи данных между двумя микроконтроллерами, подключенных к I²C.
Данные передаются по двум проводам — проводу данных и проводу тактов. Есть ведущий (master) и ведомый (slave), такты генерирует master, ведомый лишь «поддакивает» при приёме байта. Всего на одной двупроводной шине может быть до 127 устройств.
Общие характеристики
Принцип работы
I²C использует две двунаправленные линии, подтянутые к напряжению питания и управляемые через открытый коллектор или открытый сток — последовательная линия данных (SDA, англ. Serial DAta) и последовательная линия тактирования (SCL, англ. Serial CLock). Стандартные напряжения +5 В или +3,3 В, однако допускаются и другие.
Классическая адресация включает 7-битное адресное пространство с 16 зарезервированными адресами. Это означает, что разработчикам доступно до 112 свободных адресов для подключения периферии на одну шину.
Основной режим работы — 100 кбит/с; 10 кбит/с в режиме работы с пониженной скоростью. Также немаловажно, что стандарт допускает приостановку тактирования для работы с медленными устройствами.
Все передачи производятся 8-разрядными байтами. Число байтов, которые могут быть переданы за одну передачу не ограничено. Каждый байт должен сопровождаться битом подтверждения (ACK). Данные передаются начиная со старшего бита (MSB). (Рис.6) Если приемник не может получать другой полный байт данных, он не выдает сигнал ACK, который используется передатчиком для синхронизации или сигнализации о неисправности приемника (или его отсутствии).
Для подтверждения передачи байта передатчик устанавливает линию SDA в “1” в течение синхронизирующего импульса. (Рис.7) Приемник при этом должен выставить “0” на SDA. Естественно при этом должны бить выдержаны определенные временные соотношения. Обычно, приемник, который был адресован, должен генерировать сигнал ACK после того, как каждый байт был получен, за исключением того, когда сообщение начинается с адресом CBUS. Когда подчиненный приемник не подтверждает подчиненный адрес (например, устройство не готово, потому что это выполняет некоторую внутреннюю функцию), линия SDA данных должна быть оставлена в “1”. Мастер затем может выдать состояние STOP, чтобы прервать передачу. Если подчиненный приемник подтверждает подчиненный адрес, но, некоторое время позднее не может получать больше байты данных, мастер должен приостановить передачу. При приеме последнего байта в серии, вместо сигнала ACK мастер может выставить состояние STOP, при этом подчиненный передатчик должен освободить линию данных.
Каждое мастер-устройство генерирует собственные сигналы синхронизации на линии SCL. Данные на линии SDA действительны только течение ВЫСОКОГО уровня SCL. Синхронизация осуществляется благодаря “монтажному-И” на линии SCL. Это означает, что состояние “0” на линии SCL будет длиться до тех пор, пока все мастер-устройства не освободят линию синхронизации. Линия SCL будет, следовательно, задержана в уровне “0” элементом с самым длинным уровнем “0”. Элементы с более коротким уровнем “0” при этом входят в состояние ожидания.
Данные шлются пакетами, каждый пакет состоит из девяти бит. 8 данных и 1 бит подтверждения/не подтверждения приема. Первый пакет шлется от ведущего к ведомому это физический адрес устройства и бит направления.
Сам адрес состоит из семи бит (вот почему до 127 устройств на шине), а восьмой бит означает что будет делать Slave на следующем байте — принимать или передавать данные. Девятым битом идет бит подтверждения ACK. Если Slave услышал свой адрес и считал полностью, то на девятом такте он придавит линию SDA в 0, сгенерировав ACK — то есть Понял! Мастер, заметя это, понимает, что все идет по плану и можно продолжать. Если Slave не обнаружился, прозевал адрес, неправильно принял байт, сгорел или еще что с ним случилось, то, соответственно, SDA на девятом такте будет прижать некому и ACK не получится. Будет NACK.
После адресного пакета идут пакеты с данными в ту или другую сторону, в зависимости от бита RW в заголовочном пакете. Вот, например, Запись. В квадратиках идут номера битов. W=0
Чтение практически также, но есть одна тонкость. При приеме последнего байта надо дать ведомому понять, что в его услугах больше не нуждаемся и отослать NACK на последнем байте. Если отослать ACK то после стопа Master не отпустит линию — такой уж там конечный автомат. Так что прием двух байтов будет выглядеть так (R=1):
Есть еще одно состояние, как повторный старт. Это когда мы не объявляя STOP вкатываем на шину еще один START. После него мы можем обратиться к другому устройству не освобождая шину. Но чаще идет обращение к тому же самому устройству и это связано с особенностями организации памяти.
Применение
I²C находит применение в устройствах, предусматривающих простоту разработки и низкую себестоимость изготовления при относительно неплохой скорости работы.
Список возможных применений:
Пример системы с шиной I²C На рисунке: (a) Высокоинтегрированный телевизор
(b) базовая станция радиотелефона стандарта DECT
Преимущества
Недостатки
Преимущества для конструкторов
Разработка
Каждая электронная система включает в себя 3 различных типа узлов:
В настоящее время ассортимент продукции Philips включает более 150 КМОП и биполярных I²C-совместимых устройств, функционально предназначенных для работы во всех трёх вышеперечисленных категориях электронного оборудования. Все I²C-совместимые устройства имеют встроенный интерфейс, который позволяет им связываться друг с другом по шине I²C. Это конструкторское решение разрешает множество проблем сопряжения различных устройств, которые обычно возникают при разработке цифровых систем.
На дешевых устройствах часто I²C эмулируется программно с использованием технологии Bit-banging.
Поддержка операционными системами
Производные технологии
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.)