Crates.io | spidev |
lib.rs | spidev |
version | 0.6.0 |
source | src |
created_at | 2015-05-21 03:45:35.084099 |
updated_at | 2023-08-09 08:01:39.437479 |
description | Provides access to the Linux spidev interface. This interface allows for configuration of the spidev device, half-duplex SPI access, and full-duplex SPI access. |
homepage | https://github.com/rust-embedded/rust-spidev |
repository | https://github.com/rust-embedded/rust-spidev |
max_upload_size | |
id | 2158 |
size | 51,323 |
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.
extern crate spidev;
use std::io;
use std::io::prelude::*;
use spidev::{Spidev, SpidevOptions, SpidevTransfer, SpiModeFlags};
fn create_spi() -> io::Result<Spidev> {
let mut spi = Spidev::open("/dev/spidev0.0")?;
let options = SpidevOptions::new()
.bits_per_word(8)
.max_speed_hz(20_000)
.mode(SpiModeFlags::SPI_MODE_0)
.build();
spi.configure(&options)?;
Ok(spi)
}
/// perform half duplex operations using Read and Write traits
fn half_duplex(spi: &mut Spidev) -> io::Result<()> {
let mut rx_buf = [0_u8; 10];
spi.write(&[0x01, 0x02, 0x03])?;
spi.read(&mut rx_buf)?;
println!("{:?}", rx_buf);
Ok(())
}
/// Perform full duplex operations using Ioctl
fn full_duplex(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 tx_buf = [0x01, 0x02, 0x03];
let mut rx_buf = [0; 3];
{
let mut transfer = SpidevTransfer::read_write(&tx_buf, &mut rx_buf);
spi.transfer(&mut transfer)?;
}
println!("{:?}", rx_buf);
Ok(())
}
fn main() {
let mut spi = create_spi().unwrap();
println!("{:?}", half_duplex(&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.