/
i2c_write.rs
87 lines (68 loc) · 2.46 KB
/
i2c_write.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
//! Blinks an LED
#![no_std]
#![no_main]
extern crate cortex_m;
#[macro_use]
extern crate cortex_m_rt as rt;
extern crate cortex_m_semihosting as sh;
extern crate panic_semihosting;
extern crate stm32l4xx_hal as hal;
use crate::hal::prelude::*;
use crate::hal::i2c;
use crate::hal::i2c::I2c;
use crate::rt::entry;
use crate::rt::ExceptionFrame;
use crate::sh::hio;
use core::fmt::Write;
#[entry]
fn main() -> ! {
let mut hstdout = hio::hstdout().unwrap();
// writeln!(hstdout, "Hello, world!").unwrap();
// let cp = cortex_m::Peripherals::take().unwrap();
let dp = hal::stm32::Peripherals::take().unwrap();
let mut flash = dp.FLASH.constrain();
let mut rcc = dp.RCC.constrain();
let mut pwr = dp.PWR.constrain(&mut rcc.apb1r1);
let clocks = rcc.cfgr.freeze(&mut flash.acr, &mut pwr);
let mut gpioa = dp.GPIOA.split(&mut rcc.ahb2);
let mut scl =
gpioa
.pa9
.into_alternate_open_drain(&mut gpioa.moder, &mut gpioa.otyper, &mut gpioa.afrh);
scl.internal_pull_up(&mut gpioa.pupdr, true);
let mut sda =
gpioa
.pa10
.into_alternate_open_drain(&mut gpioa.moder, &mut gpioa.otyper, &mut gpioa.afrh);
sda.internal_pull_up(&mut gpioa.pupdr, true);
let mut i2c = I2c::i2c1(
dp.I2C1,
(scl, sda),
i2c::Config::new(100.kHz(), clocks),
&mut rcc.apb1r1,
);
// i2c.write(0x3C, &[0xCC, 0xAA]).unwrap();
let mut buffer = [0u8; 2];
// 0x08 is version reg
// i2c.write(0x6C, &[0x08],).unwrap();
// let val = i2c.read(0x36, &mut buffer).unwrap();
const MAX17048_ADDR: u8 = 0x6C;
i2c.write_read(MAX17048_ADDR, &[0x08], &mut buffer).unwrap();
let version: u16 = (buffer[0] as u16) << 8 | buffer[1] as u16;
writeln!(hstdout, "Silicon Version: {}", version).ok();
// let soc: u16 = (buffer[0] as u16) + (buffer[1] as u16 / 256); //& 0xFF00
// let soc: u16 = (buffer[0] as u16) << 8 & 0xFF00 | (buffer[1] as u16) & 0x00FF;
i2c.write_read(MAX17048_ADDR, &[0x04], &mut buffer).unwrap();
let soc: u16 = (buffer[0] as u16) << 8 | buffer[1] as u16;
writeln!(hstdout, "Batt SoC: {}%", soc / 256).ok();
i2c.write_read(MAX17048_ADDR, &[0x02], &mut buffer).unwrap();
let vlt: u16 = (buffer[0] as u16) << 8 | buffer[1] as u16;
writeln!(hstdout, "Volt: {}", vlt as f32 * 0.000078125).ok();
loop {
continue;
}
}
#[exception]
unsafe fn HardFault(ef: &ExceptionFrame) -> ! {
panic!("{:#?}", ef);
}