Рис. 11.1. Протокол передачи данных I²C
Начало любой передачи — условие Start — инициируется ведущим устройством, убедившимся в том, что шина свободна (высокий уровень сигналов SCL
и SDA
). Условие Start (на диаграммах обозначается как S
) — перевод сигнала SDA
из высокого в низкий при высоком уровне SCL
. Завершается операция переводом сигнала SDA
из низкого уровня в высокий при высоком уровне SCL
— условие Stop (обозначается как P
), также вводящееся ведущим устройством. При передаче данных состояние линии SDA
может изменяться только при низком уровне SCL
, биты данных считаются действительными во время высокого уровня SCL Ведущее устройство может начать очередную передачу вслед за текущей, не вводя условие Stop , — это называется repeated Start (повторный старт, обозначающийся Sr
). В протоколе условия S
и Sr
почти равнозначны. Каждая посылка данных состоит из 8 бит данных, формируемых передатчиком (старший бит — MSB — передается первым), после чего передатчик на один такт освобождает линию данных для получения подтверждения. Приемник во время девятого такта формирует бит подтверждения Ack
, по которому передатчик убеждается, что его «услышали». После передачи бита подтверждения ведомое устройство может задержать следующую посылку, удерживая линию SCL
на низком уровне. Ведомое устройство в режимах F/S может замедлить передачу по шине и на уровне приема каждого бита, удерживая SCL
на низком уровне после его спада, сформированного передатчиком. Поэтому ведущее устройство должно генерировать сигнал SCL
не «вслепую», а анализируя состояние линии SCL
: сняв этот сигнал, новый импульс (открытие ключа передатчика) оно имеет право вводить, лишь убедившись, что сигнал SCL
вернулся в пассивное состояние (высокий уровень). В противном случае синхронизация будет потеряна. Сигнал SCL
может быть растянут и другим устройством, пытающимся захватить шину в это же время. Тактовый сигнал SCL
не обязательно будет равномерным: время его нахождения на низком уровне будет определяться максимальным временем, в котором его захочет удержать самое медленное из устройств, участвующих в данном обмене (даже и конфликтующих); время нахождение на высоком уровне будет определяться самым быстрым из конфликтующих ведущих устройств.
Коллизия (конфликт) на шине может возникнуть, когда два (или более) устройства, убедившись в покое шины, одновременно (или почти одновременно) инициируют обмен данными. Все они управляют линиями SCL
и SDA
и наблюдают за ними. Если устройство, передающее единицу (высокий уровень), в данном такте на линии SDA
видит ноль (низкий уровень), оно должно признать свой проигрыш в конфликте и освободить линии SCL
и SDA
(при этом ему позволительно управлять линией SCL
до конца передачи текущего байта). Выигравшее устройство даже и не заметит проигравших конкурентов и продолжит работу. Арбитраж может закончиться в любом месте посылки, формируемой ведущим устройством. Искажения информации, передаваемой выигравшим устройством, не происходит (приятное отличие от коллизий в сетях Ethernet). Если ведущее устройство, проигравшее в конфликте, имеет и функции ведомого устройства, по признанию проигрыша оно должно перейти в режим ведомого, поскольку конфликт мог быть вызван и попыткой обращения к нему победившего ведущего устройства.
Бит подтверждения ACK
, вводящийся в конце каждого байта устройством- приемником, выполняет несколько функций. Когда передатчиком является ведущее устройство , приемник (ведомый) должен вводить нулевой бит ACK
, свидетельствующий о нормальном получении очередного байта. Единичный бит ACK
(нет подтверждения) в ответ на посылку адреса свидетельствует об отсутствии адресованного ведомого устройства на шине или его занятости внутренними процессами. Отсутствие подтверждения байта данных свидетельствует о занятости устройства. Не получив бита подтверждения, ведущее устройство должно сформировать условие Stop , чтобы освободить шину. Когда ведущее устройство является приемником , оно должно формировать нулевой бит ACK
после каждого принятого байта, кроме последнего. Единичный бит ACK
в этом случае является указанием ведомому устройству на окончание передачи — оно теперь должно освободить линии SDA
и SCL
, чтобы ведущее устройство смогло сформировать условие P
или Sr
.
Читать дальше