• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Вопрос I2C - непонятки

AndrF

Active member
С ESP-шками начал пробовать работать совсем недавно. Пока пробую Nodemcu и ESP-12.

В чем, собственно, вопрос:

В даташите на ESP-12 прописано что для I2C используются выводы IO14 (CLK) и IO2 (SDA).

В то же время глядя на различные схемы с использованием I2C вижу что все время используются другие выводы (как правило для сигнала SDA) - к примеру: Digital Thermometer on OLED Display Using ESP8266 ESP-12E NodeMCU and DS18B20 Temperature Sensor: 6 Steps. С чего бы это не используется аппаратный I2C - с чем связано его игнорирование? Я так и не смог найти ни одного примера его использования...

Или я что-то не понимаю?
 

enjoynering

Well-known member
у esp8266 программный i2c - поэтому можно вешать практичский на любую ногу. избегайте ног двойного назначения - например не вешайте i2c на ресет или на ноги которые используются для встроеной флешки.
 

AndrF

Active member
у esp8266 программный i2c - поэтому можно вешать практичский на любую ногу. избегайте ног двойного назначения - например не вешайте i2c на ресет или на ноги которые используются для встроеной флешки.
В даташите упоминается I2C и под него указаны определенные пины. Что навевает мысль об аппаратном интерфейсе... Но глубоко я пока не влазил.
 
Последнее редактирование:

AndrF

Active member
у esp8266 программный i2c - поэтому можно вешать практичский на любую ногу. избегайте ног двойного назначения - например не вешайте i2c на ресет или на ноги которые используются для встроеной флешки.
Ну если надо (а мне сейчас надо будет), то вполне можно использовать - тут неплохо описано: Using ESP8266 GPIO0/GPIO2/GPIO15 pins
 

enjoynering

Well-known member
Интересный способ с "виртуальной землей". Тут только надо смотреть чтоб суммарный ток через два оставшихся пина на виртуальную землю не превысил 6 мА (помоему на столько расчинны порты у esp).
 

Сергей_Ф

Moderator
Команда форума
@enjoynering как ток с других пинов попадёт на виртуальную землю? И вообще, в чем интересность этой схемы? Можно просто повесить притянутый к + пин на кнопку с землёй. Всё. И не нужна виртуальная земля.
 

enjoynering

Well-known member
постараюсь вам объянить, через гугл перевод - "Вместо этого подключить его к другому выходу GPIO, который запускается на землю (в качестве выхода) только после запуска ESP8266"

а вот исходник - "to connect it instead to another GPIO pin which is driven to ground (as an output) only after the ESP8266 starts up"
 

pvvx

Активный участник сообщества
постараюсь вам объянить, через гугл перевод - "Вместо этого подключить его к другому выходу GPIO, который запускается на землю (в качестве выхода) только после запуска ESP8266"

а вот исходник - "to connect it instead to another GPIO pin which is driven to ground (as an output) only after the ESP8266 starts up"
Ну там какой-то недалекий пользователь пишет и рисует, как сделать замыкание выключателем:
GPIO0 - это выход: after reset, the default is function5 to export the clock / на CPIO0 выводится CLK в 26MHz, пока не стартанет инициализация в SDK. В режиме "программирования" - 26MHz выводится всегда...
GPIO2 - это выход: U0TXD signal can be output through GPIO2 pad besides U0TXD pad / это выход TX UART, куда выводятся не отключаемые сообщения о загрузке. В режиме "программирования" - ответы внешнему UART...
Ну и возьмем следующий вариант:
GPIO0 = "0", GPIO1 = "1", GPIO2 = "0" - модуль напишет вам (boot mode:(2,x)), что означает "Jump Boot" -> ROM-BIOS при старте запускает код с адреса 0x40100000.
"Jump Boot" - это режим старта кода из IRAM без какой-либо загрузки с flash и в Arduino это состояние не обслуживается - возникает "протетед" и вечный зависон модуля, пока не сбросите. В итоге данный переключатель приводит и к этому состоянию. Обеспечение правильной перезагрузки в таком состоянии обеспечивается только в Web-свалке.

Состояния выбора загрузки, т.е. значения напряжения на пинах, защелкиваются по фронту RESET. Сигнал RESET у ESP8266 воспринимается длительностью и 1 нс. По этому если у вас на выводах, от которых зависит выбор типа загрузки, висят какие детали (пусть даже с внутренними емкостями), то внешняя помеха или даже срабатывание просыпания после deep_sleep может привести к неверному типу загрузки.

PS: И - боже вас сохрани - не читайте до обеда буржуйских блогов.
Борменталь: Гм... Да ведь других нет!
Преображенский: Вот никаких и не читайте.

PS2: У ESP нет свободных пинов. Все они задействованы в ROM-BIOS. Есть всего 3 якобы свободных, если все остальные условия строго соблюдены... Данная тема поднималась более десятка раз - ищите...
 
