pub struct Spidev { /* private fields */ }
Expand description
Provide high-level access to Linux Spidev Driver
Implementations§
source§impl Spidev
impl Spidev
sourcepub fn open<P: AsRef<Path>>(path: P) -> Result<Spidev>
pub fn open<P: AsRef<Path>>(path: P) -> Result<Spidev>
Open the spidev device with the provided path
Typically, the path will be something like "/dev/spidev0.0"
where the first number if the bus and the second number
is the chip select on that bus for the device being targeted.
Examples found in repository?
More examples
examples/spidev-bidir.rs (line 6)
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
fn main() {
let mut spidev = Spidev::open("/dev/spidev0.0").unwrap();
let options = SpidevOptions::new()
.bits_per_word(8)
.max_speed_hz(5000)
.lsb_first(false)
.mode(SpiModeFlags::SPI_MODE_0)
.build();
spidev.configure(&options).unwrap();
println!("===== Single transfer =========");
let tx_buf = [0xaa, 0xbb, 0xcc, 0xdd, 0xee];
let mut rx_buf = [0; 5];
let mut transfer = SpidevTransfer::read_write(&tx_buf, &mut rx_buf);
println!("{:?}", spidev.transfer(&mut transfer));
println!("===== Multi Transfer =========");
let mut rx_buf1 = [0; 10];
let tx_buf2 = [0x00, 0x01, 0x02, 0x03];
let delay_usecs = 10;
let tx_buf3 = [0xff, 0xfe, 0xfd];
let mut rx_buf3 = [0; 3];
let result = {
let mut transfers = vec![
SpidevTransfer::read(&mut rx_buf1),
SpidevTransfer::write(&tx_buf2),
SpidevTransfer::delay(delay_usecs),
SpidevTransfer::read_write(&tx_buf3, &mut rx_buf3),
];
spidev.transfer_multiple(&mut transfers)
};
match result {
Ok(_) => {
println!("Read {:?}", rx_buf1);
println!("Wrote {:?}", tx_buf2);
println!("Delayed by {} microseconds", delay_usecs);
println!("Wrote {:?} and read {:?}", tx_buf3, rx_buf3);
}
Err(err) => println!("{:?}", err),
}
}
sourcepub fn into_inner(self) -> File
pub fn into_inner(self) -> File
Consume the object and get the underlying File
object
sourcepub fn configure(&mut self, options: &SpidevOptions) -> Result<()>
pub fn configure(&mut self, options: &SpidevOptions) -> Result<()>
Write the provided configuration to this device
Examples found in repository?
examples/spidev-bidir.rs (line 13)
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
fn main() {
let mut spidev = Spidev::open("/dev/spidev0.0").unwrap();
let options = SpidevOptions::new()
.bits_per_word(8)
.max_speed_hz(5000)
.lsb_first(false)
.mode(SpiModeFlags::SPI_MODE_0)
.build();
spidev.configure(&options).unwrap();
println!("===== Single transfer =========");
let tx_buf = [0xaa, 0xbb, 0xcc, 0xdd, 0xee];
let mut rx_buf = [0; 5];
let mut transfer = SpidevTransfer::read_write(&tx_buf, &mut rx_buf);
println!("{:?}", spidev.transfer(&mut transfer));
println!("===== Multi Transfer =========");
let mut rx_buf1 = [0; 10];
let tx_buf2 = [0x00, 0x01, 0x02, 0x03];
let delay_usecs = 10;
let tx_buf3 = [0xff, 0xfe, 0xfd];
let mut rx_buf3 = [0; 3];
let result = {
let mut transfers = vec![
SpidevTransfer::read(&mut rx_buf1),
SpidevTransfer::write(&tx_buf2),
SpidevTransfer::delay(delay_usecs),
SpidevTransfer::read_write(&tx_buf3, &mut rx_buf3),
];
spidev.transfer_multiple(&mut transfers)
};
match result {
Ok(_) => {
println!("Read {:?}", rx_buf1);
println!("Wrote {:?}", tx_buf2);
println!("Delayed by {} microseconds", delay_usecs);
println!("Wrote {:?} and read {:?}", tx_buf3, rx_buf3);
}
Err(err) => println!("{:?}", err),
}
}
sourcepub fn transfer(&self, transfer: &mut SpidevTransfer<'_, '_>) -> Result<()>
pub fn transfer(&self, transfer: &mut SpidevTransfer<'_, '_>) -> Result<()>
Perform a single transfer
Examples found in repository?
examples/spidev-bidir.rs (line 19)
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
fn main() {
let mut spidev = Spidev::open("/dev/spidev0.0").unwrap();
let options = SpidevOptions::new()
.bits_per_word(8)
.max_speed_hz(5000)
.lsb_first(false)
.mode(SpiModeFlags::SPI_MODE_0)
.build();
spidev.configure(&options).unwrap();
println!("===== Single transfer =========");
let tx_buf = [0xaa, 0xbb, 0xcc, 0xdd, 0xee];
let mut rx_buf = [0; 5];
let mut transfer = SpidevTransfer::read_write(&tx_buf, &mut rx_buf);
println!("{:?}", spidev.transfer(&mut transfer));
println!("===== Multi Transfer =========");
let mut rx_buf1 = [0; 10];
let tx_buf2 = [0x00, 0x01, 0x02, 0x03];
let delay_usecs = 10;
let tx_buf3 = [0xff, 0xfe, 0xfd];
let mut rx_buf3 = [0; 3];
let result = {
let mut transfers = vec![
SpidevTransfer::read(&mut rx_buf1),
SpidevTransfer::write(&tx_buf2),
SpidevTransfer::delay(delay_usecs),
SpidevTransfer::read_write(&tx_buf3, &mut rx_buf3),
];
spidev.transfer_multiple(&mut transfers)
};
match result {
Ok(_) => {
println!("Read {:?}", rx_buf1);
println!("Wrote {:?}", tx_buf2);
println!("Delayed by {} microseconds", delay_usecs);
println!("Wrote {:?} and read {:?}", tx_buf3, rx_buf3);
}
Err(err) => println!("{:?}", err),
}
}
sourcepub fn transfer_multiple(
&self,
transfers: &mut [SpidevTransfer<'_, '_>]
) -> Result<()>
pub fn transfer_multiple( &self, transfers: &mut [SpidevTransfer<'_, '_>] ) -> Result<()>
Perform multiple transfers in a single system call to the kernel
Chaining together multiple requests like this can reduce latency and be used for conveniently and efficient implementing some protocols without extra round trips back to userspace.
Examples found in repository?
examples/spidev-bidir.rs (line 34)
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
fn main() {
let mut spidev = Spidev::open("/dev/spidev0.0").unwrap();
let options = SpidevOptions::new()
.bits_per_word(8)
.max_speed_hz(5000)
.lsb_first(false)
.mode(SpiModeFlags::SPI_MODE_0)
.build();
spidev.configure(&options).unwrap();
println!("===== Single transfer =========");
let tx_buf = [0xaa, 0xbb, 0xcc, 0xdd, 0xee];
let mut rx_buf = [0; 5];
let mut transfer = SpidevTransfer::read_write(&tx_buf, &mut rx_buf);
println!("{:?}", spidev.transfer(&mut transfer));
println!("===== Multi Transfer =========");
let mut rx_buf1 = [0; 10];
let tx_buf2 = [0x00, 0x01, 0x02, 0x03];
let delay_usecs = 10;
let tx_buf3 = [0xff, 0xfe, 0xfd];
let mut rx_buf3 = [0; 3];
let result = {
let mut transfers = vec![
SpidevTransfer::read(&mut rx_buf1),
SpidevTransfer::write(&tx_buf2),
SpidevTransfer::delay(delay_usecs),
SpidevTransfer::read_write(&tx_buf3, &mut rx_buf3),
];
spidev.transfer_multiple(&mut transfers)
};
match result {
Ok(_) => {
println!("Read {:?}", rx_buf1);
println!("Wrote {:?}", tx_buf2);
println!("Delayed by {} microseconds", delay_usecs);
println!("Wrote {:?} and read {:?}", tx_buf3, rx_buf3);
}
Err(err) => println!("{:?}", err),
}
}
Trait Implementations§
source§impl Read for Spidev
impl Read for Spidev
source§fn read(&mut self, buf: &mut [u8]) -> Result<usize>
fn read(&mut self, buf: &mut [u8]) -> Result<usize>
Pull some bytes from this source into the specified buffer, returning
how many bytes were read. Read more
1.36.0 · source§fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>
Like
read
, except that it reads into a slice of buffers. Read moresource§fn is_read_vectored(&self) -> bool
fn is_read_vectored(&self) -> bool
🔬This is a nightly-only experimental API. (
can_vector
)1.0.0 · source§fn read_to_end(&mut self, buf: &mut Vec<u8, Global>) -> Result<usize, Error>
fn read_to_end(&mut self, buf: &mut Vec<u8, Global>) -> Result<usize, Error>
Read all bytes until EOF in this source, placing them into
buf
. Read more1.0.0 · source§fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>
fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>
Read all bytes until EOF in this source, appending them to
buf
. Read more1.6.0 · source§fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>
fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>
Read the exact number of bytes required to fill
buf
. Read moresource§fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>
🔬This is a nightly-only experimental API. (
read_buf
)Pull some bytes from this source into the specified buffer. Read more
source§fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>
🔬This is a nightly-only experimental API. (
read_buf
)Read the exact number of bytes required to fill
cursor
. Read more1.0.0 · source§fn by_ref(&mut self) -> &mut Selfwhere
Self: Sized,
fn by_ref(&mut self) -> &mut Selfwhere Self: Sized,
Creates a “by reference” adaptor for this instance of
Read
. Read moresource§impl Write for Spidev
impl Write for Spidev
source§fn write(&mut self, buf: &[u8]) -> Result<usize>
fn write(&mut self, buf: &[u8]) -> Result<usize>
Write a buffer into this writer, returning how many bytes were written. Read more
source§fn flush(&mut self) -> Result<()>
fn flush(&mut self) -> Result<()>
Flush this output stream, ensuring that all intermediately buffered
contents reach their destination. Read more
source§fn is_write_vectored(&self) -> bool
fn is_write_vectored(&self) -> bool
🔬This is a nightly-only experimental API. (
can_vector
)1.0.0 · source§fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>
fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>
Attempts to write an entire buffer into this writer. Read more
source§fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>
fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>
🔬This is a nightly-only experimental API. (
write_all_vectored
)Attempts to write multiple buffers into this writer. Read more
Auto Trait Implementations§
impl RefUnwindSafe for Spidev
impl Send for Spidev
impl Sync for Spidev
impl Unpin for Spidev
impl UnwindSafe for Spidev
Blanket Implementations§
source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere T: ?Sized,
source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more