From f2ab4c4ec052e7b92a41e61941c5185d6c87e879 Mon Sep 17 00:00:00 2001 From: xoviat Date: Mon, 8 Mar 2021 12:35:55 -0600 Subject: [PATCH] add spi trait --- embassy-traits/src/lib.rs | 1 + embassy-traits/src/spi.rs | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 embassy-traits/src/spi.rs diff --git a/embassy-traits/src/lib.rs b/embassy-traits/src/lib.rs index 10d44d9d..431a0252 100644 --- a/embassy-traits/src/lib.rs +++ b/embassy-traits/src/lib.rs @@ -10,4 +10,5 @@ pub mod delay; pub mod flash; pub mod gpio; pub mod i2c; +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..cc5c33ec --- /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 `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<'_>; +}