Протокол I2С

Сети.

 

Когда термин «сеть» употребляется применительно к микроконтроллерам, то имеются ввиду шины, которые используются для подключения дополни­тельных устройств и для обеспечения связи между микроконтроллерами. Та­ким образом, сеть микроконтроллеров отличается от локальной сети, такой как «Ethernet», которая вероятно приходит на ум при слове «сеть».

Существует множество стандартов (в число которых входят описанные выше Microwire и SPI), которые могут привести в недоумение по поводу того, что является, и что не является сетью. Далее под микроконтроллерной сетью будем понимать отдельную линию связи (провод) и множество под­ключенных к ней устройств, которые могут инициировать передачу сообще­ний и посылать соответствующий отклик на полученное сообщение.

В таких сетях имеется «ведущий» («master») - интеллектуальное устрой­ство, которое может инициировать передачу данных. Устройства, которые отвечают на запросы, но не могут их инициировать, называются «ведомые» («slaves»). Микроконтроллерная сеть может иметь несколько «ведущих» уст­ройств, В этом случае сетевой протокол требует включения схемы арбитра­жа, которая позволит различным «ведущим» устройствам передавать данные, не нарушая других сообщений.

Обычно в микроконтроллерной сети передается относительно мало дан­ных, поэтому требуемая для них пропускная способность весьма скромна по сравнению с сетью Ethernet. Часто микроконтроллерная сеть имеет пропуск­ную способность порядка нескольких байт в секунду, тогда как сеть персо­нальных компьютеров может передавать несколько Мбайт в секунду.

 

 

 

Наиболее популярный протокол для сети микроконтроллеров - I2C, кото­рый предназначен для связи устройств в многопроцессорных системах. Этот стандарт был разработан компанией Philips в конце 70-х годов как метод реализации интерфейса между микропроцессорами и периферийными уст­ройствами, который не требует прокладки многочисленных линий для передачи между устройствами всех разрядов адреса, данных и сигналов управле­ния. Протокол I2C позволяет разделять сетевые ресурсы между несколькими ведущими процессорами («multimastering»).

Шина I2C содержит две линии: линия SDA, которая служит для передачи данных, и линия SCL, по которой передается синхросигнал, используемый для стробирования данных. Обе линии подключены через резисторы к шине питания («подтянуты» к высокому уровню потенциала), что позволяет не­скольким устройствам управлять их состоянием путем соединения по схеме «монтажное И».

Шина I2C для управления стереосистемой может иметь вид, показанный на рис. 2.37.

 

Рис. 2.37 - Пример I2C сети.

 

Двухпроводная линия используется для определения начала передачи дан­ных, а также для передачи самих данных. Чтобы начать передачу данных, шина переводится в стартовое состояние. При отсутствии передаваемых данных шина находится в ждущем (пассивном) состоянии («idle»). При этом на обе линии сигналы не поступают, и на них установлен высокий уровень сигнала (потен­циал Vdd). Чтобы инициировать передачу данных, ведущее устройство, кото­рое запрашивает управление шиной, устанавливает низкий уровень сначала на линии SDA, а затем на линии SCL (стартовое состояние). В процессе пересыл­ки данных такое состояние шины является нерабочим, так как прием переда­ваемых данных производится только при высоком (активном) уровне синхро­сигнала на линии SCL. Чтобы закончить передачу данных выполняются обратные действия: на линии SCL устанавливается высокий уровень сигнала, а затем в такое же состояние переводится линия данных SDA (рис. 2.38).

 

Рис. 2.38 - Форма сигналов на шине I2С.

 

Данные передаются синхронным способом, причем первым посылается старший бит (рис. 2.39). После передачи 8 бит ведущее устройство переводит линию данных в «плавающее» состояние, ожидая подтверждения приема дан­ных от ведомого устройства. Таким подтверждением является установка ведо­мым устройством низкого уровня сигнала на линии SDA. После бита под­тверждения на обеих линиях устанавливается низкий уровень. Затем производится пересылка следующего байта, или шина переводится в состоя­ние конца передачи. Это означает, что передача завершена, и приемник мо­жет готовиться к следующему запросу данных.

 

