use stm32f4xx_hal::{ adc::Adc, gpio::{ AF5, Alternate, gpioa::*, gpiob::*, gpioe::*, gpiod::*, Output, PushPull, PD9, }, hal::{self, blocking::spi::Write, digital::v2::OutputPin}, spi::{Spi, NoMiso, TransferModeNormal}, pac::SPI2, }; use crate::device::sys_timer::sleep; pub trait current_source_phy { type current_source_ldo_en: OutputPin; type current_source_short: OutputPin; type max5719_load: OutputPin; type max5719_cs: OutputPin; type max5719_spi: Write; } pub struct current_source_phy_construct { pub max5719_spi: C::max5719_spi, pub max5719_load: C::max5719_load, pub max5719_cs: C::max5719_cs, pub current_source_ldo_en: C::current_source_ldo_en, pub current_source_short: C::current_source_short, } pub struct current_source_settings_construct { pub output_current: f32 } pub struct current_source { pub phy : current_source_phy_construct, pub setting: current_source_settings_construct } pub struct current_source_phy_ch0; impl current_source_phy for current_source_phy_ch0 { type current_source_ldo_en = PD9>; type current_source_short = PA4>; type max5719_load = PB14>; type max5719_cs = PD8>; type max5719_spi = Spi>, NoMiso, PB15>), TransferModeNormal>; } impl current_source { pub fn setup(&mut self) { self.phy.max5719_load.set_high(); self.phy.max5719_cs.set_high(); self.phy.current_source_ldo_en.set_high(); sleep(50_u32); self.phy.current_source_short.set_high(); sleep(50_u32); } pub fn set_current(&mut self, current: f32) { self.phy.max5719_load.set_high(); self.phy.max5719_cs.set_low(); let v_dac = current * 10.0 / 0.75; let word = (((v_dac / 4.096) * 1048576.0) as u32) << 4; let mut buf = [ ((word >> 16) & 0xFF) as u8, ((word >> 8) & 0xFF) as u8, ((word >> 0) & 0xFF) as u8, ]; self.phy.max5719_spi.write(&mut buf); self.phy.max5719_cs.set_high(); self.phy.max5719_load.set_low(); } }