Skip to main content

SPI Driver

These functions allow you to configure and interact with the SPI peripheral on the ESP32 from within a WebAssembly module.


SPI Bus Configuration

Create SPI Bus Configuration

spi_bus_config = wasm_spi_bus_config_create();
  • Description: Creates a new SPI bus configuration object.
  • Returns: A pointer to the SPI bus configuration object.

Set MOSI Pin

wasm_spi_bus_config_set_mosi_io_num(spi_bus_config, mosi_io_num);
  • Parameters:
    • spi_bus_config: Pointer to the SPI bus configuration object.
    • mosi_io_num: GPIO number for the MOSI pin.
  • Description: Sets the GPIO number for the MOSI pin.

Set SCLK Pin

wasm_spi_bus_config_set_sclk_io_num(spi_bus_config, sclk_io_num);
  • Parameters:
    • spi_bus_config: Pointer to the SPI bus configuration object.
    • sclk_io_num: GPIO number for the SCLK pin.
  • Description: Sets the GPIO number for the SCLK pin.

Destroy SPI Bus Configuration

wasm_spi_bus_config_destroy(spi_bus_config);
  • Parameters:
    • spi_bus_config: Pointer to the SPI bus configuration object.
  • Description: Frees the memory allocated for the SPI bus configuration object.

Initialize SPI Bus

result = wasm_spi_bus_initialize(host_id, spi_bus_config, dma_chan);
  • Parameters:
    • host_id: SPI host ID (e.g., SPI2_HOST or SPI3_HOST).
    • spi_bus_config: Pointer to the SPI bus configuration object.
    • dma_chan: DMA channel to use (e.g., SPI_DMA_CH_AUTO).
  • Returns: ESP_OK on success, or an error code on failure.
  • Description: Initializes the SPI bus with the specified configuration.

SPI Device Configuration

Create SPI Device Configuration

spi_device_config = wasm_spi_device_interface_config_create();
  • Description: Creates a new SPI device configuration object.
  • Returns: A pointer to the SPI device configuration object.

Set CS Pin

wasm_spi_device_interface_config_set_spics_io_num(spi_device_config, cs_io_num);
  • Parameters:
    • spi_device_config: Pointer to the SPI device configuration object.
    • cs_io_num: GPIO number for the CS pin.
  • Description: Sets the GPIO number for the CS pin.

Destroy SPI Device Configuration

wasm_spi_device_interface_config_destroy(spi_device_config);
  • Parameters:
    • spi_device_config: Pointer to the SPI device configuration object.
  • Description: Frees the memory allocated for the SPI device configuration object.

Add SPI Device

result = wasm_spi_bus_add_device(host_id, spi_device_config, handle_ptr);
  • Parameters:
    • host_id: SPI host ID (e.g., SPI2_HOST or SPI3_HOST).
    • spi_device_config: Pointer to the SPI device configuration object.
    • handle_ptr: Pointer to store the handle of the added device.
  • Returns: ESP_OK on success, or an error code on failure.
  • Description: Adds a device to the SPI bus.

SPI Transactions

Create SPI Transaction

spi_transaction = wasm_spi_transaction_create();
  • Description: Creates a new SPI transaction object.
  • Returns: A pointer to the SPI transaction object.

Set Transaction Length

wasm_spi_transaction_set_length(spi_transaction, length);
  • Parameters:
    • spi_transaction: Pointer to the SPI transaction object.
    • length: Length of the transaction in bits.
  • Description: Sets the length of the SPI transaction.

Set TX Buffer

result = wasm_spi_transaction_set_tx_buffer(spi_transaction, tx_buffer_ptr);
  • Parameters:
    • spi_transaction: Pointer to the SPI transaction object.
    • tx_buffer_ptr: Pointer to the buffer containing data to transmit.
  • Returns: ESP_OK on success, or an error code on failure.
  • Description: Sets the TX buffer for the SPI transaction.

Destroy SPI Transaction

wasm_spi_transaction_destroy(spi_transaction);
  • Parameters:
    • spi_transaction: Pointer to the SPI transaction object.
  • Description: Frees the memory allocated for the SPI transaction object.

Transmit SPI Transaction

result = wasm_spi_device_transmit(handle_ptr, spi_transaction);
  • Parameters:
    • handle_ptr: Handle of the SPI device.
    • spi_transaction: Pointer to the SPI transaction object.
  • Returns: ESP_OK on success, or an error code on failure.
  • Description: Transmits the SPI transaction to the device.

Example Usage

Initialize SPI Bus and Transmit Data

// Step 1: Create and configure SPI bus
spi_bus_config = wasm_spi_bus_config_create();
wasm_spi_bus_config_set_mosi_io_num(spi_bus_config, 23); // Set MOSI pin to GPIO 23
wasm_spi_bus_config_set_sclk_io_num(spi_bus_config, 18); // Set SCLK pin to GPIO 18

// Step 2: Initialize SPI bus
result = wasm_spi_bus_initialize(SPI2_HOST, spi_bus_config, SPI_DMA_CH_AUTO);
if (result != ESP_OK) {
println("Failed to initialize SPI bus");
wasm_spi_bus_config_destroy(spi_bus_config);
return;
}

// Step 3: Create and configure SPI device
spi_device_config = wasm_spi_device_interface_config_create();
wasm_spi_device_interface_config_set_spics_io_num(spi_device_config, 5); // Set CS pin to GPIO 5

// Step 4: Add SPI device
let handle_ptr = 0;
result = wasm_spi_bus_add_device(SPI2_HOST, spi_device_config, handle_ptr);
if (result != ESP_OK) {
println("Failed to add SPI device");
wasm_spi_device_interface_config_destroy(spi_device_config);
wasm_spi_bus_config_destroy(spi_bus_config);
return;
}

// Step 5: Create and configure SPI transaction
spi_transaction = wasm_spi_transaction_create();
wasm_spi_transaction_set_length(spi_transaction, 8 * 4); // Set transaction length to 4 bytes

let tx_buffer = new Uint8Array([0x01, 0x02, 0x03, 0x04]); // Data to transmit
result = wasm_spi_transaction_set_tx_buffer(spi_transaction, tx_buffer.buffer);
if (result != ESP_OK) {
println("Failed to set TX buffer");
wasm_spi_transaction_destroy(spi_transaction);
return;
}

// Step 6: Transmit SPI transaction
result = wasm_spi_device_transmit(handle_ptr, spi_transaction);
if (result != ESP_OK) {
println("Failed to transmit SPI transaction");
} else {
println("SPI transaction transmitted successfully");
}

// Step 7: Clean up
wasm_spi_transaction_destroy(spi_transaction);
wasm_spi_device_interface_config_destroy(spi_device_config);
wasm_spi_bus_config_destroy(spi_bus_config);

This example demonstrates how to configure the SPI bus, add a device, and transmit data using the SPI bindings.