Рис.2.39 - Передача байта по шине I2С .

 

Существует две максимальные скорости передачи данных по шине I2С: «стандартный режим» - до 100 Кбит/с и «быстрый режим» - до 400 Кбит/с (рис. 2.40).

Рис. 2.40 - Временная диаграмма сигналов на шине I2С.

Формат команды, поступающей от ведущего устройства к ведомому, по­казан на рис. 2.41. Адрес получателя содержит 7 бит. Существует неутвержден­ный («свободный»») стандарт, согласно которому четыре старших бита ис­пользуются для указания типа устройства, а следующие три бита используются для выбора одного из восьми устройств этого типа или служат для более точного определения типа устройства. Так как этот стандарт не является обя­зательным, то некоторые устройства требуют указания в качестве трех после­дних адресных бит определенных кодов, тогда как другие, например микро­схемы памяти EEPROM с последовательной выборкой, используют эти биты для выбора адресата внутри устройства. Существует также 10-разрядный стан­дарт для передачи адреса, в котором первые 4 бита содержат 1, следующий бит имеет значение 0. последние 2 бита являются старшими битами адреса, а завершающие 8 бит адреса передаются в следующем байте. Все это означа­ет, что очень важно распределить адреса между устройствами, подключен­ными к шине.

Первые четыре бита адреса обычно служат для определения типа выбира­емых устройств в соответствии со следующим соглашением:

0000 - Зарезервированный адрес

0010 - Синтезатор голоса

0011 - Аудио - интерфейс

0100 - Звуковой генератор

0111 - Жидкокристаллический или светодиодный дисплей

1000 - Видео - интерфейс

1001 - Аналого-цифровой и цифро-аналоговый интерфейсы

1010 - Последовательная память

1100 - Управление радиоприемником

1101 - Часы/календарь

1111 - Зарезервировано для использования 10-разрядного адреса

 

R/W - Вид обмена (прием или передача)

Ack - Бит подтверждения

Рис. 2.41 - Формат передачи данных по шине I2С

 

Прежде, чем закончить обсуждение протокола I2C, следует обратить вни­мание на следующие обстоятельства. В некоторых устройствах требуется по­вторная посылка стартового бита, чтобы сбросить принимающее устройство в исходное состояние для приема следующей команды. Например, при чте­нии из EEPROM-памяти с последовательной выборкой первая команда по­сылает адрес ячейки, из которой производится считывание, а вторая коман­да выполняет чтение данных по этому адресу.

Следует также обратить внимание на возможность инициирования про­цесса передачи данных несколькими ведущими микроконтроллерами («multimastering»). Это может привести к возникновению коллизий, когда два устройства пытаются управлять шиной одновременно. Если один микроконт­роллер взял управление шиной, то есть установил стартовое состояние, до того, как другой попытается сделать тоже самое, то это не вызывает проблем. Проблема возникает, когда несколько устройств инициируют стартовое со­стояние одновременно, и требуется произвести арбитраж их запросов.

На практике осуществить арбитраж в этом случае достаточно просто. Во вре­мя передачи данных оба передатчика точно синхронизируют тактовые импуль­сы. Если при передаче адреса бит, который должен иметь значение 1, на самом деле принимает значение 0, то это указывает на то что шина занята другим устройством. В этом случае ведущее устройство отключается от шины и ждет, когда наступит состояние «конец передачи», после которого повторяет запрос.

Протокол I2C может быть легко реализован программным путем. Но при этом быстрый режим не может быть реализован из-за перегрузки процессо­ра, даже стандартный режим 100 Кбит/с может оказаться слишком быстрым для некоторых микроконтроллеров. Программная реализация наилучшим об­разом подходит тогда, когда в сети имеется только одно ведущее устройство. В этом случае нет необходимости синхронизироваться с другими устройства­ми или принимать сообщения от других ведущих устройств, работающих со слишком большой скоростью, которая не обеспечивается при программной реализации.