• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

Делюсь опытом Правильная библиотека для работы с I2C: brzo_i2c

DarkSide

New member
Предлагаю вашему вниманию замену стандартной i2c_master - GitHub - pasko-zh/brzo_i2c: Brzo I2C is a fast I2C Implementation written in Assembly for the esp8266
Отличие от "дефоултной" в том что часть отвечающая за коммуникацию написана на ассемблере, в результате имеем идеальную форму импульсов + есть возможность задать частоту шины. Сам лично проверил её на DS3231 и AT24C32 - работает на ура, в отличие от i2c_master с которой время от времени возникали ошибки в коммуникации. Кроме того brzo_i2c работает с Arduino "из коробки".
 

DarkSide

New member
Прелестно
[inline]// Disable all interrupts, i.e. interrupts up to the highest interrupt level[/inline]
И что?
Либа используется в проекте с двумя i2c slave-ами (опрос раз в секунду), постоянным поллингом 4х GPIO портов, wifi ap/sta, веб-интерфейсом. Работает стабильно, по watchdog-у не ребутит, wifi не отваливается.
 

pvvx

Активный участник сообщества
Отличие от "дефоултной" в том что часть отвечающая за коммуникацию написана на ассемблере, в результате имеем идеальную форму импульсов + есть возможность задать частоту шины.
Т.е. при смене частоты CPU на 160 MHz формат опроса не меняется? Или опять....
И как "в ассемблере" побеждено стробирование и загрузка шины (её FIFO) ?
При 160 MHz на время работы забитого FIFO уходит к сотне тактов CPU и без разницы на чем писать, на asm или си. Единственная привязка - счетчик тактов CPU и асинхронная ему шина с FIFO до регистров внешних портов, тоже со своим стробом. По этому asm не исправит дело, если требуется работа на предельной частоте I2C (чтобы не было выпадов более скоростных импульсов, к примеру во время/после прерывания кода внешними прерываниями) . Вы проверили разные варианты вхождения в процедуры переключения пинов при разной загрузке FIFO шины до них? :)
 
Последнее редактирование:

DarkSide

New member
Т.е. при смене частоты CPU на 160 MHz формат опроса не меняется?
Меняется.
На остальные вопросы я вам ответа дать не могу, т.к. автор не я.
При 160 Mhz не тестировал, т.к. 80 Mhz для моих задач вполне хватает.
I2C проверял на частотах 100 и 400 Khz.
Мои заключения по поводу "чистоты" сигнала основаны на анализе SDA и SCL сигналов (логическим анализатором с частотой сэмплирования 2Mhz - сравнивал работу i2c_master и brzo_i2c) и собственно проекта в котором в начале использовался i2c_master, и затем заменен на brzo.
 

raddd

New member
Предлагаю вашему вниманию замену стандартной i2c_master - GitHub - pasko-zh/brzo_i2c: Brzo I2C is a fast I2C Implementation written in Assembly for the esp8266
Отличие от "дефоултной" в том что часть отвечающая за коммуникацию написана на ассемблере, в результате имеем идеальную форму импульсов + есть возможность задать частоту шины. Сам лично проверил её на DS3231 и AT24C32 - работает на ура, в отличие от i2c_master с которой время от времени возникали ошибки в коммуникации. Кроме того brzo_i2c работает с Arduino "из коробки".
добрый день! можно глянуть пример чтения-записи для 24Схх?
сечас работаю с wire. два слева, один 24с04, второй атмега. все работает пока не переведешь мегу на 3.3 вольта.
т.к. надо снизить частоту меги с 16мгц до 8ми. возникает проблемма с чтением меги (иногда не читает). 24с04 читает четко.
полагаю надо снизить частоту SCL, но смена не работает (по осциллографу всегда одна частота независимо от Wire.setClock(4000); )
спасибо!
 

valerivp

Member
Можно для тех кто еще не курсе - т.е. встроенный аппаратный i2c в esp8266 не работает нормально?
 

pvvx

Активный участник сообщества
почему тогда на картинках по запросу: Яндекс.Картинки

