USB-I2C/SPI/GPIO Interface Adapters
Опубликовано на USB-I2C/SPI/GPIO Interface Adapters (http://ru.dlnware.com)

Главная > Передача байта данных по I2C шине

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

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

I2C transfer

Как мы видели в предыдущем разделе [1], данные на линии 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 оценок)

Ссылки
[1] http://ru.dln-adapters.com/i2c