Что произойдет, если я опущу подтягивающие резисторы на линиях I2C?


33

Только сейчас я понял, что линии данных и синхронизации I 2 C (SDA и SCL) должны иметь подтягивающие резисторы.

Ну, я построил пару часов с помощью DS1307 RTC (см технического описания ) согласно схеме ниже. Обратите внимание, что я опустил оба подтягивающих резистора.

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

Обе часы работают нормально, один из них работает уже более 3 месяцев. Как это возможно? В любом случае я хотел знать:

  1. Что происходит, когда подтягивания I 2 C опускаются?

  2. Может ли отсутствие подтягиваний повредить какую-либо из этих двух микросхем на моей плате?

Я отвечаю на вопросы, которые касаются моего конкретного случая подключения ATmega328P к RTC DS1307, как в приведенных мною схемах, но если вопрос не станет слишком широким, было бы полезно узнать, что происходит, когда выпадающие выпуски вообще опущены в других сценариях работы I 2 C.

PS. Я искал в Сети, чтобы найти ответ, но мог просто найти статьи о размерах подтягиваний.

Обновление: я использую Arduino IDE 1.03, и моя прошивка обрабатывает RTC, используя DS1307RTC Arduino lib (через ее функции RTC.read()и RTC.write()). Эта библиотека в свою очередь использует Wire.hдля общения с RTC.

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

Сфера выстрела 1 Сфера выстрела 2

Обновление 3 (после добавления подтягиваний I 2 C): Ниже приведена еще одна серия снимков прицела, которые я сделал после добавления надлежащих (4K7) подтягивающих резисторов к линиям I 2 C (на той же плате). Время нарастания уменьшилось с 5 мкс до 290 нс. Я 2 С гораздо счастливее сейчас.

Сфера выстрела 3 Сфера выстрела 4


2
Ваш код отключает подтягивания на этих выводах?
Игнасио Васкес-Абрамс

@ IgnacioVazquez-Abrams В моем коде нет прямого упоминания о выводах SDA и SCD (18 и 19). Я обрабатываю RTC, используя библиотеку DS1307RTC lib Arduino lib и ее функции RTC.read () и RTC.write ().
Рикардо

Эта библиотека в свою очередь использует Wire.h для связи с RTC.
Рикардо

3
Да, определенно использую внутренние подтягивания. Обратите внимание на кривые вместо острых краев.
Игнасио Васкес-Абрамс

Ответы:


28

1) Что происходит, когда подтягивания I2C опускаются?

На шине I 2 C не будет связи . Вообще. MCU не сможет генерировать условие запуска I 2 C. MCU не сможет передавать адрес I 2 C.

Хотите знать, почему он работал в течение 3 месяцев? Читать дальше.

2) Отсутствие подтягиваний может повредить любую из этих двух микросхем на моей плате?

Возможно нет. В данном конкретном случае (MCU, RTC, больше ничего) точно нет.

3) Почему MCU смог связаться с ведомым устройством I 2 C? Для I 2 C требуются подтягивающие резисторы. Но они не были включены в схему.

Возможно, на ATmega включены внутренние подтягивания. Из того, что я прочитал 1 , ATmega имеет внутренние подтягивания 20 кОм, которые можно включить или отключить из прошивки. 20 кОм слишком слабо для подтягивания I 2 C. Но если шина имеет низкую емкость (физически небольшую), а связь достаточно медленная, то 20 кОм все равно может заставить шину работать. Однако это не очень надежная конструкция по сравнению с использованием дискретных подтягивающих резисторов.

1 Я не парень ATmega.

обновление: в ответ на сигналы I 2 C, которые были добавлены к OP,
сигналы в OP имеют очень большую постоянную времени нарастания. Вот как обычно выглядят сигналы I 2 C

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

PIC18F4550, Vcc = + 5 В, 2,2 кОм подтягивания. Форма волны показывает SCL. Время нарастания на SDA примерно одинаково. Физический размер шины умеренный: 2 подчиненных устройства, длина печатной платы ≈100 мм.


Спасибо за Ваш ответ! Да, ATmega имеет подтягивания, которые должны быть включены в моем случае. Я дважды проверю код и библиотеки, которые я использую, а также проложу доску через прицел. Я надеюсь, что это немного прояснит ситуацию.
Рикардо

1
Возможно, вы захотите перепроверить с таблицей данных вашего ведомого устройства в первую очередь. Если я правильно помню, подтягивания на ATMega могут быть где угодно от 30k-60k (это зависит от Vcc, температуры и ряда других факторов; вы не можете действительно зависеть от них для надежного сопротивления). Вы хотите убедиться, что вы посылаете достаточный ток на подчиненное устройство, чтобы обеспечить правильную логику 1. Если сопротивление слишком велико, ваше ведомое устройство не получит достаточный ток, и вы окажетесь в том же месте, где находитесь в настоящее время.
audiFanatic

4
@audiFanatic +1. Кстати, IMO, включая подтягивающие резисторы в коммутационные панели и устанавливая их по умолчанию, является ошибкой. Представьте, что произойдет, если у кого-то будет несколько плат коммутации на одной шине I2C. Каждое подтягивание обычно составляет 2,2 кОм или около того. Подъемные резисторы на всех разделительных платах появляются параллельно. Комбинированное подтягивание становится слишком жестким для I2C. [Подробнее об этой потенциальной проблеме здесь и здесь .]
Ник Алексеев

