Лекция №8.

Тема лекции: Приборный интерфейс I2C.

Цель лекции: Изучение наиболее распространённого интерфейса связи управляющего микроконтроллерного устройства с датчиками, индикаторами и другими средствами систем управления.

 

Разработанный фирмой Philips интерфейс I2C ("Inter-Integrated Circuit"), – это двунаправленная шина с последовательным форматом данных и возможностью адресации и параллельного подключения к шине до 128 устройств.

Шина I2C содержит две сигнальные линии, одна из которых (SCL) предназначена для передачи тактового сигнала, другая (SDA) – для передачи данных (рис. 8.1).

Формирование сигналов производится выходными каскадами с открытым коллектором, поэтому линии шины должны быть подключены к источнику питания +5 В через резисторы сопротивлением 1...10 кОм, в зависимости от физической длины линий и скорости передачи данных. Параллельное подключение выходных каскадов всех узлов позволяет им всем влиять на передаваемые сигналы и участвовать в управлении обменом данными. Топология "общая шина" обеспечивает только полудуплексный обмен данными: в любом цикле обмена одно устройство передает данные, все остальные – только их принимают.

Рисунок 8.1. Интерфейс I2C.

 

Таблица 8.1. Основные технические характеристики шины І2С
(спецификация 1.0)

Наименование параметра Значение параметра
Скорость обмена low-speed не более 100 кбит/с
Скорость обмена fast-speed не более 400 кбит/с
Число адресуемых устройств (7 бит) до 128
Суммарная длина линий SCL и SDA не более 4 м
Суммарная паразитная емкость относительно общего провода не более 400 пФ
Входная емкость на каждый вывод абонента не более 10 пФ

Длина соединительных линий в стандартном режиме может достигать 2-х метров, скорость передачи – до 100 кбит/с, существует и расширенный вариант стандарта со скоростью до 400 кбит/с. Суммарная емкость линий должна быть не больше 400 пФ, входная емкость на каждую ИС – в пределах 5...10 пФ. Реальная скорость обмена данными жестко не регламентируется, хотя все устройства по стандарту должны поддерживать скорость 100 кбит/с.

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

Концепция шины настолько проста, что позволяет быстро разрабатывать принципиальную схему устройства, опробовать ее и в случае необходимости «нарастить» конструкцию новыми элементами или удалить ненужные безболезненно для других узлов. Также может быть упрощен метод разработки программного обеспечения, использованы стандартные библиотеки-подпрограммы. Практически все микросхемы с интерфейсом 12С имеют такие характеристики, которые позволяют использовать их в низковольтной портативной аппаратуре с питанием от гальванических элементов. Например, они
обладают высокой помехоустойчивостью, низким потреблением тока, широким диапазоном питающего напряжения и слабой зависимостью параметров от температуры окружающей среды.

Отметим также, что шина 12С позволяет совмещать устройства с разными напряжениями питания. Pull-up резисторы желательно подключать к питающему напряжению 5 В.

Прежде чем перейти к описанию протокола обмена по шине, отметим, что собственно ее устоявшееся название (ай-ту-си), равно как и наименования линий (SDA и SCL), является зарегистрированным наименованием. Авторские права на эти названия принадлежат фирме Philips. Соответственно другие фирмы, производящие микросхемы с интерфейсом I2C и указывающие его наличие, как такового, в технической документации, делают это по лицензии разработчика. К примеру, фирма Microchip, специализирующаяся на выпуске микроконтроллеров, имеет такую лицензию. Однако и фирмы, не имеющие лицензии, производят микросхемы с интерфейсом, очень похожим на I2C, но как I2C его не обозначают, а значит, протокол обмена может немного отличаться от стандартизованного. Делается это для обеспечения чистоты правовых отношений, которые за рубежом соблюдаются несколько более жестко, нежели у нас в стране. В любом случае, используя в своих разработках аналоги фирменных микросборок, рекомендуется внимательно ознакомиться с технической документацией.

Все устройства интерфейса (узлы шины) делятся на два класса – управляющие узлы I2C-Master и подчиненные узлы I2C-Slave. Устройство I2C- Master генерирует тактовый сигнал (SCL) и, как следствие, является ведущим. Оно может самостоятельно выходить на шину и адресовать любое устройство I2C-Slave с целью передачи или приема информации. Все I2C-Slave "слушают" шину и при приеме собственного адреса выполняют предписываемую операцию.

