Не могу отключить внутренний интерфейс I2C подтягиваний на ESP32

esp32 i2c pins pull-up ssd1306

Я разработал специальную плату ESP32 на модуле WROVER-IE. Чтобы сохранить низкое энергопотребление, я использую GPIO-управляемый высокочастотный полевой транзистор для отключения неиспользуемых периферийных устройств в режиме глубокого сна.

Проблема: Я подтянул SSD1306 I2C OLED к этому AUX rail. Он отлично работает, когда устройство бодрствует. В setup() я запускаю OLED через ssd1306.begin(), и с этого момента контакты SCL и SDA (22, 21) всегда привязаны к 3,3В, пока я не сброшу ESP32.

Шина I2C, всегда привязанная к 3.3, заканчивается кровотечением через подтягивающие резисторы и в рельс AUX, что приводит к нежелательному току в спящем режиме.

Есть ли способ отключить внутренние I2C-блоки на ESP32?

Вещи, которые я пробовал до сих пор:

  • Установка SDA, SCL в качестве выходного и низкого уровня записи (не работает)
  • Установка SDA, SCL в качестве ВВОДА и/или записи НИЗКОГО уровня (ничего не делает)
  • Вызов gpio_hold_dis(gpio_num_t(SDA));(ничего не делает)

Сейчас я пытаюсь проанализировать библиотеку esp32-hal-i2c.c, но не нахожу никаких исправлений. Любая помощь очень ценится!

Изменить, добавить схему:

-N

, 👍2

Обсуждение

"Шина I2C, всегда привязанная к 3.3, в конечном итоге истекает кровью через подтягивающие резисторы"-откуда вы это знаете? Подтягивания не потребляют никакой энергии, пока вы не общаетесь по шине., @Sim Son

Если я удалю OLED-дисплей, напряжение AUX на направляющей AUX рассеивается. Я создам диграмму, @Nick Johnson


1 ответ


5

Я решил эту проблему. Для тех, кто хотел бы отключить внутренние отсоединения на шине I2C ESP32, вам нужно отключить весь драйвер, прежде чем переводить устройство в спящий режим.

Во-первых, включите библиотеку периферийных драйверов из IDF:

#include "driver/periph_ctrl.h"

Затем позвоните перед сном следующему человеку:

rtc_gpio_isolate(gpio_num_t(SDA));
rtc_gpio_isolate(gpio_num_t(SCL));
periph_module_disable(PERIPH_I2C0_MODULE);  
digitalWrite(SDA, 0);
digitalWrite(SCL, 0);

Это остановит ESP32 от вытягивания контактов 21 и 22 во время глубокого сна. Вызов display.begin() или wire.begin() перезапустит драйвер после пробуждения.

,