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

В техническом описании EEPROM 24LC256 указано, что:

  

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

Я думал, что любой резистор с значением kÎ © выполнит эту работу (и кажется, что мой EEPROM отлично работает на разных частотах с резистором 10 кОк).

Мои вопросы:

  • есть ли правильное значение для подтягивающих резисторов?
  • существует ли закон /правило для определения этого значения?
  • как разные значения сопротивления влияют на шину данных I²²?
62 голоса | спросил JonathanD 13 MarpmSat, 13 Mar 2010 16:36:33 +03002010-03-13T16:36:33+03:0004 2010, 16:36:33

8 ответов


56

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

Формула из ATmega168 datasheet (которая, как мне кажется, исходит от официального I 2 C spec) -

$$ \ text {Freq} <100 \ text {kHz} \ подразумевает R _ {\ text {min}} = \ frac {V_ {cc} -0.4 \ text {V}} {3 \ text {mA }}, R _ {\ text {max}} = \ frac {1000 \ text {ns}} {C_ {\ text {bus}}} $$

$$ \ text {Freq}> 100 \ text {kHz} \ подразумевает R _ {\ text {min}} = \ frac {V_ {cc} -0.4 \ text {V}} {3 \ text {mA }}, R _ {\ text {max}} = \ frac {300 \ text {ns}} {C_ {\ text {bus}}} $$

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

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

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

ответил jluciani 13 MarpmSat, 13 Mar 2010 18:27:32 +03002010-03-13T18:27:32+03:0006 2010, 18:27:32
13

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

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

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

<p> Минимальные значения определяются функцией напряжения шины и должны ограничивать ток через драйверы. </p></div>
										<div class=ответил stevenvh 27 AMpFri, 27 Apr 2012 10:32:03 +040032Friday 2012, 10:32:03

8

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

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

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

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


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

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

ответил ajs410 4 +04002010-10-04T22:48:32+04:00312010bEurope/MoscowMon, 04 Oct 2010 22:48:32 +0400 2010, 22:48:32
6

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

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

ответил Adam Lawrence 2 +04002010-10-02T02:27:07+04:00312010bEurope/MoscowSat, 02 Oct 2010 02:27:07 +0400 2010, 02:27:07
5

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

ответил endolith 14 MaramSun, 14 Mar 2010 01:40:54 +03002010-03-14T01:40:54+03:0001 2010, 01:40:54
1

Минимальное значение резистора зависит от возможностей движения двух сторон шины. Например, они приводят 10 мА, поэтому ваше значение резистора должно быть больше, чем \ $ \ frac {V_ {bus}} {10 ~ mA} \ $. Это не точное значение резистора, это зависит от вашей емкости шины. Вы можете проверить значение резистора, правильно оно или нет, путем измерения времени нарастания времени и падения импульсов шины. Эти значения времени можно найти в следующей ссылке:

http://www.cypress.com/knowledge-base-article/rise-and-fall-time-specifications-scl-and-sda-lines-i2c

ответил mr. derecik 23 +03002016-10-23T16:49:59+03:00312016bEurope/MoscowSun, 23 Oct 2016 16:49:59 +0300 2016, 16:49:59
0

Вот формы сигналов, для 400kiloBits /second (200KHz 101010 waveform). RC составляет 4.7K Ом ​​и 212pF. Значение RC позволяет выполнить 2 TAU.

 введите описание изображения здесь>> </a> </p></div>
					 
						<div class=

ответил analogsystemsrf 3 J000000Monday17 2017, 20:12:40
0

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

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

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

ответил supercat 3 J000000Monday17 2017, 20:56:46

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132