Существует ли правильное значение сопротивления для подтягивающих резисторов I2C?


72

Лист данных 24EP256 EEPROM гласит:

Шине SDA требуется подтягивающий резистор для VCC (обычно 10 кОм для 100 кГц, 2 кОм для 400 кГц и 1 МГц).

Я думал, что любой резистор со значением кОм будет работать (и кажется, что моя ЭСППЗУ отлично работает на разных частотах с резистором 10 кОм).

Мои вопросы:

  • правильное ли значение для подтягивающих резисторов?
  • Есть ли закон / правило, чтобы определить это значение?
  • Как различные значения сопротивления влияют на шину данных I²C?

Несколько связано: electronics.stackexchange.com/q/76376/2028
JYelton

Ответы:


66

Правильное сопротивление подтягивания для шины I 2 C зависит от общей емкости шины и частоты, на которой вы хотите работать с шиной.

Формула из таблицы данных ATmega168 (которая, как мне кажется, основана на официальной спецификации I 2 C):

Freq<100kHzRmin=Vcc0.4V3mA,Rmax=1000nsCbus

Freq>100kHzRmin=Vcc0.4V3mA,Rmax=300nsCbus

Микросхема 24LC256 определяет максимальную емкость контактов 10 пФ (что довольно типично). Подсчитайте количество устройств, подключенных к шине параллельно, и используйте приведенную выше формулу для расчета диапазона значений, которые будут работать.

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

Я продаю некоторые комплекты с I 2 C RTC (DS1337). Я включаю резисторы 4K7 в комплект, что кажется разумным компромиссом для большинства пользователей.


Обычно я представляю, что шина простаивает (деактивируется) в подавляющем большинстве случаев, поэтому для применения с батареей есть более важные проблемы, чем попытка оптимизации подтягиваний I2C просто так: P
Nick T

5
Единственное, что я хотел бы добавить, это буфер выше суммарной емкости устройств на шине. Сама трассировка, а также паяные соединения от контактных площадок к контактам также будут иметь некоторое сопротивление. На более длинных шинах емкость трассы / провода может быть больше, чем емкость контактов устройств. При проектировании производственных плат я обычно не определяю окончательное значение подтягивания, пока у меня нет прототипа в руке, и я могу охватить шину различными значениями.
Отметить

14

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

Поэтому спецификация I2C дает максимальные значения для подтягивающих резисторов как функцию емкости шины для трех классов скорости:

введите описание изображения здесь

Минимальные значения определяются в зависимости от напряжения на шине и должны ограничивать ток через драйверы.


3
Спустя 3 года Texas Instruments написала примечание к приложению, которое достаточно близко по смыслу к этому ответу.
Ник Алексеев

EDN статья: Расчет конструкции для надежной связи I2C . [Просто накапливаю справочные материалы.]
Ник Алексеев

11

Существует правильный диапазон значений, однако трудно точно описать, что это за диапазон. Вообще 10к работает.

Цифровые выходы имеют заданную возможность источника или поглощения тока. Если ваш выход мог опуститься до 5 мА, а выход был подключен через напряжение до 5 В, а затем настроен на 0, вам потребуется сопротивление не менее 1 кОм. Если вы используете менее 1 кОм, выход не сможет потреблять достаточный ток, чтобы полностью вытащить контакт до 0 В. Если вы используете большее значение, например, 10 кОм, то для вывода требуется только 0,5 мА, что намного меньше его номинального значения.

Цифровые входы имеют указанный ток утечки. Это похоже на величину тока, которая требуется для «поддержания» 0 или 1 на входе. Если ваш подтягивающий резистор слишком велик, он не сможет преодолеть ток утечки. Если он едва преодолевает ток утечки, тогда любого шума в цепи может быть достаточно для изменения входа.

При использовании цифровых выходов, которые могут поглощать и источником тока («драйвер полюсного тотема», «двухтактный драйвер»), у вас может возникнуть соблазн не использовать подтягивающие или понижающие резисторы. Тем не менее, очень важно, чтобы входы CMOS не были допущены или они могли вытягивать чрезмерный ток ... и очень легко забыть, что двунаправленные выводы MCU обычно выступают в качестве входов!


I2C и другие подобные протоколы используют выходы «открытый сток» (или «открытый коллектор»). Вместо того, чтобы иметь выходы, которые могут тянуть вверх и вниз, а выходы с открытым стоком могут только тянуть вниз. Вот почему внешний подтягивающий резистор не требуется. В настоящее время существуют дополнительные ограничения на диапазон подтягивающих резисторов; значение подтягивания сформирует RC-цепь с емкостью шины. Слишком маленькое значение еще раз не позволит выходным драйверам понизить ток, достаточный для полного вытягивания контакта до 0. Однако слишком большое значение займет слишком много времени для зарядки емкости шины.