на пинах D1 и D2 написано SCL и SDA?
Для понту. Ну чтобы все туда подключали I2C, типа стандарт для Arduino к ESP
У ESP8266 на борту есть всего UART, (Q)SPI, I2S контроллеры. И те, без DMA, а с жалким подобием.
Большинство микросхем с якобы I2C на самом деле имеют SMBUS, а ESP8266 его не поддерживает, т.к. полингом это сделать не всегда возможно.
Т.е. для современной шины I2C необходимо, чтобы вход/выход SCL и SDA были в виде "открытого коллектора" и необходимо учитывать, что slave устройство информирует master о тайм-ауте/ready удержанием сигнала SCL в "нуле". А в имеющихся либах для ESP сигнал SCL сделан пуш-пул выходом и никто на нем ничего не смотрит, что там творится КЗ. :)
Для игры в Arduino и так потянет - на нем же не делать рабочих устройств, а для ознакомления с азами программирования, да поиграться - достаточно. Подумаешь, что иногда будет сбоить и давать неправильные данные - из него не стрелять и осечки пофигу - это оcнова Arduino...
 
Последнее редактирование:

enjoynering

Well-known member
А в имеющихся либах для ESP сигнал SCL сделан пуш-пул выходом и никто на нем ничего не смотрит, что там творится КЗ. :)
вы ошибаетесь, во фреймворке под Arduino SCL и SDA переключаются в высокое состояние путем перевода пина в INPUT и включают внутреннюю подтяжку PULLUP порядка 30kOhm..100kOhm. в низкое путем OUTPUT LOW. те это не чистый push-pull. так что ничего не выгорит.

тут многие жаловались на корявость стандартной либы i2c под Arduino. она глючила, esp8266 висла и перегружалась при подключении нескольких slave.

модераторы и аксакалы предлагали странные пути решения. от не подключать больше одного устройства, не использовать i2c и прейти на spi, добавить еще один мк с нативной поддержкой i2c и передавать данные в esp по uart. до ответа в стиле сам дурак у меня все работает с одним slave. в общем советовали все лишь бы исправлять библиотеку. и вроде умные люди и C++ знают как свои 5 пальцев, но за последние 3 года так никто ничего сделал. темы плодились, а модераторы ворчали - "зачем создавать дубль. поиском пользоваться надо". ответы рядовых пользователей я цитировать не буду, там сплошное ардуино головного мозга.

в общем пришлось покурить официальный datasheet на i2c и немного переписать драйвер и библиотеку обертку под Arduino. теперь esp8266 не перегружается при подключении нескольких slave.

забирать тут - enjoyneering/ESP8266-I2C-Driver
 
Последнее редактирование:

ecoins1994

New member
вы ошибаетесь, во фреймворке под Arduino SCL и SDA переключаются в высокое состояние путем перевода пина в INPUT и включают внутреннюю подтяжку PULLUP порядка 30kOhm..100kOhm. в низкое путем OUTPUT LOW. те это не чистый push-pull. так что ничего не выгорит.

тут многие жаловались на корявость стандартной либы i2c под Arduino. она глючила, esp8266 висла и перегружалась при подключении нескольких slave.

модераторы и аксакалы предлагали странные пути решения. от не подключать больше одного устройства, не использовать i2c и прейти на spi, добавить еще один мк с нативной поддержкой i2c и передавать данные в esp по uart. до ответа в стиле сам дурак у меня все работает с одним slave. в общем советовали все лишь бы исправлять библиотеку. и вроде умные люди и C++ знают как свои 5 пальцев, но за последние 3 года так никто ничего сделал. темы плодились, а модераторы ворчали - "зачем создавать дубль. поиском пользоваться надо". ответы рядовых пользователей я цитировать не буду, там сплошное ардуино головного мозга.

в общем пришлось покурить официальный datasheet на i2c и немного переписать драйвер и библиотеку обертку под Arduino. теперь esp8266 не перегружается при подключении нескольких slave.

забирать тут - enjoyneering/ESP8266-I2C-Driver
 

ecoins1994

New member
Почитал Ваши библиотеки под LCD и i2c ESP-8266 классно написано.
На их основе набрался опыта.
Вопросы:
1. В родной библиотеке Arduino IDE Wire.h (под AVR) нет ли подобных проблем - иногда у меня она зависает?
2. Не могли бы Вы написать командный файл для замены родной библиотеки Wire.h ESP8266 на Вашу.
3.Для ESP32 Ваша библиотека Wire.h подойдёт?
 

enjoynering

Well-known member
батник - это хорошая идея. как соберусь, разберусь и напишу.

на сколько мне известно у esp32 и avr аппратный i2c. там все должно работать нормально. может ошибка в вашем коде или библиотеках?
 
Сверху Снизу