Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Кармин Новиелло - Освоение STM32.pdf
Скачиваний:
2743
Добавлен:
23.09.2021
Размер:
47.68 Mб
Скачать

I2C

407

Прочитайте внимательно

Микроконтроллеры STM32F1 не предоставляют возможность подтягивания к питанию линий SDA и SCL. Их GPIO должны быть сконфигурированы как с открытым стоком, и для подтягивания к питанию линий I²C требуется два внешних резистора.

Будучи протоколом, основанным только на двух проводах, должен быть способ адресации каждого ведомого устройства на одной шине. По этой причине I²C определяет, что каждое ведомое устройство предоставляет уникальный адрес ведомого устройства для шины, на которой оно используется7. Адрес может быть шириной 7 или 10 бит (последний вариант довольно необычен).

Скорости шины I²C четко определены спецификацией протокола, однако не так уж редко можно встретить микросхемы, способные устанавливать пользовательские (и часто нечеткие) скорости обмена данными. Обычные частоты шины I²C – 100 кГц8, также известная как стандартный режим (standard mode), и 400 кГц, известная как быстрый режим (fast mode). Последние версии стандарта могут работать на более высоких скоростях (1 МГц, известная как быстрый режим плюс (fast mode plus), и 3,4 МГц, известная как

высокоскоростной режим (high speed mode), и 5 МГц, известная как сверхбыстрый режим

(ultra fast mode)).

Протокол I²C является достаточно простым протоколом, так что микроконтроллер может «имитировать» специально предназначенное периферийное устройство I²C, если он не предоставляет его: эта методика называется bit-banging9, и она обычно используется в достаточно недорогих 8-разрядных архитектурах, которые иногда не предоставляют выделенный интерфейс I²C в целях уменьшения количества выводов и/или стоимости ИС.

14.1.1. Протокол I²C

В протоколе I²C все транзакции всегда инициируются и завершаются ведущим устройством. Это одно из немногих правил данного коммуникационного протокола, которое необходимо учитывать при программировании (и, особенно, отладке) устройств I²C. Все сообщения, которыми обмениваются по шине I²C, разбиваются на два типа кадров: кадр адреса (address frame), где ведущее устройство указывает, какому ведомому устройству отправляется сообщение, и один или несколько кадров данных (data frames), которые являются 8-битными сообщениями с данными, передаваемыми от ведущего устройства ведомому или наоборот. Данные помещаются в линию SDA после того, как SCL

7Это является одним из наиболее существенных ограничений протокола I²C. Фактически, производители ИС редко выделяют достаточно выводов для конфигурации полного адреса ведомого устройства, используемого на плате (если вам повезет, для данной функции будет выделено не более трех выводов, предоставляя выбор только из восьми вариантов адресов ведомых устройств). При проектировании платы с несколькими устройствами, поддерживающими I²C, обратите внимание на их адрес, и в случае коллизии вам потребуется использовать два или более периферийных устройства I²C микроконтроллера для управления ими.

8Существуют ИС, поддерживающие связь только на более низких скоростях, но в настоящее время они встречаются редко.

9Bit-banging (не путать с технологией битовых лент bit-banding от ARM) – методика, представляющая собой режим программного управления выводами, симулируя таким образом аппаратную работу отсутствующего в микроконтроллере периферийного устройства. (прим. переводчика)

I2C

408

устанавливается на низкий уровень, и отсчет данных начинается после того, как линия SCL устанавливается высокой. Время между фронтами синхросигнала и считыванием/записью данных определяется устройствами на шине и может варьироваться в различных микросхемах.

Как было сказано ранее, SDA и SCL являются двунаправленными линиями, подключенными к положительному напряжению питания через источник тока или подтягивающие резисторы (см. рисунок 1). Когда шина свободна, обе линии ВЫСОКИЕ. Выходные каскады подключенных к шине устройств должны быть с открытым стоком или с открытым коллектором для выполнения правила монтажного И (wired-AND feature)10. Емкость шины ограничивает количество подключаемых к ней интерфейсов. Для приложений с одним ведущим устройством выход SCL ведущего устройства может быть двухтактным драйвером (push-pull driver), если на шине нет устройств, которые могли бы удерживать (stretch) синхросигнал (подробнее об этом позже).

Теперь попробуем проанализировать основные этапы коммуникации по I²C.

Рисунок 2: Структура базового сообщения интерфейса I²C

14.1.1.1. START- и STOP-условия

Все транзакции начинаются со START-условия и заканчиваются STOP-условием (см. рисунок 2). Переход с ВЫСОКОГО логического уровня на НИЗКИЙ на линии SDA, в то время как на линии SCL ВЫСОКИЙ уровень, определяет START-условие. Переход с НИЗКОГО логического уровня к ВЫСОКОМУ на линии SDA, в то время как на линии SCL ВЫСОКИЙ уровень, определяет STOP-условие.

START- и STOP-условия всегда генерируются ведущим устройством. Шина считается занятой после возникновения START-условия. Шина считается свободной снова через определенное время после наступления STOP-условия. Шина остается занятой, если вместо STOP-условия генерируется повторное START-условие (также называемое RESTART-условием) (подробнее об этом в ближайшее время). В этом случае START- и RESTART-условия функционально идентичны.

14.1.1.2. Формат байта

