//! Async SPI API use core::future::Future; /// Full duplex (master mode) /// /// # Notes /// /// - It's the task of the user of this interface to manage the slave select lines /// /// - Due to how full duplex SPI works each `try_read` call must be preceded by a `try_send` call. /// /// - `try_read` calls only return the data received with the last `try_send` call. /// Previously received data is discarded /// /// - Data is only guaranteed to be clocked out when the `try_read` call succeeds. /// The slave select line shouldn't be released before that. /// /// - Some SPIs can work with 8-bit *and* 16-bit words. You can overload this trait with different /// `Word` types to allow operation in both modes. pub trait FullDuplex { /// An enumeration of SPI errors type Error; type WriteFuture<'a>: Future> + 'a; type ReadFuture<'a>: Future> + 'a; type WriteReadFuture<'a>: Future> + 'a; fn read<'a>(&'a mut self, data: &'a mut [Word]) -> Self::ReadFuture<'_>; fn write<'a>(&'a mut self, data: &'a [Word]) -> Self::WriteFuture<'_>; fn read_write<'a>( &mut self, read: &'a mut [Word], write: &'a [Word], ) -> Self::WriteReadFuture<'_>; }