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

I2C

411

14.1.1.6. Комбинированные транзакции

Протокол I²C, по существу, имеет простой шаблон связи:

ведущее устройство отправляет на шину адрес ведомого устройства, участвующего в транзакции;

бит R/W, который является LSB-битом в байте адреса ведомого устройства, устанавливает направление потока данных (от ведущего к ведомому – W или от ведо-

мого к ведущему – R);

отправляется количество байт, каждый из которых чередуется с битом ACK, одним из двух узлов (peers) в соответствии с направлением передачи, пока не наступит STOP-условие.

Данная коммуникационная схема имеет большой подводный камень: если мы хотим запросить что-то конкретное у ведомого устройства, нам нужно использовать две отдельные транзакции. Давайте рассмотрим это на примере. Предположим, у нас есть EEPROM на шине I²C. Обычно устройства такого типа имеют несколько адресуемых ячеек памяти (EEPROM на 64 Кбит адресуется в диапазоне 0 – 0x1FFF12). Чтобы извлечь содержимое ячейки памяти, ведущее устройство должно выполнить следующие шаги:

запустить транзакцию в режиме записи (последний бит адреса ведомого устройства установлен в 0), отправив адрес ведомого устройства на шину I²C, чтобы EEPROM начала выборку сообщений из шины;

отправить два байта, представляющих собой ячейку памяти, которую мы хотим прочитать;

завершить транзакцию, отправив STOP-условие;

начать новую транзакцию в режиме чтения (последний бит адреса ведомого устройства установлен в 1), отправив адрес ведомого устройства на шину I²C;

прочитать n байт (обычно один, если память читается в произвольном режиме (random mode), более одного, если читается в последовательном режиме), отправленные ведомым устройством, и затем завершить транзакцию STOP-условием.

Рисунок 5: Структура комбинированной транзакции

Для поддержки этой общей коммуникационной схемы протокол I²C определяет комбинированные транзакции, в которых направление потока данных инвертируется (обычно от ведомого к ведущему устройству или наоборот) после передачи нескольких байт. На рисунке 5 схематично представлен этот способ связи с ведомыми устройствами. Ведущее устройство начинает отправку адреса ведомого устройства в режиме записи (обратите внимание на W, выделенную красным цветом на рисунке 5), а затем отправляет адреса регистров, которые мы хотим прочитать. Затем отправляется новое STARTусловие без завершения транзакции: это дополнительное START-условие также

12 Данные значения основаны на том факте, что 64 Кбит равны 65536 битам, но каждая ячейка памяти размером 8 бит, поэтому 65536/8 = 8196 = 0x2000. Так как ячейки памяти начинаются с 0, то последняя имеет адрес 0x1FFF.