Протокол 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 Кбит/с может оказаться слишком быстрым для некоторых микроконтроллеров. Программная реализация наилучшим образом подходит тогда, когда в сети имеется только одно ведущее устройство. В этом случае нет необходимости синхронизироваться с другими устройствами или принимать сообщения от других ведущих устройств, работающих со слишком большой скоростью, которая не обеспечивается при программной реализации.