The Rust spidev
seeks to provide full access to the Linux spidev
device in Rust without the need to wrap any C code or directly make
low-level system calls. The documentation for the spidev interace can
be found at https://www.kernel.org/doc/Documentation/spi/spidev.
The following is not an exhaustive demonstration of the Spidev interface but provides a pretty good idea of how to use the library in practice.
```rust extern crate spidev; use std::io; use std::io::prelude::*; use spidev::{Spidev, SpidevOptions, SpidevTransfer, SpiModeFlags};
fn createspi() -> io::Result
/// perform half duplex operations using Read and Write traits fn halfduplex(spi: &mut Spidev) -> io::Result<()> { let mut rxbuf = [0u8; 10]; spi.write(&[0x01, 0x02, 0x03])?; spi.read(&mut rxbuf)?; println!("{:?}", rx_buf); Ok(()) }
/// Perform full duplex operations using Ioctl fn fullduplex(spi: &mut Spidev) -> io::Result<()> { // "write" transfers are also reads at the same time with // the read having the same length as the write let txbuf = [0x01, 0x02, 0x03]; let mut rxbuf = [0; 3]; { let mut transfer = SpidevTransfer::readwrite(&txbuf, &mut rxbuf); spi.transfer(&mut transfer)?; } println!("{:?}", rx_buf); Ok(()) }
fn main() { let mut spi = createspi().unwrap(); println!("{:?}", halfduplex(&mut spi).unwrap()); println!("{:?}", full_duplex(&mut spi).unwrap()); } ```
The following features are implemented and planned for the library:
This crate is guaranteed to compile on stable Rust 1.56.1 and up. It might compile with older versions but that may change in any new patch release.
Most likely, the machine you are running on is not your development machine (although it could be). In those cases, you will need to cross-compile. The following basic instructions should work for the raspberry pi or beaglebone black:
sudo apt-get install g++-arm-linux-gnueabihf
.cargo build --target=arm-unknown-linux-gnueabi
.The following snippet added to my ~/.cargo/config worked for me:
[target.arm-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc"
Licensed under either of
at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Contribution to this crate is organized under the terms of the Rust Code of Conduct, the maintainer of this crate, the Embedded Linux Team, promises to intervene to uphold that code of conduct.