Перейти к содержимому

#25. I2C

В этой части мы рассмотрим I2C, третий основной протокол, который используется для взаимодействия с внешними модулями. I2C — это двухпроводной протокол, используемый для соединения одного или нескольких «мастеров» с одним или несколькими «ведомыми», хотя мы будем использовать только случай, когда один ведущий (STM32) связывается с подчиненными устройствами. Пример конфигурации показан на рисунке ниже. В этой конфигурации один ведущий связывается с несколькими ведомыми по паре сигнальных проводов SDA и SCL. Примеры ведомых устройств включают в себя — датчики температуры, влажности и движения, а также последовательные EEPROM.

Typical I2C Configuration

Программное обеспечение, необходимое для взаимодействия с устройствами I2C, значительно сложнее, чем с SPI. Например, I2C имеет несколько состояний ошибок, которые должны быть обработаны, SPI не имеет условий ошибок на физическом уровне. Точно так же I2C имеет несколько типов транзакций, в то время как SPI имеет один базовый тип транзакции. Кроме того, SPI, как правило, является гораздо более быстрой шиной (1-3 Мбит / с против 100-400 Кбит/с). Наибольшее преимущество I2C над SPI состоит в том, что число проводов, требуемых I2C, является постоянным (2) независимо от количества подключенных устройств, тогда как SPI требует отдельной строки выбора для каждого устройства. Вместо выбранных линий устройства I2C имеют внутренние адреса и выбираются ведущим посредством передачи этого адреса по шине. Эта разница делает I2C хорошим выбором, когда необходимо подключить большое количество устройств. Наконец, I2C — это симметричная шина, которая может поддерживать несколько мастеров, тогда как SPI является полностью асимметричным.

I2C Protocol:

С электрической точки зрения, I2C — это «проводная-или» шина — значение двух сигнальных проводов «высокое», если только одно из подключенных устройств не подавит сигнал на низкий уровень. На левой стороне рисунка расположены два резистора, которые принудительно («подтягивают») значение по умолчанию двух шинных проводов к VCC (обычно 3,3 В). Любое устройство на шине может безопасно в любой момент принудительно подвести любой провод на низкий уровень (к GND), потому что резисторы ограничивают ток потребления; однако протокол связи ограничивает время, когда это должно произойти. Два провода называются SCL (последовательная линия синхронизации) и SDA (последовательные данные / адрес). Для обмена данными ведущий передает тактовый сигнал на SCL во время движения или позволяет ведомому устройству управлять SDA. Таким образом, битрейт передачи определяется мастером.

Связь между ведущим и ведомым устройством состоит из последовательности транзакций, где ведущее устройство использует SCL в качестве тактового сигнала для последовательных данных, управляемых ведущим или ведомым устройством на SDA, как показано на рисунке ниже. Каждая транзакция начинается с условия запуска (S) и заканчивается условием остановки (P). Транзакция состоит из последовательности байтов, первым доставляется старший значащий бит (MSB), каждый из которых заканчивается подтверждением (ACK), как показано здесь, или не подтверждением (NACK). Данные могут отправляться либо ведомым, либо ведущим, как того требует протокол, и получатель данных генерирует ACK или NACK. Условия запуска (S) и остановки (P) всегда генерируются мастером. Переход от высокого к низкому уровню в SDA, в то время как высокий уровень вероятности нежелательной почты определяет начало. Переход от низкого к высокому на SDA, в то время как SCL высокий, определяет Стоп.

I2C Physical Protocol

Существует три типа транзакций на шине I2C, все из которых по инициативе мастера. Это транзакции записи, чтения и комбинированные транзакции, где объединенная транзакция объединяет транзакции записи и чтения. Первые два из них показаны на рисунке ниже. Кроме того, существует два режима адресации: 7-битная адресация, используемая в транзакциях и 10-битная адресация, которая поддерживает большее количество устройств на одной шине при более дорогом и более сложном формате транзакций.

I2C Write and Read Transactions

Все 7-битные адресные транзакции начинаются с события начала, передачи подчиненного адреса и бита, который указывает, является ли это транзакцией записи или чтения ведущим устройством. Фаза адреса заканчивается ACK (0), предоставленным ведомым устройством или NACK (1). Обратите внимание, что в случае отсутствия соответствующего ведомого устройства электрические свойства шины гарантируют, что мастером получен NACK. В случае, если за передачей адреса следует NACK, мастер обязан сгенерировать условие остановки, чтобы завершить транзакцию, таким образом, возвращая шину в состояние ожидания — то есть оба сигнала имеют высокий уровень.

В транзакции записи, фаза адреса, если за ней следует последовательность байтов данных (сначала MSB), передаваемых ведущим, каждый из которых сопровождается ACK или NACK ведомым. Транзакция завершается с условием Stop после того, как ведущее устройство отправило столько данных, сколько пожелает, или ведомое устройство ответило NACK.

Транзакция чтения отличается от транзакции записи тем, что данные предоставляются ведомым устройством, а ACK / NACK — ведущим. В транзакции чтения ведущий отвечает на последний байт, который он хочет получить, с помощью NACK. Транзакция прекращается с условием Stop.

Добавить комментарий