Лист данных 24EP256 EEPROM гласит:
Шине SDA требуется подтягивающий резистор для VCC (обычно 10 кОм для 100 кГц, 2 кОм для 400 кГц и 1 МГц).
Я думал, что любой резистор со значением кОм будет работать (и кажется, что моя ЭСППЗУ отлично работает на разных частотах с резистором 10 кОм).
Мои вопросы:
- правильное ли значение для подтягивающих резисторов?
- Есть ли закон / правило, чтобы определить это значение?
- Как различные значения сопротивления влияют на шину данных I²C?
Ответы:
Правильное сопротивление подтягивания для шины I 2 C зависит от общей емкости шины и частоты, на которой вы хотите работать с шиной.
Формула из таблицы данных ATmega168 (которая, как мне кажется, основана на официальной спецификации I 2 C):
Микросхема 24LC256 определяет максимальную емкость контактов 10 пФ (что довольно типично). Подсчитайте количество устройств, подключенных к шине параллельно, и используйте приведенную выше формулу для расчета диапазона значений, которые будут работать.
Если вы отключаете батареи, я бы использовал значения, которые находятся на верхнем уровне диапазона. Если в микросхемах нет ограничений мощности источника питания или рассеивания мощности, я бы использовал значения в нижней части диапазона.
Я продаю некоторые комплекты с I 2 C RTC (DS1337). Я включаю резисторы 4K7 в комплект, что кажется разумным компромиссом для большинства пользователей.
источник
Имеет смысл, что более высокие частоты требуют подтягиваний с более низким сопротивлением: более низкое сопротивление будет заряжать / разряжать емкость кабеля быстрее, что приводит к более крутым краям. С более широкими импульсами более низких частот менее крутой фронт не будет сильно влиять на форму импульса.
Поэтому спецификация I2C дает максимальные значения для подтягивающих резисторов как функцию емкости шины для трех классов скорости:
Минимальные значения определяются в зависимости от напряжения на шине и должны ограничивать ток через драйверы.
источник
Существует правильный диапазон значений, однако трудно точно описать, что это за диапазон. Вообще 10к работает.
Цифровые выходы имеют заданную возможность источника или поглощения тока. Если ваш выход мог опуститься до 5 мА, а выход был подключен через напряжение до 5 В, а затем настроен на 0, вам потребуется сопротивление не менее 1 кОм. Если вы используете менее 1 кОм, выход не сможет потреблять достаточный ток, чтобы полностью вытащить контакт до 0 В. Если вы используете большее значение, например, 10 кОм, то для вывода требуется только 0,5 мА, что намного меньше его номинального значения.
Цифровые входы имеют указанный ток утечки. Это похоже на величину тока, которая требуется для «поддержания» 0 или 1 на входе. Если ваш подтягивающий резистор слишком велик, он не сможет преодолеть ток утечки. Если он едва преодолевает ток утечки, тогда любого шума в цепи может быть достаточно для изменения входа.
При использовании цифровых выходов, которые могут поглощать и источником тока («драйвер полюсного тотема», «двухтактный драйвер»), у вас может возникнуть соблазн не использовать подтягивающие или понижающие резисторы. Тем не менее, очень важно, чтобы входы CMOS не были допущены или они могли вытягивать чрезмерный ток ... и очень легко забыть, что двунаправленные выводы MCU обычно выступают в качестве входов!
I2C и другие подобные протоколы используют выходы «открытый сток» (или «открытый коллектор»). Вместо того, чтобы иметь выходы, которые могут тянуть вверх и вниз, а выходы с открытым стоком могут только тянуть вниз. Вот почему внешний подтягивающий резистор не требуется. В настоящее время существуют дополнительные ограничения на диапазон подтягивающих резисторов; значение подтягивания сформирует RC-цепь с емкостью шины. Слишком маленькое значение еще раз не позволит выходным драйверам понизить ток, достаточный для полного вытягивания контакта до 0. Однако слишком большое значение займет слишком много времени для зарядки емкости шины.
Если есть время настройки / удержания, которое вы не можете нарушать, это поможет вам определить постоянную времени RC. Емкость шины в значительной степени определяется компоновкой печатной платы, поэтому вы можете выбрать значение R, которое в сочетании с C обеспечивает значение, комфортно соответствующее времени установки / удержания для вашего цифрового входа.
источник
Низкие значения подтягивания (более низкое сопротивление) могут улучшить границы сигнальных переходов, но иногда могут быть слишком жесткими - если устройства на шине не могут поглотить ток подтягивания, вы получаете логику «низкого уровня», которая на самом деле не настолько мала , что может вызвать ошибки связи (и много боли.)
Я бы пошел с самым высоким сопротивлением подтягиванию, которое дает вам надежную связь.
источник
Для низких частот это значение не имеет большого значения, но для высоких частот оно может оказывать фильтрующее влияние на сигнал в сочетании с другими емкостями в цепи, поэтому они рекомендуют разные значения для разных скоростей.
источник
Проблема, о которой я еще не упоминал, - это энергопотребление. Если используется источник питания 3,3 В, резистор 3,3 К на землю будет тратить 1 мА тока (3,3 мВт мощности) всякий раз, когда на выходе низкий уровень. Использование резистора 10К уменьшит ток и мощность в три раза. Если на шине I2C будет много связи, это энергопотребление может в конечном итоге составить значительную часть общего расхода энергии, особенно если шина может оставаться на низком уровне в течение длительных периодов времени. Например, если кто-то читает 100 байтов в секунду, но после чтения каждого байта на шине остается устройство, выводящее первый бит следующего байта, и у большинства этих байтов MSB очищен, шина может потратить 90% время с низким уровнем SCL и SDA. В зависимости от того, что еще делает система, это может значительно увеличить потребление энергии.
Для экономии энергии может быть полезно иметь «подтягивающий» резистор, подключенный к выводу ввода-вывода, а не к VDD. Хотя я не видел, чтобы аппаратные реализации I2C предлагали поддержку для этого, наличие главных выходных данных на отдельном выводе ввода / вывода, который подключен к шине через резистор, а не использование драйвера с открытым коллектором и фиксированного подтягивающего резистора, позволит избежать тратить ток, когда мастер хочет вывести «0». Кроме того, если мастер собирается на некоторое время оставить низкий уровень SCK, не заботясь о том, что находится на SDA, мастер может отключить подтягивание до тех пор, пока он не будет готов к дальнейшему общению. Если ни одно из устройств не нуждается в растягивании тактового сигнала, мастер может просто использовать прямой выход для SCK и не беспокоиться о каком-либо подтягивании этого провода.
Если кто-то использует программную синхронизацию битов с быстрым процессором и хочет получить хорошую производительность, несмотря на высокую емкость шины, вышеуказанный подход может быть объединен с использованием встроенных слабых подтягиваний процессора. При чтении данных включите очень сильное подтягивание на короткое время сразу после каждого падающего фронта SCK, а затем переключитесь на слабое подтягивание. Сильный подъем подтянет линию высоко, несмотря на емкость, и как только линия будет вытянута, слабый подтягивание сможет поддерживать ее на высоком уровне. Даже если у устройства возникнут проблемы с вытягиванием линии на низком уровне от сильного подтягивания, оно сможет это сделать после отключения сильного подтягивания.
источник
http://www.cypress.com/knowledge-base-article/rise-and-fall-time-specifications-scl-and-sda-lines-i2c
источник
Здесь приведены формы сигнала, для 400 кбит / с (200 кГц, 101010 формы сигнала). RC составляет 4,7 кОм и 212 пФ. Значение RC позволяет установить 2 TAU.
источник