//! Embassy SPI //! //! Depending on your target and the board you are using you have to change the //! pins. //! //! Connect MISO and MOSI pins to see the outgoing data is read as incoming //! data. //! //! The following wiring is assumed: //! SCLK => GPIO0 //! MISO => GPIO2 //! MOSI => GPIO4 //! CS => GPIO5 //% CHIPS: esp32 esp32c2 esp32c3 esp32c6 esp32h2 esp32s2 esp32s3 //% FEATURES: embassy embassy-generic-timers #![no_std] #![no_main] use embassy_executor::Spawner; use embassy_time::{Duration, Timer}; use esp_backtrace as _; use esp_hal::{ dma::*, dma_buffers, gpio::Io, prelude::*, spi::{master::Spi, SpiMode}, timer::timg::TimerGroup, }; #[esp_hal_embassy::main] async fn main(_spawner: Spawner) { esp_println::println!("Init!"); let peripherals = esp_hal::init(esp_hal::Config::default()); let timg0 = TimerGroup::new(peripherals.TIMG0); esp_hal_embassy::init(timg0.timer0); let io = Io::new(peripherals.GPIO, peripherals.IO_MUX); let sclk = io.pins.gpio0; let miso = io.pins.gpio2; let mosi = io.pins.gpio4; let cs = io.pins.gpio5; let dma = Dma::new(peripherals.DMA); cfg_if::cfg_if! { if #[cfg(any(feature = "esp32", feature = "esp32s2"))] { let dma_channel = dma.spi2channel; } else { let dma_channel = dma.channel0; } } let (rx_buffer, rx_descriptors, tx_buffer, tx_descriptors) = dma_buffers!(32000); let dma_rx_buf = DmaRxBuf::new(rx_descriptors, rx_buffer).unwrap(); let dma_tx_buf = DmaTxBuf::new(tx_descriptors, tx_buffer).unwrap(); let mut spi = Spi::new(peripherals.SPI2, 100.kHz(), SpiMode::Mode0) .with_pins(Some(sclk), Some(mosi), Some(miso), Some(cs)) .with_dma(dma_channel.configure_for_async(false, DmaPriority::Priority0)) .with_buffers(dma_rx_buf, dma_tx_buf); let send_buffer = [0, 1, 2, 3, 4, 5, 6, 7]; loop { let mut buffer = [0; 8]; esp_println::println!("Sending bytes"); embedded_hal_async::spi::SpiBus::transfer(&mut spi, &mut buffer, &send_buffer) .await .unwrap(); esp_println::println!("Bytes received: {:?}", buffer); Timer::after(Duration::from_millis(5_000)).await; } }