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

Шина 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 может быть трехпроводной (без питания) или четырехпроводной (с питанием).

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

Источник: 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
Arduino Mega2560 20 21
Arduino Due, SAM3X8E 20 21 3.3в
Arduino Leonardo, Micro, ATmega32U4 2 3
Digistump, Trinket, ATtiny85 PB0 PB2
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в

Примечания:

  1. Аппаратный I2C, сопоставленный с 1-Wire в stm32duino, см. https://github.com/stm32duino/wiki/wiki/API#i2c
  2. Большинство плат имеют подтягивающий резистор 10 кОм … 12 кОм на GPIO0/D3, GPIO2/D4/LED и подтягивающий резистор на GPIO15/D8 для прошивки и загрузки
  3. Только для Arduino. Для ESP-IDF выводы GPIO могут быть любыми, кроме того, можно использовать одновременно сразу две отдельные программные шины (#0 и #1).

Что хорошо при работе с данной шиной – на два вывода GPIO можно “повесить” целую гирлянду датчиков или других устройств и, тем самым, освободить кучу драгоценных GPIO.


 

Как выбрать номинал подтягивающего резистора

Подтягивающие резисторы должны иметь номинал от нескольких килоОм до нескольких десятков килоОм. Чем меньше номинал (сопротивление) резисторов – тем больше ток в сигнальных линиях, больше помехозащищенность шины, выше скорость передачи данных. Но, соответственно выше общее энергопотребление устройства, что может быть важно при батарейном (автономном) питании.

На многочисленных схемах в интернете можно найти рекомендации устанавливать резисторы 4,7кОм, 5,1кОм и даже 10кОм. Так какой же выбрать? Давайте посчитаем. Воспользуемся банальным законом Ома.

Для микроконтроллеров, рассчитанных на напряжение , максимальная сила тока в линиях 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В (если ничего не предпринимать), что может привести к выводу сенсора из строя даже при корректном напряжении питания. Дабы решить эту проблему, на плату устанавливается преобразователь логических уровней на двух полевых транзисторах по следующей схеме:

Классическая схема сопряжения уровней. Источник: Яндекс Картинки

Полная схема сопряжения трех-вольтовых устройств с пяти-вольтовым контроллером может выглядеть так:

Схема подключения 3,3В-устройств к микроконтроллеру 5В

Более подробно об согласовании логических уровней советую почитать тут, очень подробно всё расписано

Очень часто преобразователи уровней уже установлены на шилдах сенсоров, и вам не нужно ничего паять самостоятельно. Классическим примером может служит сенсор AHT10, у него почти всегда присутствует схема сопряжения на шилде:

Схема модуля сенсора AHT10

То есть такие сенсоры можно смело и безопасно подключать к платам Arduino, да и резисторы подтяжки на них уже имеются.

Вопрос: можно ли такой пятивольтовый шилд подключать к трехвольтовым контроллерам типа ESP8266 или ESP32?

Можно, конечно. Некоторые сенсоры, например AHTxx, только со стабилизатором и продаются. Стабилизатор, конечно, немного “просадит” напряжение питания, но это не страшно, так как большинство популярных чипов сенсоров способно работать при напряжении питания уже от 1,7В. Работать будет даже немного лучше, так как стабилизатор почти не будет греться.

Только не стоит подключать такой модуль к питанию 5В, если ваш MCU рассчитан на 3.3В! В этом случае через резисторы подтяжки ex (R3 и R4 на схеме выше) на выводы вашего контроллера поступит поданное на модуль напряжение до стабилизатора, то есть 5В, что явно не пойдет ему на пользу.

Если вам по какой-то причине потребуется подключить пяти-вольтовые устройства к ESP8266 или ESP32, например, то советую случае советую вам применить описанную выше схему в зеркальном отражении:

Схема подключения 5В-устройств к микроконтроллеру 3,3В

Эта схема позволяет подключать, например, LCD2004 и LCD1602 в пяти-вольтовом исполнении к ESP без переделок LCD.

 


 

Протокол передачи данных

С “физикой” процесса, надеюсь, разобрались, теперь самое время обсудить программную сторону вопроса – каким образом данные передаются по шине. Давайте разберемся хотя бы в общих чертах, как работает протокол 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 отправляет “стоп-бит” для завершения сеанса.

Чтение данных мастером

Запись данных мастером

 

На схеме выше изображен “идеальный” вариант – только прием или только передача. На практике же чаще используется комбинированный вариант, когда мастер всегда начинает работу с режима передачи master->slave, и первым делом самолёты передаёт номер регистра, из которого он хотел бы получить данные, и затем сразу же переходит “на прием”. Ведомое же устройство, получив адрес запрашиваемого регистра, в свою очередь начинает передачу данных. Это может происходить в рамках одного сеанса связи:

  • start
  • address + write
  • send register
  • read data
  • stop

Запрос данных с ведомого устройства

Но иногда необходимо время между запросом данных из регистра и их отправкой ведомым (например на время измерения). В этом случае информация передается за два сеанса:

  • start
  • address + write
  • send register
  • stop

пауза на время измерения

  • start
  • address + read
  • read data
  • stop

В разных источниках и даташитах эти самые регистры могут называться по разному – регистр, адрес, команда и т.д. Но по сути это одно и то же.

 


На этом пока всё, до встречи на сайте и на telegram-канале

💠 Полный архив статей вы найдете здесь


Пожалуйста, оцените статью:
[ 4.8 из 5, всего 8 оценок ]

16 комментариев для “Шина I2C: принципы функционирования или зачем ещё тут нужны какие-то резисторы?”

  1. Огромное спасибо за статью! Очень многое прояснило с этими резисторами подтяжки))
    но все таки я не могу понять:
    ESP32 3.3В и некая микросхема с I2C и питанием 5В – как в таком случае подключать подтягивающие резисторы?
    где-то на просторах интернета на ардуино форумах читал, что I2C в ESP32 толерантны к 5В…

    1. Но во первых, согласно datasheet-у на ESP32 (4.3 DC Characteristics), выводы GPIO рассчитаны на напряжение не более чем VDD+0.3, то есть по максимуму это будет 3.6+0.3=3.9В. Толерантны-то они может и толерантны, но это означает что они выдержат 5В, но далеко не факт что будут работать.
      Что и подтверждается на практике, вот на этой плате https://kotyara12.ru/iot/esp32r4v3/ китаезы тоже видимо решили, что “толерантны” и вывели на разъемы I2C 5 вольт вместо 3,3. И половина устройств на шине отказалась при этом тупо работать. Просто тупо не отвечали и все. Делайте выводы сами. Хотя, есть люди, которым даташиты не указ, но что ж…
      А поступать просто – включать через схему согласователя уровней, он же есть в статье. Например, купить готовые модули, или спаять самому на полевичках. Вот например я подключал пятивольтовый LCD2004 к трехвольтовой ESP32: https://dzen.ru/media/kotyara12/brakovannye-preobrazovateli-urovnei-s-aliexpress-6467314132cb6e328929b33e

  2. Спасибо за статью! Очень познавательно. Прошу прояснить некоторое затруднение. Можно ли вместо резисторов подтяжки использовать батарейки или аккумуляторы, как источники противо-ЭДС? Заранее спасибо.

    1. Чисто теоретически – да. Но резисторы все равно нужны, иначе просто спалите либо контроллер, либо slave-устройство. И напряжение “батареек” должно соответствовать допустимому напряжению на шине.

      1. Георгий

        Спасибо за ответ. Сейчас думаю над одним проектом. В числе прочего пытаюсь бороться с резисторами. К примеру, если напряжение открытых коллекторов VCC 5 Вольт, то можно поставить батарейку, тоже, на 5 Вольт. Она ослабит ток до допустимых значений?

        1. Нет конечно. У батарейки довольно низкое внутреннее сопротивление, она сразу же “отдаст” приличный ток, спалит чувствительную электронику и успокоится.
          А зачем, простите, бороться с резисторами? Рассеиваемая мощность на них минимальная. Можете сами легко посчитать, по закону Ома. Но это только если ток течет всегда.
          И эта мощность рассеивается только в моменты передачи данных. Ну допустим, на SCL всегда идут импульсы, но и там скважность не более 0,5. То есть реальное рассеивание будет еще меньше как минимум в 2 раза.

          1. Георгий

            То есть, даже, как источник противо-ЭДС не ослабит? Жалко. Спасибо.

            1. Ну смотрите. Допустим питание шины 5В. Резисторы вы выбрали 10К.

              Тогда максимальный ток будет: 5 В / 10000 Ом = 0,0005 А, то есть всего 500 мкА. Тогда рассеиваемая мощность 0,0005 * 5 = 0,0025 Вт или 2,5 мВт.
              И это при условии, что на шине ВСЕГДА низкий уровень. Но такое невозможно. Допустим, что скважность импульсов 1/2 (это максимум).
              Тогда реальная рассеиваемая мощность на одном резисторе будет не выше 1,25 милливатт, а скорее всего меньше 1 мВт.

              Хотите меньше? Если вы скажем экранчик хотите подключить на шину IIC. Он всегда будет находится на расстоянии 5 см от МК. В этом случае безболезненно можно увеличить резисторы скажем до 47к и в 5 раз уменьшить рассеиваемую мощность. Так как емкость шины будет мизерной и проблем не предвидится.

              Считайте, думайте. Электроника – это всегда расчеты, хотя и вольности в цифровой электронике иногда вполне допустимы.

    2. Георгий

      Спасибо, большое! Я как раз о вольностях задумался. Дело не меньшей рассеиваемой мощности на резисторе, а в избавлении от резисторов с помощью батареек (или аккумуляторов). К примеру размера таблетки. Но раз не получиться снизить ток на открытых коллекторах, то буду думать что-то ещё.

      1. Тогда можно поискать внутреннюю схему PCF8574, там на выходах как раз источник стабильного тока на 100 мкА “со срывом” применен, можно посмотреть как оно реализовано. Но, боюсь, резисторов и там хватает

        1. Георгий

          Спасибо за ссылку! Вообще, есть стремление сделать цап для аудио применения. Для себя. Усилитель сделал. Очередь идошла до источника. Есть два пути: с помощью плиса и готовых мультибитников с соответствующим выходом, Или dsd в чистом виде, как здесь: https://www.audiodesignguide.com/DSC1/index.html, и здесь: https://puredsd.ru.
          Но хочется понять, возможно ли сделать подобное с помощью ферритовой памяти, как в старых эвм? Чтобы были провода и биаксы.

    3. Спасибо за труды.
      Но что-то у меня не выходит использовать приложенную либу…

      Использую attiny85, порты поменял на PORB0 для sda, и PORB2 для scl (уже распаяны были – пытался TWI реализовать), подключаю mini ds3231 module (RTC). Пока все, что делаю – передаю адрес и слушаю ack:

      “`
      i2c_init();
      i2c_start();

      long int address = 0x11010000;
      int addrResult = i2c_send_byte(address);
      indicate(addrResult);
      “`

      Получаю “1” – согласно .h файлу – это `NACK`… Есть идеи, что не так может быть?

        1. почему? вроде ничего аппаратнозависимого в коде нет, но мнение принял, поищу что-то специализированное, спасибо

          1. Моя либа – это даже не полноценная либа, а “обёртка” для базового api esp32. Причём в ESP-IDF 5.0 производитель во многом внедрил в базовое api функции очень схожие с моими. Видимо, напрашивалось самой собой. Так что моя теперь стала не очень актуальной.

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

    Ваш адрес email не будет опубликован. Обязательные поля помечены *