ШИНА I2C

Шина I2C разработана для подключения дополнительных устройств по двум линиям, обеспечивая двунаправленный обмен данными на высокой скорости. Руководство предназначено для ознакомления с работой шины I2C с целью самостоятельной реализации протокола обмена. Для более подробного описания следует обратиться к технической документации фирмы-разработчика Philips Corporation. Ниже приведены характеристики шины I2C:

— скорость обмена — до 100 кбит/сек для стандартного режима и до 400 кбит/сек для усовершенствованного быстрого режима;

— максимальная длина линий — не более 2-х метров;

— суммарная емкость линий — не более 400 пФ;

— входная емкость на каждую ИС — не более 10 пФ;

— величина подтягивающих резисторов 1…10 кОм;

Шина — это двунаправленная асинхронная шина с последовательной передачей данных и возможностью адресации до 128 устройств. Физически шина содержит две сигнальные линии, одна из которых (SCL) предназначена для передачи тактового сигнала, а вторая (SDA) для обмена данными. Для управления линиями применяются выходные каскады с открытым стоком или открытым коллектором, чтобы устройства можно было соединять по схеме «Монтажное ИЛИ». Для обеспечения высокого уровня при отсутствии на шине активного устройства используются внешние подтягивающие резисторы к источнику питания (обычно +5 В) сопротивлением 1…10 кОм, в зависимости от физической длины линии и скорости передачи данных. На одной шине могут работать устройства нормального и быстрого режима.

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

— ведущий передает, а ведомый принимает;

— ведущий принимает, а ведомый передает.

Кроме того, возможен, так называемый, «Multi Master» режим, когда на шине установлено несколько ведущих абонентов, которые либо совместно разделяют общие ведомые устройства, либо попеременно являются то ведущими устройствами, то ведомыми. Такой режим требует арбитража и распознавания конфликтов. Естественно, он сложнее в реализации и, как следствие, реже используется в реальных изделиях.

Инициализация и прекращение передачи данных

В начальный момент времени — в режиме ожидания, обе линии SCL и SDA находятся в состоянии лог. «1», так как притянуты подтягивающими резисторами  (транзистор выходного каскада с открытым стоком или открытым коллектором закрыт). Начало и конец передачи данных определяют условия START и STOP. Условие START определяется как переход SDA из высокого уровня в низкий при высоком уровне SCL, а условие STOP — как переход SDA из низкого уровня в высокий при высоком уровне SCL (см. ниже рисунок 1). Ведущий генерирует эти условия в начале и конце передачи данных. Ввиду такого способа определения START и STOP при передаче данных линия SDA может изменять свое состояние только при низком уровне SCL.

Адресация на шине I2C

Существуют два формата адреса. Простейший 7-битный формат с битом R/-W (см. рисунок 2). Адрес — это 7 старших битов байта. Более сложным является 10-битный формат с битом R/-W, где первые пять битов определяют, что это 10-битный адрес.

— где S — условие START, R/W — бит чтение/запись (1 — чтение, 0 — запись), ACK — подтверждение приема, посылается ведомым.

Подтверждение передачи

Данные должны передаваться побайтно, без ограничения количества байтов за сеанс. После каждого байта ведомый выдает бит подтверждения ACK. Когда ведомый не подтверждает получение адреса или данных, ведущий должен прервать передачу. Ведомый оставляет на SDA высокий уровень, чтобы ведущий выставил STOP.

Если данные получает ведущий, он выдает подтверждение для каждого принятого байта данных, кроме последнего. Чтобы завершить ведомому о завершении приема данных, ведущий не посылает подтверждения. После этого ведомый освобождает SDA, чтобы ведущий выставил STOP.

При необходимости, ведомый может задержать передачу следующего байта, удерживая низкий уровень на SCL, что заставит ведущий перейти в состояние ожидания. Когда ведомый отпустит SCL, передача данных продолжится. Это позволяет ведомому отложить прием данных, либо выбрать данные для передачи до того, как продолжат поступать тактовые импульсы.  На рисунке 3 показана последовательность передачи данных ведущим и ведомым.

Когда ведущий не желает освобождать шину (выставив STOP), он должен выставить повторный старт, который идентичен START (переход SDA из высокого уровня в низкий при высоком уровне SCL), но выдается вслед за подтверждением, т.е. шина не освобождена. Это позволяет ведущему посылать команды ведомому и затем принимать запрошенную информацию или адресовать различные ведомые устройства. Подобный механизм показан на рисунке 4.

Работа при конкуренции

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

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

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

Арбитраж не допускается между:

— повторными START-ми;

— STOP и битом данных;

— повторным START и STOP;

Ведущий должен обеспечить невозможность возникновения приведенных условий.

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

Временные параметры шины

На рисунках 5 и 6 и в таблицах приведены требования PHILIPS к сигналам на шине.

Таб. 1

