I2C (или как многие называют ее И2Ц) это двупроводная последовательная шина, разработанная корпорацией Philips (сейчас NXP) в начале 80-х. На данный момент шина I2C широко используется для связи однокристальных микроконтроллеров, микросхем памяти (EEPROM), аналого-цифровых и цифро-аналоговых преобразователей, датчиков температуры и давления а также множества других периферийных устройств.
Спецификация шины I2C описывает 4 скоростные категории для двунаправленной передачи данных:
Standard-mode (Sm) | скорость до 100 кбит/с |
Fast-mode (Fm) | скорость до 400 кбит/с |
Fast-mode Plus (Fm+) | скорость до 1 Мбит/с |
High-speed mode (Hs-mode) | скорость до 3.4 Мбит/с |
Шина I2C использует две линии - SDA (линия данных) и SCL (линия синхронизации).
Данные передаются между двумя устройствами - Master (ведущий) и Slave (ведомый). Ведущий инициирует передачу данных и формирует сигналы синхронизации. Ведомый может начать передачу данных только по команде ведущего
К одной шине может быть подключено несколько ведущих и ведомых. Позже мы обсудим, роль каждого из них, сейчас же важно понять, как они могут передавать данные по одним и тем же проводам, избегая конфликтов.
Все устройства подключаются к шине через открытый коллектор или открытый сток. При таком подключении, устройство может или выдавать на шину логический ноль, или не выдавать ничего (выход находится в состоянии высокого импеданса).
Если выходы всех устройств, подключенных к шине, находятся в состоянии высокого импеданса, то два внешних резистора Rp подтягивают обе линии к напряжению питания Vdd, и тем самым устанавливают логическую единицу. Значение этих резисторов обычно колеблется от 1 кОм до 10 кОм. Если одно или несколько устройств выдают логический 0, то и на линии устанавливается низкий уровень напряжения. Шина считается свободной, когда ни одно из устройств не передает данных и обе линии установлены в 1.
В одной из последующих глав мы детально рассмотрим варианты подключения разнообразных устройств к шине I2C. Теперь перейдем к изучению протокола I2C на примере передачи одного байта данных от I2C ведущего к ведомому.
Данная осциллограмма может быть условно разделена на семь частей:
- формирование состояния START (S);
- передача адреса ведомого устройства;
- бит направления данных (чтение или запись);
- подтверждение приема (ACK) адреса ведомого устройства;
- передача байта данных;
- подтверждение приема (ACK) байта данных;
- формирование состояния STOP (P).
Все семь частей осциллограммы мы детально обсудим в разделе Передача байта данных по I2C шине. Сейчас же мы обратим внимание на передачу одного бита данных по шине I2C.
В процессе передачи данных, значения на линии SDA изменяются, когда линия SCL в нуле. Когда линия SCL в единице, принимающее устройство считывает бит данных (состояние SDA линии). В этот момент данные на линии SDA должны оставаться неизменными.