Hi,
my goal is to transfer a file between two ESP32s using SPI. As a first step, I'm trying to simply send a string (as a 32-byte buffer) but so far without success, so hoping for some fresh eyes please.
The master is an S3 using HSPI default pins connected to a slave (just an older ESP32) VSPI default pins (eg S3 MOSI=11 -> ESP MOSI 23, etc).
The intention is to use transfer(buffer, size) at the master and see the string at the slave. Instead the slave RX buffer is just showing the same values as the slave TX buffer (the string is nowhere to be seen) - complete code below.
SPI_Master
#include <Arduino.h>
#include <SPI.h>
static const int spiClk = 1000000;
SPIClass *hspi = NULL;
void hspi_send_command();
void setup()
{
Serial.begin(115200);
hspi = new SPIClass(HSPI);
hspi->begin();
pinMode(SS, OUTPUT);
}
void loop()
{
hspi_send_command();
}
void hspi_send_command()
{
uint8_t spi_master_tx_buf[32];
const char *my_string = "test string with 32 character...";
// initialise the buffer
for (uint32_t i = 0; i < 32; i++)
spi_master_tx_buf[i] = my_string[i];
// debug
Serial.print("Before transfer: ");
for (size_t i = 0; i < 32; ++i)
printf("%d ", spi_master_tx_buf[i]);
printf("\n");
hspi->beginTransaction(SPISettings(spiClk, MSBFIRST, SPI_MODE0));
digitalWrite(SS, LOW);
hspi->transfer(spi_master_tx_buf, 32);
// debug
Serial.print("After transfer: ");
for (size_t i = 0; i < 32; ++i)
printf("%d ", spi_master_tx_buf[i]);
printf("\n");
digitalWrite(SS, HIGH);
hspi->endTransaction();
delay(1000);
}
SPI_Slave
#include <Arduino.h>
#include <ESP32SPISlave.h>
ESP32SPISlave slave;
static constexpr uint32_t BUFFER_SIZE{32};
uint8_t spi_slave_tx_buf[BUFFER_SIZE];
uint8_t spi_slave_rx_buf[BUFFER_SIZE];
constexpr uint8_t CORE_TASK_SPI_SLAVE{0};
constexpr uint8_t CORE_TASK_PROCESS_BUFFER{0};
static TaskHandle_t task_handle_wait_spi = 0;
static TaskHandle_t task_handle_process_buffer = 0;
void set_buffer();
void task_wait_spi(void *pvParameters);
void task_process_buffer(void *pvParameters);
void setup()
{
Serial.begin(115200);
slave.setDataMode(SPI_MODE0);
slave.begin(VSPI);
set_buffer();
xTaskCreatePinnedToCore(task_wait_spi, "task_wait_spi", 2048, NULL, 2, &task_handle_wait_spi, CORE_TASK_SPI_SLAVE);
xTaskNotifyGive(task_handle_wait_spi);
xTaskCreatePinnedToCore(task_process_buffer, "task_process_buffer", 2048, NULL, 2, &task_handle_process_buffer, CORE_TASK_PROCESS_BUFFER);
}
void loop()
{
}
void set_buffer()
{
for (uint32_t i = 0; i < BUFFER_SIZE; i++)
spi_slave_tx_buf[i] = (0xFF - i) & 0xFF;
memset(spi_slave_rx_buf, 0, BUFFER_SIZE);
}
void task_wait_spi(void *pvParameters)
{
while (1)
{
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
// block until the transaction comes from master
slave.wait(spi_slave_rx_buf, spi_slave_tx_buf, BUFFER_SIZE);
xTaskNotifyGive(task_handle_process_buffer);
}
}
void task_process_buffer(void *pvParameters)
{
while (1)
{
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
// show received data
Serial.print("RX buffer: ");
for (size_t i = 0; i < BUFFER_SIZE; ++i)
printf("%d ", spi_slave_rx_buf[i]);
printf("\n");
// show tx data
Serial.print("TX buffer: ");
for (size_t i = 0; i < BUFFER_SIZE; ++i)
printf("%d ", spi_slave_tx_buf[i]);
printf("\n");
slave.pop();
xTaskNotifyGive(task_handle_wait_spi);
}
}
I wondered if it might be a timing issue as one poster on this forum suggested the printf statements were at fault, although I have just copied those from one of the examples in the ESP32SPISlave repo.
Cheers,
j