This commit is contained in:
Filipriec
2026-03-10 15:15:00 +01:00
parent 8d8d3b3341
commit 9e90cc7295

View File

@@ -5,6 +5,7 @@
use defmt::*; use defmt::*;
use embassy_executor::Spawner; use embassy_executor::Spawner;
use embassy_stm32::spi::{Config, Spi}; use embassy_stm32::spi::{Config, Spi};
use embassy_stm32::gpio::{Pull, Level, Speed, Output};
use embassy_time::{Duration, Timer}; use embassy_time::{Duration, Timer};
use {defmt_rtt as _, panic_probe as _}; use {defmt_rtt as _, panic_probe as _};
@@ -14,33 +15,37 @@ async fn main(_spawner: Spawner) {
let p = embassy_stm32::init(Default::default()); let p = embassy_stm32::init(Default::default());
let mut i2c_cfg = Config::default(); let mut spi = Spi::new_blocking(p.SPI1, p.PA5, p.PA7, p.PA6, Config::default());
i2c_cfg.sda_pullup = true; let mut cs = Output::new(p.PA4, Level::High, Speed::VeryHigh);
i2c_cfg.scl_pullup = true;
i2c_cfg.timeout = Duration::from_millis(200);
let mut i2c = I2c::new_blocking(p.I2C3, p.PC0, p.PC1, i2c_cfg); cs.set_low();
let addr = 0x23; if let Err(e) = spi.blocking_write(&[0x01u8, 0x79u8]) {
if let Err(e) = i2c.blocking_write(addr, &[0x01, 0x79]) {
error!("Nepodarilo sa aktivovať CMM: {:?}", e); error!("Nepodarilo sa aktivovať CMM: {:?}", e);
} }
cs.set_high();
loop { loop {
let mut raw = [0u8; 9]; let mut data = [0u8; 10];
match i2c.blocking_write_read(addr, &[0x24], &mut raw) {
data[0] = 0xA4;
cs.set_low();
let result = spi.blocking_transfer_in_place(&mut data);
cs.set_high();
match result {
Ok(_) => { Ok(_) => {
let x = i32::from_be_bytes([raw[0], raw[1], raw[2], 0]) >> 8; // index 0, len potvrdenie prijatia adresy
let y = i32::from_be_bytes([raw[3], raw[4], raw[5], 0]) >> 8; let raw = &data[1..];
let z = i32::from_be_bytes([raw[6], raw[7], raw[8], 0]) >> 8;
info!("X: {}, Y: {}, Z: {}", x, y, z); info!("X: {:02x}{:02x}{:02x} Y: {:02x}{:02x}{:02x} Z: {:02x}{:02x}{:02x}",
} raw[0], raw[1], raw[2],
Err(e) => { raw[3], raw[4], raw[5],
error!("Chyba pri čítaní: {:?}", e); raw[6], raw[7], raw[8]);
} }
Err(e) => error!("SPI error: {:?}", e),
} }
// Čítajte napríklad každých 100ms. Dáta v registroch budú vždy najaktuálnejšie dokončené meranie.
Timer::after(Duration::from_millis(100)).await; Timer::after(Duration::from_millis(100)).await;
} }
} }