Возможен и так называемый режим "Multi-Master", когда на шине установлено несколько устройств I2C-Master. Они либо совместно разделяют общие узлы I2C-Slave, либо попеременно являются то I2C-Master, управляя обменом информацией, то I2C-Slave, когда находятся в режиме ожидания команд от другого I2C-Master. Режим "Multi-Master" требует арбитража и распознавания конфликтов.

В режиме покоя обе линии SCL и SDA находятся в состоянии логической единицы (транзисторы выходных каскадов всех узлов закрыты). Цикл обмена может быть начат узлом I2C-Master только из режима покоя шины и состоит из следующих элементов: формирование сигнала "Старт", передача адреса I2C-Slave, передача данных, формирование сигнала "Стоп".

Синхронизация циклов обмена шины требует формирования сигналов "Старт" и "Стоп", ограничивающих начало и конец информационного пакета.

Для кодирования этих сигналов используется изменение состояния линии SDA при единичном состоянии линии SCL, что недопустимо при передаче данных (рис. 8.1). "Старт"-условие соответствует отрицательному перепаду (падающий фронт) SDA, когда SCL находится в единичном состоянии, а 'Стоп"-условие –положительному перепаду (нарастающий фронт) линии SDA при единичном состоянии линии SCL.

Рис. 8.2. Сигналы "Старт" и "Стоп" I2C

При передаче всех остальных сигналов (рис. 8.3) каждый бит по SDA стробируется положительным импульсом (нарастающим фронтом) SCL. Изменение состояния линии SDA производится только при нулевом состоянии линии SCL. При этом I2C-Slave может "придерживать" линию SCL в нулевом состоянии и соответственно снижать скорость обмена данными, например, на время обработки очередного сигнала, а I2C-Master обязан дождаться освобождения линии SCL прежде, чем продолжится передача информации.

Рисунок 8.3. Информационные сигналы I2C

 

Все данные в цикле обмена передаются отдельными байтами, прием каждого байта должен подтверждаться приемником для продолжения цикла обмена. Передача данных начинается по первому положительному импульсу на линии SCL после сигнала "Старт", которым стробируется старший бит первого байта. Каждый байт (8 битов) передается за 9 тактовых периодов сигнала SCL, формируемого I2C-Master. В девятом такте устройство-получатель выдает подтверждение (ACK) – нулевой сигнал SDA, свидетельствующий о "взаимопонимании" передатчика и получателя.

Рисунок 8.4. процесс передачи байта по шине 12С.

После отработки состояния Start передатчик последовательно выставляет на линии SDA данные, начиная со старшего бита (MSB) и заканчивая младшим (LSB). Данные стробируются по линии SCL импульсами 1...8.

Обратите внимание: линия SDA приемника (slave-абонента) в момент приема информационных битов (MSB-LSB) должна быть выставлена в единичное состояние. Физически это означает, что транзистор, подключенный к линии SDA, должен быть закрыт. В момент отрицательного перепада импульса 8 на линии SCL slave-абонент
должен выставить на линию SDA нулевой уровень - открыть транзистор. Тем самым приемник подтверждает нормальный прием байта. Передатчик (master-абонент) должен выставлять на линию SDA единичное состояние. Благодаря тому что линия организована по способу «монтажное И», ее состояние будет определяться только slave-абонентом. Передатчик должен проверить состояние линии SDA, затем выдать девятый стробирующий импульс, с которым slave-абонент выставит на линию SDA высокий уровень, проверить выполнение этой операции и лишь после продолжить передачу. В случае неподтверждения нормального приема (сигнал АСК имеет высокий уровень) передатчику желательно выполнить условие Stop и повторить передачу.

Третья ситуация, которая может возникнуть при получении сигнала АСК, связана с задержкой обработки данных в Slave-абоненте, как показано на рис. 8.5.

Рисунок 8.5. Задержка состояния acknowledge

Задержка освобождения линии SDA не свидетельствует о неправильном обмене информацией, поэтому master-абоненту достаточно дождаться окончания АСК и продолжить передачу. Добавим также, что в фирменной документации состояние acknowledge условно именуется буквой «А». Если байт, переданный по шине, является последним в пакете, master-устройство вместо проверки сигнала АСК может выставить состояние Stop, и slave-абонент должен освободить линию SDA.

Описанные состояния являются вполне достаточными для функционирования шины 12С с одиночным master-устройством. Как правило, master-абонента очень легко организовать программным способом, что и используется многими разработчиками. Для реализации режима multi-master, как уже было сказано, должны быть реализованы дополнительные состояния синхронизации и арбитража.

