mirror of
https://github.com/hubaldv/bioz-firmware-rs.git
synced 2025-12-06 05:01:18 +00:00
Working waveform (sinus) generator.
This commit is contained in:
@@ -6,11 +6,19 @@ use crate::ad5940_registers::*;
|
||||
pub struct AD5940 {
|
||||
spi: Spi<'static, Blocking>,
|
||||
cs: Output<'static>,
|
||||
rst: Output<'static>,
|
||||
}
|
||||
|
||||
impl AD5940 {
|
||||
pub fn new(spi: Spi<'static, Blocking>, cs: Output<'static>) -> Self {
|
||||
AD5940 { spi, cs }
|
||||
pub fn new(spi: Spi<'static, Blocking>, cs: Output<'static>, rst: Output<'static>) -> Self {
|
||||
AD5940 { spi, cs, rst }
|
||||
}
|
||||
|
||||
pub async fn reset(&mut self) -> Result<(), Error> {
|
||||
self.rst.set_low();
|
||||
Timer::after_millis(1).await;
|
||||
self.rst.set_high();
|
||||
Ok(())
|
||||
}
|
||||
|
||||
async fn read_reg_16(&mut self, address: Register) -> Result<u16, Error> {
|
||||
@@ -109,6 +117,13 @@ impl AD5940 {
|
||||
self.write_reg_16_raw(0x0A04, 0xF27B).await?;
|
||||
self.write_reg_16_raw(0x0A00, 0x8009).await?;
|
||||
self.write_reg_16_raw(0x22F0, 0x0000).await?;
|
||||
|
||||
// According to library
|
||||
// self.write_reg_32_raw(0x2230, 0xDE87A5AF).await?;
|
||||
// self.write_reg_16_raw(0x2250, 0x103F).await?;
|
||||
// self.write_reg_16_raw(0x22B0, 0x203C).await?;
|
||||
// self.write_reg_32_raw(0x2230, 0xDE87A5A0).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -147,6 +162,42 @@ impl AD5940 {
|
||||
|
||||
Ok((tempsensdat0 as f32/(pga_gain * k)) - 273.15)
|
||||
}
|
||||
|
||||
pub async fn init_waveform(&mut self) -> Result<(), Error> {
|
||||
// Set frequency
|
||||
let freq: u32 = 2000;
|
||||
let sinefcw = (freq as f64) * (1_073_741_824.0 / 16_000_000.0);
|
||||
let sinefcw = 0x00FFFFFF & sinefcw as u32;
|
||||
self.write_reg_32(Register::WGFCW, sinefcw).await?;
|
||||
|
||||
// Init amplitude
|
||||
let wg_amplitude = 1279;
|
||||
self.write_reg_32(Register::WGAMPLITUDE, wg_amplitude).await?;
|
||||
|
||||
// WGCON, enable waveform generator and set to sinusoidal, NO DACCAL
|
||||
let config_wgcon = WaveformGeneratorConfigurationRegister::TYPESEL_SIN.bits();
|
||||
self.write_reg_32(Register::WGCON, config_wgcon).await?;
|
||||
|
||||
// SWCON - set up switch matrix
|
||||
let mut swcon = SwitchMatrixConfigurationRegister::reset.bits();
|
||||
|
||||
swcon &= !SwitchMatrixConfigurationRegister::NMUXCON_MSK.bits();
|
||||
swcon |= SwitchMatrixConfigurationRegister::NMUXCON_N2.bits();
|
||||
|
||||
swcon &= !SwitchMatrixConfigurationRegister::PMUXCON_MSK.bits();
|
||||
swcon |= SwitchMatrixConfigurationRegister::PMUXCON_P11.bits();
|
||||
|
||||
swcon &= !SwitchMatrixConfigurationRegister::DMUXCON_MSK.bits();
|
||||
swcon |= SwitchMatrixConfigurationRegister::DMUXCON_D5.bits();
|
||||
|
||||
self.write_reg_32(Register::SWCON, swcon).await?;
|
||||
|
||||
// AFECON:
|
||||
let config_afecon = ConfigurationRegister::reset.bits() | ConfigurationRegister::DACREFEN.bits() | ConfigurationRegister::EXBUFEN.bits() | ConfigurationRegister::INAMPEN.bits() | ConfigurationRegister::DACEN.bits() | ConfigurationRegister::WAVEGENEN.bits();
|
||||
self.write_reg_32(Register::AFECON, config_afecon).await?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
#[allow(dead_code)]
|
||||
@@ -165,8 +216,13 @@ enum Register {
|
||||
ADIID = 0x0000_0400, // Analog Devices Inc., identification register
|
||||
CHIPID = 0x0000_0404, // Chip identification register
|
||||
AFECON = 0x0000_2000, // Configuration Register
|
||||
SWCON = 0x0000_200C, // Switch Matrix Configuration Register
|
||||
WGCON = 0x0000_2014, // Waveform Generator Configuration Register
|
||||
WGFCW = 0x0000_2030, // Waveform Generator, Sinusoid Frequency Control Word Register
|
||||
WGAMPLITUDE = 0x0000_203C, // Waveform Generator, Sinusoid Amplitude Register
|
||||
TEMPSENSDAT = 0x0000_2084, // Temperature Sensor Result Register
|
||||
ADCDAT = 0x0000_2074, // ADC Raw Result Register
|
||||
TEMPSENS = 0x0000_2174, // Temperature Sensor Configuration Register
|
||||
ADCCON = 0x0000_21A8, // ADC Configuration Register
|
||||
PMBW = 0x0000_22F0, // Power Mode Configuration Register
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user