embassy/embassy-traits/src/spi.rs

60 lines
1.7 KiB
Rust
Raw Normal View History

2021-03-08 19:35:55 +01:00
//! 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
///
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 Spi<Word> {
2021-03-08 19:35:55 +01:00
/// An enumeration of SPI errors
type Error;
}
2021-07-20 16:02:33 +02:00
pub trait FullDuplex<Word>: Spi<Word> + Write<Word> + Read<Word> {
2021-03-18 01:27:30 +01:00
type WriteReadFuture<'a>: Future<Output = Result<(), Self::Error>> + 'a
where
2021-11-21 09:11:00 +01:00
Self: 'a,
Word: 'a;
2021-03-08 19:35:55 +01:00
/// The `read` array must be at least as long as the `write` array,
/// but is guaranteed to only be filled with bytes equal to the
/// length of the `write` array.
2021-03-08 19:35:55 +01:00
fn read_write<'a>(
2021-04-14 16:37:10 +02:00
&'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
}
2021-07-20 16:02:33 +02:00
pub trait Write<Word>: Spi<Word> {
type WriteFuture<'a>: Future<Output = Result<(), Self::Error>> + 'a
where
2021-11-21 09:11:00 +01:00
Self: 'a,
Word: 'a;
fn write<'a>(&'a mut self, data: &'a [Word]) -> Self::WriteFuture<'a>;
}
pub trait Read<Word>: Write<Word> {
type ReadFuture<'a>: Future<Output = Result<(), Self::Error>> + 'a
where
2021-11-21 09:11:00 +01:00
Self: 'a,
Word: 'a;
fn read<'a>(&'a mut self, data: &'a mut [Word]) -> Self::ReadFuture<'a>;
2021-07-20 16:02:33 +02:00
}