From 9feffc8152de141ce91dd7a26fd8a980411e1288 Mon Sep 17 00:00:00 2001 From: Filipriec Date: Tue, 3 Mar 2026 17:53:40 +0100 Subject: [PATCH] working magnetometer --- 2sem_i2c/src/bin/main.rs | 41 +++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/2sem_i2c/src/bin/main.rs b/2sem_i2c/src/bin/main.rs index 0b440fc..61d7476 100644 --- a/2sem_i2c/src/bin/main.rs +++ b/2sem_i2c/src/bin/main.rs @@ -4,33 +4,48 @@ use defmt::*; use embassy_executor::Spawner; -use embassy_stm32::i2c::I2c; -use embassy_stm32::i2c::Config; +use embassy_stm32::i2c::{Config, I2c}; use embassy_time::{Duration, Timer}; - use {defmt_rtt as _, panic_probe as _}; #[embassy_executor::main] async fn main(_spawner: Spawner) { - info!("tititititi"); + info!("tititi"); let p = embassy_stm32::init(Default::default()); + let mut i2c_cfg = Config::default(); i2c_cfg.sda_pullup = true; i2c_cfg.scl_pullup = true; - i2c_cfg.timeout = Duration::from_millis(10); - let mut i2c = I2c::new_blocking(p.I2C3, p.PC0, p.PC1, i2c_cfg); + i2c_cfg.timeout = Duration::from_millis(200); - let mg = 0x23; + let mut i2c = I2c::new_blocking(p.I2C3, p.PC0, p.PC1, i2c_cfg); + let addr = 0x23; 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]; - if let Ok(_) = i2c.blocking_read(mg, &mut data) { - defmt::info!("0x{:02x}: {}", mg, data); - } else { - defmt::warn!("Device 0x{:02x} not responding", mg); + let _ = i2c.blocking_write(addr, &[0x00, 0x70]); + + Timer::after(Duration::from_millis(50)).await; + + 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; } }