#spi-driver #driver #amplifier #embedded-hal #embedded-hal-driver #hx711

hx711_spi

使用SPI接口与HX711通信的通用平台驱动程序

6个版本 (3个破坏性更新)

0.5.0 2023年3月1日
0.4.2 2023年2月25日
0.4.0 2022年4月24日
0.3.2 2022年4月12日
0.2.1 2021年4月14日

#553 in 嵌入式开发

MIT/Apache

185KB
130

包含 (ZIP文件, 61KB) examples/hx711_spi.fzz

hx711_spi

Crate License GitHub branch checks state

Maintained dependency status GitHub Repo stars Crates.io

这是一个与HX711负载细胞集成电路通信的通用平台驱动程序。它使用SPI而不是位打孔。此 [no_std] 驱动程序使用 embedded-hal 特性构建。它在Raspberry PI上开发,并报告在STM32和ESP32上工作。建议始终使用 cargo-crev 验证每个依赖项的可信度,包括此依赖项。

为什么我又写了一个HX711驱动程序?

在多用户/多任务环境中,位打孔不可靠。另一方面,SPI通过硬件支持处理时序,并且不受其他进程的影响。

使用方法

注意:我使用的是重新定义的SPI信号名称('查看sparkfun的解析')。

使用嵌入式-hal实现来获取SPI。HX711不使用SCLK,而是由驱动程序使用SDO提供时钟。确保HX711是总线上唯一的设备,因为它不实现CS(芯片选择)。将SDO连接到PD_SCK,将SDI连接到HX711的DOUT。SPI时钟频率必须在20 kHz和5 MHz之间。由于SPI时钟未被使用,SPI模式0或模式1应该可以工作。您需要测试哪个给您提供最佳结果。库假设SDO信号是空闲低电平。如果不是这种情况,您必须使用额外的硬件将其拉低。在这种情况下,您应该使用 [invert-sdo] 功能向hx711发送正确的信号。

没有实现称重功能(如去皮重量和校准),因为这在我看来不属于设备驱动程序的一部分。存在关机功能只是为了兼容性。由于CPU/MPU需要不断在总线上发送信号来关闭HX711,因此使用这种(滥用)SPI实现是不可行的,这完全违背了目的。

待办事项

  • 在更多平台上进行测试
  • 关机(仅存在兼容性功能。使用SPI无法实现)
  • 重置
  • [无标准]
  • 使其可重入/线程安全

示例

树莓派

// embedded_hal implementation
use rppal::{spi::{Spi, Bus, SlaveSelect, Mode, Error},hal::Delay};

use hx711_spi::Hx711;
use nb::block;

// minimal example
fn main() -> Result<(), Error>
{
    let spi = Spi::new(Bus::Spi0, SlaveSelect::Ss0, 1_000_000, Mode::Mode0)?;
    let mut hx711 = Hx711::new(spi);

	  hx711.reset()?;
    let v = block!(hx711.read())?;
 	  println!("value = {}", v);

    Ok(())
}

STM32F1

stm32f103(蓝色药丸)初始化示例(注意模式1)。

    use stm32f1xx_hal::time::U32Ext;
    use cortex_m_rt::entry;
    use stm32f1xx_hal::{pac, prelude::*,
      spi::{Mode, Phase, Polarity, Spi}, };

    let dp = pac::Peripherals::take().unwrap();
    let mut rcc = dp.RCC.constrain();
    let mut gpiob = dp.GPIOB.split(&mut rcc.apb2);
    let clocks = rcc.cfgr.freeze(&mut flash.acr);

    let hx711_spi_pins = (
        gpiob.pb13.into_alternate_push_pull(&mut gpiob.crh),
        gpiob.pb14.into_floating_input(&mut gpiob.crh),
        gpiob.pb15.into_alternate_push_pull(&mut gpiob.crh),
    );
    let hx711_spi = spi::Spi::spi2(device.SPI2, hx711_spi_pins, spi::MODE_1, 1.mhz(), clocks);
    let mut hx711_sensor = Hx711::new(hx711_spi);
    hx711_sensor.reset().unwrap();
    hx711_sensor.set_mode(hx711_spi::Mode::ChAGain128).unwrap(); // x128 works up to +-20mV

路线图

1.0 一旦确定,将实现embedded_hal::adc::OneShot

反馈

欢迎各种形式的反馈。如果您有任何问题或问题,请将其发布在问题跟踪器上。这实际上是我第一次用Rust编写的代码。我仍在学习。所以请耐心,修复一个错误可能需要一些时间。我可能需要突破我的知识壁垒。如果您在另一个平台上进行了测试,我也很愿意听到您的反馈!

非常感谢'jbit'澄清了关于线程安全的问题,以及'anddreyk0'在STM32上的测试和调试!

参考文献

许可

根据您的选择

依赖关系

~2MB
~49K SLoC