Если есть время настройки / удержания, которое вы не можете нарушать, это поможет вам определить постоянную времени RC. Емкость шины в значительной степени определяется компоновкой печатной платы, поэтому вы можете выбрать значение R, которое в сочетании с C обеспечивает значение, комфортно соответствующее времени установки / удержания для вашего цифрового входа.


7

Низкие значения подтягивания (более низкое сопротивление) могут улучшить границы сигнальных переходов, но иногда могут быть слишком жесткими - если устройства на шине не могут поглотить ток подтягивания, вы получаете логику «низкого уровня», которая на самом деле не настолько мала , что может вызвать ошибки связи (и много боли.)

Я бы пошел с самым высоким сопротивлением подтягиванию, которое дает вам надежную связь.


5

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


2

Проблема, о которой я еще не упоминал, - это энергопотребление. Если используется источник питания 3,3 В, резистор 3,3 К на землю будет тратить 1 мА тока (3,3 мВт мощности) всякий раз, когда на выходе низкий уровень. Использование резистора 10К уменьшит ток и мощность в три раза. Если на шине I2C будет много связи, это энергопотребление может в конечном итоге составить значительную часть общего расхода энергии, особенно если шина может оставаться на низком уровне в течение длительных периодов времени. Например, если кто-то читает 100 байтов в секунду, но после чтения каждого байта на шине остается устройство, выводящее первый бит следующего байта, и у большинства этих байтов MSB очищен, шина может потратить 90% время с низким уровнем SCL и SDA. В зависимости от того, что еще делает система, это может значительно увеличить потребление энергии.

Для экономии энергии может быть полезно иметь «подтягивающий» резистор, подключенный к выводу ввода-вывода, а не к VDD. Хотя я не видел, чтобы аппаратные реализации I2C предлагали поддержку для этого, наличие главных выходных данных на отдельном выводе ввода / вывода, который подключен к шине через резистор, а не использование драйвера с открытым коллектором и фиксированного подтягивающего резистора, позволит избежать тратить ток, когда мастер хочет вывести «0». Кроме того, если мастер собирается на некоторое время оставить низкий уровень SCK, не заботясь о том, что находится на SDA, мастер может отключить подтягивание до тех пор, пока он не будет готов к дальнейшему общению. Если ни одно из устройств не нуждается в растягивании тактового сигнала, мастер может просто использовать прямой выход для SCK и не беспокоиться о каком-либо подтягивании этого провода.

Если кто-то использует программную синхронизацию битов с быстрым процессором и хочет получить хорошую производительность, несмотря на высокую емкость шины, вышеуказанный подход может быть объединен с использованием встроенных слабых подтягиваний процессора. При чтении данных включите очень сильное подтягивание на короткое время сразу после каждого падающего фронта SCK, а затем переключитесь на слабое подтягивание. Сильный подъем подтянет линию высоко, несмотря на емкость, и как только линия будет вытянута, слабый подтягивание сможет поддерживать ее на высоком уровне. Даже если у устройства возникнут проблемы с вытягиванием линии на низком уровне от сильного подтягивания, оно сможет это сделать после отключения сильного подтягивания.



-1

Здесь приведены формы сигнала, для 400 кбит / с (200 кГц, 101010 формы сигнала). RC составляет 4,7 кОм и 212 пФ. Значение RC позволяет установить 2 TAU.

введите описание изображения здесь


Этот ответ просто неверен. Тактовая частота 200 кГц дает 200 кбит / с, а не 400. Сопротивление подтягиванию влияет только на передние фронты. Графики выглядят запутанно, как будто происходит какая-то модуляция. Физические величины и их единицы записываются с пробелом (или тонким пространством) между ними. Тау - это символ, а не аббревиатура.
Венни

@venny Это типичные формы сигнала для автобуса, работающего слишком быстро для времени установления. С установлением только 2 TAU, нет плоской вершины для сигналов, следовательно, «какая-то модуляция»; будь это псевдослучайный паттерн, изменчивость расселения была бы очень очевидной; читать на «глаз данных». Наконец, тактовая частота 200 кГц имеет высокий уровень 2,5 мкс, а низкий - 2,5 мкс; период 2.5uS - это именно те данные 400 кГц, о которых я упоминал.
аналоговые системы
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.