#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];
void setup() {
// Setup serial port
Serial.begin(115200);
// note: the default pins are different depending on the board
// please refer to README Section "SPI Buses and SPI Pins" for more details
slave.setDataMode(SPI_MODE0);
// HSPI = CS: 15, CLK: 14, MOSI: 13, MISO: 12 -> default
// VSPI = CS: 5, CLK: 18, MOSI: 23, MISO: 19
slave.begin(VSPI); //VSPI mode
//slave.begin(); //HSPI mode
// clear buffers
memset(spi_slave_tx_buf, 0, BUFFER_SIZE);
memset(spi_slave_rx_buf, 0, BUFFER_SIZE);
}
void loop() {
// if there is no transaction in queue, add transaction
if (slave.remained() == 0)
slave.queue(spi_slave_rx_buf, spi_slave_tx_buf, BUFFER_SIZE);
// if transaction has completed from master,
// available() returns the number of completed transactions,
// and `spi_slave_rx_buf` is automatically updated
while (slave.available()) {
// do something with `spi_slave_rx_buf`
// show received data
for (size_t i = 0; i < slave.size(); ++i) {
printf("%d ", spi_slave_rx_buf[i]);
}
printf("\n");
slave.pop();
}
}
/**
TASK MODE
#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 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);
// do something with `spi_slave_rx_buf`
slave.pop();
xTaskNotifyGive(task_handle_wait_spi);
}
}
void setup() {
// note: the default pins are different depending on the board
// please refer to README Section "SPI Buses and SPI Pins" for more details
slave.setDataMode(SPI_MODE0);
slave.begin(HSPI);
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() {
}
**/