Только сейчас я понял, что линии данных и синхронизации I 2 C (SDA и SCL) должны иметь подтягивающие резисторы.
Ну, я построил пару часов с помощью DS1307 RTC (см технического описания ) согласно схеме ниже. Обратите внимание, что я опустил оба подтягивающих резистора.
Обе часы работают нормально, один из них работает уже более 3 месяцев. Как это возможно? В любом случае я хотел знать:
Что происходит, когда подтягивания I 2 C опускаются?
Может ли отсутствие подтягиваний повредить какую-либо из этих двух микросхем на моей плате?
Я отвечаю на вопросы, которые касаются моего конкретного случая подключения 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 без внешних подтягиваний.
Обновление 3 (после добавления подтягиваний I 2 C): Ниже приведена еще одна серия снимков прицела, которые я сделал после добавления надлежащих (4K7) подтягивающих резисторов к линиям I 2 C (на той же плате). Время нарастания уменьшилось с 5 мкс до 290 нс. Я 2 С гораздо счастливее сейчас.
Ответы:
На шине I 2 C не будет связи . Вообще. MCU не сможет генерировать условие запуска I 2 C. MCU не сможет передавать адрес I 2 C.
Хотите знать, почему он работал в течение 3 месяцев? Читать дальше.
Возможно нет. В данном конкретном случае (MCU, RTC, больше ничего) точно нет.
Возможно, на 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 мм.
источник
Используемая вами библиотека и библиотеки, от которых она зависит (Wire), разрешают внутренние подтягивания ATMega. Это слабые подтяжки, которые при нормальном использовании дополняют любые внешние подтяжки (два резистора параллельно). Из-за относительно высокого сопротивления от 20 кОм до 70 кОм, они не вызывают особых проблем при использовании внешних.
Теперь без внешних резисторов слабые внутренние подтяжки - единственное, что ведет линию высоко. В зависимости от конфигурации вашей платы, скорости вашей линии i2c, частоты доступа к ней, внешних помех и т. Д. Они могут работать, а могут и не работать. Тебе повезло. У вас есть подтягивания, но не те, которые вы ожидали.
Даже без внутренних подтягиваний отсутствие подтягиваний не повредит ни IC. Внутренняя структура линий SC1 и SDA устройства i2c подобна транзисторам NPN. Это открытые коллекторы , по существу управляемые током / переключаемые диоды.
Последнее, на что следует обратить внимание: наличие внутренних подтягиваний, когда ваша ATMega под напряжением 5 В, а устройство i2c является устройством только 3,3 В, может вызвать проблемы. Или, если у вас есть внутренние подтяжки и внешние резисторы, подключенные к напряжению 3,3 В или другому напряжению, также могут вызвать проблемы. По сути, это намеренно игнорируемая ошибка в библиотеке Wire.
источник
You do have pull-ups, just not ones you expected.
- Думаю, ты это прибил. Благодарность!Как правило, для схемы интерфейса I 2 C вам понадобятся подтягивающие резисторы . Если интерфейс действительно имеет полную спецификацию I 2 C на обоих концах проводов, то сигнальные линии без резисторов никогда не смогут перейти на высокий уровень. Они могут оставаться низкими или переходить на некоторый промежуточный уровень, определяемый током утечки в деталях на каждом конце. Причина этого в том, что истинный I 2 C является шиной с открытым стоком.
Некоторые устройства могут иметь встроенные подтягивающие резисторы в диапазоне от 20 кОм до 100 кОм, чтобы удерживать выводы интерфейса на высоком неактивном уровне, когда интерфейс I 2 C на детали не используется. Для простых и коротких интерфейсов этих подтягивающих резисторов может быть достаточно для обеспечения тока, необходимого для поднятия линий на высокий уровень, когда сигнализируются тактовые импульсы и / или данные.
По вашей схеме трудно сказать, но в некоторых случаях интерфейсы I 2 C реализуются с использованием выводов портов ввода / вывода общего назначения, а затем разбиваются на биты в программном обеспечении. Иногда разработчик может не управлять выводами ввода / вывода в этой конфигурации с использованием методики с открытым стоком, и это может повлиять на то, почему может показаться, что интерфейс без подтягивающих резисторов работает.
В конце дня вы, вероятно, должны сами проверить сигнализацию на одном из ваших более ранних часов с помощью осциллографа, чтобы увидеть, работают ли 1 и 0 на интерфейсе в пределах уровней заданного напряжения. Тогда вы точно будете знать, действительно ли вам просто невероятно повезло с этой реализацией, или один из факторов, которые я упомянул выше, работает.
источник
Скорее всего, шина I2C просто не будет работать.
Скорее всего нет.
источник
Ваши линии I2C не будут работать вообще. Если я не ошибаюсь, I2C просто подает низкие сигналы, но не возвращает их обратно в высокое состояние, поэтому вам нужны эти резисторы.
Любое отсутствие подтягиваний не должно повредить IC.
источник
I2C является TTL-логическим протоколом; так что ваши данные и тактовые линии открыты. Другими словами, аппаратное обеспечение I2C может только снизить эти линии; они остаются плавающими, когда не ноль. Вот тут и появляются нагрузочные резисторы. Это упрощенная схема, но поработайте со мной на секунду.
смоделировать эту схему - схема, созданная с использованием CircuitLab
Как вы видете; подтягивающий резистор необходим для того, чтобы логика 1 была видна на выходе, когда логика TTL не управляет выходом на низком уровне. Логика TTL не может вести линии высоко, как я уже упоминал. Если бы этого не было, выходной сигнал оставался бы плавающим, и это было бы непредсказуемо, что вы можете увидеть на выходе (насколько вы знаете, ваша микроволновая печь или кишечные дисфункции ваших коллег, вызванные неким не содержащим сахара липким медведем, могут вызвать значение колеблется).
Теперь, если бы вы реализовали I2C в программном обеспечении с микроконтроллером, это, вероятно, не было бы слишком большой проблемой, так как это, скорее всего, будет использовать логику CMOS, которая может приводить к высоким или низким выходам.
источник
Когда я побил I2C с помощью микро в качестве мастера, который поставляет часы, я смог управлять SCL без подтягивания.
Однако SDA должен быть OC с подтягиванием, чтобы подчиненное устройство могло опускаться и правильно реагировать.
С уважением
источник