working magnetometer
This commit is contained in:
@@ -4,33 +4,48 @@
|
|||||||
|
|
||||||
use defmt::*;
|
use defmt::*;
|
||||||
use embassy_executor::Spawner;
|
use embassy_executor::Spawner;
|
||||||
use embassy_stm32::i2c::I2c;
|
use embassy_stm32::i2c::{Config, I2c};
|
||||||
use embassy_stm32::i2c::Config;
|
|
||||||
use embassy_time::{Duration, Timer};
|
use embassy_time::{Duration, Timer};
|
||||||
|
|
||||||
use {defmt_rtt as _, panic_probe as _};
|
use {defmt_rtt as _, panic_probe as _};
|
||||||
|
|
||||||
#[embassy_executor::main]
|
#[embassy_executor::main]
|
||||||
async fn main(_spawner: Spawner) {
|
async fn main(_spawner: Spawner) {
|
||||||
info!("tititititi");
|
info!("tititi");
|
||||||
|
|
||||||
let p = embassy_stm32::init(Default::default());
|
let p = embassy_stm32::init(Default::default());
|
||||||
|
|
||||||
let mut i2c_cfg = Config::default();
|
let mut i2c_cfg = Config::default();
|
||||||
i2c_cfg.sda_pullup = true;
|
i2c_cfg.sda_pullup = true;
|
||||||
i2c_cfg.scl_pullup = true;
|
i2c_cfg.scl_pullup = true;
|
||||||
i2c_cfg.timeout = Duration::from_millis(10);
|
i2c_cfg.timeout = Duration::from_millis(200);
|
||||||
let mut i2c = I2c::new_blocking(p.I2C3, p.PC0, p.PC1, i2c_cfg);
|
|
||||||
|
|
||||||
let mg = 0x23;
|
let mut i2c = I2c::new_blocking(p.I2C3, p.PC0, p.PC1, i2c_cfg);
|
||||||
|
let addr = 0x23;
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
Timer::after(Duration::from_secs(1)).await;
|
// Attempt to read REVID (Register 0x36) - Should return 0x22
|
||||||
|
let mut rev_id = [0u8; 1];
|
||||||
|
match i2c.blocking_write_read(addr, &[0x36], &mut rev_id) {
|
||||||
|
Ok(_) => {
|
||||||
|
let _ = i2c.blocking_write(addr, &[0x04, 0x00, 0xC8, 0x00, 0xC8, 0x00, 0xC8]);
|
||||||
|
|
||||||
let mut data = [0u8; 1];
|
let _ = i2c.blocking_write(addr, &[0x00, 0x70]);
|
||||||
if let Ok(_) = i2c.blocking_read(mg, &mut data) {
|
|
||||||
defmt::info!("0x{:02x}: {}", mg, data);
|
Timer::after(Duration::from_millis(50)).await;
|
||||||
} else {
|
|
||||||
defmt::warn!("Device 0x{:02x} not responding", mg);
|
let mut raw = [0u8; 9];
|
||||||
|
if let Ok(_) = i2c.blocking_write_read(addr, &[0x24], &mut raw) {
|
||||||
|
let x = i32::from_be_bytes([raw[0], raw[1], raw[2], 0]) >> 8;
|
||||||
|
let y = i32::from_be_bytes([raw[3], raw[4], raw[5], 0]) >> 8;
|
||||||
|
let z = i32::from_be_bytes([raw[6], raw[7], raw[8], 0]) >> 8;
|
||||||
|
info!("X: {}, Y: {}, Z: {}", x, y, z);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Err(e) => {
|
||||||
|
error!("I2C Error: {:?}.", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
Timer::after(Duration::from_millis(1000)).await;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user