Tool/software:
Currently using the evaluation kit with the following configuration:
VCCA = VCCB = GND
VSSA = VSSB = -4V
VDD = 5V
VIO = 3.3V
the ftdi bridge is fully disconnected from all jumpers. I am using my own micro for spi control.
When I enable PAON, the dacs begin reporting that their power status has gone into low power mode. If I disable PAON, then all the dacs show they're enabled as normal and I can control them as expected. I don't see this linked behavior really mentioned in the documentation as to why the dacs would enter low power mode if paon is enabled, or maybe I am overlooking something here.
I've disabled all alarms for PAON and equally disabled the global alarm register to confirm that there are no alarms triggering.
Reading the ADC reports the correct values per channel.
While reading back out the pwr_status_1 register, it also shows that all dacs should be disabled but they're still actively driving the commanded value, 2.6V.
Code snippet below of what is inside of my main
// Global address { Afe20408Definitions::gen_cfg_0_t content; content.bits.flexio_out_ode = Afe20408Definitions::FlexIoOutODE::PUSH_PULL_OUTPUT; content.bits.paon_ode = Afe20408Definitions::PaonODE::PUSH_PULL_OUTPUT; content.bits.paon_pol = Afe20408Definitions::PaonPOL::INVERT_PWR_EN_PAON_SETTING; device.set_gen_cfg_0(content); } { Afe20408Definitions::gen_cfg_1_t content; content.bits.vssa_range = Afe20408Definitions::gen_cfg_1_t::VSS_A_B_RANGE::MID_RANGE; content.bits.vssb_range = Afe20408Definitions::gen_cfg_1_t::VSS_A_B_RANGE::MID_RANGE; content.bits.flexio_func = Afe20408Definitions::gen_cfg_1_t::FLEXIO_FUNC::N_ALARMOUT; device.set_gen_cfg_1(content); } { Afe20408Definitions::global_cfg_t content; content.bits.adc_byp_en = Afe20408Definitions::AdcBypass::DISABLED; content.bits.alarm_byp_en = Afe20408Definitions::AlarmBypass::ENABLE_ALL_ALARM_CONDITION_STATES_AND_ALARM_STATUS_BITS_BYPASS; device.set_global_cfg(content); } { Afe20408Definitions::channel_enable_t content; content.register_content = 0; // Ignore flexio for dacs device.set_flexio_enable(content); } { Afe20408Definitions::alarmout_src_0_t content; content.register_content = 0; // no alarms effect paon device.set_alarmout_src_0(content); } { Afe20408Definitions::alarmout_src_1_t content; content.register_content = 0; // no alarms effect paon device.set_alarm_out_src_1(content); } { Afe20408Definitions::paon_src_0_t content; content.register_content = 0; device.set_paon_src_0(content); } { Afe20408Definitions::paon_src_1_t content; content.bits.vcca_paon_out = Afe20408Definitions::PaonAlarmEffect::ALARM_EVENT_DOES_NOT_AFFECT_PAON_PIN; content.bits.vccb_paon_out = Afe20408Definitions::PaonAlarmEffect::ALARM_EVENT_DOES_NOT_AFFECT_PAON_PIN; content.bits.vssa_paon_out = Afe20408Definitions::PaonAlarmEffect::ALARM_EVENT_DOES_NOT_AFFECT_PAON_PIN; content.bits.vssb_paon_out = Afe20408Definitions::PaonAlarmEffect::ALARM_EVENT_DOES_NOT_AFFECT_PAON_PIN; content.bits.thermerr_paon_out = Afe20408Definitions::PaonAlarmEffect::ALARM_EVENT_DOES_NOT_AFFECT_PAON_PIN; content.bits.ref_paon_out = Afe20408Definitions::PaonAlarmEffect::ALARM_EVENT_DOES_NOT_AFFECT_PAON_PIN; device.set_paon_src_1(content); } // Page 1 { Afe20408Definitions::adc_gen_cfg_t content; content.bits.falr_sense = Afe20408Definitions::adc_gen_cfg_t::OutOfRangeConversionsToSetAlarm::_4; content.bits.falr_adc = Afe20408Definitions::adc_gen_cfg_t::OutOfRangeConversionsToSetAlarm::_4; content.bits.falr_tmp = Afe20408Definitions::adc_gen_cfg_t::OutOfRangeConversionsToSetAlarm::_4; content.bits.cmode = Afe20408Definitions::AdcConversionMode::AUTO_MODE; content.bits.shunt_range = Afe20408Definitions::ShuntRange_mV::_163_84; device.set_adc_gen_cfg(content); } { Afe20408Definitions::adc_conv_cfg_0_t content; content.bits.conv_rate_adc = Afe20408Definitions::adc_conv_cfg_0_t::AquisitionAndConversionTime_uS::_152; content.bits.conv_rate_sense = Afe20408Definitions::adc_conv_cfg_0_t::AquisitionAndConversionTime_uS::_152; content.bits.conv_rate_tmp = Afe20408Definitions::adc_conv_cfg_0_t::AquisitionAndConversionTime_uS::_152; device.set_adc_conv_gen_cfg_0(content); } { Afe20408Definitions::adc_conv_cfg_1_t content; content.bits.avg_adc = Afe20408Definitions::adc_conv_cfg_1_t::AverageSamples::_1; content.bits.avg_sense = Afe20408Definitions::adc_conv_cfg_1_t::AverageSamples::_1; content.bits.avg_tmp = Afe20408Definitions::adc_conv_cfg_1_t::AverageSamples::_1; device.set_adc_conv_gen_cfg_1(content); } { Afe20408Definitions::adc_hyst_0_t content; content.bits.hyst_adc = 0x08; content.bits.hyst_tmp = 0x08; device.set_adc_hyst_0(content); } { Afe20408Definitions::adc_hyst_1_t content; content.bits.hyst_sense = 0x08; device.set_adc_hyst_1(content); } // Page 2 { Afe20408Definitions::adc_ccs_ids_t content; content.bits.ccs_id_a = 0x03; content.bits.ccs_id_b = 0x01; device.set_adc_ccs_ids_x(Afe20408Definitions::AdcCcsId::_0, content); content.bits.ccs_id_a = 0x04; content.bits.ccs_id_b = 0x01; device.set_adc_ccs_ids_x(Afe20408Definitions::AdcCcsId::_1, content); content.bits.ccs_id_a = 0x02; content.bits.ccs_id_b = 0x01; device.set_adc_ccs_ids_x(Afe20408Definitions::AdcCcsId::_2, content); content.bits.ccs_id_a = 0x05; content.bits.ccs_id_b = 0x01; device.set_adc_ccs_ids_x(Afe20408Definitions::AdcCcsId::_3, content); } { Afe20408Definitions::adc_ccs_cfg_0_t content; content.bits.ccs_start_index = 0x00; content.bits.ccs_stop_index = 0x07; device.set_adc_ccs_cfg_0(content); } // page 3 { Afe20408Definitions::dac_current_t content; content.bits.daca0_current = Afe20408Definitions::dac_current_t::DacCurrentOutput_mA::HIGH_CURRENT_MODE_120; content.bits.daca1_current = Afe20408Definitions::dac_current_t::DacCurrentOutput_mA::HIGH_CURRENT_MODE_120; content.bits.daca2_current = Afe20408Definitions::dac_current_t::DacCurrentOutput_mA::HIGH_CURRENT_MODE_120; content.bits.daca3_current = Afe20408Definitions::dac_current_t::DacCurrentOutput_mA::HIGH_CURRENT_MODE_120; content.bits.dacb0_current = Afe20408Definitions::dac_current_t::DacCurrentOutput_mA::HIGH_CURRENT_MODE_120; content.bits.dacb1_current = Afe20408Definitions::dac_current_t::DacCurrentOutput_mA::HIGH_CURRENT_MODE_120; content.bits.dacb2_current = Afe20408Definitions::dac_current_t::DacCurrentOutput_mA::HIGH_CURRENT_MODE_120; content.bits.dacb3_current = Afe20408Definitions::dac_current_t::DacCurrentOutput_mA::HIGH_CURRENT_MODE_120; device.set_dac_current(content); } { Afe20408Definitions::dac_cfg_t content; content.bits.clamp_sel_outa0 = Afe20408Definitions::ClampSelectOutA0::DACA1; content.bits.clamp_sel_outa2 = Afe20408Definitions::ClampSelectOutA2::DACA3; content.bits.clamp_sel_outb0 = Afe20408Definitions::ClampSelectOutB0::DACB1; content.bits.clamp_sel_outb2 = Afe20408Definitions::ClampSelectOutB2::DACB3; device.set_dac_cfg(content); } { Afe20408Definitions::dac_sync_cfg_t content; content.register_content = 0x0; // ALL channels async and ignore broadcast device.set_dac_sync_cfg(content); } { Afe20408Definitions::dac_apd_en_t content; content.register_content = 0; // Disable auto power down device.set_dac_apd_en(content); } { Afe20408Definitions::apd_src_0_t content; content.register_content = 0; // Disable auto power down device.set_daca_apd_src_0(content); } { Afe20408Definitions::apd_src_1_t content; content.register_content = 0; // Disable auto power down device.set_daca_apd_src_1(content); } { Afe20408Definitions::apd_src_0_t content; content.register_content = 0; // Disable auto power down device.set_dacb_apd_src_0(content); } { Afe20408Definitions::apd_src_1_t content; content.register_content = 0; // Disable auto power down device.set_dacb_apd_src_1(content); } { Afe20408Definitions::apd_src_0_t content; content.register_content = 0; // Disable auto power down device.set_outa_apd_src_0(content); } { Afe20408Definitions::apd_src_1_t content; content.register_content = 0; // Disable auto power down device.set_outa_apd_src_1(content); } { Afe20408Definitions::apd_src_0_t content; content.register_content = 0; // Disable auto power down device.set_outb_apd_src_0(content); } { Afe20408Definitions::apd_src_1_t content; content.register_content = 0; // Disable auto power down device.set_outb_apd_src_1(content); } { Afe20408Definitions::dac_limits_t content; content.bits.first_limit = Afe20408Definitions::dac_limits_t::DAC_LIMIT_0x1FFF; content.bits.second_limit = Afe20408Definitions::dac_limits_t::DAC_LIMIT_0x1FFF; device.set_adc_code_limit_a_0_1(content); device.set_adc_code_limit_a_2_3(content); device.set_adc_code_limit_b_0_1(content); device.set_adc_code_limit_b_2_3(content); } { Afe20408Definitions::channel_enable_t content; content.bits.dac_a_0 = Afe20408Definitions::ChannelEnable::CHANNEL_ENABLED_FOR_DAC_CHANNEL; content.bits.dac_a_1 = Afe20408Definitions::ChannelEnable::CHANNEL_ENABLED_FOR_DAC_CHANNEL; content.bits.dac_a_2 = Afe20408Definitions::ChannelEnable::CHANNEL_ENABLED_FOR_DAC_CHANNEL; content.bits.dac_a_3 = Afe20408Definitions::ChannelEnable::CHANNEL_ENABLED_FOR_DAC_CHANNEL; content.bits.dac_b_0 = Afe20408Definitions::ChannelEnable::CHANNEL_ENABLED_FOR_DAC_CHANNEL; content.bits.dac_b_1 = Afe20408Definitions::ChannelEnable::CHANNEL_ENABLED_FOR_DAC_CHANNEL; content.bits.dac_b_2 = Afe20408Definitions::ChannelEnable::CHANNEL_ENABLED_FOR_DAC_CHANNEL; content.bits.dac_b_3 = Afe20408Definitions::ChannelEnable::CHANNEL_ENABLED_FOR_DAC_CHANNEL; device.set_drive_0_enable(content); } { Afe20408Definitions::channel_enable_t content; content.bits.dac_a_0 = Afe20408Definitions::ChannelEnable::CHANNEL_ENABLED_FOR_DAC_CHANNEL; content.bits.dac_a_1 = Afe20408Definitions::ChannelEnable::CHANNEL_ENABLED_FOR_DAC_CHANNEL; content.bits.dac_a_2 = Afe20408Definitions::ChannelEnable::CHANNEL_ENABLED_FOR_DAC_CHANNEL; content.bits.dac_a_3 = Afe20408Definitions::ChannelEnable::CHANNEL_ENABLED_FOR_DAC_CHANNEL; content.bits.dac_b_0 = Afe20408Definitions::ChannelEnable::CHANNEL_ENABLED_FOR_DAC_CHANNEL; content.bits.dac_b_1 = Afe20408Definitions::ChannelEnable::CHANNEL_ENABLED_FOR_DAC_CHANNEL; content.bits.dac_b_2 = Afe20408Definitions::ChannelEnable::CHANNEL_ENABLED_FOR_DAC_CHANNEL; content.bits.dac_b_3 = Afe20408Definitions::ChannelEnable::CHANNEL_ENABLED_FOR_DAC_CHANNEL; device.set_drive_1_enable(content); } // Setup global page { Afe20408Definitions::pwr_en_t content; content.bits.pdaca0 = Afe20408Definitions::EnableStatus::ENABLED; content.bits.pdaca1 = Afe20408Definitions::EnableStatus::ENABLED; content.bits.pdaca2 = Afe20408Definitions::EnableStatus::ENABLED; content.bits.pdaca3 = Afe20408Definitions::EnableStatus::ENABLED; content.bits.pdacb0 = Afe20408Definitions::EnableStatus::ENABLED; content.bits.pdacb1 = Afe20408Definitions::EnableStatus::ENABLED; content.bits.pdacb2 = Afe20408Definitions::EnableStatus::ENABLED; content.bits.pdacb3 = Afe20408Definitions::EnableStatus::ENABLED; content.bits.paon = Afe20408Definitions::EnableStatus::ENABLED; device.set_pwr_en(content); } { Afe20408Definitions::drvenswen_t content; content.bits.drven_sw_en_daca0 = Afe20408Definitions::SoftwareOperation::ENABLE; content.bits.drven_sw_en_daca1 = Afe20408Definitions::SoftwareOperation::ENABLE; content.bits.drven_sw_en_daca2 = Afe20408Definitions::SoftwareOperation::ENABLE; content.bits.drven_sw_en_daca3 = Afe20408Definitions::SoftwareOperation::ENABLE; content.bits.drven_sw_en_dacb0 = Afe20408Definitions::SoftwareOperation::ENABLE; content.bits.drven_sw_en_dacb1 = Afe20408Definitions::SoftwareOperation::ENABLE; content.bits.drven_sw_en_dacb2 = Afe20408Definitions::SoftwareOperation::ENABLE; content.bits.drven_sw_en_dacb3 = Afe20408Definitions::SoftwareOperation::ENABLE; device.set_drven_sw_en(content); } { Afe20408Definitions::drven_t content; content.bits.drven_daca0 = Afe20408Definitions::SoftwareOperation::ENABLE; content.bits.drven_daca1 = Afe20408Definitions::SoftwareOperation::ENABLE; content.bits.drven_daca2 = Afe20408Definitions::SoftwareOperation::ENABLE; content.bits.drven_daca3 = Afe20408Definitions::SoftwareOperation::ENABLE; content.bits.drven_dacb0 = Afe20408Definitions::SoftwareOperation::ENABLE; content.bits.drven_dacb1 = Afe20408Definitions::SoftwareOperation::ENABLE; content.bits.drven_dacb2 = Afe20408Definitions::SoftwareOperation::ENABLE; content.bits.drven_dacb3 = Afe20408Definitions::SoftwareOperation::ENABLE; device.set_drven(content); } // Setup Dac voltage { static constexpr uint16_t _2V6 = 0x1776; // output voltage 2.6V device.set_dac_buffer(Afe20408Definitions::DacChannel::daca0, _2V6); device.set_dac_buffer(Afe20408Definitions::DacChannel::daca1, _2V6); device.set_dac_buffer(Afe20408Definitions::DacChannel::daca2, _2V6); device.set_dac_buffer(Afe20408Definitions::DacChannel::daca3, _2V6); device.set_dac_buffer(Afe20408Definitions::DacChannel::dacb0, _2V6); device.set_dac_buffer(Afe20408Definitions::DacChannel::dacb1, _2V6); device.set_dac_buffer(Afe20408Definitions::DacChannel::dacb2, _2V6); device.set_dac_buffer(Afe20408Definitions::DacChannel::dacb3, _2V6); } // start adc { Afe20408Definitions::trigger_t content; content.bits.adc_trig = Afe20408Definitions::AdcTrigger::START_CONVERSIONS; content.bits.dac_trig = Afe20408Definitions::DacTrigger::INITIATE_TRANSFER_FROM_DAC_BUFFER_TO_ACTIVE; content.bits.alarm_latch_clr = Afe20408Definitions::AlarmLatchClear::CLEAR_ALARM_BITS; device.set_trigger(content); } while (true) { device.print_chip_id(); mcm_led_1.update(); mcm_led_2.update(); mcm_led_3.update(); device.set_gpio_data(Afe20408Definitions::GpioState::LOW); // Read out values from device uint16_t adc_code_0 = 0; uint16_t adc_code_1 = 0; uint16_t raw_adc_0 = 0; uint16_t raw_adc_1 = 0; uint16_t adc_temp = 0; if (!device.get_adc_sense_0(adc_code_0) // || !device.get_adc_sense_1(adc_code_1) // || !device.get_adc_adc_0(raw_adc_0) // || !device.get_adc_adc_1(raw_adc_1) // || !device.get_adc_tmp(adc_temp)) { logger.info("failed to read!"); continue; } // convert adc0 to float int32_t adc_mv = static_cast<float>(static_cast<int16_t>(raw_adc_0)) * 0.003125f * 1000.f; logger.info("Raw Sense 0: %6u, Raw Sense 1: %6u", adc_code_0, adc_code_1); logger.info("raw adc 0: %6ld, raw adc 1: %6ld", raw_adc_0, raw_adc_1); logger.info("adc_mv: %ld", adc_mv); logger.info("Temp mC: %lu", static_cast<uint32_t>(static_cast<float>(adc_temp) * 0.0078f * 1000.f)); { Afe20408Definitions::alarm_status_0_t content; device.get_alarm_status_0(content); logger.info("sense0_alr %u\t sense1_alr %u \t adc0_alr %u \t adc1_alr %u \t tmp_alr %u", content.bits.sense0_alr, content.bits.sense1_alr, content.bits.adc0_alr, content.bits.adc1_alr, content.bits.tmp_alr); } { Afe20408Definitions::alarm_status_1_t content; device.get_alarm_status_1(content); logger.info("vcca_alr %u\t vccb_alr % u\t vssa_alr % u\t vssb_alr % u\t thermerr_alr % u\t ref_alr % u\t alarmin_alr %u", content.bits.vcca_alr, content.bits.vccb_alr, content.bits.vssa_alr, content.bits.vssb_alr, content.bits.thermerr_alr, content.bits.ref_alr, content.bits.alarmin_alr); } { Afe20408Definitions::pwr_status_0_t content; device.get_pwr_status_0(content); logger.info( "\r\n vddl_sts %u\r\n vssa_lowrange_sts %u\r\n vssa_midrange_sts %u\r\n vssa_highrange_sts %u\r\n vcca_sts %u\r\n " "vssb_lowrange_sts %u\r\n vssb_midrange_sts %u\r\n vssb_highrange_sts %u\r\n vccb_sts %u", content.bits.vddl_sts, content.bits.vssa_lowrange_sts, content.bits.vssa_midrange_sts, content.bits.vssa_highrange_sts, content.bits.vcca_sts, content.bits.vssb_lowrange_sts, content.bits.vssb_midrange_sts, content.bits.vssb_highrange_sts, content.bits.vccb_sts); } { Afe20408Definitions::pwr_status_1_t content; device.get_pwr_status_1(content); logger.info( "\r\npdaca0_sts: %u \t\r\npdaca1_sts: %u \t\r\npdaca2_sts: %u \t\r\npdaca3_sts: %u \t\r\npdacb0_sts: %u " "\t\r\npdacb1_sts: %u \t\r\npdacb2_sts: %u \t\r\npdacb3_sts: %u \t\r\ndrven_daca0_sts: %u \t\r\ndrven_daca1_sts: %u " "\t\r\ndrven_daca2_sts: %u \t\r\ndrven_daca3_sts: %u \t\r\ndrven_dacb0_sts: %u \t\r\ndrven_dacb1_sts: %u " "\t\r\ndrven_dacb2_sts: %u \t\r\ndrven_dacb3_sts: %u", content.bits.pdaca0_sts, content.bits.pdaca1_sts, content.bits.pdaca2_sts, content.bits.pdaca3_sts, content.bits.pdacb0_sts, content.bits.pdacb1_sts, content.bits.pdacb2_sts, content.bits.pdacb3_sts, content.bits.drven_daca0_sts, content.bits.drven_daca1_sts, content.bits.drven_daca2_sts, content.bits.drven_daca3_sts, content.bits.drven_dacb0_sts, content.bits.drven_dacb1_sts, content.bits.drven_dacb2_sts, content.bits.drven_dacb3_sts); } { Afe20408Definitions::gen_status_t content; device.get_general_status(content); logger.info( "\n\rgalr : %u \n\rgtmp_alr : %u \n\rpaon_sts : %u \n\rgalarmin_alr : %u \n\rgvcvss_alr : %u \n\rn_adc_ready : %u " "\n\rgsense_alr : %u \n\rgadc_alr : %u \n\rgtherm_alr : %u \n\rgref_alr : %u", content.bits.galr, content.bits.gtmp_alr, content.bits.paon_sts, content.bits.galarmin_alr, content.bits.gvcvss_alr, content.bits.n_adc_ready, content.bits.gsense_alr, content.bits.gadc_alr, content.bits.gtherm_alr, content.bits.gref_alr); } }
Here is the captured output
1970-01-01T00:00:05.241Z INFO Afe20408.cc::print_chip_id()::331 ID : 0x2480 1970-01-01T00:00:05.242Z INFO Afe20408Demo_main.cc::main()::395 Raw Sense 0: 20009, Raw Sense 1: 14385 1970-01-01T00:00:05.243Z INFO Afe20408Demo_main.cc::main()::396 raw adc 0: 7685, raw adc 1: 60 1970-01-01T00:00:05.245Z INFO Afe20408Demo_main.cc::main()::397 adc_mv: 24015 1970-01-01T00:00:05.246Z INFO Afe20408Demo_main.cc::main()::398 Temp mC: 25740 1970-01-01T00:00:05.247Z INFO Afe20408Demo_main.cc::main()::408 sense0_alr 0 sense1_alr 0 adc0_alr 0 adc1_alr 0 tmp_alr 0 1970-01-01T00:00:05.249Z INFO Afe20408Demo_main.cc::main()::421 vcca_alr 0 vccb_alr 0 vssa_alr 0 vssb_alr 0 thermerr_alr 0 ref_alr 0 alarmin_alr 0 1970-01-01T00:00:05.251Z INFO Afe20408Demo_main.cc::main()::441 vddl_sts 1 vssa_lowrange_sts 1 vssa_midrange_sts 1 vssa_highrange_sts 0 vcca_sts 0 vssb_lowrange_sts 1 vssb_midrange_sts 1 vssb_highrange_sts 0 vccb_sts 0 1970-01-01T00:00:05.254Z INFO Afe20408Demo_main.cc::main()::469 pdaca0_sts: 0 pdaca1_sts: 0 pdaca2_sts: 0 pdaca3_sts: 0 pdacb0_sts: 0 pdacb1_sts: 0 pdacb2_sts: 0 pdacb3_sts: 0 drven_daca0_sts: 1 drven_daca1_sts: 1 drven_daca2_sts: 1 drven_daca3_sts: 1 drven_dacb0_sts: 1 drven_dacb1_sts: 1 drven_dacb2_sts: 1 drven_dacb3_sts: 1 1970-01-01T00:00:05.260Z INFO Afe20408Demo_main.cc::main()::487 galr : 0 gtmp_alr : 0 paon_sts : 0 galarmin_alr : 0 gvcvss_alr : 0 n_adc_ready : 1 gsense_alr : 0 gadc_alr : 0 gtherm_alr : 0 gref_alr : 0