3个不稳定版本

0.2.1 2020年5月14日
0.2.0 2020年5月2日
0.1.0 2020年5月1日

#1137 in 嵌入式开发

Apache-2.0

34KB
670 代码行

Rust接口用于SPI LS7366 正交编码器缓冲区。

已根据数据手册实现了芯片的全部功能,并由该驱动程序公开。

此驱动程序应适用于任何具体的 embedded_hal::blocking::spi 实现。

在Raspberry Pi Model 4B上使用双LS7366R缓冲芯片进行了测试。

附加功能!

从v0.2.0版本开始,库使用no_std构建。

请参阅文档以获取完整驱动程序详细信息。

构建快速入门

快速入门针对rppal设计,旨在在Raspberry Pi上运行。尽管如此,应该很容易用其他实现替换rppal元素。

cargo build --target=armv7-unknown-linux-gnueabihf --example quickstart

lib.rs:

使用embedded_hal的LS7366缓冲编码器接口。

只要实现阻塞的 embedded_hal SPI traits,此驱动程序应与任何SPI接口一起工作。

库使用no_std构建。

示例

从缓冲区读取的最小样板代码

  use ls7366::Ls7366;
// --- snip ---
#
#
#
    // Construct a driver instance from the SPI interface, using default chip configurations.
    let mut spi_driver = Ls7366::new(some_hal_spi_object).unwrap();

    // Loop and read the counter.
    loop {
        let result = spi_driver.get_count().unwrap();
        sleep(Duration::from_secs(1));
        println!("read data:= {:?}", result);
    }
// --- snip ---

高级配置

LS7366有两个寄存器专门用于配置芯片的各种功能:Mdr0Mdr1

可以通过写入这两个寄存器来配置芯片。

当使用 Ls7366::new 时,无需手动配置这些寄存器。

  1. 构建一个配置所需的 Mdr0Mdr1 实例。
  2. 将这些实例写入相关寄存器。
use ls7366::mdr0::{QuadCountMode, CycleCountMode, FilterClockDivisionFactor,IndexMode, Mdr0};
use ls7366::mdr1::{CounterMode, Mdr1};
use ls7366::{Ls7366, Target, Encodable};
use embedded_hal_mock::spi::Mock;
use embedded_hal_mock::spi::Transaction as SpiTransaction;
// --- snip ---
    let mdr0_configuration = Mdr0{
        quad_count_mode: QuadCountMode::Quad2x,
        filter_clock : FilterClockDivisionFactor::Two,
        index_mode: IndexMode::ClearCntr,
        cycle_count_mode: CycleCountMode::SingleCycle,
        is_index_inverted: false
    };
    let mdr1_configuration = Mdr1{
        counter_mode: CounterMode::Byte3,
        // --- Snip ---
        # disable_counting:true,
        # flag_on_bw: false,
        # flag_on_idx: false,
        # flag_on_cmp: false,
        # flag_on_cy: false,
    };

    driver.write_register(Target::Mdr0, &[mdr0_configuration.encode()]).unwrap();
    driver.write_register(Target::Mdr1, &[mdr1_configuration.encode()]).unwrap();

依赖项

~120KB