Любой узел шины, как "Master", так и "Slave" может в разные моменты времени быть как передатчиком, так и получателем и в соответствии с режимом обязан либо принимать, либо выдавать сигнал ACK. Отсутствие сигнал ACK (единица на SDA в такте подтверждения) интерпретируется как ошибка.

Процедура адресации на шине I2C заключается в том, что первый байт после сигнала "Старт" – это всегда байт адреса и определяет, какой ведомый выбирается ведущим для работы. После 7 бит адреса следует бит направления данных (R/W), “ноль” означает передачу в I2C-Slave (запись), а “единица” - прием из I2C-Slave (чтение). В 9 такте I2C-Slave сигналом ACK подтверждает прием своего адреса и бита направления обмена данными. Далее цикл обмена переходит в фазу передачи данных, I2C-Master передает последовательности сигналов SCL, по которым узел-передатчик формирует последовательности битовых сигналов, а узел-приемник на каждом 9 такте передает сигнал ACK, подтверждающий прием очередного байта. Количество байт, передаваемых за один цикл обмена, не регламентируется, но не должно быть слишком большим, иначе обмен данными для других узлов шины будет блокироваться.

Пересылка данных всегда заканчивается сигналом "Стоп", генерируемым ведущим I2C-Master. Если I2C-Master будет использовать шину дальше, он может без сигнала "Стоп" выдать повторный "Старт" и затем адрес устройства для следующего цикла интерфейса. При таком алгоритме управления обменом возможны различные комбинации чтения/записи. Например, в первом цикле обмена "запись" I2C-Master может передать для I2C-Slave в поле данных байт – идентификатор запрашиваемых данных, а во втором цикле обмена "чтение" получить от I2C-Slave требуемые данные.

Указанный алгоритм адресации требует присвоения уникальных 7 битовых адресов для всех I2C-Slave шины. Эти I2C-адреса должны быть заданы до начала обмена по шине. В зависимости от типов применяемых устройств, адреса могут задаваться либо программной инициализацией, либо определяются аппаратно, например, коммутацией цепей управления адресом в устройстве I2C-Slave.

Теперь поговорим об арбитраже. Согласно спецификации режима multi-master, передатчик может начинать передачу данных только после того, как убедится, что шина свободна (линии SDA и SCL имеют высокий уровень). Но несколько передатчиков могут сгенерировать состояние Start практически одновременно, поэтому нужно определить, какое устройство первым выставило Start-условие. Как это возможно выполнить с помощью достаточно скудных (с точки зрения возможностей серьезных шин, конечно!) средств 12С? Дело в том, что линия SDA выполнена также по способу «монтажное И». В течение процедуры передачи все master-абоненты проверяют состояние линии SDA. Если обнаружено несоответствие (выставляется высокий уровень, а при проверке читается низкий), передатчик, выставляющий высокий уровень, отключается. Естественно, что в процессе передачи бита осуществляется синхронизация. Арбитраж производится по шине SDA в периоды, когда шина SCL находится в единичном состоянии. Если один ведущий передает на линию данных НИЗКИЙ уровень, в то время как другой – ВЫСОКИЙ, то последний отключается от линии, так как состояние SDL не соответствует состоянию его внутренней линии данных. Таким образом, арбитраж при одновременной передаче обеспечивает более высокий приоритет не узлу интерфейса, а сообщению с большим числом нулевых бит в передаваемой последовательности.

Арбитраж может продолжаться на протяжении нескольких бит. Так как сначала передается адрес, а потом данные, то арбитраж может продолжаться до окончания адреса, а если ведущие адресуют одно и то же устройство, то в арбитраже будут участвовать и данные. Вследствие такой схемы арбитража при столкновении данные не теряются. Ведущему, проигравшему арбитраж, разрешается выдавать синхроимпульсы на шину SCL до конца байта, в течение которого был потерян доступ. Если I2C-Master проигрывает арбитраж на стадии передачи адреса, то он должен переключиться в режим ведомого, чтобы выигравший арбитраж ведущий мог его адресовать.

Как показывает практика, процедура арбитража наиболее трудна для понимания. Поэтому, чтобы досконально разобраться, приведем наглядную аналогию. Представьте себе шеренгу людей, синхронно поднимающих руки по команде ведущего. Если рука поднята, это свидетельствует о передаче единицы, если опущена — нуля. Допустим, в первом такте все подняли руки, а во втором — двое руки не подняли. Согласно принципу арбитража, из шеренги выбывают все, кроме этих двоих. Далее они, подчиняясь командам ведущего, будут поднимать или опускать руки, пока в каком-либо такте не окажется,
что один руку поднял, а другой — опустил. Так вот, «поднявший руку от руки и погибнет» — перефразируем известное выражение. Он выбывает, а передачу до окончания продолжит оставшийся — в единственном числе.

