#accelerometer #embedded-hal-driver #bosch #series #control #product #bma222e

无需std bma2xx

Bosch BMA2XX系列加速度计的硬件级平台无关驱动程序

1个不稳定版本

0.1.0 2019年1月4日

#7#bosch

MIT 许可证

12KB
140

Bosch BMA222E及其系列驱动程序

目前这仅支持I2C配置,因为我无法从PCB上的家中移除小巧的包装。如果您想玩一玩,您可以在Xfinity XR11遥控器中找到它们。😊

这个系列中的寄存器映射非常相似,因此应该可以通过对这里的代码进行最小修改来支持以下芯片

  • BMA222 - 8位分辨率
  • BMA250 - 10位分辨率
  • BMA253 - 12位分辨率
  • BMA255 - 12位分辨率
  • BMA280 - 14位分辨率

具体来说,这些芯片现在应该与库兼容,但您不会从增强的分辨率中受益。

更多关于该产品线的信息请访问Bosch网站: https://www.bosch-sensortec.com/bst/products/all_products/bma222e

当前支持的功能

  1. 通过I2C访问芯片
  2. 读取X、Y、Z轴及其是否自上次轮询以来已更新
  3. 读取X、Y、Z轴的事件FIFO(#1的32元素深度队列版本)
  4. 更改FIFO模式(流、FIFO、旁路)并读取FIFO的满度
  5. 检查EEPROM中的数据及其剩余写入次数
  6. 软件复位
  7. 读取温度

当前不支持的功能

如果您觉得这里有任何功能有意义,请随时联系帮助实现这些功能。我只是个人不需要它们。

  1. 除BMA222E之外的任何芯片
  2. 通过SPI访问芯片
  3. 更改要抛到FIFO的轴
  4. 启用斜率、点击、FIFO满、方向等中断
  5. 点击检测
  6. 加速度数据滤波器
  7. 电源模式(正常、深度睡眠、低功耗、挂起)
  8. 低功耗睡眠持续时间
  9. 是否要阴影加速度数据
  10. 配置INT1和INT2引脚及其源
  11. 加速度、斜率等中断阈值
  12. FIFO水位中断级别
  13. 自检
  14. 实际上编程EEPROM或设置值
  15. 设置偏移补偿
  16. 偏移补偿
  17. 还有很多!

示例用法

fn main() {
    // Get an instance of an i2c struct here with one of the [device crates](https://github.com/rust-embedded/awesome-embedded-rust#device-crates).

    let mut accel = Bma222e::new(i2c);

    accel.reset().unwrap();

    examples(accel).unwrap();
}

fn examples(accel: Bma222e) -> Result<(), ()> {
    let chip_id = accel.who_am_i()?;
    println!("About to Begin. ID is {} and should be {}", chip_id, bma222e::IDENTIFIER)?;

    let temp = accel.temperature()?;
    println!("Temperature: {}", temp)?;

    let writes_remaining = accel.eeprom_writes_remaining()?;
    println!("EEPROM Writes Remaining: {}", writes_remaining)?;

    let nvm_data = accel.eeprom_data()?;
    hprint!("EEPROM Data: ")?;
    for byte in &nvm_data {
        hprint!("{:02X} ", byte)?;
    }
    println!()?;


    // FIFO-related goodness!
    // TODO: Find out why the output data wasn't consistent
    let fifo_size = accel.fifo_size()?;
    println!("Events in the FIFO: {}", fifo_size)?;
    let mut events = [AxisData {value: 0, changed: false}; 3];
    accel.fifo_set_mode(FIFOConfig::BYPASS)?;
    accel.fifo_get(&mut events)?;

    let x = accel.axis_x()?;
    let y = accel.axis_y()?;
    let z = accel.axis_z()?;
    println!("X:{0:03} Y:{1:03} Z:{2:03}",
        x.value,
        y.value,
        z.value)?;

    Ok(())    
}

依赖项

~71KB