Rust Bare Metal implementation of SPI interface with DMA for ESP32.
Add dependencies to the project:
cargo add esp-display-interface-spi-dma
cargo add static_cell
cargo add esp-bsp
Example for ESP32-S3-BOX:
use static_cell::make_static;
use esp_display_interface_spi_dma::display_interface_spi_dma;
...
let dma = Gdma::new(peripherals.DMA);
let dma_channel = dma.channel0;
let descriptors = make_static!([0u32; 8 * 3]);
let rx_descriptors = make_static!([0u32; 8 * 3]);
let (lcd_sclk, lcd_mosi, lcd_cs, lcd_miso, lcd_dc, mut lcd_backlight, lcd_reset) = lcd_gpios!(BoardType::ESP32S3Box, io);
let spi = Spi::new(
peripherals.SPI2,
40u32.MHz(),
SpiMode::Mode0,
&clocks
).with_pins(
Some(lcd_sclk),
Some(lcd_mosi),
Some(lcd_miso),
Some(lcd_cs),
).with_dma(
dma_channel.configure(
false,
&mut *descriptors,
&mut *rx_descriptors,
DmaPriority::Priority0,
)
);
let di = display_interface_spi_dma::new_no_cs(2 * 256 * 192, spi, lcd_dc);
let display_config = DisplayConfig::for_board(BoardType::ESP32S3Box);
let mut display = match mipidsi::Builder::ili9342c_rgb565(di)
.with_display_size(display_config.h_res, display_config.v_res)
.with_orientation(mipidsi::Orientation::PortraitInverted(false))
.with_color_order(mipidsi::ColorOrder::Bgr)
.init(&mut delay, Some(lcd_reset))
{
Ok(display) => display,
Err(_e) => {
// Handle the error and possibly exit the application
panic!("Display initialization failed");
}
};