Всем доброго времени суток! Современные функциональные и параметрические характеристики устройств на основе цифровых схем определяются входящими в их состав интегральных схем и интерфейсами (шинами) различных типов. В настоящее время наибольшее распространение получили последовательные шины. Одним из представителей, которых является интерфейс Inter-Integrated Circuit Bus, сокращённо I2C читается, как «ай-ту-си».
Для сборки радиоэлектронного устройства можно преобрески DIY KIT набор по ссылке.
Данный интерфейс изначально был разработан фирмой Philips Semiconductor для применения в аудио- и видеосистемах. И как видно из названия, предназначен для передачи данных между микросхемами по двунаправленной двухпроводной шине. Он не нуждается в каких-либо преобразователях напряжения или интерфейсных элементах, а в случае совместимых с I2C микросхем всё обеспечение для поддержки протокола интегрировано внутри.
Устройство шины I2C.
В основе протокола обмена данными по шине I2C стоит классический принцип между двумя любыми устройствами, когда одно устройство передаёт данные, а второе их принимает. Иногда устройства меняются ролями, но в любом случае необходимо чётко понимать, какое устройство является главным, а какое – подчинённым.
В случае интерфейса I2C одно устройство является ведущим (называемое Master), а другие – ведомыми (называемые Slave). Данный тип организации шины называется master-организацией и является наиболее часто используемым. Обычно master-устройством выступает микроконтроллер, который задаёт поток данных и формирует необходимые временные интервалы и задержки.
Иногда в схемах, в которых реализован протокол I2C, существует необходимость в подключении к одной шине нескольких master-устройств. В таком случае используется режим работы интерфейса, называемый multi-master. Однако, это требует усложнения организации шины, так как master-устройства, должны решить, кто из них будет работать со slave-устройствами. Требования протокола I2C состоит в том, что в конкретный момент времени совершать операции может только одно master-устройство. В противном случае возникает, так называемый шинный конфликт, когда данные до конкретного slave-устройства могут не дойти или дойти в искажённом виде.
Для правильной реализации multi-master режима и исключения шинного конфликта, применяются процедуры арбитража и синхронизации.
Аппаратная реализация шины I2C.
Реализация шины I2C достаточно проста, что позволяет быстро разработать принципиальную схему устройства, а в случае необходимости добавить в схему новые элементы или удалить ненужные. Кроме того, в настоящее время практически все микроконтроллеры имеют стандартные библиотеки для работы с данным интерфейсом. Рассмотрим аппаратную реализацию шины I2C.
Аппаратная реализация шины I2C.
Устройство интерфейса I2C имеет достаточно простую схему. Он включает в себя два транзистора с открытым коллектором (стоком) и два буфера с высоким входным сопротивлением. Один из выводов называется линией данных SDA (Serial Data Line), предназначенный для передачи данных. Второй вывод называется линией тактирования или синхронизации SCL (Serial Clock Line), предназначенный дли передачи синхронизирующих импульсов.
По цифровым линиям данных передаются сигналы в двух состояниях: в высоком уровне, обозначается «1» и в низком уровне, обозначается «0». Когда линии SDA и SCL находятся в уровне «1», то данное состояние называется свободным шинным состоянием. Шина в таком случае не занята и готова к обмену данными, то есть шина находится в состоянии ожидания. В случае, если устройства с интерфейсом I2C не имеют активных выводов, то есть выводы реализованы с открытым коллектором (стоком), то для обеспечения такого состояния к выводам необходимо подвести высокий уровень напряжения. Чаще всего высокий уровень напряжения берут от шины положительного напряжения питания Vdd (+Uпит), но напрямую этого делать нельзя. Для того чтобы предотвратить внутреннее короткое замыкание по цепи +Uпит – ОК вывода, используют «подтягивающие» внешние резисторы Rpu (pull-up resistors). Величина данных резисторов лежит в пределах 1…10 кОм.
Однако встречаются master-устройства, внутри которых уже имеются «подтягивающие» элементы. Поэтому при реализации шины I2C необходимо изучить master-устройство, так как его выводы могут быть активными, то есть имеют на выводах транзисторные ключи вместо pull-up резисторов.
Основным отличием master-устройств от slave-устройств заключается в том, что только master-устройство генерирует синхронизирующий сигнал SCL.
Применяемость той или иной шины в конкретном устройстве зависит от её технических характеристик. Интерфейс I2C относится к классу последовательных шин передачи данных, поэтому имеет низкую пропускную способность. Таким образом, сфера её применения находится в области приборов бытовой техники, а также вспомогательных устройствах компьютерной техники. Основные технические характеристики шины I2C представлены ниже
Параметр | Режим работы | Значение |
Скорость обмена | Стандартный режим
Standard mode (Sm) |
100 кбит/с |
Быстрый режим
Fast mode (Fm) |
400 кбит/с | |
Быстрый режим плюс
Fast mode plus (Fm+) |
1 Мбит/с | |
Высокоскоростной режим
High-speed mode (Hs) |
1,7 Мбит/с
|
|
Высокоскоростной режим
High-speed mode (Hs) |
3,4 Мбит/с | |
Сверхбыстрый режим
Ultra-fast mode (UFm) |
5 Мбит/с | |
Суммарная паразитная ёмкость относительно общего провода | Стандартный режим
Standard mode (Sm) |
400 пФ |
Быстрый режим
Fast mode (Fm) |
400 пФ | |
Быстрый режим плюс
Fast mode plus (Fm+) |
550 пФ | |
Высокоскоростной режим
High-speed mode (Hs) |
400 пФ | |
Высокоскоростной режим
High-speed mode (Hs) |
100 пФ | |
Сверхбыстрый режим
Ultra-fast mode (UFm) |
— | |
Входная ёмкость на каждый вывод | — | 10 пФ |
Число адресуемых устройств | 7-битная адресация | до 128
(реально 112 из-за зарезервированных адресов) |
10-битная адресация | до 1024 (реально 1008 из-за зарезервированных адресов) | |
Суммарная длина линий SCL и SDA | — | не более 4 м |
Как уже было сказано, наиболее распространённой конфигурацией шины I2C является master-организация. Начнём распространение с неё.
Правила передачи информации по шине I2C.
Требование к шине I2C заключается в том, что передача данных по ней происходит при условии стробирования бита данных, передаваемых по линии SDA, сигналом, поступающим по линии SCL. Это требование заключается в том, что для передачи бита данных «0» или «1» по линии SDA от master-устройства к slave-устройству, необходимо чтобы на линии SCL произошёл перепад напряжения из низкого уровня в высокий (положительный перепад).
Таким образом, правило организации протокола I2C звучит так: смена данных по линии SDA может быть произведена только при низком уровне на линии SCL.
Передача бита информации по шине I2C.
Ещё одним важным правилом организации протокола I2C является наличие сигналов начала и окончания передачи информации. Для этого предназначены сигналы распознавания начала и конца, обозначаемые соответственно Start (S) и Stop (P). На рисунке ниже показаны данные условия.
Для начала передачи данных от master-устройства, на его выводах SCL и SDA должно появиться Start-условие, которое указывает slave-устройствам начать принимать данные. Условию START соответствует перепад напряжения от высокого уровня «1» в низкий – «0» на линии SDA, при неизменном высоком уровне «1» на линии SCL.
Для обозначения окончания передачи данных от master-устройства должно появиться Stop-условие, указывающее окончание передачи данных. Условию STOP соответствует перепад напряжения от низкого уровня «0» к высокому уровню «1» на линии SDA, при высоком уровне напряжения «1» на линии SCL.
Кроме Start-условия master-устройство может генерировать условие «повторный Start» в середине передачи данных. Сигналы на линиях SCL и SDA идентичны условию START: переход от высокого уровня к низкому на SDA при высоком уровне на линии SCL.
Третьим правилом передачи данных в интерфейсе I2C является наличие сигнала ACK (сигнал подтверждения), который свидетельствует о правильном принятии данных от master-устройства. Сигнал ACK генерирует slave-устройство путём выставления низкого уровня напряжения на линии. И во время передачи стробирующего импульса по линии SCL master-устройство проверяет наличие (сигнал ACK) или отсутствие подтверждения (сигнал NAK). И в случае его наличия продолжает передачу данных. В случае отсутствия сигнала ACK передатчику желательно выполнить Stop-условие и попытаться повторить передачу. Рассмотрим передачу данных по шине I2C.
Передача данных по шине I2C передаётся по байтно, каждый байт данных передаваемых по линии SDA состоит из восьми бит. Количество байтов, которые передаются за одну передачу не ограничено. После каждого байта данных slave-устройство должно выдать бит подтверждения ASK. Данный сигнал говорит о том, что slave-устройство успешно приняло байт данных и готово принять следующий. Однако существуют ситуации, когда slave-устройство, генерирует сигнал NAK – отсутствие подтверждения:
- Отсутствует ведомое устройство (slave) адрес, которого запрашивает ведущее устройство (master).
- Slave-устройство занято обработкой каких-либо данных и не может в данный момент дать ответ.
- Slave-устройство не понимает данные, которые передает ему master-устройство.
- Slave-устройство не может принять больше ни одного байта.
- Ведущий приемник должен подать сигнал об окончании передачи подчиненному передатчику.
После рассмотрения общей информации о шине I2C, рассмотрим формат передачи (протокол) данных конкретному устройству.
Формат передачи данных шиной I2C.
Для передачи данных по шине I2C необходимо, чтобы slave-устройство было однозначно идентифицируемо. Для идентификации используют адрес slave-устройства, по которому к нему можно обратиться. Адрес ведомого устройства располагается во внутренних ячейках памяти и может быть назначен или задан жёстко изначально.
Так как для работы интерфейса I2C необходимо только две линии SCL и SDA, то в начале передачи данных от master-устройства, все slave-устройства «слушают» шину I2C, для опознавания своего адреса. Устройство, опознавшее свой адрес, начинает принимать данные, а остальные следят только за появлением состояния STOP. Протокол I2C предусматривает три формата передачи данных:
— master-устройство отправляет данные slave-устройствам;
— master-устройство читает данные со slave-устройства;
— смешанный формат, содержащий отправку и чтение данных.
Изначально возник формат адреса, именуемый 7-ми битной адресацией, поэтому рассмотрим его. Так как данные по шине I2C передаются по байтно, то первые семь бит передают адрес slave-устройства, а последний восьмой бит является флагом, который определяет master-устройство выполняет трансляцию или чтение данных. Ниже представлен формат передачи данных по шине I2C.
Формат передачи данных по шине I2C.
Как уже говорилось передача данных по шине I2C начинается с условного состояния START (S). Так как на одной линии могут находится до 112 устройств, то первый байт пересылаемый по шине называется адресным байтом (А1…А7). Здесь следует сказать, что существует исключение из данного правила, когда требуется обращение сразу ко всем slave-устройствам, так называемый общий вызов, но об этом позже.
В адресном байте первые семь битов соответствуют адресу устройства, идущие в порядке уменьшения, то есть сначала старший бит А7, а в конце самый младший А1. Самый младший бит (R/W) адресного байта является флагом действия, которое ожидается на шине I2C. Если он содержит низкий уровень «0» (Write), то байты данных будут передаваться от master-устройства к slave-устройству. В данном случае говорят, что происходит запись данных по шине. В случае если бит R/W выставлен в высокий уровень «1», то байты данных будут передаваться от slave-устройства к master-устройству. Происходит так называемое чтение данных по шине.
После адресного байта slave-устройство, адрес которого выдало master-устройство обязано выдать бит подтверждения (ACK) либо не подтверждения (NAK).
Вторым и последующим байтом при 7-ми битной адресации являются байты данных, которые в зависимости от бита R/W могут идти либо от master-устройства (R/W = 0), либо от slave-устройства (R/W = 1). Каждый байт данных оканчивается сигналом подтверждения (ACK).
Передача данных оканчивается условным состоянием STOP (P).
Зарезервированные адреса интерфейса I2C.
Выше было сказано, что некоторые slave-адреса не могут быть использованы для адресации ведомых устройств. Они используются для служебных сообщений, которые указаны в таблице ниже.
Slave-адрес | Бит R/W | Описание |
0000 000 | 0 | Общий вызов |
0000 000 | 1 | Программный START |
0000 001 | X | Адрес шины CBUS |
0000 010 | X | Зарезервирован |
0000 011 | Х | Зарезервирован |
0000 1ХХ | Х | Код режима Hs-mode |
1111 1XX | 1 | ID устройства |
1111 0XX | X | 10 битная slave-адресация |
Рассмотрим эти режимы подробнее.
- Общий вызов – адресуется всем устройствам, подключённым к шине I2C и при его получении устройства должны выдать подтверждение ACK. Однако, если какому-либо устройству не нужны данные, передаваемые при общем вызове, они могут его игнорировать. После выдачи бита ACK устройство становится slave-устройством и может обрабатывать второй и последующие байты, выдаваемые master-устройством. Рассмотрим формат данных общего вызова.
Формат передачи данных «Общий вызов».
При общем вызове, определяющим является второй и последующие байты, называемый информационным. В зависимости от LSB (Least Significant Bit) – наименьший значащий бит, задаются два режима:
— LSB = «0», в этом случае информационный бит выполняет следующие функции:
- 00000110 (06h) – аппаратный сброс и запись программируемой части адреса slave-устройства. При получении этих данных все устройства, отправившие ACK, сбрасываются и принимают программную часть своего адреса.
- 00000100 (04h) – запись программируемой части адреса slave-устройства. При получении этих данных все устройства, принимают программную часть своего адреса, без перезагрузки.
- 00000000 (00h) – данный код запрещено использовать в качестве второго байта.
Другие коды, в которых младший бит равен «0» не установлены и все slave-устройства должны их игнорировать.
— LSB = «1», в этом случае двухбайтовая последовательность называется аппаратный общий вызов. Это вызов происходит от устройства, которое не может быть запрограммировано на выдачу адреса конкретного slave-устройства. И во втором байте передаёт только аппаратный общий вызов и свой адрес для идентификации в системе. Семь битов в информационном байте содержат адрес устройства, генерирующего аппаратный общий вызов.
- Программный СТАРТ
Микроконтроллеры выступающие в качестве Master-устройства на шине I2C могут быть двух типов:
- Со встроенным аппаратным интерфейсом I2C и программируемые на работу с прерываниями шины I2C.
- Без встроенного интерфейса I2C и постоянно контролирующие шину программными средствами.
В первом случае достаточно просто запрограммировать микроконтроллер на прерывания от шины и в случае наличия передачи данных будет выполняться программа обработки. Во втором случае микроконтроллер обязан постоянно опрашивать шину для получения данных.
Формат данных «Программный START» шины I2C.
Данная процедура предназначена для «медленных» микроконтроллеров, которые не могут обрабатывать интерфейс I2C также быстро, как и устройства с аппаратной шиной I2C. В таком случае для передачи данных может использоваться более длительная процедура – программный START.
Для медленных микроконтроллеров достаточно опрашивать линию SDA с меньшей частотой, до тех пор, пока не определится один из семи нулей в начальном байте, после условия START. После чего микроконтроллер переключается на работу с более высокой частотой.
- Адресация шины CBUS. Устройства с интерфейсом CBUS могут быть подключены к шине I2C, так как между этими двумя протоколами передачи данных не слишком большие различия.
Интерфейс CBUS предполагает наличие третьей линии данных DLEN и отсутствие бита подтверждения (ACK). Поэтому иногда линии данных интерфейсов совмещают, и при поступлении в первом байте адреса шины CBUS, устройства slave шины I2C должны игнорировать все данные вплоть до поступления сигнала условия STOP (P).
- Режим Hs-mode. При поступлении от master-устройства первого байта со slave-адресом 0000 1ХХ, slave-устройства, которые могут работать в режиме Hs-mode переключаются в данный режим. Он позволяет совершать обмен данными со скоростью до 3,4 Мбит/с, что достигается укорачиванием длительности стробирующего импульса по линии SCL.
- ID устройства. Отправка в первом байте комбинации битов в виде 1111 1XX1 позволяет master-устройству запросить у slave-устройства информацию о нём. Данная информация представляет собой три байта (24 бита) содержащие следующие данные:
-12 бит, идентифицирующие производителя
Комбинация бит | Производитель | |||||||||||
11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | NXP Semiconductors |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | NXP Semiconductors (reserved) |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | NXP Semiconductors (reserved) |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | NXP Semiconductors (reserved) |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | Ramtron International |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | Analog Devices |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | STMicroelectronics |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | ON Semiconductor |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | Sprintek Corporation |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | ESPROS Photonics AG |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | Fujitsu Semiconductor |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | Flir |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 | O2Micro |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | Atmel |
— 9 бит, идентифицирующие наименование устройства;
— 3 бита, идентификации модификации устройства.
Данные об ID жёстко записаны во внутреннюю память устройства. Формат передачи данных выглядит следующим образом.
Формат данных «ID Устройства» шины I2C.
Последовательность получения информации об slave-устройстве, путём посылания ID device выглядит следующим образом:
— отправка условия START;
— master-устройство отправляет первым байтом ID device с установленным младшим битом на запись (R/W = «0»): 1111 1000;
— master-устройство отправляет вторым байтом адрес slave-устройства, от которого требуется идентификация. При этом значение младшего бита не имеет значение LSB = «Х»;
— master-устройство отправляет сигнал «повторный START»;
— master-устройство отправляет байт с данными «device» с установленным младшим битом на чтение (R/W = «1»): 1111 1001;
— slave-устройство начинает транслировать информацию о своей идентификации в виде 3-х байтовых данных:
- первый байт и старшие 4 бита второго байта – информация о своем производителе;
- младшие 4 бита второго бита и старшие 5 бит третьего байта – информация о типе устройства;
- младшие 3 бита третьего байта – информация о модификации устройства.
— после окончание чтения данных об ID устройства, master-устройство обязано выдать сигнал «NAK», а случае его отсутствия информация от ID устройства будет циклически повторяться.
Теория это хорошо, но необходимо отрабатывать это всё практически ПОПРОБОВАТЬ МОЖНО ЗДЕСЬ