From b28b61dc4aeb772502c61e4b0d9091569fac4a40 Mon Sep 17 00:00:00 2001 From: Felipe Balbi Date: Thu, 11 Dec 2025 15:56:27 -0800 Subject: [iMXRT] Add spi driver --- examples/mimxrt6/Cargo.toml | 2 ++ examples/mimxrt6/src/bin/spi-async.rs | 35 ++++++++++++++++++++++++ examples/mimxrt6/src/bin/spi.rs | 51 +++++++++++++++++++++++++++++++++++ 3 files changed, 88 insertions(+) create mode 100644 examples/mimxrt6/src/bin/spi-async.rs create mode 100644 examples/mimxrt6/src/bin/spi.rs (limited to 'examples') diff --git a/examples/mimxrt6/Cargo.toml b/examples/mimxrt6/Cargo.toml index dc09e97e7..ada112833 100644 --- a/examples/mimxrt6/Cargo.toml +++ b/examples/mimxrt6/Cargo.toml @@ -21,6 +21,8 @@ embedded-hal-async = "1.0.0" mimxrt600-fcb = "0.2.2" panic-probe = { version = "1.0.0", features = ["print-defmt"] } +embedded-hal-bus = "0.3.0" +is31fl3743b-driver = { version = "0.1.1", features = ["is_blocking"] } # cargo build/run [profile.dev] diff --git a/examples/mimxrt6/src/bin/spi-async.rs b/examples/mimxrt6/src/bin/spi-async.rs new file mode 100644 index 000000000..aa56f7c42 --- /dev/null +++ b/examples/mimxrt6/src/bin/spi-async.rs @@ -0,0 +1,35 @@ +#![no_std] +#![no_main] + +use defmt::info; +use embassy_executor::Spawner; +use embassy_imxrt::bind_interrupts; +use embassy_imxrt::flexcomm::spi::{InterruptHandler, Spi}; +use embassy_imxrt::peripherals::FLEXCOMM5; +use {defmt_rtt as _, embassy_imxrt_examples as _, panic_probe as _}; + +bind_interrupts!(struct Irqs { + FLEXCOMM5 => InterruptHandler; +}); + +const BUFLEN: usize = 1024; + +#[embassy_executor::main] +async fn main(_spawner: Spawner) { + let p = embassy_imxrt::init(Default::default()); + + info!("Initializing SPI"); + + let mut spi = Spi::new_async(p.FLEXCOMM5, p.PIO1_3, p.PIO1_5, p.PIO1_4, Irqs, Default::default()); + + let mut rxbuf = [0x55; BUFLEN]; + let txbuf = [0xaa; BUFLEN]; + + for _ in 0..10 { + spi.async_transfer(&mut rxbuf, &txbuf).await.unwrap(); + assert!(rxbuf.iter().all(|b| *b == 0xaa)); + rxbuf.fill(0x55); + } + + info!("SPI transfers succeeded"); +} diff --git a/examples/mimxrt6/src/bin/spi.rs b/examples/mimxrt6/src/bin/spi.rs new file mode 100644 index 000000000..4854432e8 --- /dev/null +++ b/examples/mimxrt6/src/bin/spi.rs @@ -0,0 +1,51 @@ +#![no_std] +#![no_main] + +use defmt::info; +use embassy_executor::Spawner; +use embassy_imxrt::flexcomm::spi::Spi; +use embassy_imxrt::gpio; +use embassy_time::{Delay, Timer}; +use embedded_hal_bus::spi::ExclusiveDevice; +use is31fl3743b_driver::{CSy, Is31fl3743b, SWx}; +use {defmt_rtt as _, embassy_imxrt_examples as _, panic_probe as _}; + +#[embassy_executor::main] +async fn main(_spawner: Spawner) { + let p = embassy_imxrt::init(Default::default()); + + info!("Initializing SPI"); + + let cs = gpio::Output::new( + p.PIO1_6, + gpio::Level::Low, + gpio::DriveMode::PushPull, + gpio::DriveStrength::Normal, + gpio::SlewRate::Standard, + ); + + let spi = Spi::new_blocking(p.FLEXCOMM5, p.PIO1_3, p.PIO1_5, p.PIO1_4, Default::default()); + let delay = Delay; + + // One SPI device only on the SPI bus + let spi_dev = ExclusiveDevice::new(spi, cs, delay).unwrap(); + + // Instantiate IS31FL3743B device + let mut driver = Is31fl3743b::new(spi_dev).unwrap(); + + // Enable phase delay to help reduce power noise + let _ = driver.enable_phase_delay(); + // Set global current, check method documentation for more info + let _ = driver.set_global_current(90); + + let _ = driver.set_led_peak_current_bulk(SWx::SW1, CSy::CS1, &[100; 11 * 18]); + + // Driver is fully set up, we can now start turning on LEDs! + // Create a white breathing effect + loop { + for brightness in (0..=255_u8).chain((0..=255).rev()) { + let _ = driver.set_led_brightness_bulk(SWx::SW1, CSy::CS1, &[brightness; 11 * 18]); + Timer::after_micros(1).await; + } + } +} -- cgit