требованиями SMBus и ACCESS.Bus.
Интерфейс I²C использует две сигнальные линии: данных SDA
(Serial Data) и синхронизации SCL
(Serial Clock). В обменах участвуют два устройства —
Протокол обмена для обычных устройств SCL
не обязателен. Все одноименные передатчики соединяются по схеме «Монтажное И»: уровень в линии будет высоким, если все передатчики пассивны, и низким, если хоть у одного передатчика выходной транзистор открыт. В покое (
Рис. 11.1. Протокол передачи данных I²C
Начало любой передачи — условие SCL
и SDA
). Условие S
) — перевод сигнала SDA
из высокого в низкий при высоком уровне SCL
. Завершается операция переводом сигнала SDA
из низкого уровня в высокий при высоком уровне SCL
— условие P
), также вводящееся ведущим устройством. При передаче данных состояние линии SDA
может изменяться только при низком уровне SCL
, биты данных считаются действительными во время высокого уровня SCL Ведущее устройство может начать очередную передачу вслед за текущей, не вводя условие Sr
). В протоколе условия S
и Sr
почти равнозначны. Каждая посылка данных состоит из 8 бит данных, формируемых передатчиком (старший бит — MSB — передается первым), после чего передатчик на один такт освобождает линию данных для получения подтверждения. Приемник во время девятого такта формирует бит подтверждения Ack
, по которому передатчик убеждается, что его «услышали». После передачи бита подтверждения ведомое устройство может задержать следующую посылку, удерживая линию SCL
на низком уровне. Ведомое устройство в режимах SCL
на низком уровне после его спада, сформированного передатчиком. Поэтому ведущее устройство должно генерировать сигнал SCL
не «вслепую», а анализируя состояние линии SCL
: сняв этот сигнал, новый импульс (открытие ключа передатчика) оно имеет право вводить, лишь убедившись, что сигнал SCL
вернулся в пассивное состояние (высокий уровень). В противном случае синхронизация будет потеряна. Сигнал SCL
может быть растянут и другим устройством, пытающимся захватить шину в это же время. Тактовый сигнал SCL
не обязательно будет равномерным: время его нахождения на низком уровне будет определяться максимальным временем, в котором его захочет удержать самое медленное из устройств, участвующих в данном обмене (даже и конфликтующих); время нахождение на высоком уровне будет определяться самым быстрым из конфликтующих ведущих устройств.
SCL
и SDA
и наблюдают за ними. Если устройство, передающее единицу (высокий уровень), в данном такте на линии SDA
видит ноль (низкий уровень), оно должно признать свой проигрыш в конфликте и освободить линии SCL
и SDA
(при этом ему позволительно управлять линией SCL
до конца передачи текущего байта). Выигравшее устройство даже и не заметит проигравших конкурентов и продолжит работу. Арбитраж может закончиться в любом месте посылки, формируемой ведущим устройством. Искажения информации, передаваемой выигравшим устройством, не происходит (приятное отличие от коллизий в сетях Ethernet). Если ведущее устройство, проигравшее в конфликте, имеет и функции ведомого устройства, по признанию проигрыша оно должно перейти в режим ведомого, поскольку конфликт мог быть вызван и попыткой обращения к нему победившего ведущего устройства.
ACK
, вводящийся в конце каждого байта устройством- приемником, выполняет несколько функций. Когда ACK
, свидетельствующий о нормальном получении очередного байта. Единичный бит ACK
(нет подтверждения) в ответ на посылку адреса свидетельствует об отсутствии адресованного ведомого устройства на шине или его занятости внутренними процессами. Отсутствие подтверждения байта данных свидетельствует о занятости устройства. Не получив бита подтверждения, ведущее устройство должно сформировать условие ACK
после каждого принятого байта, кроме последнего. Единичный бит ACK
в этом случае является указанием ведомому устройству на окончание передачи — оно теперь должно освободить линии SDA
и SCL
, чтобы ведущее устройство смогло сформировать условие P
или Sr
.
На вышеописанной физической основе строится протокол обмена данными по I²C. Каждое ведомое устройство имеет свой адрес, уникальный на шине. В начале любой передачи ведущее устройство после условия S
или Sr
посылает адрес ведомого устройства или специальный адрес (табл. 11.1). Ведомое устройство, опознавшее свой адрес после условия P
или Sr
. В первоначальном варианте интерфейса разрядность адреса устройства составляла 7 бит, впоследствии был введен и режим 10-битной адресации, совместимый с 7- битной. На одной шине могут присутствовать устройства и с 7-битной, и 10-битной адресацией.
Таблица 11.1. Специальные адреса I²C
Биты[7:1] | Бит 0 (RW) | Назначение |
---|---|---|
0000000 | 0 | General call address — адрес общего вызова |
0000 000 | 1 | Start — начало активного обмена |