From 04b60834607bf77d01acc298615babcc21b7e736 Mon Sep 17 00:00:00 2001 From: Hubald Verzijl Date: Tue, 12 Aug 2025 20:53:24 +0200 Subject: [PATCH] Working sequencer. --- src/ad5940.rs | 98 +++++++++++++++++++++++++++------------------------ src/main.rs | 79 +++++++++++++++++++++-------------------- 2 files changed, 93 insertions(+), 84 deletions(-) diff --git a/src/ad5940.rs b/src/ad5940.rs index 5920a39..7fa46e3 100644 --- a/src/ad5940.rs +++ b/src/ad5940.rs @@ -45,8 +45,7 @@ impl AD5940 { self.cs.set_high(); // Wait after cs is high - // Timer::after_nanos(80).await; - Timer::after_millis(10).await; + Timer::after_nanos(80).await; // Read command self.cs.set_low(); @@ -66,7 +65,6 @@ impl AD5940 { // let mut data = [0u8; 5]; // First byte dummy, then four data bytes // self.spi.blocking_read(&mut data)?; self.cs.set_high(); - Timer::after_millis(1).await; Ok(result) } @@ -87,8 +85,7 @@ impl AD5940 { self.cs.set_high(); // Wait after cs is high - // Timer::after_nanos(80).await; - Timer::after_millis(10).await; + Timer::after_nanos(80).await; // Write value command self.cs.set_low(); @@ -99,7 +96,6 @@ impl AD5940 { self.spi.blocking_write(&[value as u16])?; } self.cs.set_high(); - Timer::after_millis(1).await; Ok(()) @@ -137,7 +133,7 @@ impl AD5940 { if address as u32 > 0x21FF { error!("Sequencer write address out of range: 0x{:04X}", address as u32); } - let cmd = (((address as u32) >> 2) & 0x7F) << 24 | (value & 0xFF_FFFF); + let cmd = 0b1 << 31 | (((address as u32) >> 2) & 0x7F) << 24 | (value & 0xFF_FFFF); self.sequencer_insert(cmd).await; return Ok(()) @@ -148,7 +144,7 @@ impl AD5940 { error!("Sequencer wait cycles out of range: {}", cycles); return; } - let cmd = 0b01 << 30 | 0x0000_0000 | cycles & 0x3FFF_FFFF; + let cmd = 0b00 << 30 | 0x0000_0000 | cycles & 0x3FFF_FFFF; self.sequencer_insert(cmd).await; } @@ -174,12 +170,8 @@ impl AD5940 { start_address &= 0x7FF; // Ensure start address is within bounds while counter < self.seq_len { - self.write_reg(Register::CMDFIFOWADDR, start_address + (counter) as u32).await.unwrap(); - Timer::after_millis(1).await; + self.write_reg(Register::CMDFIFOWADDR, start_address + counter as u32).await.unwrap(); self.write_reg(Register::CMDFIFOWRITE, self.seq_buffer[counter as usize]).await.unwrap(); - // self.write_reg(Register::CMDFIFOWRITE, 0).await.unwrap(); - Timer::after_millis(1).await; - // info!("{:032b}", self.seq_buffer[counter as usize]); counter += 1; } } @@ -198,40 +190,23 @@ impl AD5940 { } } - pub async fn sequencer_trigger(&mut self) { + pub async fn sequencer_trigger(&mut self, seq: u8) { // Trigger the sequencer - self.write_reg(Register::TRIGSEQ, 1 << 0).await.unwrap(); - // self.write_reg(Register::TRIGSEQ, 1 << 1).await.unwrap(); - // self.write_reg(Register::TRIGSEQ, 1 << 2).await.unwrap(); - // self.write_reg(Register::TRIGSEQ, 1 << 3).await.unwrap(); + match seq { + 0 => self.write_reg(Register::TRIGSEQ, 1 << 0).await.unwrap(), + 1 => self.write_reg(Register::TRIGSEQ, 1 << 1).await.unwrap(), + 2 => self.write_reg(Register::TRIGSEQ, 1 << 2).await.unwrap(), + 3 => self.write_reg(Register::TRIGSEQ, 1 << 3).await.unwrap(), + _ => { + error!("Sequencers from 0 till 3 are allows, now: seq={}", seq); + }, + } - // wait - // Timer::after_millis(10).await; - - let test = self.read_reg(Register::SEQCNT).await.unwrap(); - info!("Sequencer triggered, SEQCNT: {}", test); - - - let test = self.read_reg(Register::INTCFLAG0).await.unwrap(); - info!("INTCFLAG0: 0x{:08X}", test); - let test = self.read_reg(Register::INTCFLAG1).await.unwrap(); - info!("INTCFLAG1: 0x{:08X}", test); - - self.write_reg_raw(0x3008, 0xFFFF_FFFF).await.unwrap(); - self.write_reg_raw(0x300C, 0xFFFF_FFFF).await.unwrap(); - - let test = self.read_reg(Register::SEQTIMEOUT).await.unwrap(); - info!("SEQTIMEOUT: {}", test); - - let test = self.read_reg(Register::CMDFIFOWADDR).await.unwrap(); - info!("CMDFIFOWADDR: {}", test); - - // for i in 0..200 { - let test= self.read_reg_raw(0x206C).await.unwrap(); - info!("DATAFIFORD: 0x{:08X}", test); + // for _ in 0..100 { + // let test = self.read_reg_raw(0x206C).await.unwrap(); + // info!("DATAFIFORD: 0x{:08X}", test); // } - - + let test = self.read_reg_raw(0x2200).await.unwrap(); info!("FIFOCNTSTA: {}", (test>>16) & 0b111_1111_1111); } @@ -314,12 +289,12 @@ impl AD5940 { self.write_reg(Register::SEQCON, reg).await.unwrap(); // Reset SEQCON - self.write_reg(Register::SEQCNT, 0x0000_0002).await.unwrap(); + self.write_reg(Register::SEQCNT, 0x0000_0001).await.unwrap(); // Disable fifo self.write_reg(Register::FIFOCON, 0b010 << 13).await.unwrap(); - let cmd = 0b10 << 9 | 0b001 << 6 | 1 << 3 | 1; + let cmd = 0b101 << 9 | 0b001 << 6 | 0b01 << 3 | 0b01; self.write_reg(Register::CMDDATACON, cmd).await.unwrap(); // Enable FIFO @@ -397,6 +372,37 @@ impl AD5940 { Ok(()) } + + pub async fn init_impedance(&mut self) -> Result<(), Error> { + // AFECON: + self.afecon( + AFECON::DACBUFEN + | AFECON::DACREFEN + | AFECON::SINC2EN + | AFECON::DFTEN + | AFECON::WAVEGENEN + | AFECON::TIAEN + | AFECON::INAMPEN + | AFECON::EXBUFEN + | AFECON::ADCCONVEN + | AFECON::ADCEN + | AFECON::DACEN, + true, + ) + .await; + + // SWCON - set up switch matrix for impedance measurement + self.swcon( + SWCON::NMUXCON_N2 + | SWCON::PMUXCON_P11 + | SWCON::DMUXCON_D5).await; + // + self.write_reg_raw(0x0000_20D0, 0b1000 << 4).await.unwrap(); + // SINC3 = 5 --> 160000 Hz + // SINC2 = 178 --> 898,8764044944Hz + // ... (DFTNUM = 2048) + Ok(()) + } } #[allow(dead_code)] diff --git a/src/main.rs b/src/main.rs index 12307f0..1f2414e 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,8 +13,8 @@ use crate::ad5940_registers::{AFECON, AFEGENINTSTA}; use {defmt_rtt as _, panic_probe as _}; -// mod ad5940; -// use ad5940::AD5940; +mod ad5940; +use ad5940::AD5940; // mod adg2128; // use adg2128::State; @@ -63,27 +63,28 @@ async fn main(spawner: Spawner) { let p = embassy_stm32::init(config); info!("Hello World!"); - let mut led = Output::new(p.PA5, Level::High, Speed::Low); + // let mut led = Output::new(p.PA5, Level::High, Speed::Low); - // // Set up SPI for AD5940 - // let cs = Output::new(p.PC9, Level::High, Speed::Low); - // let rst = Output::new(p.PB3, Level::High, Speed::Low); + // Set up SPI for AD5940 + let cs = Output::new(p.PC9, Level::High, Speed::Low); + let rst = Output::new(p.PB3, Level::High, Speed::Low); - // let spi = spi::Spi::new_blocking( - // p.SPI1, - // p.PA5, // SCK - // p.PA7, // MOSI - // p.PA6, // MISO - // spi::Config::default() - // ); + let spi = spi::Spi::new_blocking( + p.SPI1, + p.PA5, // SCK + p.PA7, // MOSI + p.PA6, // MISO + spi::Config::default() + ); - // let mut ad5940 = AD5940::new(spi, cs, rst); - // ad5940.reset().await.unwrap(); - // Timer::after_millis(1).await; - // ad5940.system_init().await.unwrap(); + let mut ad5940 = AD5940::new(spi, cs, rst); + ad5940.reset().await.unwrap(); + Timer::after_millis(1).await; + ad5940.system_init().await.unwrap(); // ad5940.init_temperature().await.unwrap(); - // ad5940.init_waveform().await.unwrap(); + ad5940.init_waveform().await.unwrap(); + ad5940.init_impedance().await.unwrap(); // // Set up I2C for ADG2128 // let i2c = i2c::I2c::new_blocking( @@ -101,37 +102,39 @@ async fn main(spawner: Spawner) { // electrodes.set(Electrode::E3, AD5940Pin::AIN1, State::ENABLED); // // electrodes.set(Electrode::E12, AD5940Pin::RE0, State::ENABLED); + // Turn on the green LED + ad5940.write_reg_raw(0x0000_0004, 1 << 1).await.unwrap(); + ad5940.write_reg_raw(0x0000_001C, 1 << 1).await.unwrap(); + // // Sequencer test - // ad5940.sequencer_enable(true).await; - // ad5940.afecon(AFECON::WAVEGENEN, true).await; - // ad5940.wgfcw(1000).await; - // ad5940.sequencer_wait(600_000).await; - // ad5940.wgfcw(2000).await; + ad5940.sequencer_enable(true).await; + ad5940.afecon(AFECON::WAVEGENEN, true).await; + ad5940.wgfcw(1000).await; + ad5940.sequencer_wait(300_000).await; + ad5940.wgfcw(2000).await; + ad5940.sequencer_wait(160_000).await; // ad5940.sequencer_trigger_interrupt(AFEGENINTSTA::CUSTOMINT0).await; - // ad5940.sequencer_trigger_interrupt(AFEGENINTSTA::CUSTOMINT1).await; - // ad5940.sequencer_wait(160_000).await; - // ad5940.afecon(AFECON::WAVEGENEN, false).await; - // ad5940.sequencer_enable(false).await; + ad5940.afecon(AFECON::WAVEGENEN, false).await; + ad5940.sequencer_enable(false).await; // // Configure the sequencer cmd data sram - // ad5940.cmddatacon().await; + ad5940.cmddatacon().await; - // let start_address = 100; // 20 works - // ad5940.sequencer_cmd_write(start_address).await; + let start_address = 0; + ad5940.sequencer_cmd_write(start_address).await; - // ad5940.sequencer_info_configure(0, ad5940.seq_len, start_address).await; - // info!("{}", ad5940.seq_len); + ad5940.sequencer_info_configure(0, ad5940.seq_len, start_address).await; // Create USB driver and start postcard-rpc server let driver = Driver::new(p.USB, Irqs, p.PA12, p.PA11); init_communication(driver, spawner); // Green led task - spawner.must_spawn(green_led(led)); + // spawner.must_spawn(green_led(led)); loop { // Read chip id - // let chip_id = ad5940.get_chipid().await.unwrap(); + // let chip_id = ad5940.get_chipid().await; // info!("Chip ID: 0x{:04X}", chip_id); // Read temperature @@ -143,15 +146,15 @@ async fn main(spawner: Spawner) { // info!("high"); - + ad5940.sequencer_trigger(0).await; - info!("Mainloop still running!"); + // info!("Mainloop still running!"); - Timer::after_millis(5000).await; + Timer::after_millis(250).await; - // ad5940.sequencer_trigger().await; + } }