Каково время выхода из Wire.begin()?

Вот схема моего проекта:

Цель состоит в том, чтобы заставить ноутбук работать как клавиатура для настольного ПК. Nano использует Serial.read() для получения нажатий клавиш с ноутбука и пересылки данных нажатия и отпускания клавиш на Leonardo (с помощью I2C), выполняющий роль USB-HID-клавиатуры.

Настройка Nano выглядит следующим образом:

void setup() {
  Wire.begin();
  Serial.begin(14400);
  Serial.write("Hello");  // https://serialport.io/docs/api-stream#serialpor|
  pinMode(LED_BUILTIN, OUTPUT);
}

Установка Леонардо выглядит следующим образом:

void setup() {
  Keyboard.begin();
  Wire.begin(4);
  Wire.onReceive(cbfunc);
}

Я тестировал обе платы по отдельности, но не всю установку целиком. Всякий раз, когда какая-либо плата подключается к USB-порту, она включается из-за +5 вольт от USB. Теперь, когда у меня есть провода i2c на месте, я в замешательстве -

если я сначала подключу leonardo & desktop [а i2c-master (Nano) еще не включен], что произойдет в Wire.begin(4)? Будет ли он ждать (1с, 5с, навсегда), пока i2c-master не выйдет в сеть?

, 👍2

Обсуждение

почему бы вам не написать скетч, чтобы проверить это?, @jsotola


1 ответ


Лучший ответ:

0

Как правило, вы не должны подавать питание на какой-либо контакт устройства, которое выключено. Это может привести к тому, что ток, протекающий через зажимные диоды, заземлится и может разрушить аппаратное обеспечение контактов или устройство (также это может привести к странным ситуациям, когда устройство несколько питается через вывод ввода-вывода, что может привести к нестабильности).

Вы можете либо разорвать соединение между устройствами, если только одно из них питается (это должно быть возможно с некоторыми дополнительными компонентами), либо вы можете питать оба устройства от одного USB-порта. Для другого порта вы бы перерезали линию V+ (положительное напряжение питания) USB-порта/кабеля (это гарантирует, что вы не получите плохой ток между обоими компьютерами на линии питания USB, если они обеспечивают немного другое напряжение). Поскольку провод заземления по-прежнему соединяет оба компьютера и ардуино, связь по-прежнему будет работать правильно.

если я сначала подключу leonardo & desktop [а i2c-master (Nano) еще не включен], что произойдет в Wire.begin(4)?

Линия Wire.begin() не застрянет, так как она не делает много на линиях и не знает, если что-то подключено на другом конце, пока какая-то транзакция не произойдет на шине. Но может быть так, что любая транзакция от работающего Arduino (мастер) может вызвать блокировку шины I2C (так как в некоторых местах библиотека ждет, когда линии поднимутся. Соединение через зажимные диоды может удерживать линию на низком уровне. Я не уверен в этом). Тогда вам нужно будет сбросить оба ардуино, чтобы убедиться, что автобус находится в здоровом состоянии.

Решение сверху (питание обоих ардуино от одного USB-порта) также обеспечит одновременный запуск обоих ардуино и, таким образом, не заблокирует шину через зажимные диоды.

,