2021-03-08 19:35:55 +01:00
|
|
|
//! Async SPI API
|
|
|
|
|
|
|
|
use core::future::Future;
|
2021-03-18 01:27:30 +01:00
|
|
|
use core::pin::Pin;
|
2021-03-08 19:35:55 +01:00
|
|
|
|
|
|
|
/// Full duplex (master mode)
|
|
|
|
///
|
|
|
|
/// # Notes
|
|
|
|
///
|
|
|
|
/// - It's the task of the user of this interface to manage the slave select lines
|
|
|
|
///
|
2021-03-08 21:00:31 +01:00
|
|
|
/// - Due to how full duplex SPI works each `read` call must be preceded by a `write` call.
|
2021-03-08 19:35:55 +01:00
|
|
|
///
|
2021-03-08 21:00:31 +01:00
|
|
|
/// - `read` calls only return the data received with the last `write` call.
|
2021-03-08 19:35:55 +01:00
|
|
|
/// Previously received data is discarded
|
|
|
|
///
|
2021-03-08 21:00:31 +01:00
|
|
|
/// - Data is only guaranteed to be clocked out when the `read` call succeeds.
|
2021-03-08 19:35:55 +01:00
|
|
|
/// 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<Word> {
|
|
|
|
/// An enumeration of SPI errors
|
|
|
|
type Error;
|
|
|
|
|
2021-03-18 01:27:30 +01:00
|
|
|
type WriteFuture<'a>: Future<Output = Result<(), Self::Error>> + 'a
|
|
|
|
where
|
|
|
|
Self: 'a;
|
|
|
|
type ReadFuture<'a>: Future<Output = Result<(), Self::Error>> + 'a
|
|
|
|
where
|
|
|
|
Self: 'a;
|
|
|
|
type WriteReadFuture<'a>: Future<Output = Result<(), Self::Error>> + 'a
|
|
|
|
where
|
|
|
|
Self: 'a;
|
2021-03-08 19:35:55 +01:00
|
|
|
|
2021-03-18 01:27:30 +01:00
|
|
|
fn read<'a>(self: Pin<&'a mut Self>, data: &'a mut [Word]) -> Self::ReadFuture<'a>;
|
|
|
|
fn write<'a>(self: Pin<&'a mut Self>, data: &'a [Word]) -> Self::WriteFuture<'a>;
|
2021-03-08 19:35:55 +01:00
|
|
|
fn read_write<'a>(
|
2021-03-18 01:27:30 +01:00
|
|
|
self: Pin<&'a mut Self>,
|
2021-03-08 19:35:55 +01:00
|
|
|
read: &'a mut [Word],
|
|
|
|
write: &'a [Word],
|
2021-03-18 01:27:30 +01:00
|
|
|
) -> Self::WriteReadFuture<'a>;
|
2021-03-08 19:35:55 +01:00
|
|
|
}
|