Esp32 S3 две шины I2C

Помогите разобраться с шиной I2C.

Адаптирую проект метеостанции под свой дисплей esp32-8048s070 , на дисплее touch подключен через I2C к gpio 19 20 esp32 , на плате есть разьем I2C но с gpio 17 и 18 к нему я подключил датчики si7021 или bme280. В исходном коде если не использовать датчики то тач работает , если использовать датчики то после инициализации тача она перед ними идет , для работы с датчиками wire переписывает wire.begin(pin_i2c_sda, pin_i2c_scl); ну и соответственно тач не работает.

 //-----------------scr_touch==scr_touch
#ifdef scr_touch
#ifdef scr_touch_GT911
//#include "TAMC_GT911.h" //addr 0x5D
int8_t touch_rotation = -1; //1,3
#include "Touch_GT911.h"
#if defined(ESP32)
#if defined(tft_800_480_5)||defined(tft_800_480_7)
#define TOUCH_SDA  19
#define TOUCH_SCL  20
#define TOUCH_INT -1
#define TOUCH_RST 38
#endif
#endif //911
Touch_GT911 tp = Touch_GT911(TOUCH_SDA, TOUCH_SCL, GPIO_NUM_NC, TOUCH_RST, tft_w, tft_h);
.
.
.
.
. 

//----------------I2C
#ifdef i2c_gpio_user
  Wire.begin(pin_i2c_sda, pin_i2c_scl);
#ifdef debug
  printF("\tuser_sda:"); Serial.println(pin_i2c_sda);
  printF("\tuser_scl:"); Serial.println(pin_i2c_scl);
#endif
#endif

погуглив нашел что можно использовать такое определение для шин wire.begin(SDA1, SCL1); wire1.begin(SDA2, SCL2);

но во всех библиотеках проекта используется wire это получается что все библиотеки переделывать придется ?

существует ли метод работы шины I2C на дублирующих выводах или как в таком случаи быть может кто сталкивался с подобным ?

исходник и схема

На m5core2 есть две i2c шины.
Wire. …
Wire1. …
Можешь у m5 подсмотреть.

то что можно так две шины организовать я понял wire и wire1 , но тогда библиотеки переделать придется под wire1 тк там везде используется wire (или я что то не понимаю?). интересно можно ли как то без переделки библиотек обьединить две I2C в одну ware ?
вот нахрена разработчики дисплея посадили тач на отдельные выводы а не на разьем что на плате I2C

автозамена сделает это за 200 миллисекунд :slight_smile:

не хотел конечно исправлять библиотеки думал есть какие нибудь варианты еще , после работы вечером попробую.

& .cpp

Есть мнение, что тебе лучше только там поправить wire на wire1.

Есть библиотеки принимающие как параметр ссылку или указатель на объект Wire

Для si7021 или bme280 например Adafruit

1 лайк

Всё верно, можно сделать несколько i2c интерфейсов.
Есть еще вариант, два проводочка припаять к i2c от тачпада и использовать его как единственный i2c. (Но надо в коде смотреть, как реализованы инициализация и использование i2c тачпада, возможно нужно будет править код)

Проще походу gt911 подправить.

Проводки паять мне кажется не вариант плату не хочу портить, программно хотелось бы.

Тут уж выбрать… Либо проводочки, либо библиотеки переписывать

Хотя непонятно, чем вас ответ #7 не устраивает… ни паять, ни библиотеки править не потребуется

К сожалению я не совсем понял в 7 сообщении ((Есть библиотеки принимающие как параметр ссылку или указатель на объект Wire)) как такой вариант реализовать.

Есть библиотеки, где интерфейс I2c прописан жестко - то есть указано Wire и только с ним библиотека и работает.

А есть те, где номер I2c - величина переменная. То есть можно задать, чтобы библиотека обращалась к Wire, а можно к Wire1, или Wire2 (если есть). И задается это одной переменной в коде, без замены Wire на Wire1 в исходниках библиотеки

Возможно есть другой вариант использования, с указанием ссылки на существующий wire. Смотри функции в h файле.

Вы когда экземпляр класса делаете - указываете там нужную вам шину.

class TwoWire bus0(0); // I2C0
class TwoWire bus1(1); // I2C1

Затем вызываете свой bus1::begin() и bus0::begin() и пользуетесь.

Если у вас есть чей-то код, который ожидает что объект называется “Wire“ - ну исправьте.

По умолчанию в Arduino Core есть два экземпляра класса: Wire и Wire1. Но никто вас не заставляет ими пользоваться

так и сделал в touch.cpp поменял wire на wire1 это было самое лучшее решение так как другую шину wire использует три библиотеки .