Вы здесь

Передача байта данных по I2C шине

Давайте рассмотрим осциллограмму транзакции, где I2C ведущий передает один байт данных на ведомое устройство.

I2C transfer

Как мы видели в предыдущем разделе, данные на линии SDA могут меняться, когда линия SCL в нуле. Исключениями из этого правила являются состояния START и STOP. Также есть повторный START (repeated START – Sr), но его мы рассмотрим в одной из последующих глав.

Состояние START извещает ведомых о начале передачи. Для генерации состояния START ведущий переводит SDA линию из единицы в ноль, оставляя линию SCL в единице. Позже он выставляет ноль на линии SCL, чтобы приготовить шину для передачи первого бита.

I2C Start Condition

Первые семь бит, следующие за состоянием START, содержат адрес ведомого устройства I2C. Как и любые данные, адрес передается последовательно, начиная со старшего бита (MSB) и заканчивая младшим. Каждое ведомое устройство, подключенное к шине I2C, должно иметь уникальный адрес. В данной транзакции участвует ведомое устройство с адресом 1010001 (0x51). Все остальные ведомые ждут генерации состояния STOP.

Восьмой бит первого байта определяет направление передачи. В нашем случае он установлен в ноль. Это означает, что данные передаются от ведущего к ведомому (операция записи - write). Направление передачи задается ведущим устройством.

После каждых восьми бит данных (в том числе байт адреса и направления передачи), следует бит подтверждения (ACK - acknowledge). Этот бит устанавливается принимающим устройством. В нашем случае, байт был передан Ведущим, поэтому Ведомый устанавливает бит подтверждения равным 0. Ведущий генерирует тактовый импульс для бита подтверждения (также как и все другие тактовые импульсы).

Отсутствие подтверждения (высокий уровень на линии SDA) байта адреса может быть в одном из трех случаев:

  1. Ведомое устройство с этим адресом не подключено к шине.
  2. Ведомый не поддерживает данного направления передачи (запись в нашем случае). Есть ряд устройств, которые поддерживают только операции чтения. Например, некоторые датчики температуры и давления.
  3. Ведомое устройство на данный момент занято обработкой предыдущей команды и не готово к приему следующей. В некоторых случаях Ведомый может задержать Acknowledge, удерживая линию SCL в нуле. Но об этом мы поговорим в разделе, посвященном синхронизации.

Независимо от причины отсутствия подтверждения, мастер должен сгенерировать состояние STOP и освободить шину.

 После подтверждения байта адреса Ведущий может передать первый байт данных. Байт данных также должен быть подтвержден сигналом ACK от Ведомого.

В конце передачи Ведущий генерирует состояние STOP и освобождает шину. Состояние STOP генерируется изменением линии SDA с нуля на единицу, в то время как SCL в единице. Перед генерацией состояния STOP мастер устанавливает ноль на линии SDA (при низком уровне сигнала на SCL).

Rating: 
Средняя: 4.5 (15 оценок)

Языки

Вход на сайт