diff --git a/src/ad5940.rs b/src/ad5940.rs index 8a81907..aaac75f 100644 --- a/src/ad5940.rs +++ b/src/ad5940.rs @@ -87,57 +87,57 @@ pub struct DspConfig { } impl DspConfig { - pub fn adc_mux_n(mut self, muxseln: MUXSELN) -> Self { + pub fn adc_mux_n(&mut self, muxseln: MUXSELN) -> &mut Self { self.muxseln = Some(muxseln); self } - pub fn adc_mux_p(mut self, muxselp: MUXSELP) -> Self { + pub fn adc_mux_p(&mut self, muxselp: MUXSELP) -> &mut Self { self.muxselp = Some(muxselp); self } - pub fn ctiacon(mut self, ctiacon: CTIACON) -> Self { + pub fn ctiacon(&mut self, ctiacon: CTIACON) -> &mut Self { self.ctiacon = Some(ctiacon); self } - pub fn rtiacon(mut self, rtiacon: RTIACON) -> Self { + pub fn rtiacon(&mut self, rtiacon: RTIACON) -> &mut Self { self.rtiacon = Some(rtiacon); self } - pub fn sinc3osr(mut self, sinc3osr: SINC3OSR) -> Self { + pub fn sinc3osr(&mut self, sinc3osr: SINC3OSR) -> &mut Self { self.sinc3osr = Some(sinc3osr); self } - pub fn sinc2osr(mut self, sinc2osr: SINC2OSR) -> Self { + pub fn sinc2osr(&mut self, sinc2osr: SINC2OSR) -> &mut Self { self.sinc2osr = Some(sinc2osr); self } - pub fn adcsamplerate(mut self, adcsamplerate: ADCSAMPLERATE) -> Self { + pub fn adcsamplerate(&mut self, adcsamplerate: ADCSAMPLERATE) -> &mut Self { self.adcsamplerate = Some(adcsamplerate); self } - pub fn dftin_sel(mut self, dftin: DFTINSEL) -> Self { + pub fn dftin_sel(&mut self, dftin: DFTINSEL) -> &mut Self { self.dftin = Some(dftin); self } - pub fn dftnum(mut self, dftnum: DFTNUM) -> Self { + pub fn dftnum(&mut self, dftnum: DFTNUM) -> &mut Self { self.dftnum = Some(dftnum); self } - pub fn hanning(mut self, hanning: bool) -> Self { + pub fn hanning(&mut self, hanning: bool) -> &mut Self { self.hanning = Some(hanning); self } - pub fn set_clks(mut self, fsys: u32, fadc: u32) -> Self { + pub fn set_clks(&mut self, fsys: u32, fadc: u32) -> &mut Self { self.fsys = Some(fsys); self.fadc = Some(fadc); self.ratio_sys2adc_clk = Some(fsys as f32 / fadc as f32); @@ -156,27 +156,27 @@ pub struct SramConfig { } impl SramConfig { - pub fn datafifosrcsel(mut self, datafifosrcsel: DATAFIFOSRCSEL) -> Self { + pub fn datafifosrcsel(&mut self, datafifosrcsel: DATAFIFOSRCSEL) -> &mut Self { self.datafifosrcsel = Some(datafifosrcsel); self } - pub fn datafifoen(mut self, datafifoen: DATAFIFOEN) -> Self { + pub fn datafifoen(&mut self, datafifoen: DATAFIFOEN) -> &mut Self { self.datafifoen = Some(datafifoen); self } - pub fn data_size(mut self, data_mem_size: DATA_MEM_SEL) -> Self { + pub fn data_size(&mut self, data_mem_size: DATA_MEM_SEL) -> &mut Self { self.data_mem_size = Some(data_mem_size); self } - pub fn cmd_mode(mut self, cmd_mem_mode: CMDMEMMDE) -> Self { + pub fn cmd_mode(&mut self, cmd_mem_mode: CMDMEMMDE) -> &mut Self { self.cmd_mem_mode = Some(cmd_mem_mode); self } - pub fn cmd_size(mut self, cmd_mem_size: CMD_MEM_SEL) -> Self { + pub fn cmd_size(&mut self, cmd_mem_size: CMD_MEM_SEL) -> &mut Self { self.cmd_mem_size = Some(cmd_mem_size); self } diff --git a/src/communication.rs b/src/communication.rs index 0729a3f..00799da 100644 --- a/src/communication.rs +++ b/src/communication.rs @@ -169,7 +169,7 @@ pub async fn start_single_impedance_handler(context: SpawnCtx, header: VarHeader context.impedance_setup.lock().await.running = true; // Init the sequencer - context.impedance_setup.lock().await.init_single_frequency_measurement(rqst.sinus_frequency).await; + context.impedance_setup.lock().await.init_single_frequency_measurement(rqst.sinus_frequency, rqst.dft_number).await; // Trigger the sequencer context.impedance_setup.lock().await.start_measurement().await; diff --git a/src/icd_mapping.rs b/src/icd_mapping.rs new file mode 100644 index 0000000..72ec4d8 --- /dev/null +++ b/src/icd_mapping.rs @@ -0,0 +1,27 @@ +use crate::ad5940_registers::DFTNUM; +use bioz_icd_rs::IcdDftNum; + +// Map ICD types to register types +pub trait IntoDftnum { + fn into_dftnum(self) -> DFTNUM; +} + +impl IntoDftnum for IcdDftNum { + fn into_dftnum(self) -> DFTNUM { + match self { + IcdDftNum::Num4 => DFTNUM::Num4, + IcdDftNum::Num8 => DFTNUM::Num8, + IcdDftNum::Num16 => DFTNUM::Num16, + IcdDftNum::Num32 => DFTNUM::Num32, + IcdDftNum::Num64 => DFTNUM::Num64, + IcdDftNum::Num128 => DFTNUM::Num128, + IcdDftNum::Num256 => DFTNUM::Num256, + IcdDftNum::Num512 => DFTNUM::Num512, + IcdDftNum::Num1024 => DFTNUM::Num1024, + IcdDftNum::Num2048 => DFTNUM::Num2048, + IcdDftNum::Num4096 => DFTNUM::Num4096, + IcdDftNum::Num8192 => DFTNUM::Num8192, + IcdDftNum::Num16384 => DFTNUM::Num16384, + } + } +} \ No newline at end of file diff --git a/src/impedance.rs b/src/impedance.rs index 7518533..99c8e41 100644 --- a/src/impedance.rs +++ b/src/impedance.rs @@ -10,7 +10,8 @@ use static_cell::StaticCell; use crate::ad5940::*; use crate::ad5940_registers::*; -use bioz_icd_rs::ImpedanceOutput; +use bioz_icd_rs::{ImpedanceOutput, IcdDftNum}; +use crate::icd_mapping::IntoDftnum; pub static IMPEDANCE_CHANNEL: Channel = Channel::new(); @@ -51,7 +52,8 @@ impl ImpedanceSetup { self.ad5940.apply_clk_config(&clk_config).await.unwrap(); // Set DSP configuration - let dsp_config = DspConfig::default() + let mut dsp_config = DspConfig::default(); + dsp_config .adc_mux_n(MUXSELN::HsTiaNeg) .adc_mux_p(MUXSELP::HsTiaPos) .ctiacon(CTIACON::C32) @@ -68,7 +70,8 @@ impl ImpedanceSetup { self.dsp_config = Some(dsp_config); // Set SRAM configuration (cmd and data sram) - let sram_config = SramConfig::default() + let mut sram_config = SramConfig::default(); + sram_config .datafifosrcsel(DATAFIFOSRCSEL::DFT) .datafifoen(DATAFIFOEN::Normal) .data_size(DATA_MEM_SEL::Size2kB) @@ -83,9 +86,13 @@ impl ImpedanceSetup { Ok(()) } - pub async fn init_single_frequency_measurement(&mut self, frequency: u32) { + pub async fn init_single_frequency_measurement(&mut self, frequency: u32, dft_number: IcdDftNum) { + // Set DFT number + self.dsp_config.as_mut().unwrap().dftnum(dft_number.into_dftnum()); + self.ad5940.apply_dsp_config(self.dsp_config.as_ref().unwrap()).await.unwrap(); + // Configure GPIOs - self.ad5940.write_reg(Register::GP0CON, 0b10 << 4 | 0b10 << 2 | 0b10).await.unwrap(); + self.ad5940.write_reg(Register::GP0CON, 0b10 << 4 | 0b10 << 2 | 0b10).await.unwrap(); self.ad5940.write_reg(Register::SYNCEXTDEVICE, 0b111).await.unwrap(); // Calculate wait time between measurement start and stop @@ -150,6 +157,8 @@ impl ImpedanceSetup { self.start_measurement().await; } + + pub async fn start_measurement(&mut self) { self.ad5940.sequencer_trigger(0).await; } diff --git a/src/main.rs b/src/main.rs index e41114a..cb38792 100644 --- a/src/main.rs +++ b/src/main.rs @@ -40,6 +40,8 @@ use impedance::IMPEDANCE_CHANNEL; mod impedance; use impedance::{ImpedanceSetup, ImpedanceSetupType, IMPEDANCE_SETUP}; +mod icd_mapping; + bind_interrupts!(struct Irqs { USB_DRD_FS => usb::InterruptHandler; });