Делюсь опытом Правильная библиотека для работы с 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

New 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

Active 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

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

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