2
@Ricardo Это не радостная шина I2C для ваших прицелов [первый набор прицелов в OP]. Я также добавил прицел в свой ответ.
Ник Алексеев

3
В этой статье есть некоторые формы сигналов о хороших и плохих сигналах i2c
ford

16

Используемая вами библиотека и библиотеки, от которых она зависит (Wire), разрешают внутренние подтягивания ATMega. Это слабые подтяжки, которые при нормальном использовании дополняют любые внешние подтяжки (два резистора параллельно). Из-за относительно высокого сопротивления от 20 кОм до 70 кОм, они не вызывают особых проблем при использовании внешних.

Что происходит, когда подтягивания I2C опускаются?

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

Отсутствие подтягиваний может повредить любую из этих двух микросхем на моей плате?

Даже без внутренних подтягиваний отсутствие подтягиваний не повредит ни IC. Внутренняя структура линий SC1 и SDA устройства i2c подобна транзисторам NPN. Это открытые коллекторы , по существу управляемые током / переключаемые диоды.

Последнее, на что следует обратить внимание: наличие внутренних подтягиваний, когда ваша ATMega под напряжением 5 В, а устройство i2c является устройством только 3,3 В, может вызвать проблемы. Или, если у вас есть внутренние подтяжки и внешние резисторы, подключенные к напряжению 3,3 В или другому напряжению, также могут вызвать проблемы. По сути, это намеренно игнорируемая ошибка в библиотеке Wire.


4
+1 - You do have pull-ups, just not ones you expected.- Думаю, ты это прибил. Благодарность!
Рикардо

Просто чтобы вы знали, я добавил несколько прицелов, чтобы прояснить, что происходит с моей настройкой.
Рикардо

2
@Ricardo Да, видя их, в 33 кГц. Треть самой низкой скорости i2c, и сигнал все еще очень плохой. На 100 кГц или 400 кГц у вас не будет рабочего общения. Замечательно то, что многие устройства i2c работают с максимальной скоростью. Просто помните, что внутренние подтягивания могут быть до 70k Ом, типичный i2c резистор 4.7k
Прохожий

8

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

Некоторые устройства могут иметь встроенные подтягивающие резисторы в диапазоне от 20 кОм до 100 кОм, чтобы удерживать выводы интерфейса на высоком неактивном уровне, когда интерфейс I 2 C на детали не используется. Для простых и коротких интерфейсов этих подтягивающих резисторов может быть достаточно для обеспечения тока, необходимого для поднятия линий на высокий уровень, когда сигнализируются тактовые импульсы и / или данные.

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

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


4

Что происходит, когда подтягивания I2C опускаются?

Скорее всего, шина I2C просто не будет работать.

Отсутствие подтягиваний может повредить любую из этих двух микросхем на моей плате?

Скорее всего нет.


3

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

Любое отсутствие подтягиваний не должно повредить IC.


Контакты I2C имеют открытый сток.
Мэтт Янг

1

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

схематический

смоделировать эту схему - схема, созданная с использованием CircuitLab


Как вы видете; подтягивающий резистор необходим для того, чтобы логика 1 была видна на выходе, когда логика TTL не управляет выходом на низком уровне. Логика TTL не может вести линии высоко, как я уже упоминал. Если бы этого не было, выходной сигнал оставался бы плавающим, и это было бы непредсказуемо, что вы можете увидеть на выходе (насколько вы знаете, ваша микроволновая печь или кишечные дисфункции ваших коллег, вызванные неким не содержащим сахара липким медведем, могут вызвать значение колеблется).

Теперь, если бы вы реализовали I2C в программном обеспечении с микроконтроллером, это, вероятно, не было бы слишком большой проблемой, так как это, скорее всего, будет использовать логику CMOS, которая может приводить к высоким или низким выходам.


1
Рад, что это помогло.
audiFanatic

2
Неважно, используют ли устройства логику TTL или CMOS - нормальные TTL и нормальные CMOS выходы будут тянуть сигнал как вверх, так и вниз. Сигналы I2C представляют собой либо TTL с открытым коллектором, либо (что более вероятно) КМОП с открытым стоком - в обоих случаях транзистор, который будет выводить сигнал высокого уровня, отсутствует на выходном каскаде источника, поэтому необходимы подтягивающие резисторы для тянуть сигналы высоко. Возможно, что микроконтроллер имеет внутренние подтяжки на этих пинтах.
Питер Беннетт

3
-1 Как сказал Питер Беннетт, многие из этих ответов просто неверны. Называние TTL-сигналов «открытым стоком» - это раздача.
Джо Хасс

Обратите внимание, что использование I2C с TTL имеет свои преимущества, а именно то, что вам часто не требуются преобразователи уровня для обработки компонентов с различными напряжениями питания, подключенными к одной и той же шине. Простая установка напряжения подтяжки на самое высокое принимаемое входное напряжение чипа с наименьшим напряжением во много раз достаточна для входных каскадов TTL . На CMOS это не сработает.
Бен Фойгт

@BenVoigt: Нет - неверно называть конфигурацию «требуется подтягивающий резистор» «TTL», так как это может быть сделано либо с CMOS, либо с TTL, а DS1307 является частью CMOS. В техническом описании Maxim четко указано, что выходы являются открытым стоком, а на блок-схеме показан FET для одного выхода.
Питер Беннетт

0

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

Однако SDA должен быть OC с подтягиванием, чтобы подчиненное устройство могло опускаться и правильно реагировать.

С уважением

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.