#spi #interface #devices #linux #access #linux-kernel #transfer

spidev

提供对Linux spidev接口的访问。此接口允许配置spidev设备、半双工SPI访问和全双工SPI访问。

10个版本 (5个重大更新)

0.6.0 2023年8月9日
0.5.1 2021年11月22日
0.4.1 2021年2月21日
0.4.0 2019年6月7日
0.1.0 2015年5月21日

#3 in #spi

Download history 5779/week @ 2024-04-22 4838/week @ 2024-04-29 3555/week @ 2024-05-06 4801/week @ 2024-05-13 4951/week @ 2024-05-20 4945/week @ 2024-05-27 4039/week @ 2024-06-03 4017/week @ 2024-06-10 4095/week @ 2024-06-17 3889/week @ 2024-06-24 2454/week @ 2024-07-01 3546/week @ 2024-07-08 4190/week @ 2024-07-15 5319/week @ 2024-07-22 5701/week @ 2024-07-29 5574/week @ 2024-08-05

每月20,931次下载
143 个crate中使用 (23 个直接使用)

MIT/Apache

26KB
311

Rust Spidev

Build Status Version License Minimum Supported Rust Version

文档

Rust的spidev旨在在不使用任何C代码或直接进行底层系统调用的前提下,为Rust提供对Linux spidev设备的完全访问。spidev接口的文档可以在https://linuxkernel.org.cn/doc/Documentation/spi/spidev找到。

示例/API

以下不是Spidev接口的全面演示,但提供了在实际中使用库的大致方法。

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());
}

功能

以下功能已实现并计划在库中实现

  • 实现Read特例
  • 实现Write特例
  • 支持全双工传输
  • 支持配置spidev设备
  • 支持查询spidev配置状态

最低支持的Rust版本 (MSRV)

此crate保证在稳定Rust 1.56.1及更高版本上编译。它可能能够编译旧版本,但在任何新的补丁版本中可能会改变。

交叉编译

您正在运行的机器很可能不是您的开发机器(尽管它可能是)。在这些情况下,您将需要进行交叉编译。以下基本说明应该适用于树莓派或beaglebone black。

  1. 安装rust和cargo
  2. 安装合适的交叉编译器。在Ubuntu系统上,可以通过执行以下命令完成:sudo apt-get install g++-arm-linux-gnueabihf
  3. 为您的目标构建或安装Rust。为了使libstd可用于您的目标,这是必要的。对于arm-linux-gnueabihf,您可以在https://github.com/japaric/ruststrap找到二进制文件。使用这种方法或自己构建,您需要将${rust}/lib/rustlib/arm-unknown-linux-gnueabihf复制到您的系统Rust库文件夹(它以三元组命名空间,因此不会破坏任何东西)。
  4. 通过将以下行添加到您的~/.cargo/config文件中,告诉cargo如何链接。
  5. 运行您的构建 cargo build --target=arm-unknown-linux-gnueabi

以下添加到我的~/.cargo/config的片段对我有效

[target.arm-unknown-linux-gnueabihf]
linker = "arm-linux-gnueabihf-gcc"

许可证

在您选择的以下许可证下许可

由您选择。

贡献

除非您明确声明,否则根据Apache-2.0许可证定义的,您有意提交的任何贡献,均应按上述方式双重许可,不附加任何其他条款或条件。

行为准则

此crate的贡献是在Rust行为准则的条款下组织的,该crate的维护者、嵌入式Linux团队承诺将介入以维护该行为准则。

依赖关系

~1.5MB
~35K SLoC