pub trait SpiDevice<Word: Copy + 'static = u8>: ErrorType {
    // Required method
    async fn transaction(
        &mut self,
        operations: &mut [Operation<'_, Word>]
    ) -> Result<(), Self::Error>;

    // Provided methods
    async fn read(&mut self, buf: &mut [Word]) -> Result<(), Self::Error> { ... }
    async fn write(&mut self, buf: &[Word]) -> Result<(), Self::Error> { ... }
    async fn transfer(
        &mut self,
        read: &mut [Word],
        write: &[Word]
    ) -> Result<(), Self::Error> { ... }
    async fn transfer_in_place(
        &mut self,
        buf: &mut [Word]
    ) -> Result<(), Self::Error> { ... }
}
Expand description

SPI device trait.

SpiDevice represents ownership over a single SPI device on a (possibly shared) bus, selected with a CS (Chip Select) pin.

See the docs on embedded-hal for important information on SPI Bus vs Device traits.

Required Methods§

source

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

Perform a transaction against the device.

  • Locks the bus
  • Asserts the CS (Chip Select) pin.
  • Performs all the operations.
  • Flushes the bus.
  • Deasserts the CS pin.
  • Unlocks the bus.

The locking mechanism is implementation-defined. The only requirement is it must prevent two transactions from executing concurrently against the same bus. Examples of implementations are: critical sections, blocking mutexes, returning an error or panicking if the bus is already busy.

On bus errors the implementation should try to deassert CS. If an error occurs while deasserting CS the bus error should take priority as the return value.

Provided Methods§

source

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

Do a read within a transaction.

This is a convenience method equivalent to device.read_transaction(&mut [buf]).

See also: SpiDevice::transaction, SpiDevice::read

source

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

Do a write within a transaction.

This is a convenience method equivalent to device.write_transaction(&mut [buf]).

See also: SpiDevice::transaction, SpiDevice::write

source

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

Do a transfer within a transaction.

This is a convenience method equivalent to device.transaction(&mut [Operation::Transfer(read, write)]).

See also: SpiDevice::transaction, SpiBus::transfer

source

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

Do an in-place transfer within a transaction.

This is a convenience method equivalent to device.transaction(&mut [Operation::TransferInPlace(buf)]).

See also: SpiDevice::transaction, SpiBus::transfer_in_place

Object Safety§

This trait is not object safe.

Implementations on Foreign Types§

source§

impl<Word: Copy + 'static, T: SpiDevice<Word> + ?Sized> SpiDevice<Word> for &mut T

source§

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

source§

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

source§

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

source§

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

source§

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

Implementors§