Рис. 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.
Читать дальше