pub struct RefCellDevice<'a, BUS, CS, D> { /* private fields */ }
Expand description
RefCell
-based shared bus SpiDevice
implementation.
This allows for sharing an SpiBus
, obtaining multiple SpiDevice
instances,
each with its own CS
pin.
Sharing is implemented with a RefCell
. This means it has low overhead, but RefCellDevice
instances are not Send
,
so it only allows sharing within a single thread (interrupt priority level). If you need to share a bus across several
threads, use CriticalSectionDevice
instead.
Implementations§
source§impl<'a, BUS, CS, D> RefCellDevice<'a, BUS, CS, D>
impl<'a, BUS, CS, D> RefCellDevice<'a, BUS, CS, D>
source§impl<'a, BUS, CS> RefCellDevice<'a, BUS, CS, NoDelay>
impl<'a, BUS, CS> RefCellDevice<'a, BUS, CS, NoDelay>
sourcepub fn new_no_delay(bus: &'a RefCell<BUS>, cs: CS) -> Result<Self, CS::Error>where
CS: OutputPin,
pub fn new_no_delay(bus: &'a RefCell<BUS>, cs: CS) -> Result<Self, CS::Error>where
CS: OutputPin,
Create a new RefCellDevice
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
.