embedded_hal_bus::spi

Struct ExclusiveDevice

source
pub struct ExclusiveDevice<BUS, CS, D> { /* private fields */ }
Expand description

SpiDevice implementation with exclusive access to the bus (not shared).

This is the most straightforward way of obtaining an SpiDevice from an SpiBus, ideal for when no sharing is required (only one SPI device is present on the bus).

Implementations§

source§

impl<BUS, CS, D> ExclusiveDevice<BUS, CS, D>

source

pub fn new(bus: BUS, cs: CS, delay: D) -> Result<Self, CS::Error>
where CS: OutputPin,

Create a new ExclusiveDevice.

This sets the cs pin high, and returns an error if that fails. It is recommended to set the pin high the moment it’s configured as an output, to avoid glitches.

source

pub fn bus(&self) -> &BUS

Returns a reference to the underlying bus object.

source

pub fn bus_mut(&mut self) -> &mut BUS

Returns a mutable reference to the underlying bus object.

source§

impl<BUS, CS> ExclusiveDevice<BUS, CS, NoDelay>

source

pub fn new_no_delay(bus: BUS, cs: CS) -> Result<Self, CS::Error>
where CS: OutputPin,

Create a new ExclusiveDevice without support for in-transaction delays.

This sets the cs pin high, and returns an error if that fails. It is recommended to set the pin high the moment it’s configured as an output, to avoid glitches.

Warning: The returned instance technically doesn’t comply with the SpiDevice contract, which mandates delay support. It is relatively rare for drivers to use in-transaction delays, so you might still want to use this method because it’s more practical.

Note that a future version of the driver might start using delays, causing your code to panic. This wouldn’t be considered a breaking change from the driver side, because drivers are allowed to assume SpiDevice implementations comply with the contract. If you feel this risk outweighs the convenience of having cargo automatically upgrade the driver crate, you might want to pin the driver’s version.

§Panics

The returned device will panic if you try to execute a transaction that contains any operations of type Operation::DelayNs.

Trait Implementations§

source§

impl<BUS, CS, D> ErrorType for ExclusiveDevice<BUS, CS, D>
where BUS: ErrorType, CS: OutputPin,

source§

type Error = DeviceError<<BUS as ErrorType>::Error, <CS as ErrorType>::Error>

Error type.
source§

impl<Word: Copy + 'static, BUS, CS, D> SpiDevice<Word> for ExclusiveDevice<BUS, CS, D>
where BUS: SpiBus<Word>, CS: OutputPin, D: DelayNs,

source§

fn transaction( &mut self, operations: &mut [Operation<'_, Word>], ) -> Result<(), Self::Error>

Perform a transaction against the device. Read more
source§

fn read(&mut self, buf: &mut [Word]) -> Result<(), Self::Error>

Do a read within a transaction. Read more
source§

fn write(&mut self, buf: &[Word]) -> Result<(), Self::Error>

Do a write within a transaction. Read more
source§

fn transfer( &mut self, read: &mut [Word], write: &[Word], ) -> Result<(), Self::Error>

Do a transfer within a transaction. Read more
source§

fn transfer_in_place(&mut self, buf: &mut [Word]) -> Result<(), Self::Error>

Do an in-place transfer within a transaction. Read more
source§

impl<Word: Copy + 'static, BUS, CS, D> SpiDevice<Word> for ExclusiveDevice<BUS, CS, D>
where BUS: AsyncSpiBus<Word>, CS: OutputPin, D: AsyncDelayNs,

source§

async fn transaction( &mut self, operations: &mut [Operation<'_, Word>], ) -> Result<(), Self::Error>

Perform a transaction against the device. Read more
source§

async fn read(&mut self, buf: &mut [Word]) -> Result<(), Self::Error>

Do a read within a transaction. Read more
source§

async fn write(&mut self, buf: &[Word]) -> Result<(), Self::Error>

Do a write within a transaction. Read more
source§

async fn transfer( &mut self, read: &mut [Word], write: &[Word], ) -> Result<(), Self::Error>

Do a transfer within a transaction. Read more
source§

async fn transfer_in_place( &mut self, buf: &mut [Word], ) -> Result<(), Self::Error>

Do an in-place transfer within a transaction. Read more

Auto Trait Implementations§

§

impl<BUS, CS, D> Freeze for ExclusiveDevice<BUS, CS, D>
where BUS: Freeze, CS: Freeze, D: Freeze,

§

impl<BUS, CS, D> RefUnwindSafe for ExclusiveDevice<BUS, CS, D>

§

impl<BUS, CS, D> Send for ExclusiveDevice<BUS, CS, D>
where BUS: Send, CS: Send, D: Send,

§

impl<BUS, CS, D> Sync for ExclusiveDevice<BUS, CS, D>
where BUS: Sync, CS: Sync, D: Sync,

§

impl<BUS, CS, D> Unpin for ExclusiveDevice<BUS, CS, D>
where BUS: Unpin, CS: Unpin, D: Unpin,

§

impl<BUS, CS, D> UnwindSafe for ExclusiveDevice<BUS, CS, D>
where BUS: UnwindSafe, CS: UnwindSafe, D: UnwindSafe,

Blanket Implementations§

source§

impl<T> Any for T
where T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for T
where T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for T
where U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

source§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.