Номер Символ Описание Мин. Ном. Макс. Ед. изм Прим
90 Tsu.sta Уста-
новление
START
100 кГц 4700 нс Только для повторного START
400 кГц 600
91 Thd.sta Удер-
жание
START
100 кГц 4000 нс
400 кГц 600
92 Tsu.sto Уста-
новление
STOP
100 кГц 4700 нс
400 кГц 600
93 Thd.sto Удер-
жание
STOP
100 кГц 4000 нс

Таб. 2

Номер Символ Описание Мин. Макс. Ед. изм Прим
100 Thigh Длит. высокого уровня 100 кГц 4000 нс
400 кГц 600
101 Tlow Длит. низкого уровня 100 кГц 4700 нс
400 кГц 1300
102 Tr Длит. переднего фронта 100 кГц 1000 нс
400 кГц 20+0,1Сb 300 10пф<Cb<400пф
103 Tf Длит. заднего фронта 100 кГц 1000 нс
400 кГц 20+0,1Cb 300 10пф<Cb<400пф
106 Thd.dat Удерж. входных данных 100 кГц 0 нс
400 кГц 0 900
107 Tsu.dat Установл. входных данных 100 кГц 250 нс
400 кГц 100
109 Taa Устан. выходных данных 100 кГц 3500 нс
400 кГц
110 Tbuf Шина свободна 100 кГц 4700 нс Новая передача не может начаться раньше Tbuf
400 кГц 1300
Cbuf Емкостная нагрузка на шине 400 пф

 

Практические рекомендации

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

Удобства применения шины I2C очевидны — малое количество соединительных линий и высокая скорость обмена, простота аппаратной реализации линии связи. Наиболее широко поддерживает шину, конечно же, PHILIPS, производящая множество ИС различной сложности с управлением по I2C. В первую очередь, можно выделить микросхемы энергонезависимой памяти (EEPROM) серии 24Схх в 8-ми выводных корпусах, фактически ставшие промышленным стандартом. Из широко распространённых ИС можно выделить: микросхемы часов PCF8583, параллельный порт PCF8574, 4-х канальный 8-ми разрядный АЦП PCF8591.

I2C -абоненты жёстко разделяются по классам: «Master»- и «Slave»-устройство. Тот факт, что сигнал SCL всегда генерируется «Master»-устройством означает, что «Master»-абонент может быть достаточно легко реализован чисто программными средствами, так как все изменения на шине будут происходить только по сигналу SCL. И наоборот, реализация «Slaves-устройства требует аппаратной поддержки, кроме случая очень низких скоростей обмена. Существуют микроконтроллеры поддерживающие «Slave»-операции шины I2C. Это, прежде всего Philips PCF80C552 (652), Microchip PIC16C62 (64, 73 и др.), Motorola MC68HC705CJ4 (BD3, Е5). Кроме того, микроконтроллеры фирмы Philips, Microchip аппаратно поддерживают «Masters-протокол.

В типичной микропроцессорной системе с применением I2C -устройств, обычно существует центральный микроконтроллер, две линии портов которой отведены для управления линиями шины I2C SCL и SDA. Линии шины I2C должны быть выполнены с открытым коллектором (ОК)или открытым стоком (ОС), и подтянуты резисторами к линии питания +5 В, что позволяет абонентам шины производить операции типа «Монтажное ИЛИ» для торможения процесса обмена в случае, если они не успевают отрабатывать операции со скоростью «Masters-абонента.

Типичная ошибка при реализации программ «Masters-абонента — управление значением порта микроконтроллера для установки нулевого и единичного состояний линий SCL и SDA. Если для микроконтроллера семейства MCS-51 это нормальный режим работы, так как единичное состояние порта у них реализуется встроенным подтягивающим резистором ~ 50 кОм, то для микроконтроллеров с симметричными портами (Motorola 68НСххх, Microchip PIC, Atmel AVR) это будет порождать электрические конфликты. Хотя в современных кристаллах фирмы Microchip обычно интерфейс I2C реализован на аппаратном уровне, для него отведены 2 соответствующих порта. Для тех микросхем, где шина I2C не реализована на аппаратном уровне, например, в руководстве «Microchip. Embedded Control Handbook 1994/1995» приведены практические программы для связи PIC с ИС EEPROM, содержащие подобные грубые ошибки. Положение усугубляется тем, что в случае микросхем EEPROM такой вариант может сработать, так как они являются 100% аппаратными схемами и не вносят задержек в связной протокол, а паузу ожидания окончания цикла программирования производят переходом в пассивное состояние. Использование таких подпрограмм с ИС, производящими захват линии SCL (практически любой «Slaves-абонент, реализованный с применением микроконтроллера), приведёт к невозможности связи, а возможно, и к выходу ИС из строя.

