Влияние номинала подтягивающих резисторов на сигнал шины I2C

I2C это популярный протокол связи во встраиваемых системах. При взаимодействии с ведомым устройством резистор необходим на каждой двунаправленной линии. Возникает один вопрос: «какого номинала подтягивающий резистор я должен использовать?». Вместо того чтобы использовать кучу теории и расчетов я думаю, что будет легче показать, что происходит с сигналами при использовании различных резисторов.

Поскольку Arduino является популярной платформой среди любителей, мы будем использовать его для наших примеров. Будем связывать с Arduino часы реального времени DS3231, которые также является устройством питающимся от 5 вольт. Мы также рассмотрим воздействия на сигнал с разной скоростью шины I2C (тактовой частотой 100 и 400 кГц).

Будем использовать осциллограф для измерения времени нарастания, частоты и пикового напряжения. Частота? Зачем нам измерять частоту, если известно что устройство работает на 100 кГц… Ну давайте посмотрим, что говорит осцилограмма. Поскольку ёмкость примерно одинакова для линий SDA (данные) и SCL (тактирование), мы будем изменять сопротивление только на линии SCL и использовать стандартный 4,7 кОм резистор на SDA линии. Нам будет легче анализировать повторяющийся тактовый сигнал на экране осциллографа, чем различные комбинации данных.

Для начала рассмотрим схему, используя только внутренние подтягивающие резисторы в Arduino. Как вы можете видеть на первом рисунке, тактовый сигнал имеет очень долгий восходящий фронт и достигает максимальное напряжение только 3,76 вольт, прежде чем упасть до нуля. В то время как схема работает, я не хотел бы полагаться на неё где-либо вне лаборатории. Как вы можете видеть, измеренная частота близка к 87 кГц в связи с медленным временем нарастания. Схема по-прежнему работает, но если ваше устройство чувствительно ко времени, использование внутренних подтягивающих резисторов не будет хорошей идеей. В любом случае давайте отключим внутренние подтягивающие резисторы в Arduino и установим наши собственные, и посмотрим, как они влияют на сигнал. Мы начнем с резистора 68 кОм, затем 47к, 33к, 10к, 6.8к, 4.7к, 3.3к, 2.2к и наконец, 1.5к.

Как вы можете видеть на втором рисунке, сигнал в конечном итоге приобретает прямоугольную форму, которая является тем, что мы хотели бы видеть. Обратите внимание, как измеренная частота приближается к желаемой при значениях между 33 кОм и 10 кОм. Вы также можете видеть как уменьшается время нарастания при уменьшении сопротивления. Резистор 4.7 кОм даёт сигнал хорошего вида с временем нарастания около 1 мкс. Данный номинал 4.7 кОм является довольно распространенным сопротивлением, которое используется во многих устройствах при одном ведомом. Конечно, при добавлении большего количества устройств к линиям шины, ёмкость будет увеличиваться, что означает необходимость уменьшения сопротивления (t = RC), если вы хотите сохранить целостность сигнала. Каждая схема является уникальной и ёмкость изменяется, поэтому хорошей практикой будет наблюдение сигнала на экране осциллографа. Можно ли использовать резистор с низким номиналом для уменьшения времени нарастания, что дало бы нам сигнал наиболее прямоугольной формы? И да, и нет. Стандарт I2C устанавливает некоторые ограничения, которые должны быть выполнены, к счастью эти пределы помогают нам сузить диапазон значений сопротивления. Простая формула для расчета наименьшего номинала подтягивающего резистора Rp = (Vcc — 0.4)/3mA, которая для напряжения 5 вольт даёт около 1.5 кОм. Формула для расчета максимальной величины резистора основана на максимальном времени нарастания для стандартного режима (100 кГц), который равен 1 мкс, и выглядит так: Rp = 1us/Cb, где Cb это общая ёмкость шины для одной сигнальной линии. Таким образом, для нашего примера общая ёмкость шины будет составлять около 20 пФ (ёмкость Arduino составляет 10 пФ, в соответствии с даташитом, и DS3231 тоже 10 пФ), что дает верхнюю планку номинала резистора в 50 кОм. Очевидно, добавляя более одного чипа DS3231 к линии, будет изменяться наибольшее допустимое сопротивление которое должны использовать (33.3к, затем 25к, и т.д.). Важно отметить, что каждое I2C устройство обладает собственным уровнем ёмкости, поэтому всегда необходимо смотреть даташит, чтобы узнать это значение.

Далее, мы будем использовать ту же схему, но на этот раз давайте перейдем от стандартного режима в быстрый режим Fast mode (400 кГц). Как вы можете видеть на третьем рисунке, время нарастания очень медленное по отношению к тактовой частоте. Частота тактовых импульсов измеряется в пределах 171 кГц, что значительно ниже желаемой 400 кГц. Также обратите внимание, что пиковое напряжение достигает всего 3.28 В перед переключением на вторую половину рабочего цикла. Повторим тот же тест, что и выше, используя те же резисторы. Прежде чем мы начнем, давайте взглянем на расчеты для определения верхних и нижних границ номиналов подтягивающих резисторов. Расчет для наименьшего значения подтягивающего резистора такой же, что и выше, получаем 1.5 кОм, однако максимальная скорость нарастания для быстрого режима снижается с 1 микросекунды до 300 наносекунд. Как вы можете видеть, используя формулу и подставляя максимальную ёмкость шины в 400 пФ, получаем в результате сопротивление 750 Ом для верхнего предела, который ниже, чем самый низкий номинал для нижней границы от первого расчета. По этой причине максимальная рекомендуемая ёмкость шины уменьшается до 200 пФ с напряжением 5 вольт. Поэтому внимательно следите за общей ёмкостью шины при построении схемы. Итак, давайте установим резисторы и посмотрим, как они влияют на качество сигнала (рисунок 4). Обратите внимание, как измеряемая тактовая частота не доходит до 400 кГц, пока мы не перейдём от резисторов 6.8 кОм до 4,7 кОм. Вы также можете видеть, что сигнал принимает хорошую форму, как только мы переходим от 2.2 кОм до 1.5 кОм.

Авторство
Статья переведена с английского.
Автором оригинальной статьи является Wayne Truchsess.
Ссылка на оригинальную статью «Effects of Varying I2C Pull-Up Resistors» (сайт недоступен): http://dsscircuits.com/articles/47-effects-of-varying-i2c-pull-up-resistors