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 嵌入式开发
185KB
130 行
包含 (ZIP文件, 61KB) examples/hx711_spi.fzz
hx711_spi
这是一个与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上的测试和调试!
参考文献
许可
根据您的选择
- Apache License,版本2.0 (LICENSE-APACHE 或 这里)
- MIT许可 (LICENSE-MIT 或 这里)
。
依赖关系
~2MB
~49K SLoC