Реализовать настоящую имитацию ОК или ОС (мы назвали этот режим имитацией ОК или ОС, так он не позволяет устанавливать на линии напряжение выше напряжения питания, что было бы нормально для настоящего ОК или ОС, но так как по спецификации I2C напряжение на линиях SCL и SDA не должно превышать напряжение питания, его вполне законно можно считать выходом с ОК или ОС) на порте с симметричным выходом можно, если установить значение порта постоянно в ноль, а управлять состоянием линии через манипуляции с регистром направления данных. Для микроконтроллеров PIC это будет регистр «TRISx», переводящий порт либо в третье состояние, либо подключающий линии в соответствии с состоянием регистра «PORTx». Практически так же это реализуется в AVR и МС68НС05 (08, 11), где «DDRx» коммутирует порт «PORTx», с той лишь разницей, что у них другая полярность управляющего сигнала — у PIC ноль в «TRISx» соответствует нулю на выходе, а у AVR и МС68НС05 единица в «DDRx» соответствует нулю на выходе.

Ещё одна тонкость связанная с PIC, не имеющая собственно к I2C никакого отношения заключается в том, что у него совмещены регистр чтения состояния линий порта и регистр записи значения порта, в результате чего, если часть линий порта запрограммирована на вывод, а другая находится в третьем состоянии, то при выполнении PICом операции модификации в регистр порта перепишутся значения непосредственно с выводов PICa установленных в третье состояние, что может нарушить (и, скорее всего, нарушит) работу программы обмена (потеряются нули, обеспечивающие имитацию выходов с ОК или ОС). Поэтому лучше производить принудительную установку в ноль битов в «PORTx», например, перед каждой операцией обмена, скажем такой последовательностью:

movlw    b’11100111′              ;  Маска линий SCL и SDA в порте C  (RC3 и RC4)

andwf    portс,f                        ;  Сброс значений линий SCL и SDA в порте C в ноль

Другая важная сторона вопроса — необходимость тщательного соблюдения параметров временной диаграммы процесса обмена. Несмотря на то, что шина I2C асинхронная и позволяет затягивать передачу бита (байта) на сколь угодно длительное время (это свойство позволяет реализовывать программы I2C -обмена на самом низком уровне приоритета, прерывая процесс передачи в любое время), требования к минимальным значениям длительностей импульсов очень жёсткие. Ситуация усугубляется тем, что положительные перепады состояния линии имеют склонность затягиваться, так как несимметричные управляющие выходы не могут создать крутые положительные фронты.

При написании программ очень важно контролировать время между операциями на шине, реализуемыми различными подпрограммами, например выдача «Start» и «Stop»-условия, передача бита, передача байта. При состыковке этих подпрограмм не должны быть нарушены минимальные значения времени, что очень легко происходит при использовании высокоскоростных процессоров (AVR, PIC). Кроме того, необходимо следить, чтобы время между изменением на линии SDA и стробированием положительным импульсом на линии SCL было не меньше половины минимальной длительности полупериода SCL (4.7 мкс/2 = 2.4 мкс). Помимо этого, некоторые «Slaves-приборы могут ужесточить требования к максимальной частоте обмена, в этом случае необходимо пропорционально снижению частоты обмена увеличивать значения минимумов временных допусков.

Ещё одна распространённая ошибка — игнорирование требования слежения за захватом линии SCL «Slaves-абонентом. Грамотно реализованные программы операций «Master»-абонента должны контролировать возврат линии SCL после того, как переводят её в единичное состояние, и только дождавшись реальной установки линии SCL в единичное состояние продолжать операции приёмо-передачи.

Теперь опишем минимально необходимый набор операций для реализации «Masters-абонента. Прежде всего, это подпрограммы выдачи «Start»- и «Stop»-условия, подпрограмма передачи байта, подпрограмма приёма байта, выдающая сигнал АСК и подпрограмма приёма байта, не выдающая сигнал АСК. Три последние используют подпрограммы передачи бита и приёма бита. Во временных промежутках между подпрограммами линия SCL имеет нулевое значение. Как уже говорилось ранее, важно правильно согласовать все временные характеристики подпрограмм. Если, к примеру, вы вызываете повторный «Start» сразу за передачей (приёмом) байта, то необходимо, чтобы полностью завершился нулевой полупериод (> 4.7 мкс), предшествующий «Start»-условию, а подпрограмма, реализующая «Start»-условие, переведя линии SDA и SCL в единичное состояние, дождавшись их реального возврата, должна удерживать её в таком состоянии не менее установленного времени (> 4.7 мкс), и так во всех случаях.

Оперируя этими пятью подпрограммами можно легко наладить обмен по шине I2C. Можно выдать на шину «Start»-условие, за ним «Slave Adress», далее данные, в соответствии с протоколом конкретной I2C -ИС. Можно выдать повторное «Start»-условие, новый «Slave Adress» и так далее, формируя процесс обмена как из элементов конструктора. Обычно протоколы обмена «Slave»-устройств довольно логично соответствуют программированию в таком стиле.

Добавить комментарий