ESP, IoT Траблы I2C слейв ESP32

Arleen Lasleur

✩✩✩✩✩✩✩
13 Мар 2021
7
1
Screenshot_20250410_110508.png
Имеется 2 платы, соединяемые шлейфом 15см многожильного провода.

Первая плата (ведущий) - контроллер с тремя двухканальными преобразователями уровня на полевом транзисторе, для UART0, UART1 и I2C. Собран на WROOM32U.
Вторая (ведомый) - преобразователь протокола, занимается чтением с wiegand ридеров. На ней нет ничего интересного, просто кучка диодов/стабилитронов для защиты от попадания 12V во вход ESPшки. Собран на Supermini у которой на плате есть "С3" в надписи, но ESP-IDF говорит что камень стоит S3.

Первый вариант подключения: просто кабелем. Подтяжкой I2C в этом случае работают правые по схеме резисторы 10k. Подтяжка, imo, так себе. Но вроде как работает (должна). Тем более на таком коротком кабеле. Челики в соседних тредах интернетов хвастаются что I2C чуть ли не на 15 метров кидали. Метры, Карл. При том что вроде как и2ц шина считается межкорпусной, всмысле между корпусами микросхем, т. е. на одной плате.

Upd: особенность этого преобразователя: работа на активный ноль. То есть, если он занимается преобразованием с 3v3 к 3v3, то он работает правильно. Тем не менеее он в 3м варианте убран, чтобы исключить до адекватного диагноза. Спойлер, диагноз не найден. Так же, стояли стабилитроны защищающие внешние линии (S**_EXT) от напряжения выше 5V. Инторнеты пишут что они могут делать голову т к имеют высокую ёмкость (сотни пФ). Тоже убраны, тоже ничего не дало.
Приборов, чтобы посмотреть чё там происходит, разумеется нет. (но видимо пора добавлять в список, раз уж на меня такие задачи ставят)

Второй вариант: замкнуты джамперы S1 S2, включающие на стороне слейва более твёрдую подтяжку (1k2 резистор обеспечивает ток в шине I2C не менее 2.75 мА). Чо именно меняет - непонятно, но теоретически меняет работу слейва. Особой разницы не замечено.

Третий вариант:
1. транзистор и один резистор в каждом канале ПУ демонтирован, т. е. образуется пустое место (линии S**_INT оторваны от чего-либо), куда можно в обход кинуть кабель со слейва.
2. что и сделано, с его 1.2k притяжкой.

Разрабы и авторы документации мамой клянутся что если не тупить с резисторами, то скоростя вплоть до 400 kHz. Дефолт 100 kHz так вообще на изичах левой задней. На деле, работает внятно т о л ь к о на неадекватно заниженной скорости, не более 5000 Hz. Кроме того:

1. Если воткнуть второй USB кабель (тупесь) в Supermini, то он ухудшает условия приёма (хотя должен улучшать, бо доп. питание, легче AMS1117-3.3 стабу у ведомого, от которого теоретически может питаться шина). Стабилизатор ведомого независимый (свой), т. е. питание к нему подводится только 5V.
2. Даже на до стрёмного низкой скорости, никакая внятная работа не гарантируется - бывает нужно нажать Reset у слейва. После этого полностью прекращается поток ошибок чтения, т. е. сильно походит на сбой синхронизации. Upd. проблема может быть, но может и не быть. Если устройство долго лежало невключенным и подключить - то может работать нормально, т. о. явно не связано с наполненностью конденсаторов по питанию.
3. Виганды по-моему присылают разные коды с одинаковой карточки, но может там что-то напутано с таском ридера. Есть wiegand-кнопки, они работают абсолютно нормально. Может искажения на I2C, может как-то связано с длиной посылки. Не суть, первоочередная проблема - (1) и (2).

Чо может быть? Дискасс.

Исходники если сильно надо покажу и объясню, но думаю будет не особо релевантно - они под FreeRTOS на ESP-IDF, инфы в нете, как выражался Oxxxy, с гулькин член. Складывается мнение что никто прежде такое вообще ни разу не делал. Тем не менее, статьи про I2C слейв на ESP - они как суслик - их не видно, но они есть. Сами разрабы из Espressif написали в аппноте что используйте версию драйвера v2, там что-то там пофикшено. Ессно всё переключено на вторую версию но толку как-то не особо. Делать битбанг на блокирующих функциях типа delay(), digitalWrite() будет затруднительно т. к. приём запросов мастера - это всё же про работу на прерываниях. Короче во FreeRTOS проще.
 
Изменено:

Геннадий П

★★★★★★✩
14 Апр 2021
1,958
630
45
Проблема в отсутствии осциллографа, с помощью которого проблема скорее всего найдётся в считанные минуты. А так, можно очень долго гадать что происходит с сигналом и как он искажается.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
585
176
проблема скорее всего найдётся в считанные минуты
Если проблема плавающая, то искать может быт не просто. И дело не обязательно в железе, может софт сбоит.
Но изначальный вопрос очень длинный и сложно написанный. Если slave не работает при рекомендованной схеме подключения, то нафига вся предыстория с усложненными схемами, и специфическим скетчем, который работает неизвестно как. Если есть сомнение в работоспособности slave, то собирается схема под конкретную задачу, проверить принципиальную работоспособность slave без остальных процессов и усложнения схемотехники.
 

Arleen Lasleur

✩✩✩✩✩✩✩
13 Мар 2021
7
1
Итак первое чо было: несоответствие протокола. Мастера писал другой человек, там была функция i2c_master_read() т. е. чтение из слейва (любого байта). Есть функция регистрового чтения i2c_master_write_read() или как-то типа того называется, короче там сперва мастер записывает в слейв один байт - "команду", как в ИК-пультах в младших байтах посылки. Переделал, но особо не зароляло, аппаратная проблема тоже была.

Второе чё было. Притяжка снаружи (левее транзистора по схеме мастера) не роляет. Должна быть сильная притяжка внутри 3V3 периметра, т. е. понадобилось заменить 10k на 4k7. Ёмкость стабилитрона, по-моему, не влияет, но да - хорошо бы померить.

Мб кому-то пригодится эта инфа. Учитывайте все места, где работает I2C подтяжка шины. Преобразователи уровня её делят на "до" и "после".
 
  • Лойс +1
Реакции: Wan-Derer