Последнее редактирование:

AndrF

Active member
По этому если у вас на выводах, от которых зависит выбор типа загрузки, висят какие детали (пусть даже с внутренними емкостями), то внешняя помеха или даже срабатывание просыпания после deep_sleep может привести к неверному типу загрузки.
Сильно сомневаюсь, что при наличии подтяжки, вход микросхемы, подключенный к GPIO, создаст такую уж громадную емкость...
 

enjoynering

Well-known member
@pvvx тогда вопрос по GPIO2 в документации часто встречается, что для загрузки из flash/flash boot (arduino случай) - GPIO2 должен быть установлен в high. как он может быть выходом?

полный список условий для flash boot:
GPIO15 - LOW
GPIO - HIGH
GPIO2 - HIGH
 

AndrF

Active member
@pvvx тогда вопрос по GPIO2 в документации часто встречается, что для загрузки из flash/flash boot (arduino случай) - GPIO2 должен быть установлен в high. как он может быть выходом?
Да элементарно же - высокий уровень у него должен быть лишь в момент старта (это задается резистором подтяжки) потом, когда программа начала работать, указываете что это выход и работаете как обычно.
 

pvvx

Активный участник сообщества
@pvvx тогда вопрос по GPIO2 в документации часто встречается, что для загрузки из flash/flash boot (arduino случай) - GPIO2 должен быть установлен в high. как он может быть выходом?
Как TX сдвоенной UART.
При активности RESET все пины в Z состоянии и защелкиваются фронтом, помещаясь в старшие биты GPIO_IN
esp8266web/gpio_reg.xlsx at master · pvvx/esp8266web · GitHub
У вас COM порт есть? Подключите к GPIO2 и прозреете, что все стартовые сообщения ROM-BIOS выводятся в оба порта: TX/GPIO1 и TX2/GPIO2.
У меня всегда включено 2 COM порта на макетках к ESP8266
Снимок1512.gif
После проверки 6 защелкнутых состояний пинов выбра режима загрузки проверяются и текущие значения, включая и другие пины. В зависимости от них, к примеру, включаетcя SWAP UART и вывод идет на другие пины. Далее, при инициализации SDK опять идет проверка уровней на портах и так-же переключаются разные пины + в зависимости от установок в esp_init_data_default.bin. Только потом переходит к выполнению кода пользователя и тут уж вы можете перенастроить пины как хотите. В Espressif сами не знают что они там понаписали - от них доков никаких не было и нет, кроме pin_reg.xlsx. Я наизусть всё состояния и условия не помню (т.к. там зависимостей более пары десятков), и копаться в старых записях не собираюсь.
полный список условий для flash boot:
Нет. Смотрите код ROM-BIOS (IDA в помощь), а так-же хотя-бы pin_reg.xlsx strapping esp8266web/pin_reg.xlsx at master · pvvx/esp8266web · GitHub
Тему уже мусолят более 2-х лет... Дублировать каждому - надоело. Ищите - всё описано давно, в меcте с циферками в "boot mode(A, B)"...
 
Последнее редактирование:

AndrF

Active member
Что спорить - долго попробовать? Передо мной как раз макетка - выбираю для интерфейса I2C пины GPIO0 и GPIO2. Заливаю - все прекрасно работает...
 

pvvx

Активный участник сообщества
Что спорить - долго попробовать? Передо мной как раз макетка - выбираю для интерфейса I2C пины GPIO0 и GPIO2. Заливаю - все прекрасно работает...
Ну и хорошо. Спорить смысла нет - можете замкнуть все ножки, какая разница? :)
Заливайте дальше, всё равно ESP в помойку.
-----
@enjoynering - я вам оставил в наследство нерешенные только вопросы c переключениями пинов при инициализации SDK в зависимости от значений в esp_init_data_default.bin:
Снимок1513.gif Снимок1514.gif
Можете порешать эти задачки :)
Кроме этих переключений, при инициализации SDK дергаются и всякие подтяжки у разных портов - кому это надо, если и так практически все пины у ESP8266 дергаются в беспорядке при старте - загадка, сокрытая Espressif :) Смотря дизассемблированный код этих частей, можно сказать только что это писал пьяный программер из Espressif, который наворотил сотни ошибок в ROM и в первых SDK...
 
Последнее редактирование:

AndrF

Active member
:)
Кроме этих переключений, при инициализации SDK дергаются и всякие подтяжки у разных портов - кому это надо, если и так практически все пины у ESP8266 дергаются в беспорядке при старте - загадка, сокрытая Espressif :)
"Дергаются при инциализации" - это значит опрашиваются? Ведь изначально они сконфигурированы как входы. Ну и фиг с ним - лично мне это совершенно не мешает. После старта я конфигурирую их как выходы и работаю с ними...
 
Сверху Снизу