#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, который учитывает эти свойства и выполняет работу. Например. возможно, вы захотите начинать каждую передачу шины с того, что ведомое устройство отправляет количество байтов данных, которые оно поставило в очередь для передачи, чтобы ведущее устройство знало, сколько данных ему нужно для синхронизации с ведомого устройства. Или, в качестве более простого решения, всегда передавайте минимальное количество байтов, чтобы получить сообщение любого размера, а затем разберитесь позже, было ли отправлено сообщение или нет.