Каждое слово, передаваемое по линии SDA, должно иметь размер 8 бит, и это также подразумевается для кадра адреса, как мы увидим через некоторое время. Количество байт, которое может быть передано за одну транзакцию, не ограничено. Каждый байт должен сопровождаться битом «Подтверждено» (Acknowledge, ACK). Сначала данные передаются со старшего значащего бита (Most Significant Bit, MSB) (см. рисунок 2). Если ведомое устройство не может получить или передать другой полный байт данных до тех пор, пока оно не выполнит какую-либо другую функцию, например, обслуживание внутреннего прерывания, оно может удерживать линию синхронизации SCL на НИЗКОМ логическом уровне, чтобы перевести ведущее устройство в состояние ожидания. Затем

10 Логический вентиль И, реализованный с использованием пассивных элементов, таких как резисторы и диоды. (прим. переводчика)

I2C

409

передача данных продолжается, когда ведомое устройство готово к другому байту данных, и освобождает линию синхронизации SCL.

14.1.1.3. Кадр адреса

Кадр адреса всегда является первым в любой новой последовательности передачи. Для 7-разрядного адреса сначала следует старший значащий бит (MSB), за адресом следует бит R/W, указывающий, является ли это операцией чтения (1) или записи (0) (см. рисунок 2).

Рисунок 3: Структура сообщения в случае использования 10-разрядной адресации

В 10-разрядной системе адресации (см. рисунок 3) для передачи адреса ведомого устройства требуются два кадра. Первый кадр будет состоять из кода 1111 0XXD2, где XX – два MSB-бита 10-разрядного адреса ведомого устройства, а D – бит R/W, описанный выше. Бит ACK первого кадра будет утверждаться всеми ведомыми устройствами, адреса которых совпадают с двумя первыми MSB-битами переданного адреса. Как и при обычной 7-битной передаче, немедленно начинается другая передача, и эта передача содержит биты [7:0] передаваемого адреса ведомого устройства. На этом этапе адресуемое ведомое устройство должно ответить битом ACK. Если этого не происходит, то режим сбоя такой же, как и в 7-битной системе.

Обратите внимание, что устройства с 10-разрядным адресном могут сосуществовать с устройствами с 7-разрядным адресом, поскольку начальная часть адреса 11110 не является частью каких-либо допустимых 7-разрядных адресов.

14.1.1.4. Биты «Подтверждено» (ACK) и «Не подтверждено» (NACK)

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

Сигнал ACK формируется следующим образом: передатчик освобождает линию SDA во время синхроимпульса подтверждения ACK, таким образом приемник может притянуть линию SDA к НИЗКОМУ логическому уровню, при этом она должна оставаться стабильно НИЗКОЙ в течение периода ВЫСОКОГО уровня синхроимпульса. Если SDA остается в ВЫСОКОМ уровне в течение этого девятого синхроимпульса, то формируется сигнал «Не подтверждено» (Not Acknowledge, NACK). Далее ведущее устройство может сгенерировать либо STOP-условие для отмены передачи, либо RESTART-условие для начала новой передачи. Существует пять условий, приводящих к генерации NACK:

1.На шине отсутствует приемник по переданному адресу, поэтому нет устройства, которое ответило бы подтверждением ACK.

11 Обратите внимание, что здесь мы в общем говорим о приемнике и передатчике, поскольку бит ACK/NACK может быть установлен как ведущим, так и ведомым устройствами.

I2C

410

2.Приемник не может принимать или передавать, потому что он выполняет некоторую функцию в реальном времени и не готов начать связь с ведущим устройством.

3.Во время передачи приемник получил данные или команды, которые он не понимает.

4.Во время передачи приемник больше не может получать байты данных.

5.Приемник ведущего устройства должен просигнализировать об окончании передачи ведомому передатчику.

Действие бита ACK/NACK обусловлено природой открытого стока протокола I²C. Открытый сток означает, что как ведущее, так и ведомое устройства, участвующие в транзакции, могут притягивать соответствующую сигнальную линию на НИЗКИЙ логический уровень, но не могут подтянуть ее на ВЫСОКИЙ. Если передатчик или приемник освобождает линию, то она автоматически подтягивается на ВЫСОКИЙ уровень соответствующим резистором, если другой не притягивает ее на НИЗКИЙ уровень. Природа открытого стока протокола I²C также гарантирует, что на шине не будет никакой конфликтной ситуации, когда одно устройство пытается вывести линию на ВЫСОКИЙ уровень, а другое пытается притянуть ее на НИЗКИЙ, тем самым исключая возможность повреждения устройств или чрезмерного рассеивания мощности в системе.

14.1.1.5. Кадры данных

После того, как был отправлен кадр адреса, могут начать передаваться данные. Ведущее устройство будет просто продолжать генерировать синхроимпульсы на SCL за равные промежутки времени, а данные будут помещаться на SDA ведущим или ведомым устройством, в зависимости от того, на операцию чтения или записи указывает бит R/W. Обычно первый байт или первые два байта содержат адрес регистра ведомого устройства для записи/чтения. Например, для I²C памяти EEPROM первые два байта, следующие за кадром адреса, представляют собой адрес ячейки памяти, участвующей в транзакции.

В зависимости от бита R/W последовательные байты заполняются ведущим (если бит R/W установлен в 1) или ведомым (если бит R/W равен 0) устройством. Количество кадров данных является произвольным, и большинство ведомых устройств автоматически инкрементируют внутренний регистр, что означает, что последующие операции чтения или записи будут поступать из следующего регистра в линии. Данный режим также называется последовательным (sequential) или пакетным (burst) режимом (см. рисунок

4), и это способ повысить скорость передачи.

Рисунок 4: Передача в пакетном режиме, когда несколько байт данных передается за одну транзакцию