Связь ESP32<->ESP32 (проводная)

Denis Karasiov

New member
Добрый день.

Подскажите пожалуйста, есть необходимость организовать проводную связь между несколькими модулями ESP. Изначально предполагал использовать I2C - оказалось, что ESP32 не может быть слейвом. Пробую SPI - та же фигня. Остается вариант - UART, но не очень нравится, т.к. в общем случае хочется иметь возможность подключить более одного слейв-устройства.

Может я куда-то не туда смотрю и все можно, все-таки, сделать на I2C или SPI?

Спасибо
 

nikolz

Well-known member
читаем док

Шина I2C (Inter-Integrated Circuit) может использоваться для связи с несколькими внешними устройствами, подключенными к той же шине, что и ESP32. На борту ESP32 есть два контроллера I2C, каждый из которых может быть установлен в режим master или slave.
I2C — ESP-IDF Programming Guide v4.1-dev-279-g96b96ae24 documentation
ESP32 имеет четыре периферийных устройства SPI, называемых SPI0, SPI1, HSPI и VSPI. SPI0 полностью посвящен: флэш-кэш ESP32 используется для отображения в память устройства SPI flash, к которому оно подключено. SPI1-это подключен к тем же аппаратным линиям, что и SPI0, и используется для записи на флэш-чип. HSPI и ВСПИ вы можете свободно использовать, и с драйвером spi_slave, они могут быть использованы в качестве SPI ведомого устройства, управляемого от a подключенный мастер SPI.
 

pvvx

Активный участник сообщества
Подскажите пожалуйста, есть необходимость организовать проводную связь между несколькими модулями ESP.
Если модули на одной плате, тогда возможно использование I2C или SPI. Эти шины без драйверов рассчитаны на расстояние между чипами до 15-20 см. Для надежной связи на большее расстояние нужны специальные микросхемы драйверов. Для SPI это драйвера с диф.токовыми парами и они недешевы.
Из самых дешевых и оптимальных выйдет использование CAN шины. Это связь используется на несколько метров для множества устройств с приемлемыми скоростями. В принципе CAN оптимален до сотни метров, аналогично ethernet, но использует меньше ресурсов. Он для этого и разрабатывался и применяется...
Для связи по проводу на большие расстояния используют RS-485 на низком битрейте. На 9600 - до км.
 

Denis Karasiov

New member
Да, модули именно на одной плате, поэтому и смотрел в сторону I2C или SPI. Но уж очень не хотелось погружаться в SDK, хотя, похоже, придется. Спасибо.
 

Denis Karasiov

New member
Очень тяжело идет SDK.

В примере код:
Код:
//Configuration for the SPI slave interface
    spi_slave_interface_config_t slvcfg={
        .mode=0,
        .spics_io_num=GPIO_CS,
        .queue_size=3,
        .flags=0,
        .post_setup_cb=my_post_setup_cb,
        .post_trans_cb=my_post_trans_cb
    };
Ругается на параметры: mode, queue_size, post_setup_cb, post_trans_cb. Пишет:
Ошибка компиляции для платы ESP32 Dev Module
Неужели нет готового работающего примера?
 

nikolz

Well-known member
Очень тяжело идет SDK.

В примере код:
Код:
//Configuration for the SPI slave interface
    spi_slave_interface_config_t slvcfg={
        .mode=0,
        .spics_io_num=GPIO_CS,
        .queue_size=3,
        .flags=0,
        .post_setup_cb=my_post_setup_cb,
        .post_trans_cb=my_post_trans_cb
    };
Ругается на параметры: mode, queue_size, post_setup_cb, post_trans_cb. Пишет:

Неужели нет готового работающего примера?
это подойдет ?:
loboris/ESP32_NEW_SPI_MASTER_EXAMPLE
 

pvvx

Активный участник сообщества

nikolz

Well-known member
Очень тяжело идет SDK.

В примере код:
Код:
//Configuration for the SPI slave interface
    spi_slave_interface_config_t slvcfg={
        .mode=0,
        .spics_io_num=GPIO_CS,
        .queue_size=3,
        .flags=0,
        .post_setup_cb=my_post_setup_cb,
        .post_trans_cb=my_post_trans_cb
    };
Ругается на параметры: mode, queue_size, post_setup_cb, post_trans_cb. Пишет:

Неужели нет готового работающего примера?
это подойдет?
iPAS/esp32-slave-spi
 

pvvx

Активный участник сообщества
Там описано, что в принципе применение SPI на ESP32 не желательно из-за множества ограничений и глюков.
При этом глюки и баги неисправимые и несовместимые с жизнью, т.е. даже в своем устройстве их не обойти для нормальной работы в Slave...
Т.е. если что-то и выйдет, то CPU будет занят, как будто он "ногодрыгом" (ковыряет битики GPIO) работает на прием SPI. :(
 

pvvx

Активный участник сообщества
На нормальном CPU заряжаем несколько буферов DMA, включаем SPI (на одной стороне slave, на другой - мастер) и по прерыванию готовности данных вынимаем один готовый буфер, пишем в другой. Тем самым как-бы имеем отображение общей области памяти у обоих и сигнал обновления...
Если оба на одной плате, то ставим скорость SPI за 100 МГц.
 
Сверху Снизу