use embedded_hal_async::spi::SpiDevice; use embedded_hal_async::spi::Operation; pub async fn read_adc, const N: usize>(device: &mut SPI, channels: [u8; N]) -> [u16; N] { let p = N; let p2 = p * 2; let mut buffers = [0u8; 16]; for (k, v) in channels.iter().enumerate() { buffers[2 * k] = v << 3; buffers[2 * k + 1] = 0; } let mut operation = [Operation::TransferInPlace(&mut buffers[0..p2])]; device.transaction(&mut operation).await.unwrap(); let mut results = [0u16; N]; for i in 0..N { results[i] = u16::from_be_bytes([buffers[2*i], buffers[2*i + 1]]) } return results; } #[embassy_executor::task] async fn spi_task(mut spi: SPI1, cs: Output<'static>) { let spi_bus = Mutex::new(RefCell::new(spi)); let spi = SpiDevice::new(&spi_bus, cs); let results = read_adc(&mut spi, [0,1,2,3,4,5,6,7]).await; info!("ADC: {:?}", results); Timer::after_millis(100); }