Описание устройства
i2c - последовательная асимметричная шина для связи между интегральными схемами внутри электронных приборов. Использует две двунаправленные линии связи (SDA и SCL), применяется для соединения низкоскоростных периферийных компонентов с процессорами и микроконтроллерами.
Данные передаются по двум проводам — провод данных и провод тактов (данные (SDA) и такты (SCL)). Есть ведущий (master) и ведомые (slave). Инициатором обмена всегда выступает ведущий, обмен между двумя ведомыми невозможен.
Такты на линии SCL генерирует ведущий. Линией SDA могут управлять как ведущий, так и ведомый в зависимости от направления передачи. Единицей обмена информации является сообщение, обрамленное уникальными условиями на шине, именуемыми стартовым и стоповым условиями.
Стандартные напряжения на линиях связи +5 В или +3,3 В, однако допускаются и другие.
Стандарт предусматривает «горячее» подключение и отключение устройств в процессе работы системы.
Интерфейс i2c предназначен для довольно быстрой и надежной передачи на небольшие расстояния, обычно в пределах одного устройства. Как правильно, длина проводов ограничена несколькими метрами.
Адресация
Всего на одной двухпроводной шине может быть до 127 устройств. Классическая адресация включает 7-битное адресное пространство с 16 зарезервированными адресами. Это означает, что разработчикам доступно до 112 свободных адресов для подключения периферии на одну шину.
Первые семь битов образуют адрес ведомого. Восьмой, младший бит, определяет направление пересылки данных. «Ноль» означает, что ведущий будет передавать информацию выбранному ведомому. «Единица» означает, что ведущий будет получать информацию от ведомого.
Адрес устройств на шине определяется хардверно самими устройствами.
Обращение ведущего начинается с падения уровня на шине данных SDA, что является стартовым сигналом для ведомых. Повышение уровня SDA при высоком тактовом сигнале является для них стоп-командой. Все, что происходит между этими событиями, называется “сообщение”, то есть передача данных.
Разберемся в общих чертах, как работает протокол i2c, это поможет правильно пользоваться им, понимая, что и в каком порядке происходит в недрах устройств.
Структура сообщения
Размер пакета данных для связи I2C составляет 8 бит, и в основном есть три типа: инструкция (7-битный адрес ведомого + 1 бит команда чтения и записи (запись 0, чтение 1)), байтовый адрес (8-битный байтовый адрес, чтение и запись данных с этого адреса) и данные (8-битные сообщения). Во время передачи данных следуйте порядку старшего бита первым и младшего бита последним (т.е. старший бит первым, младший бит последний).
Ведущий в начале каждого сообщения передает один байт, где указывает адрес ведомого и направление передачи последующих данных. После каждого пакета передается один бит подтверждения приема приемной стороной.
Адрес 7 бит, тот самый идентификатор конкретного ведомого устройства, к которому обращается ведущий. Далее бит чтения или записи, объясняющий что мы хотим - передать данные или получить их. ACK/NACK - биты подтверждения или неподтверждения приема информации каждого кадра. ACK единственный бит, который генерируется в линии SCL ведомым устройством. А если ведущий читал данные, то, прочитав последний интересующий байт должен вместо последнего ACK передать NACK, обрывая передачу.
К сожалению, без дополнительных мер мы не можем воспользоваться этой информацией о доставке, она лишь сокращает время передачи, обрывая ее, когда принимающее устройство перестает отвечать.