Разобравшись с условиями передачи данных по шине 12С, обратим внимание на форматы передачи (протоколы). Что такое формат? И не проще ли использовать передачу по 8 битов, как это предписывается, наполняя их содержимым по своему усмотрению? Оказывается, нет. Каждое устройство должно иметь на шине свой уникальный адрес, по которому к нему можно обратиться. Адрес устройства всегда располагается в определенном месте (специалисты говорят: в определенных ячейках внутренней памяти). Адрес может быть назначен, а может быть жестко определен. В случае шины 12С адреса устройств, называемые slave-адресами, жестко определяются.

Они «закладываются» при изготовлении микросхем и не подлежат переназначению, то есть модификации. В принципе часто все же переназначить адрес можно (и это делается с помощью 2—3 битов), но, за редким исключением, эти биты нужно предварительно определить аппаратно, то есть установить перемычки на соответствующие выводы. Этот принцип был заложен еще на заре возникновения шины для того, чтобы предельно упростить протокол обмена и аппаратную реализацию интерфейсов. Отметим, что значение slave-адреса можно узнать из документации на соответствующую микросхему.

Поскольку все абоненты шины не имеют иных способов общения, кроме обмена данными по линиям SDA и SCL, в момент начала передачи все slave-абоненты «слушают» линию на предмет опознавания своего slave-адреса. Опознавший свой адрес абонент продолжает прием данных и выдачу сигналов АСК, остальные только следят за моментом выдачи состояния Stop. В связи с этим возможны три формата передачи, определяемые как 7-битные (традиционные):

• master транслирует данные на slave;

• master читает данные со slave;

• комбинированный формат трансляции/чтения.

 

Рисунок 8.6 процедура арбитража для двух master-абонентов.

 

Исторически сложилось, что вначале возник формат 7-битной адресации, при котором осуществляется передача slave-адреса 7 битами, а восьмой бит должен содержать признак операции «чтение/запись» (R/W). Легко посчитать — при 7-битной адресации на шине может присутствовать только 128 устройств с уникальными адресами. Реально устройств и того меньше, так как некоторые адреса зарезервированы под некоторые служебные функции, о которых мы расскажем ниже.

На рис. 8.7 приведен формат передачи данных от master-устройства к slave-абоненту. Заметим, что прямоугольники, отображенные на этом и последующих рисунках серым тоном, относятся к направлению передачи от master к slave, а белым цветом — от slave к master.

Рисунок 8.7. Master транслирует данные на slave

Необходимо сразу оговориться, что первый бит, передающий slave-адрес устройства, содержит признак операции R/W. Когда этот бит установлен в «О», будет осуществляться запись в slave-устройство, когда в «1» — чтение из него.

Рисунок 8.8 формат передачи данных от slave-абонента к master-устройству.

Обратите внимание: после чтения информационного байта DATA master-абонент обязан подтвердить получение байта сигналом АСК.

 

Рисунок 8.9. Комбинированный формат

Обычно комбинированные форматы используются для работы с последовательной памятью (для сокращения времени доступа к данным). Изучая рис. 8.9, мы можем заметить, что здесь повторяются знакомые нам по рис. 8.7 и рис. 8.8 форматы. Единственное новшество, введенное в комбинированный формат, — повторное условие Start (repcated Start condition), обозначаемое на рисунке сокращением «Sr». Чуть позже, в соответствующей главе, мы рассмотрим типы последовательной памяти и способы работы с ней.

Как уже было сказано ранее, некоторые Slave-адреса используются не для прямой адресации устройств на шине 12С, а для служебных сообщений.

 

Таблица 8.2. Служебные адреса

Slave-адрес R/W Описание служебного адреса
0000 000 Общий вызов
0000 000 Программный Start
0000 001 X Адрес шины CBUS
0000 010 X Зарезервирован для других форматов шины
X Зарезервирован на будущее
0000 1хх X Код режима Hs-mode
1111 1хх X Зарезервирован на будущее
1111 0хх X 10-битная адресация slave-абонентов

 

Преимущества шины I2C очевидны – малое количество соединительных линий и высокая скорость обмена, простота аппаратной реализации интерфейса. Наиболее широко поддерживает шину I2C фирма Philips, производящая множество ИС различной сложности с управлением по I2C.