Шина I2C: принципы функционирования или зачем ещё тут нужны какие-то резисторы?
Добрый день, уважаемый читатель! Некоторое время назад я начал сочинительствовать на тему работы с шиной I2C с использованием фреймворка ESP-IDF. И она таки будет, но немного позже. Но вовремя сообразил, что придется отталкиваться от принципов функционирования данной шины, про которые я ещё не рассказывал. Поэтому решил отложить статью ESP-IDF + I2C в несколько более долгий ящик, а написать другую статью, на которую буду ссылаться впоследствии.
Принципы работы шины IIC (она же имеет более устоявшееся имя как I2C) не зависят от программной реализации, поэтому данная статья может быть полезна как программистам ESP-IDF, так и фанатам Arduino. Да и вообще всем, кто хочет понять как функционирует шина, зачем нужны какие-то резисторы, и как и в каком порядке улетают байты и биты по проводкам.
Статей на данную тему можно найти предостаточно, но я все-таки рискну написать ещё одну, авось вам понравится.
Немного теории
Интерфейс I2C (или по другому IIC) — это широко распространённый двухпроводный сетевой последовательный интерфейс, придуманный фирмой Philips более 30 лет назад и завоевавший популярность относительно высокой скоростью передачи данных (обычно до 100 кбит/с, в современных микросхемах до 400 кбит/с), дешевизной и простотой реализации.
Любое устройство на шине I2C может быть одного из двух типов: master (ведущий) или slave (ведомый). Как правило на шине только один master и одно или несколько slave-устройств, хотя это не строго обязательно – вполне можно иметь несколько мастеровых одновременно. Обмен данными происходит сеансами, которыми полностью управляет master: “начинает разговор”, “вызывает” нужного slave по его адресу и затем “дает ему слово”, если это требуется. Все ведомые устройства имеют уникальный номер – адрес, даже если такое устройство на всю сеть одно. Мастер номера не имеет. Ведомые молчат, слушают, что говорит ведущий и откликаются только тогда, когда ведущий их об этом напрямую просит, называя их по адресу, поэтому в сети всегда царит образцовый порядок (ну почти).
I2C позволяет подключать к одной шине до 127 slave-устройств одновременно, не используя дополнительного оборудования (если не считать двух подтягивающих резисторов), обращаясь к ним по 7-битному адресу (в некоторых реализациях адрес может быть и 10-битным, но это не наш случай). Но адреса slave-устройств на шине зачастую изменить нельзя, поэтому подключить к одной шине несколько однотипных устройств бывает сложно.
Картинка заимствована из статьи: https://3d-diy.ru/wiki/arduino-moduli/interfeys-peredachi-dannykh-i2c/. Не вижу смысла рисовать аналогичную, это лучшая иллюстрация в данном случае
Физическая реализация
Физически шина состоит из двух проводников (или линий):
- SCL или CLOCK (Serial CLock или Signal CLock) – эта линия (провод) служит для тактирования, то есть для управления передачей данных и согласования всех устройств между собой.
- SDA или DATA (Serial DAta или Signal DAta) – как и следует из названия, по этому проводу собственно и передаются данные.
Строго говоря, необходим как минимум ещё и третий провод — общий (или земля), но интерфейс принято называть двухпроводным по количеству сигнальных проводов. Да и питание на периферийные устройства зачастую подается с того же источника, что и на микроконтроллер, поэтому физически шина I2C может быть трехпроводной (без питания) или четырехпроводной (с питанием).
Источник: https://radiohlam.ru/i2c/
Подтягивающие резисторы должны быть подключены к той линии питания, на напряжение которой рассчитаны GPIO используемого микроконтроллера и подключенных устройств. Обычно это +5В или +3,3В, в зависимости от используемого микроконтроллера. Например для ESP32 и ESP8266 нельзя подключать подтягивающие резисторы к шине питания +5В, так как их GPIO рассчитаны на напряжение не более чем 3,7В, и это может привести к физическому повреждению микроконтроллера. Подробнее об согласовании уровней поговорим чуть ниже.
Используемые выводы
На разных МК (микроконтроллерах, он же MCU), выводы шины I2C могут быть разными. В качестве ориентира можно использовать следующую таблицу (источник: enjoyneering):
Плата | SDA | SCL | Питание |
Arduino Uno, Mini, Pro, ATmega168, ATmega328 | A4 | A5 | 5в |
Arduino Mega2560 | 20 | 21 | 5в |
Arduino Due, SAM3X8E | 20 | 21 | 3. |
Arduino Leonardo, Micro, ATmega32U4 | 2 | 3 | 5в |
Digistump, Trinket, ATtiny85 | PB0 | PB2 | 5в |
Blue Pill, STM32F103xxxx boards | PB9/PB7 (1) | PB8/PB6 (1) | 3.3в / 5в |
ESP8266 ESP-01 | GPIO0 (2) | GPIO2 (2) | 3.3в / 5в |
ESP8266 NodeMCU 1.0, ESP8266 WeMos D1 Mini | GPIO4/D2 | GPIO5/D1 | 3.3в |
ESP32 (Arduino framework) | GPIO21/D21 (3) | GPIO22/D22 (3) | 3.3в |
Примечания:
- Аппаратный I2C, сопоставленный с 1-Wire в stm32duino, см. https://github. com/stm32duino/wiki/wiki/API#i2c
- Большинство плат имеют подтягивающий резистор 10 кОм … 12 кОм на GPIO0/D3, GPIO2/D4/LED и подтягивающий резистор на GPIO15/D8 для прошивки и загрузки
- Только для Arduino. Для ESP-IDF выводы GPIO могут быть любыми, кроме того, можно использовать одновременно сразу две отдельные программные шины (#0 и #1).
Что хорошо при работе с данной шиной – на два вывода GPIO можно “повесить” целую гирлянду датчиков или других устройств и, тем самым, освободить кучу драгоценных GPIO.
Как выбрать номинал подтягивающего резистора
Подтягивающие резисторы должны иметь номинал от нескольких килоОм до нескольких десятков килоОм. Чем меньше номинал (сопротивление) резисторов – тем больше ток в сигнальных линиях, больше помехозащищенность шины, выше скорость передачи данных. Но, соответственно выше общее энергопотребление устройства, что может быть важно при батарейном (автономном) питании.
На многочисленных схемах в интернете можно найти рекомендации устанавливать резисторы 4,7кОм, 5,1кОм и даже 10кОм. Так какой же выбрать? Давайте посчитаем. Воспользуемся банальным законом Ома.
Для микроконтроллеров, рассчитанных на напряжение 5В, максимальная сила тока в линиях SDA и SCL при подтяжке к земле через транзисторы любого устройства составит:
- для 10 кОм – 5 / 10000 = 0,0005А или 0,5мА или 500мкА
- для 4,7 кОм – 5 / 4700 = ~0,00106А или 1мА
Между тем, рекомендованный ток подтяжки, по некоторым данным и даташитам, составляет от 1-3 мA (standard and fast mode). То есть при резисторах 10кОм мы получаем ток подтяжки в 2 раза меньше рекомендованного, при 4,7кОм – рекомендованный.
Будет работать? Конечно будет!
Повторюсь, это расчетная максимальная величина, на деле ток будет чуть ниже за счёт сопротивления канала транзистора. 500 микроампер, на мой взгляд, вполне нормальный ток для провода сравнительно небольшой длины, мало подверженного помехам.
Но при напряжении питания 3,3в, например для микроконтроллеров ESP8266 и ESP32, ток будет в ~1,5 раза ниже, то есть 330мкА (для 10 кОм) и ~700мкА (для 4,7 кОм). 330 мкА уже заметно ниже нормы. Но будет ли работать? Конечно будет! Но при небольших помехах и коротких проводах.
Дело в том, что при небольших токах в шине в дело вступает паразитная емкость между соединительными проводами. Строго говоря паразитная емкость она есть всегда, нигде она не прячется, просто при небольших токах она оказывает большее влияние на переходные процессы.
Для тока частотой 100 кГц (стандартная частота работы шины) трех- или четырхпроводный кабель, по сути, является конденсатором. Не самым банальным и простым, но все же конденсатором:
Упрощенное представление соединения между устройствами
И чем выше паразитная емкость между проводами, в том числе между сигнальными линиями и “землей” или “питанием”, тем больше тока при переключениях уровня будет “уходить впустую”, рассеиваясь в “конденсаторах”. Это приведет к тому, то крутизна фронтов и спадов импульсов будет сильно искажаться, и вместо теоретически прямоугольных импульсов мы получим нечто такое:
На самом деле здесь взята иллюстрация нормальной работы из какого-то datasheet-а. Но при больших потерях спады и фронты импульсов будут еще плавнее.
Что, конечно же, приведет к различным сбоям и помехам на шине.
Стандарт шины предусматривает общую паразитную емкость между линиями шины в стандартном режиме (100 кбит/с) не более 400 пикоФарад, а в более высокоскоростных режимах может быть и ещё меньше:
Источник: https://en.wikipedia.org/wiki/Two-wire_interface
Кроме того, возможны перекрестные наводки сигнала SCL на линию SDA и наоборот (как в банальном трансформаторе). На практике это приводит к тому, что максимальная физическая длина проводов шины I2C составляет несколько метров (без применения специальных устройств, о них ниже).
Подведем итоги. Существуют обоснованные рекомендации по выбору резисторов подтяжки в зависимости от напряжения питания, паразитной емкости и скорости работы шины:
Слева зависимость максимального сопротивления подтяжки от суммарной паразитной емкости проводов шины, справа – минимальное допустимое значение в зависимости от напряжения питания. Выбирайте значение в указанных пределах, балансируя между потребляемым током и надежностью работы.
На практике в своих устройствах я ставлю резисторы подтяжки не более 5,1кОм, так как использую в основном трехвольтовые контроллеры от Espressif. С учетом, что на некоторых шилдах сенсоров уже стоят подтягивающие резисторы 10кОм, которые в таком случае будут включены параллельно “моим” (и общее сопротивление снизится) – в самый раз.
Борьба с помехами на шине I2C
Бывают случаи, особенно когда нужно “отодвинуть” какой-либо сенсор подальше от устройства, начинают наблюдаться различные помехи и сбои – ошибки CRC (контрольной суммы при передаче), “приходят” неверные данные, устройства “не слушаются”.
В этом случае в первую очередь стоит попробовать снизить номинал подтягивающих резисторов, например до 1 кОм при 3,3В (для 3В это вполне допустимый вариант). Увеличение тока до ~ 3 мА позволит выправить крутизну импульсов за счет более быстрой перезарядки паразитной емкости и наладить работу шины. Но сильно увлекаться этим не стоит – дабы не “спалить” микроконтроллер или периферийное устройство (например сенсор). Допустимый ток через вывод GPIO для ESP32 составляет аж 40 миллиампер, но я далеко не уверен, что подключенное slave-устройство выдержит такое издевательство.
Как вариант можно попробовать снизить частоту шины, если ваше программное обеспечение это позволяет. Это уменьшит скорость передачи данных, но для чтения данных о температуры с сенсоров высокая скорость не всегда и нужна. Зато это уменьшит помехи, если они вызваны большой емкостью шины. Пробовал, в моем случае не очень сильно, но все-таки помогло. Кардинально решил заменой кабеля.
Очень важное значение может иметь кабель и расположение жил в кабеле. Например 4-проводный плоский “телефонный” кабель плохо подходит для шины I2C – особенно при расположении SDA и SCL “рядом” (например желтый и зеленый на рисунке ниже), в этом случае помехи начинаются уже от ~1 м. Для лучшей стабильности следует располагать линии SCL и SDA по краям кабеля, а внутренние жилы использовать для питания и общего провода, это позволит существенно подавить перекрестные наводки.
Я использую так: желтый – SCL, черный – SDA, красный – питание, зеленый – общий
Как ни странно, обычная 8-проводная “витая пара” (так называемый UTP-кабель) на практике довольно хорошо подходит для подключения различных I2C устройств и сенсоров, но при этом следует учитывать расположение жил в кабеле для лучшей работы! Не следует использовать одну и ту же перекрученную пару для SCL и SDA – в этом случае возникают сильные перекрестные помехи (перекрученная пара работает как трансформатор). Лучше использовать одну пару для SCL + “питание”, вторую как SDA + “земля”. Это сильно снизит перекрестные помехи и улучшит работу. Если у вас имеется кабель категории 6 (с сердечником внутри, разделяющим пары), то это даст ещё более лучшие результаты.
Если длина проводов относительно невелика, а помехи всё же присутствуют, то скорее всего причина этому – некачественный блок питания, который дает слишком сильные помехи на всё устройство, в том числе и на шину. Уменьшение резисторов тут уже ничего не дает. Попробуйте его заменить на заведомо исправный, если проблемы прекратятся – причина именно в нём.
Удлинение шины
Если нужно существенно “удлинить” шину, придется применять спецсредства – например специализированные микросхемы типа PCA9615 или P82B715. Они позволяют существенно поднять напряжение и токи внутри “физической шины” и тем самым снизить потери и помехи. Но это дается за счет очень существенного дополнительного энергопотребления, разумеется. За счет этого можно “удлинить” шину до 20 метров.
Типовая схема включения. Ток в линиях связи может достигать ~10мА. Обратите внимание на разделение проводов по парам – как раз об этом я и писал выше. Но вот подтягивать локальные SDA и SCL к 5В при трехвольтовом контроллере я б не стал. Преобразователи уровней копейки стоят
Нужно расстояние больше? Используйте сенсоры или устройства на шине RS232 или RS485, но это отдельная тема для разговора.
Подключение готовых модулей сенсоров с уже установленными резисторами подтяжки
Чаще всего в любительской практике используются I2C устройства, уже распаянные на миниплатах – модулях. Как правило, на таких модулях уже установлены резисторы подтяжки, например такие:
Плата сенсора с уже установленными резисторами 10 кОм
В этом случае резисторы рядом с MCU можно и не устанавливать. Тем более, когда вы планируете подключить к одной шине 2-3 или более устройств – в этом случае иногда придется выпаять или сдуть феном часть лишних подтягивающих резисторов с плат сенсоров. Иногда резисторы подтяжки выполнены отключаемыми, как на примере ниже, что позволяет задействовать их только при необходимости:
Здесь резисторы подтяжки 4,7кОм можно подключить или отключить с помощью капельки припоя
Сенсоры с встроенными стабилизаторами и согласователями логических уровней
При заказе сенсоров следует обращать особое внимание на то, на какое напряжение рассчитан тот или иной модуль. Почти все чипы (микросхемы) рассчитаны на напряжение питания не выше 3,6В. Но популярные платы Arduino работают с напряжением питания 5В, поэтому подключать такие сенсоры напрямую к 5-вольтовой логике нельзя. Для решения этой проблемы китайцы наладили выпуск пятивольтовых модулей с встроенным стабилизатором и устройством согласования уровней, например таких:
Две версии модуля с BME280 – маленькая 5В и большая 3.3В
В этом случае на плату (шилд) дополнительно устанавливается стабилизатор, который понижает напряжение питания для сенсора до положенных 3,3В. Беда в том, что стабилизатор греется, и может вносить погрешность в данные температуры.
Но и это еще не всё! Стабилизатор понизит напряжение на выводе питания сенсора, но вот на выводах SCL и SDA по прежнему останется 5В (если ничего не предпринимать), что может привести к выводу сенсора из строя даже при корректном напряжении питания. Дабы решить эту проблему, на плату устанавливается преобразователь логических уровней на двух полевых транзисторах по следующей схеме:
Классическая схема сопряжения уровней. Источник: Яндекс Картинки
Более подробно об согласовании логических уровней советую почитать тут, очень подробно всё расписано.
Схема модуля сенсора AHT10
То есть такие сенсоры можно смело и безопасно подключать к платам Arduino, да и резисторы подтяжки на них уже имеются.
Вопрос: можно ли такой пятивольтовый шилд подключать к трехвольтовым контроллерам типа ESP8266 или ESP32?
Можно, конечно. Некоторые сенсоры, например AHTxx, только со стабилизатором и продаются. Стабилизатор, конечно, немного “просадит” напряжение питания, но это не страшно, так как большинство популярных чипов сенсоров способно работать при напряжении питания уже от 1,7В. Работать будет даже немного лучше, так как стабилизатор почти не будет греться.
Только не стоит подключать такой модуль к питанию 5В, если ваш MCU рассчитан на 3.3В! В этом случае через резисторы подтяжки ex (R3 и R4 на схеме выше) на выводы вашего контроллера поступит поданное на модуль напряжение до стабилизатора, то есть 5В, что явно не пойдет ему на пользу.
Протокол передачи данных
С “физикой” процесса, надеюсь, разобрались, теперь самое время обсудить программную сторону вопроса – каким образом данные передаются по шине. Давайте разберемся хотя бы в общих чертах, как работает протокол I2C, это поможет правильно пользоваться им, понимая, что и в каком порядке происходит в недрах устройств.
Каждый сеанс обмена начинается с подачи master-ом стартового сигнала S (иногда называемого стартовым битом или стартовым условием или командой). “Стартовый бит” — это изменение уровня на линии SDA с высокого на низкий, но только при наличии высокого уровня на линии SCL. И наоборот – изменение уровня на линии SDA с низкого на высокий при наличии высокого уровня на линии SCL является стоп-сигналом P, означающим конец сеанса связи. Все, что происходит между этими событиями, называется “сообщением”, то есть собственно и есть передача данных. Обратите внимание: переключение уровней на линии SDA во время передачи данных всегда должно происходить только при низком уровне на линии SCL.
Источник: https://3d-diy.ru/wiki/arduino-moduli/interfeys-peredachi-dannykh-i2c/
После подачи “старт-сигнала” первым делом master должен сказать, с кем он хочет пообщаться и указать, что именно он хочет — передавать данные в устройство или читать их из него. Для этого он выдаёт на шину 7-ми битный адрес slave-устройства, с которым хочет общаться, и один бит, указывающий направление передачи данных: 0 — если от master к slave или 1 — если от slave к master. Первый байт после подачи “старт-сигнала” всегда всеми воспринимается как адресация.
Структура пакета данных на шине I2C. Источник: https://3d-diy.ru/wiki/arduino-moduli/interfeys-peredachi-dannykh-i2c/
После этого все slave-устройства на шине сверяют запрошенный адрес со своим, и если адрес совпал, ответить отправкой одного единственного бита подтверждения ACK, который означает “я здесь, все хорошо”. Ответить должно только запрошенное устройство, все остальные тупо молчат. Если бит ACK не вернулся, master-устройство понимает, что запрашиваемое устройство отсутствует на шине или “ушло в глухую несознанку”.
Есть ещё бит отсутствия подтверждения NACK, который может сигнализировать об занятости устройства (например идет измерение), или о том, что получатель хочет закончить передачу или же о том, что команда, посланная master-ом, почему-то не была выполнена.
После получения подтверждения master-устройство начинает отправку порции данных в 8 бит (1 байт), называемых кадром или пакетом. Это если планировалась передача данных master -> slave. Если же master хочет получить данные, то сразу после отправки первого бита ASC он ждет первый кадр данных от slave без каких-либо задержек. В ответ принимающая сторона должна отправить бит ASC в качестве подтверждения передачи кадра. Затем идет передача следующего байта / кадра и так далее. В конце сеанса связи вместо ASC отправляется NACK.
Когда все данные успешно переданы master отправляет “стоп-бит” для завершения сеанса.
Пожалуй лучшая иллюстрация процесса, что я нашел по данной теме:
Источник: https://radiohlam.ru/i2c/
На схеме выше изображен “идеальный” вариант – только прием или только передача. На практике же чаще используется комбинированный вариант, когда мастер всегда начинает работу с режима передачи master->slave, и первым делом самолёты передаёт номер регистра, из которого он хотел бы получить данные, и затем сразу же переходит “на прием”. Ведомое же устройство, получив адрес запрашиваемого регистра, в свою очередь начинает передачу данных. Это может происходить в рамках одного сеанса связи:
- start
- address + write
- send register
- read data
- stop
Но иногда необходимо время между запросом данных из регистра и их отправкой ведомым (например на время измерения). В этом случае информация передается за два сеанса:
- start
- address + write
- send register
- stop
пауза на время измерения
- start
- address + read
- read data
- stop
В разных источниках и даташитах эти самые регистры могут называться по разному – регистр, адрес, команда и т.д. Но по сути это одно и то же.
Вот собственно и всё, о чем я хотел вам поведать, прежде чем рассказывать о работе с шиной I2C из ESP-IDF. До встречи на сайте и на dzen-канале!
10.0 Электрические параметры устройств I2C – В помощь студентам БНТУ – курсовые, рефераты, лабораторные !
Электрические параметры ввода/вывода I2C-совместимых устройств и характеристики подключенных к ним линий шины приведены в таблицах 3 и 4 раздела 15. 0
I2C-устройства с фиксированными входными уровнями 1.5 В и 3 В могут иметь свои собственные питающие напряжения. Подтягивающие резисторы должны быть подключены к источнику 5 В ± 10% (рис. 21). I2C-устройства с входными уровнями, зависящими от напряжения питания должны иметь одну общую линию питания, к которой также должен быть подключен подтягивающий резистор (рис. 22).
Когда устройства с фиксированным входным уровнем смешаны с устройствами с относительным входным уровнем, последние должны быть подключены к одной общей линии питания 5 В ±10% и должны иметь подтягивающие резисторы, подключенные к SDA и SCL контактам как показано на рис 23.
Входные уровни определяются следующим образом:
- шумовая граница НИЗКОГО уровня есть 0.1 от напряжения питания
- шумовая граница ВЫСОКОГО уровня есть 0.2 от напряжения питания
Как показано на рис. 24, последовательно включенные резисторы Rs (например, 300 Ом) могут быть использованы для защиты от высоковольтных выбросов напряжения на линиях шины.
Рисунок 21. Подключение устройств с фиксированным входным уровнем к шине I2C
Рисунок 22. Подключение устройств с широким диапазоном питания к шине I2C
Рисунок 23. Подключение устройств с относительным (Vdd1) уровнем входного напряжения и фиксированным входным уровнем (Vdd2-4) к шине I2C
Рисунок 24. Последовательные резисторы Rs для защиты от высоковольтных выбросов
10.1 Максимальные и минимальные значения для резисторов Rp и Rs
Для I2C-устройств в стандартном режиме величины резисторов зависят от следующих параметров:
- Напряжение питания
- Емкость шины
- Количество подключенных устройств (входной ток + ток утечки)
Величина питающего напряжения ограничивает минимальное значение Rp вследствие ограниченного минимального тока выходных каскадов (3 мА) при Volmax=0.4 В. Vdd как функция Rpmin показана на рис. 25.
Желаемая шумовая граница 0.1Vdd для НИЗКОГО уровня ограничивает максимальное значение Rs. Rsmax как функция от Rp показано на рис. 25.
Емкость шины состоит из общей емкости проводов, подключенных портов и контактов. Эта емкость ограничивает максимальное значение Rp вследствие ограничений на время установления (фронта). Рис. 27 показывает Rpmax как функцию от емкости шины.
Максимальный ток при ВЫСОКОМ уровне для каждого порта не превышает 10 мкА. Вследствие желаемой шумовой границы 0.2Vdd для ВЫСОКОГО уровня, входной ток ограничивает максимальное значение Rp. Этот предел зависит от Vdd. Общий ток при ВЫСОКОМ уровне как функция от Rpmax показан на рис. 28.
Рисунок 25. Минимальное значение Rp как функция от напряжения питания при параметре Rs
Рисунок 26. Максимальное значение Rs как функция от Rp при параметре – Vdd
Рисунок 27. Максимальное значение Rp как функция от емкости шины для стандартного режима
Рисунок 28. Общий ток при напряжении ВЫСОКОГО уровня как функция максимального значения Rp при параметре – Vdd
9.0 7-битная адресация Назад
11.0 Дополнения к спецификации шины I2C Вперёд
Подтягивающие резисторы | Работа с устройствами I2C
Подтягивающие резисторы
Сохранить Подписаться
Пожалуйста, войдите, чтобы подписаться на это руководство.
После входа в систему вы будете перенаправлены обратно к этому руководству и сможете подписаться на него.
В качестве части электрического интерфейса I2C требуется пара подтягивающих резисторов, как показано на схеме выше. Есть два отдельных резистора:
- Один между ПДД и ВКК
- Один между SCL и VCC
Где VCC — логический уровень для контроллера и цели. Довольно часто это еще и мощность. Так, например, та же линия 3,3 В, которая питает целевое устройство.
Подтянуться к чему?
Как упоминалось выше, подтягивающие резисторы должны быть подключены к тому же напряжению, что и «логический уровень» устройства. Это не следует путать с напряжением питания. Общие значения для обоих составляют 5 В и 3,3 В.
Если “мощность” и “логический уровень” совпадают, 5В или 3,3В, то все просто. Обычно в игре присутствует только один уровень напряжения.
Иногда плата имеет «питание» 5 В (например, от порта USB), но «логический уровень» (напряжение на контактах GPIO) составляет 3,3 В. Это потенциально может привести к смешанным уровням напряжения, поскольку теперь в игре участвуют два напряжения. Различные процессоры имеют разные уровни терпимости к этому. Например, было замечено, что SAMD51 очень не любит линии I2C, подтянутые выше 3,3 В.
Где они?
Для автономной установки, такой как iPhone, подтягивающие резисторы могут быть расположены в любом удобном месте внутри самого iPhone. Все — хост-контроллер, все целевые устройства, проводка между ними и т. д. — все находится в одном блобе. Таким образом, подтягивающие резисторы находятся где-то в этом пятне.
Все становится немного сложнее, когда хост-контроллер и целевые устройства разделены. Это ситуация, которая обычно существует для Makers. Существует множество вариантов хост-контроллеров, например плата Raspberry Pi или Arduino. Также существует множество целевых устройств на базе I2C, например — все прорывы датчиков STEMMA. Где должны быть расположены подтягивающие резисторы в этом сценарии? К сожалению, стандарта нет. Так что все зависит. Но обычно есть только два варианта расположения подтягивающих резисторов:
- на хост-контроллере
- на целевом устройстве(ах)
Подтягивающие резисторы на хост-контроллере
Raspberry Pi является одним из примеров, когда подтягивающие резисторы расположены на хост-контроллере. Вот пример, показывающий подтягивающие резисторы I2C на схеме для Raspberry Pi 3 Model B+.
Недостатком этого является то, что всегда присутствуют подтягивающие резисторы. Поэтому, если кто-то захочет использовать контакты GPIO для чего-то другого, кроме I2C, подтягивающие резисторы все равно будут там, физически подключены к тем же контактам и могут вызвать потенциальные помехи.
Подтягивающие резисторы на целевом устройстве
Этот подход используется почти во всех прорывах Adafruit I2C. Вот пример, показывающий подтягивающие резисторы для версии STEMMA прорыва BMP280.
Недостатком этого подхода является различное эффективное значение сопротивления подтягиванию при подключении нескольких целевых устройств. Несколько наборов подтягивающих резисторов действуют параллельно и, таким образом, уменьшают общее подтягивающее сопротивление, наблюдаемое шиной I2C. Однако, как правило, это не проблема, так как I2C будет работать в довольно широком диапазоне значений сопротивления подтягивания.
Другим незначительным моментом является повышенная стоимость. Шине I2C требуется только один набор подтягивающих резисторов, независимо от того, сколько целевых устройств подключено. Таким образом, устанавливая резисторы на каждую коммутационную плату, возникает ненужная аппаратная избыточность.
Подтягивающие резисторы ни на
, ни наВполне возможно оказаться в ситуации, когда подтягивающие резисторы вообще не включены ни в контроллер, ни в целевое устройство. Возможно, прорыв датчика был разработан для контроллера, такого как Raspberry Pi, который имеет подтягивания. Или точные номиналы резисторов были оставлены на усмотрение конечного пользователя. Так что резисторы были сняты. Потом пробуют использовать такой прорыв с контроллером, вроде Метро, у которого тоже нет подтягиваний. Это не сработает.
В этой ситуации необходимо как-то добавить подтягивающие резисторы. Если все настроено на макетной плате, это можно сделать довольно легко. Например, AM2320 не имеет подтягивающих резисторов внутри корпуса. Таким образом, они должны быть добавлены извне, как показано здесь:
.Повторный запуск Конфликты адресов
Это руководство было впервые опубликовано 09 марта 2022 г. Оно было последним обновлено 09 марта 2022 г.
Эта страница (Подтягивающие резисторы) последний раз обновлялась 25 февраля 2022 г.
Текстовый редактор на базе tinymce.
I2C — SparkFun Learn
- Главная
- Учебники
- I2C
≡ Страниц
Авторы: SFUptownMaker
Избранное Любимый 130
Сигналы
Каждая шина I 2 C состоит из двух сигналов: SDA и SCL. SDA (Serial Data) — это сигнал данных, а SCL (Serial Clock) — это тактовый сигнал. Тактовый сигнал всегда генерируется текущим контроллером шины; некоторые периферийные устройства могут время от времени переводить часы на низкий уровень, чтобы задержать отправку контроллером дополнительных данных (или потребовать больше времени для подготовки данных, прежде чем контроллер попытается их синхронизировать). Это называется “ тактовая частота “и описана на странице протокола.
В отличие от соединений UART или SPI, драйверы шины I 2 C являются “открытым стоком”, что означает, что они могут тянуть соответствующую сигнальную линию в низкий уровень, но не могут управлять ею. Таким образом, не может быть конкуренции за шину, когда одно устройство пытается перевести линию в высокий уровень, а другое — в низкий, что устраняет возможность повреждения драйверов или чрезмерного рассеивания мощности в системе.Каждая сигнальная линия имеет резистор на нем, чтобы восстановить сигнал на высоком уровне, когда ни одно устройство не устанавливает его на низкий уровень. 0007
Обратите внимание на два подтягивающих резистора на двух линиях связи.
Выбор резистора зависит от устройств на шине, но рекомендуется начинать с 4,7 кОм; резистор и при необходимости отрегулируйте . I 2 C — достаточно надежный протокол, который можно использовать с короткими отрезками провода (2–3 м). Для больших пробегов или систем с большим количеством устройств лучше использовать меньшие резисторы.
Большинство устройств I 2 C, предлагаемых в каталоге SparkFun, обычно включают подтягивающие резисторы для контактов SCL и SDA. Если у вас много I 2 C устройств на одной шине, возможно, потребуется отрегулировать эквивалентное значение нагрузочных резисторов, отключив нагрузочные резисторы на нескольких устройствах. В зависимости от того, что подключено к шине и конструкции, на одну и ту же шину можно включить около 7x I 2 устройств C. Однако, если у вас возникли какие-либо проблемы, вы можете отрезать две дорожки, соединяющие центральную контактную площадку, с помощью канцелярского ножа или удалить припой с трех контактных площадок с помощью паяльника, чтобы отсоединить резисторы на некоторых платах. Как видите, в конструкции платы GPS слева использовались дорожки для подключения перемычек для подтягивающих резисторов. В конструкции платы GPS справа используется припой для соединения перемычек для подтягивающих резисторов.
Трассировка соединительных перемычек на SAM-M8Q | Пайка для соединения перемычек на XA1110 |
Если ваша конструкция требует более длинных отрезков провода, вы можете использовать специальную микросхему для расширения сигнала, такую как PCA9615, в следующих продуктах.
Руководство по подключению SparkFun QwiicBus
1 апреля 2021 г.
Создайте шумоизолированную шину I2C дальнего действия с помощью комплекта SparkFun QwiicBus, включающего QwiicBus EndPoint и MidPoint, следуя этому руководству по подключению.
Избранное Любимый 0
Сигнальные логические уровни
Так как устройства на шине фактически не выводят сигналы на высокий уровень, I 2 C обеспечивает некоторую гибкость при подключении устройств с различными входными/выходными напряжениями. В общем, в системе, где одно устройство находится под более высоким напряжением, чем другое, можно соединить два устройства через I 2 C без какой-либо схемы сдвига уровня между ними. Хитрость заключается в том, чтобы подключить подтягивающие резисторы к более низкому из двух напряжений. Это работает только в некоторых случаях, когда более низкое из двух системных напряжений превышает входное напряжение высокого уровня системы с более высоким напряжением, например, 5 В Arduino и 3,3 В акселерометра. В зависимости от конструкции Arduino или I 2 C, мы рекомендуем использовать преобразователь логического уровня, чтобы обеспечить согласованность и избежать повреждения какого-либо устройства на шине.
Если разница напряжений между двумя системами слишком велика (скажем, 5 В и 2,5 В), SparkFun предлагает простую плату переключения уровня I 2 C — например, Прорыв транслятора уровней PCA9306. Эта выделенная плата переключения уровней также включает в себя линию включения, которую можно использовать для отключения связи с выбранными устройствами.