/******************************************************************************* TEST medi50 Dec 23 //=========power_control.c==================== ******************************************************************************/ #include #include #include #include #include "main.h" #include "power_control.h" #include "nrf_delay.h" #include "measurements.h" #include "meas_pd_voltage_simple.h" //#include "inv_imu_driver.h" //#include "app_raw_main.h" #include "mcp4725_i2c.h" #include "ada2200_spi.h" #include "ad5272_i2c.h" #include "nrf_log.h" #include "app_timer.h" #include "debug_print.h" #include "cat_interface.h" #include "i2c_manager.h" #define IR_POWER_HOLD NRF_GPIO_PIN_MAP(0, 11) //#define RCV_POWER_HOLD NRF_GPIO_PIN_MAP(1, 9) #define EEP_WP NRF_GPIO_PIN_MAP(0, 24) APP_TIMER_DEF(m_power_timer_id); //#define POWER_LOOP_INTERVAL 30 // 2025-12-08 change to #define POWER_LOOP_INTERVAL 30 -> 20 #define POWER_LOOP_INTERVAL 20 static uint8_t p_order; extern uint8_t simple_samples_in_buffer; extern volatile bool processing; bool lock_check = false; void power_gpio_init(void) { nrf_gpio_cfg_output(IR_POWER_HOLD); //nrf_gpio_cfg_output(RCV_POWER_HOLD); nrf_gpio_cfg_output(EEP_WP); } void ir_power_control(on_off_cont_t ir_power_st) { if(ir_power_st == OFF) { nrf_gpio_pin_clear(IR_POWER_HOLD); }else if(ir_power_st == ON){ nrf_gpio_pin_set(IR_POWER_HOLD); } } void eeprom_control(on_off_cont_t eeprom_st) { if(eeprom_st == OFF) { nrf_gpio_pin_clear(EEP_WP); }else if(eeprom_st == ON){ nrf_gpio_pin_set(EEP_WP); } } //void rcv_power_control(on_off_cont_t rcv_power_st) //{ // if(rcv_power_st == OFF) { // nrf_gpio_pin_clear(RCV_POWER_HOLD); // }else if(rcv_power_st == ON){ // nrf_gpio_pin_set(RCV_POWER_HOLD); // } //} int device_sleep_mode(void){ int rc = 0; eeprom_control(OFF); mcp4725_PowerDownMode(); nrf_delay_ms(2); ada2200_stop(); nrf_delay_ms(2); // ada2200_uninit(); nrf_delay_ms(2); nrf_delay_ms(2); // ad5272_i2c_uninit(); nrf_delay_ms(2); // rcv_power_control(OFF); nrf_delay_ms(2); ir_power_control(OFF); nrf_delay_ms(2); DBG_PRINTF("Device_Sleep_Mode OK!\r\n"); if(rc == 0) { // DBG_PRINTF("Device_Sleep_Mode OK!\r\n"); } else { DBG_PRINTF("ERR!!! Device_Sleep_Mode Failed!\r\n"); } nrf_delay_ms(10); processing = false; return rc; } int device_activated(void){ int rc = 0; p_order = 0; lock_check =true; power_timer_start(); eeprom_control(OFF); // nrf_delay_ms(1); // ir_power_control(ON); // nrf_delay_ms(1); // rcv_power_control(ON); // // nrf_delay_ms(5); //// ada2200_start(); // nrf_delay_ms(100); // ada2200_init(); // nrf_delay_ms(50); // mcp4725_init(); // nrf_delay_ms(50); // ad5272_i2c_init(); // nrf_delay_ms(50); // mcp4725_powerOnWakeUp(); // // nrf_delay_ms(10); // // // ad5272_normal_mode(); // nrf_delay_ms(50); // ada2200_start(); // if( rc == 0) { // DBG_PRINTF("Device_Activate_Mode OK!\r\n"); // } else { // DBG_PRINTF("ERR!!! Device_Activated Failed!\r\n"); // } // nrf_delay_ms(1000); return rc; } /** * @brief Power-up sequence state machine * * Executes hardware initialization in 9 steps (case 0-8) * Called by app_timer at POWER_LOOP_INTERVAL (20ms) * * Sequence: * 0: LED off, IR power on * 1: (reserved) * 2: I2C init * 3: (reserved) * 4: DAC wake-up * 5: LED-PD modulation set * 6: ADA2200 lock-in amp start * 7: PD channel select * 8: Complete */ void power_loop(void *p_context) { UNUSED_PARAMETER(p_context); power_timer_stop(); #if DEBUG_MINIMAL_BOOT /* Minimal Boot: Skip sensor initialization */ DBG_PRINTF("[PWR] Minimal mode - skipping sensor init\r\n"); p_order = 8; // Jump to complete #else /* Full Boot: Execute power sequence */ switch (p_order) { /* Step 0: Power On */ case 0: LED_ALLOFF(); ir_power_control(ON); nrf_delay_ms(20); DBG_PRINTF("[PWR] Step %d: IR Power ON\r\n", p_order); break; /* Step 1: Reserved */ case 1: DBG_PRINTF("[PWR] Step %d: (reserved)\r\n", p_order); break; /* Step 2: I2C Initialize */ case 2: sw_i2c_init_once(); nrf_delay_ms(10); DBG_PRINTF("[PWR] Step %d: I2C Init\r\n", p_order); break; /* Step 3: Reserved */ case 3: DBG_PRINTF("[PWR] Step %d: (reserved)\r\n", p_order); break; /* Step 4: DAC Wake-up */ case 4: nrf_delay_ms(10); mcp4725_powerOnWakeUp(); nrf_delay_ms(20); DBG_PRINTF("[PWR] Step %d: MCP4725 Wake-up\r\n", p_order); break; /* Step 5: LED-PD Modulation Set */ case 5: led_pd_mod_set(1000); nrf_delay_ms(10); led_pd_mod_set(1000); nrf_delay_ms(10); DBG_PRINTF("[PWR] Step %d: LED-PD Mod Set (1000)\r\n", p_order); break; /* Step 6: ADA2200 Lock-in Amplifier Start */ case 6: ada2200_start(); nrf_delay_ms(100); DBG_PRINTF("[PWR] Step %d: ADA2200 Start\r\n", p_order); break; /* Step 7: PD Channel Select */ case 7: if (NRF_SUCCESS == pd_on(2)) { DBG_PRINTF("[PWR] Step %d: PD Channel ON\r\n", p_order); } break; /* Step 8: Complete */ case 8: DBG_PRINTF("[PWR] Step %d: Sequence Complete\r\n", p_order); break; default: break; } #endif /* Advance to next step or finish */ if (p_order < 8) { p_order++; power_timer_start(); } else { DBG_PRINTF("[PWR] Device Activated OK!\r\n"); } } int device_reactivated(void){ int rc = 0; sw_i2c_init_once(); mcp4725_PowerDownMode(); DBG_PRINTF("LOCKIN!!\r\n"); nrf_delay_ms(10); ada2200_stop(); nrf_delay_ms(10); ir_power_control(OFF); nrf_delay_ms(10); lock_check = true; p_order = 0; power_timer_start(); return rc; } void power_timer_start(void) { APP_ERROR_CHECK(app_timer_start(m_power_timer_id, APP_TIMER_TICKS(POWER_LOOP_INTERVAL), NULL)); } void power_timer_stop(void) { APP_ERROR_CHECK(app_timer_stop(m_power_timer_id)); } void power_timer_init(void) //active start { APP_ERROR_CHECK(app_timer_create(&m_power_timer_id, APP_TIMER_MODE_SINGLE_SHOT, power_loop)); // 2025-12-08 change to APP_TIMER_MODE_REPEATED mode //APP_ERROR_CHECK(app_timer_create(&m_power_timer_id, APP_TIMER_MODE_REPEATED, power_loop)); }