Как я могу передавать данные от ведомого устройства к ведущему с ESP32 (ведомого устройства) на Arduino (master) с помощью ESPDMASPI?

#esp32 #spi #platformio

#esp32 #spi #platformio

Вопрос:

В настоящее время я работаю над проектом, который использует ESP32 в качестве ведомого устройства SPI с Arduino Uno в качестве ведущего устройства SPI. Я разрабатываю это platformio и использую Arduino framework для ESP32. Я наткнулся на эту библиотеку hideakitai ESP32DMASPI. Я успешно передаю данные с Uno на ESP32 (вдохновленный примером):

 while(spi.available())
{
    uint8_t data[BUFFER_SIZE] = {0};
    for (size_t i = 0; i < BUFFER_SIZE;   i)
    {
        data[i] = spi_slave_rx_buf[i];
        spi_slave_rx_buf[i] = 0;
    }
    user_onReceive(data);
    spi.pop();
}
 

Я изо всех сил пытаюсь реализовать on_request функцию «» для отправки (передачи) байта обратно в master. Как мне это сделать?

Глядя на то, как работает SPI, линия MISO передает те же данные, что и MOSI дополнительные данные, добавленные ведомым устройством, так ли это работает? Могу ли я реализовать что-то подобное с помощью ESP32DMASPI?

Любая помощь приветствуется! TIA

Комментарии:

1. У Hideakitai есть другая библиотека esp32-slave-spi , которая не использует DMA и проще (и медленнее, но это не имеет большого значения, учитывая, что у вас был более медленный Arduino в качестве SPI master). У него есть несколько примеров, в том числе о том, как настроить буфер передачи данных (это данные для отправки ведущему устройству), используя либо опрос, либо задачу freertos. Его работы основаны на документации по драйверам ведомого устройства ESP32 SPI .

Ответ №1:

Шина SPI обладает двумя особыми свойствами.

Во-первых, это полный дуплекс, что означает одновременные потоки данных в обоих направлениях (от ведущего устройства к ведомому, от ведомого устройства к ведущему). Каждый раз, когда линия SCLK завершает цикл, 1 бит данных передается на MISO и столько же на MOSI. Нет случаев, когда потоки данных идут только в одном направлении, всегда в обоих (очевидно, что данные могут быть бессмысленными или фиктивными, если нет ничего подходящего для отправки).

Во-вторых, только ведущий может инициировать передачу данных по шине SPI. Это сложная часть. Если у ведомого устройства есть какие-либо данные для отправки ведущему устройству, у него должны быть готовы эти данные в очереди / буфере передачи. В следующий раз, когда master запускает передачу данных (т.Е. синхронизирует шину), Эти данные отправляются от ведомого устройства к ведущему (и тот же объем данных передается в противоположном направлении, но это может быть фиктивным). Ведущий должен позаботиться о том, чтобы синхронизировать шину достаточно раз, чтобы считывать все данные с ведомого устройства.

Вам выпала честь создать (обрамляющий) протокол поверх SPI, который учитывает эти свойства и выполняет работу. Например. возможно, вы захотите начинать каждую передачу шины с того, что ведомое устройство отправляет количество байтов данных, которые оно поставило в очередь для передачи, чтобы ведущее устройство знало, сколько данных ему нужно для синхронизации с ведомого устройства. Или, в качестве более простого решения, всегда передавайте минимальное количество байтов, чтобы получить сообщение любого размера, а затем разберитесь позже, было ли отправлено сообщение или нет.