| //! Serial Peripheral Interface |
| |
| use nb; |
| |
| /// 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 `send` call. |
| /// |
| /// - 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; |
| |
| /// Reads the word stored in the shift register |
| /// |
| /// **NOTE** A word must be sent to the slave before attempting to call this |
| /// method. |
| fn read(&mut self) -> nb::Result<Word, Self::Error>; |
| |
| /// Sends a word to the slave |
| fn send(&mut self, word: Word) -> nb::Result<(), Self::Error>; |
| } |
| |
| /// Clock polarity |
| #[derive(Clone, Copy, PartialEq, Eq)] |
| pub enum Polarity { |
| /// Clock signal low when idle |
| IdleLow, |
| /// Clock signal high when idle |
| IdleHigh, |
| } |
| |
| /// Clock phase |
| #[derive(Clone, Copy, PartialEq, Eq)] |
| pub enum Phase { |
| /// Data in "captured" on the first clock transition |
| CaptureOnFirstTransition, |
| /// Data in "captured" on the second clock transition |
| CaptureOnSecondTransition, |
| } |
| |
| /// SPI mode |
| #[derive(Clone, Copy, PartialEq, Eq)] |
| pub struct Mode { |
| /// Clock polarity |
| pub polarity: Polarity, |
| /// Clock phase |
| pub phase: Phase, |
| } |
| |
| /// Helper for CPOL = 0, CPHA = 0 |
| pub const MODE_0: Mode = Mode { |
| polarity: Polarity::IdleLow, |
| phase: Phase::CaptureOnFirstTransition, |
| }; |
| |
| /// Helper for CPOL = 0, CPHA = 1 |
| pub const MODE_1: Mode = Mode { |
| polarity: Polarity::IdleLow, |
| phase: Phase::CaptureOnSecondTransition, |
| }; |
| |
| /// Helper for CPOL = 1, CPHA = 0 |
| pub const MODE_2: Mode = Mode { |
| polarity: Polarity::IdleHigh, |
| phase: Phase::CaptureOnFirstTransition, |
| }; |
| |
| /// Helper for CPOL = 1, CPHA = 1 |
| pub const MODE_3: Mode = Mode { |
| polarity: Polarity::IdleHigh, |
| phase: Phase::CaptureOnSecondTransition, |
| }; |