Подключение Arduino Nano, Mega и LCD через I2C работает, но не работает при выключении Mega

i2c

Я подключил Arduino Nano, Mega и ЖК-дисплей через I2C / TWI (SDA / SCL).

Nano играет роль ведущего устройства, в то время как Arduino Mega и LCD являются подчиненными устройствами. Это работает хорошо, пока я не выключу Arduino Mega. Конечно, я не ожидаю, что Мега ответит.

В частности, линия SCL, по-видимому, отключает соединение. Отключение SCL от Mega приведет к восстановлению соединения с ЖК-дисплеем. Я добавил два подтягивающих резистора 4.7k к обоим SDA SCL, но никаких улучшений от этого не произошло.

Нет ли другого способа, кроме физического отключения линий?

, 👍2


2 ответа


1

Видишь Как настроить шину I2C, которая остается действительной при отключении или сбое ведомого устройства?

В основном I2C использует подтягивания, чтобы все линии были ВЫСОКИМИ до тех пор, пока какое-либо устройство не опустит их на НИЗКИЙ уровень. Для этого Arduino использует INPUT_PULLUP / OUTPUT + НИЗКИЕ состояния. Но если вы выключите Arduino (выключите Vcc), внутренние диоды отключат питание на выводах до Vcc (что равно нулю) + напряжение диода (которое мало), фактически до логического МИНИМУМА. И I2C видит, что, поскольку устройство все время активно отправляет низкий уровень, связь блокируется.

Если вы просто добавляете подтягивающие резисторы, у вас либо они достаточно высоки, чтобы это не мешало этому состоянию, либо они достаточно низки, чтобы рисовать линии ВЫСОКО, даже когда на устройстве НИЗКИЙ уровень, что не позволяет другим устройствам рисовать их НИЗКО для связи. Вам нужно "отрезать" такие неактивные линии - либо физически отсоединить (выдернуть провода из разъема, например, если вы просто вынимаете Mega из розетки, или использовать некоторые реле с питанием от Mega Vcc, которые отключают их при отключении питания), либо электрически отсоединить, используя некоторые схемы, предназначенные для этого. Некоторые из них уже проданы, или вы можете создать свои собственные с тем же эффектом (если вы специалист в этой области - в противном случае гораздо проще и быстрее заплатить за какое-то уже готовое решение).

,

Или... не выключайте Arduino Mega. Используйте один и тот же источник питания для всего, что подключено к одной и той же шине I2C., @Jot

Ну, это тоже сработает :) Но я думаю, есть причина, по которой пользователь хочет отключить одну из своих ардуино, иначе он вообще не влезет в проблему., @gilhad

Кстати: я использую настройку, где сеть I2C использует 4 провода — SDA, SCK, GND и PWR — поэтому я просто подключаю шину I2C с помощью подтягиваний, и все, что подключено через I2C, питается от того же источника (шина I2C также служит источником питания). сеть - и может питаться от реального источника питания, а не только от Arduino). Так что либо он подключен к I2C и запитан, либо не запитан, но и вообще не подключен к I2C., @gilhad

именно для этого мы здесь: распознать, что может быть проблемой xy: http://xyproblem.info/ Мой основной проект Arduino Mega имеет два из 5 проводов. Шина I2C 5 В с питанием 5 В плюс сигнал прерывания и шина I2C 3,3 В с питанием 3,3 В и сигналом прерывания. Сигнал прерывания предназначен для обнаружения, когда ведомому устройству требуется внимание, например, сигналы тревоги от датчиков движения., @Jot


0

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

,