Struct spidev::SpidevOptions

source ·
pub struct SpidevOptions {
    pub bits_per_word: Option<u8>,
    pub max_speed_hz: Option<u32>,
    pub lsb_first: Option<bool>,
    pub spi_mode: Option<SpiModeFlags>,
}
Expand description

Options that control defaults for communication on a device

Individual settings may be overridden via parameters that are specified as part of any individual SpiTransfer when using transfer or transfer_multiple.

Options that are not configured with one of the builder functions will not be modified in the kernel when configure is called.

Fields§

§bits_per_word: Option<u8>§max_speed_hz: Option<u32>§lsb_first: Option<bool>§spi_mode: Option<SpiModeFlags>

Implementations§

source§

impl SpidevOptions

source

pub fn new() -> SpidevOptions

Create a new, empty set of options

Examples found in repository?
examples/spidev-bidir.rs (line 7)
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),
    }
}
source

pub fn bits_per_word(&mut self, bits_per_word: u8) -> &mut Self

The number of bits in each SPI transfer word

The value zero signifies eight bits.

Examples found in repository?
examples/spidev-bidir.rs (line 8)
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),
    }
}
source

pub fn max_speed_hz(&mut self, max_speed_hz: u32) -> &mut Self

The maximum SPI transfer speed, in Hz

The controller can’t necessarily assign that specific clock speed.

Examples found in repository?
examples/spidev-bidir.rs (line 9)
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),
    }
}
source

pub fn lsb_first(&mut self, lsb_first: bool) -> &mut Self

The bit justification used to transfer SPI words

Zero indicates MSB-first; other values indicate the less common LSB-first encoding. In both cases the specified value is right-justified in each word, so that unused (TX) or undefined (RX) bits are in the MSBs.

Examples found in repository?
examples/spidev-bidir.rs (line 10)
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),
    }
}
source

pub fn mode(&mut self, mode: SpiModeFlags) -> &mut Self

Set the SPI Transfer Mode

Use the constants SPI_MODE_0..SPI_MODE_3; or if you prefer you can combine SPI_CPOL (clock polarity, idle high iff this is set) or SPI_CPHA (clock phase, sample on trailing edge iff this is set) flags.

Note that this API will always prefer to use SPI_IOC_WR_MODE rathern than the 32-bit one to target the greatest number of kernels. SPI_IOC_WR_MODE32 is only present in 3.15+ kernels. SPI_IOC_WR_MODE32 will be used iff bits higher than those in 8bits are provided (e.g. Dual/Quad Tx/Rx).

Examples found in repository?
examples/spidev-bidir.rs (line 11)
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),
    }
}
source

pub fn build(&self) -> Self

Finalize and build the SpidevOptions

Examples found in repository?
examples/spidev-bidir.rs (line 12)
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 Clone for SpidevOptions

source§

fn clone(&self) -> SpidevOptions

Returns a copy of the value. Read more
1.0.0 · source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
source§

impl Debug for SpidevOptions

source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
source§

impl Default for SpidevOptions

source§

fn default() -> SpidevOptions

Returns the “default value” for a type. Read more
source§

impl PartialEq<SpidevOptions> for SpidevOptions

source§

fn eq(&self, other: &SpidevOptions) -> bool

This method tests for self and other values to be equal, and is used by ==.
1.0.0 · source§

fn ne(&self, other: &Rhs) -> bool

This method tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
source§

impl Copy for SpidevOptions

source§

impl StructuralPartialEq for SpidevOptions

Auto Trait Implementations§

Blanket Implementations§

source§

impl<T> Any for Twhere T: 'static + ?Sized,

source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
source§

impl<T> Borrow<T> for Twhere T: ?Sized,

source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
source§

impl<T> BorrowMut<T> for Twhere T: ?Sized,

source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
source§

impl<T> From<T> for T

source§

fn from(t: T) -> T

Returns the argument unchanged.

source§

impl<T, U> Into<U> for Twhere U: From<T>,

source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

source§

impl<T> ToOwned for Twhere T: Clone,

§

type Owned = T

The resulting type after obtaining ownership.
source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
source§

impl<T, U> TryFrom<U> for Twhere U: Into<T>,

§

type Error = Infallible

The type returned in the event of a conversion error.
source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
source§

impl<T, U> TryInto<U> for Twhere U: TryFrom<T>,

§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.