
Имеется 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 проще.
Изменено: