diff --git a/embassy-traits/src/lib.rs b/embassy-traits/src/lib.rs index bf5c63de..81a847ef 100644 --- a/embassy-traits/src/lib.rs +++ b/embassy-traits/src/lib.rs @@ -13,4 +13,5 @@ pub mod flash; pub mod gpio; pub mod i2c; pub mod qei; +pub mod spi; pub mod uart; diff --git a/embassy-traits/src/spi.rs b/embassy-traits/src/spi.rs new file mode 100644 index 00000000..d0cf29e6 --- /dev/null +++ b/embassy-traits/src/spi.rs @@ -0,0 +1,36 @@ +//! 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 `read` call must be preceded by a `write` call. +/// +/// - `read` calls only return the data received with the last `write` call. +/// Previously received data is discarded +/// +/// - Data is only guaranteed to be clocked out when the `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<'_>; +}