Example #1
0
void cycle5 (void) {
    if (do_cycle5 == 1) {
        // Set Halt
        set_halt_until_mbus_tx();
    
        // Copy SRAM data into Flash SRAM (bulk)
        // Source Addr: 0x00000000 ~ 0x0000000F (16 words)
        // Target Addr: 0x00000000~
        mbus_copy_mem_from_local_to_remote_bulk (FLS_ADDR, 0x00000000, 0x00000000, 15);
    
        // Put the Flash SRAM data on the bus (to NODE_A)
        set_halt_until_mbus_fwd();
        mbus_copy_mem_from_remote_to_any_bulk (FLS_ADDR, 0x00000000, NODE_A_ADDR, 0x00000000, 15);

        // Put the Flash SRAM data (very long) on the bus (to NODE_B)
        set_halt_until_mbus_tx();
        mbus_copy_mem_from_remote_to_any_bulk (FLS_ADDR, 0x00000000, NODE_B_ADDR, 0x00000000, 127);

        // Halt CPU
        set_halt_until_mbus_fwd();  // CPU will resume when an MBus FWD operation is done.
        halt_cpu();                 // Halt CPU!

        // Read FLS's REG#0x23 ~ REG#0x27 (5 Registers) 
        set_halt_until_mbus_rx();
        mbus_copy_registers_from_remote_to_local (FLS_ADDR, 0x23, 0x00, 4);

        // Put those register values on the bus (to an fake address)
        set_halt_until_mbus_tx();
        mbus_copy_registers_from_local_to_remote (0xD, 0x15, 0x00, 4);
    }
}
Example #2
0
void cycle6 (void) {
    if (do_cycle6 == 1) {
        // Set Halt
        set_halt_until_mbus_tx();

        // Copy SRAM data into Flash SRAM (stream)
        // From 0x00000000, a quarter of SRAM
        mbus_copy_mem_from_local_to_remote_stream (0, FLS_ADDR, 0x00000000, 511);
    
        // Put the Flash SRAM data on the bus (to NODE_A)
        set_halt_until_mbus_fwd();
        mbus_copy_mem_from_remote_to_any_stream (0, FLS_ADDR, 0x00000000, NODE_A_ADDR, 511);

        // Put the Flash SRAM data (very long) on the bus (to NODE_B). I will use halt_cpu() here.
        set_halt_until_mbus_tx();
        mbus_copy_mem_from_remote_to_any_stream (1, FLS_ADDR, 0x00000000, NODE_B_ADDR, 511);

        // Halt CPU
        set_halt_until_mbus_fwd();  // CPU will resume when an MBus FWD operation is done.
        halt_cpu();                 // Halt CPU!

        // Set Halt
        set_halt_until_mbus_tx();
    }
}
Example #3
0
static void send_radio_data_ppm(bool last_packet, uint32_t radio_data){
    	// Write Data: Only up to 24bit data for now
    	radv9_r3.RAD_FSM_DATA = radio_data;
   	 mbus_remote_register_write(RAD_ADDR,3,radv9_r3.as_int);

    	if (!radio_ready){
		radio_ready = 1;

		// Release FSM Reset
		radv9_r13.RAD_FSM_RESETn = 1;
		mbus_remote_register_write(RAD_ADDR,13,radv9_r13.as_int);
		delay(MBUS_DELAY);
    	} 

	#ifdef DEBUG_MBUS_MSG
		mbus_write_message32(0xBB, 0x0);
	#endif

	// Set CPU Halt Option as RX --> Use for register read e.g.
    	set_halt_until_mbus_rx();

   	// Fire off data
    	uint32_t count;
    	mbus_msg_flag = 0;
    	radv9_r13.RAD_FSM_ENABLE = 1;
    	mbus_remote_register_write(RAD_ADDR,13,radv9_r13.as_int);

    	for( count=0; count<RADIO_TIMEOUT_COUNT; count++ ){
		if( mbus_msg_flag ){
    		set_halt_until_mbus_tx();
			mbus_msg_flag = 0;
			if (last_packet){
				radio_ready = 0;
				radio_power_off();
			}else{
				radv9_r13.RAD_FSM_ENABLE = 0;
				mbus_remote_register_write(RAD_ADDR,13,radv9_r13.as_int);
			}
			return;
		}else{
			delay(MBUS_DELAY);
		}
    	}
	
    	// Timeout
    	set_halt_until_mbus_tx();
	mbus_write_message32(0xBB, 0xFAFAFAFA);
}
Example #4
0
void VIMv1_load_imem() {
    // VIMv1_CTRL power must be on and un-isolated to access IMEM

    // Release Sleep
    VIMv1_R41_CTRL_POWER.CTRL_RESET   = 0x1;
    VIMv1_R41_CTRL_POWER.CTRL_ISOLATE = 0x1;
    VIMv1_R41_CTRL_POWER.CTRL_SLEEP   = 0x0;
    mbus_remote_register_write(VIM_ADDR, 0x41, VIMv1_R41_CTRL_POWER.as_int);

    // Release Isolation
    VIMv1_R41_CTRL_POWER.CTRL_RESET   = 0x1;
    VIMv1_R41_CTRL_POWER.CTRL_ISOLATE = 0x0;
    VIMv1_R41_CTRL_POWER.CTRL_SLEEP   = 0x0;
    mbus_remote_register_write(VIM_ADDR, 0x41, VIMv1_R41_CTRL_POWER.as_int);

    // Enable LC_MEM interface in VIMv1
    VIMv1_R40_ENABLE_LC_MEM.DEBUG_CLK_SOURCE = 0x0;
    VIMv1_R40_ENABLE_LC_MEM.ENABLE_DEBUG     = 0x0;
    VIMv1_R40_ENABLE_LC_MEM.ENABLE_LC_MEM    = 0x1;
    mbus_remote_register_write(VIM_ADDR, 0x40, VIMv1_R40_ENABLE_LC_MEM.as_int);

    // Copy the instruction from Flash (Total 2kB)
    set_halt_until_mbus_fwd();
    mbus_copy_mem_from_remote_to_any_bulk (FLP_ADDR, (uint32_t *) 0x0, VIM_ADDR, (uint32_t *) 0x0, 0x1FF);
    set_halt_until_mbus_tx();

    // Disable LC_MEM interface in VIMv1
    VIMv1_R40_ENABLE_LC_MEM.DEBUG_CLK_SOURCE = 0x0;
    VIMv1_R40_ENABLE_LC_MEM.ENABLE_DEBUG     = 0x0;
    VIMv1_R40_ENABLE_LC_MEM.ENABLE_LC_MEM    = 0x0;
    mbus_remote_register_write(VIM_ADDR, 0x40, VIMv1_R40_ENABLE_LC_MEM.as_int);
}
Example #5
0
void cycle8 (void) {
    if (do_cycle8 == 1) {
        // Set Halt
        set_halt_until_mbus_tx();

        // Enable TIMER32 IRQ
        clear_all_pend_irq();
        *NVIC_ISER =  (0 /*GPIO*/ << 16)    | (0 /*SPI*/ << 15)     | (0 /*GOCEP*/ << 14)  | (0 /*MBUS_FWD*/ << 13) 
                    | (0 /*MBUS_TX*/ << 12) | (0 /*MBUS_RX*/ << 11) | (0 /*MEM_WR*/ << 10) | (0 /*REG7*/ << 9) 
                    | (0 /*REG6*/ << 8)     | (0 /*REG5*/ << 7)     | (0 /*REG4*/ << 6)    | (0 /*REG3*/ << 5) 
                    | (0 /*REG2*/ << 4)     | (0 /*REG1*/ << 3)     | (0 /*REG0*/ << 2)     
                    | (0 /*TIMER16*/ << 1)  | (1 /*TIMER32*/ << 0);

        // Timer16 with ROI (Reset-On-Interrupt)
        config_timer32(/*cmp*/ 0x2000, /*roi*/ 0x1, /*cnt*/ 0x0, /*status*/ 0x0); // Start Timer32. Trigger when it reaches 0x2000. Reset on Interrupt.

        // Wait for Interrupt
        WFI();

        // 1 IRQ: TIMER16
        if (irq_history == (1 << 0)) { 
               pass (0xB, irq_history); irq_history = 0;}
        else { fail (0xB, irq_history); }

        // Reset Timer16
        *TIMER32_GO = 0x0;
        *TIMER32_CNT = 0x0;
    }
}
Example #6
0
void cycle3 (void) {
    if (do_cycle3 == 1) {
        // Set Halt
        set_halt_until_mbus_rx();
        
        // Copy MEM 0x00000000 in FLS and store those in PRE's 0x00001400~
        mbus_copy_mem_from_remote_to_any_bulk (FLS_ADDR, 0x00000000, PRE_ADDR, (uint32_t *) 0x00001400, 0);

        // Copy MEM 0x00000000~0x0000003C in FLS and store those in PRE's 0x00001500~
        mbus_copy_mem_from_remote_to_any_bulk (FLS_ADDR, 0x00000000, PRE_ADDR, (uint32_t *) 0x00001500, 9);

        // Before streaming, set the pointer to start from.
        *REG_STR0_OFF = 0x00000510;
        *REG_STR1_OFF = 0x00000500;

        // Copy MEM 0x00000000 in FLS and store those in PRE's 0x00000F9C~
        mbus_copy_mem_from_remote_to_any_stream (1, FLS_ADDR, 0x00000000, PRE_ADDR, 0);

        if (*REG_STR1_OFF == 0x501) pass (0x4, *REG_STR1_OFF);
        else fail (0x4, *REG_STR1_OFF);

        // Copy MEM 0x00000000~0x0000003C in FLS and store those in PRE's 0x00000FA0~
        mbus_copy_mem_from_remote_to_any_stream (0, FLS_ADDR, 0x00000000, PRE_ADDR, 9);

        if (*REG_STR0_OFF == 0x51A) pass (0x5, *REG_STR0_OFF);
        else fail (0x5, *REG_STR0_OFF);

        // Configre Halt Setting; Now use HALT_UNTIL_MBUS_TX (maybe the most useful one)
        set_halt_until_mbus_tx();
    }
}
Example #7
0
int main() {

	// Wakeup timer value
	//mbus_write_message32(0xAA,*REG_WUPT_VAL);

    // Only enable relevant interrupts (PRCv17)
	//enable_reg_irq();
	//enable_all_irq();
	*NVIC_ISER = (1 << IRQ_WAKEUP) | (1 << IRQ_GOCEP) | (1 << IRQ_TIMER32) | (1 << IRQ_REG0)| (1 << IRQ_REG1)| (1 << IRQ_REG2)| (1 << IRQ_REG3);
  
    // Config watchdog timer to about 10 sec; default: 0x02FFFFFF
    config_timerwd(TIMERWD_VAL);

    // Initialization sequence
    if (enumerated != 0xDEADBEE0){
        operation_init();
		sns_wakeup_timer_test();
    }

	set_halt_until_mbus_tx();
	mbus_write_message32(0xAA,0xABCD1234);
    delay(MBUS_DELAY);


	//sns_temp_test();


	//set_wakeup_timer(WAKEUP_PERIOD_CONT, 0x1, 0x1);
	//mbus_write_message32(0xFF,*REG_WUPT_VAL);
    operation_sleep();

    while(1);
}
Example #8
0
void initialization (void) {
    // Disable MBus Watchdog Timer
    *REG_MBUS_WD = 0;

    // Global Variables
    enumerated = 0xDEADBEEF;
    cyc_num = 0;

    // Enumeration
    set_halt_until_mbus_rx();
    mbus_enumerate(FLS_ADDR);
    mbus_enumerate(PMU_ADDR);
    set_halt_until_mbus_tx();

    // PMU Optimization
    PMU_optimization();
    
    // XO Setting
    XO_initialization ();

    // Set up XOT timer
    uint32_t xot_sat_val_upper = (XOT_SAT_VAL & 0xFFFF0000) >> 16;
    uint32_t xot_sat_val_lower = XOT_SAT_VAL & 0x0000FFFF;

    *REG_XOT_CONFIGU = xot_sat_val_upper;
    *REG_XOT_CONFIG  = (0x1 << 17) | (0x1 << 16) | (xot_sat_val_lower << 0);
}
Example #9
0
static void operation_init(void){
  
	// Set CPU & Mbus Clock Speeds
    prcv13_r0B.CLK_GEN_RING = 0x1; // Default 0x1
    prcv13_r0B.CLK_GEN_DIV_MBC = 0x1; // Default 0x1
    prcv13_r0B.CLK_GEN_DIV_CORE = 0x3; // Default 0x3
	*((volatile uint32_t *) REG_CLKGEN_TUNE ) = prcv13_r0B.as_int;

    delay(MBUS_DELAY*20);
  
    //Enumerate & Initialize Registers
    Pstack_state = PSTK_IDLE; 	//0x0;
    enumerated = 0xDEADBEEF;
    exec_count = 0;
    exec_count_irq = 0;
    mbus_msg_flag = 0;
  
    // Set CPU Halt Option as RX --> Use for register read e.g.
    set_halt_until_mbus_rx();

    //Enumeration
    mbus_enumerate(RAD_ADDR);
  
    // Set CPU Halt Option as TX --> Use for register write e.g.
    set_halt_until_mbus_tx();

	// Sleep
    operation_sleep_for(2);
    operation_sleep_notimer();
}
Example #10
0
static void sns_temp_test(void){

	// Read temp result
	set_halt_until_mbus_rx();
	mbus_remote_register_read(SNS_ADDR,0x6,1);
	set_halt_until_mbus_tx();
	mbus_write_message32(0xC0,*REG1);

	// Reset the counter and temp sensor
	snsv11_r01.TSNS_RESETn = 0;
	mbus_remote_register_write(SNS_ADDR,1,snsv11_r01.as_int);

	// Set temp sensor conversion time 
	snsv11_r03.TSNS_SEL_CONV_TIME = 0x6;
	mbus_remote_register_write(SNS_ADDR,0x03,snsv11_r03.as_int);

	// Turn on SNS LDO
	// snsv11_r00
	//snsv11_r00.LDO_VREF_I_AMP	= 0;
	//snsv11_r00.LDO_SEL_TSNS	= 4;
	//snsv11_r00.LDO_SEL_CDC 	= 4;
	snsv11_r00.LDO_EN_VREF 	= 1;
	mbus_remote_register_write(SNS_ADDR,0,snsv11_r00.as_int);
	delay(MBUS_DELAY*10);

	snsv11_r00.LDO_EN_IREF 	= 1;
	snsv11_r00.LDO_EN_TSNS_OUT	= 1; // Default: 1
	mbus_remote_register_write(SNS_ADDR,0,snsv11_r00.as_int);
	delay(MBUS_DELAY*10);

	// Turn on digital block
	snsv11_r01.TSNS_SEL_LDO = 1;
	mbus_remote_register_write(SNS_ADDR,1,snsv11_r01.as_int);

	// Turn on analog block
	snsv11_r01.TSNS_EN_SENSOR_LDO = 1;
	mbus_remote_register_write(SNS_ADDR,1,snsv11_r01.as_int);
	snsv11_r01.TSNS_ISOLATE = 0;
	mbus_remote_register_write(SNS_ADDR,1,snsv11_r01.as_int);
	delay(MBUS_DELAY*10);

	// Disable all timers
	//disable_timerwd();
	//*REG_MBUS_WD = 0;

	mbus_write_message32(0xAA,0xABCD1111);

	// Start temp measurement
	snsv11_r01.TSNS_RESETn = 1;
	mbus_remote_register_write(SNS_ADDR,1,snsv11_r01.as_int);

	operation_sleep();

	WFI();

	mbus_write_message32(0xAA,0xABCD2222);

}
Example #11
0
void cycle2 (void) {
    if (do_cycle2 == 1) {
        arb_debug_reg(0x42, 0x00000000);

        //----------------------------------------------------------------------------------------------------------    
        // Copy from Flash and triggers Soft Reset
        if (!get_flag(FLAG_SOFT_RESET)) {

            set_flag(FLAG_SOFT_RESET, 1);

            *REG_SYS_CONF = 0x60;

            arb_debug_reg(0x42, 0x00000001);
            mbus_copy_mem_from_local_to_remote_bulk (FLP_ADDR, 0x0, 0x0, 15);

            set_halt_until_mbus_trx();
            arb_debug_reg(0x42, 0x00000002);
            mbus_copy_mem_from_remote_to_any_bulk (FLP_ADDR, 0x0, PRC_ADDR, (uint32_t *) 0x6C840000, 15);

            set_halt_until_mbus_tx();

            *REG_SYS_CONF = 0x70;

            set_halt_until_mbus_trx();
            arb_debug_reg(0x42, 0x00000003);
            mbus_copy_mem_from_remote_to_any_bulk (FLP_ADDR, 0x0, PRC_ADDR, (uint32_t *) 0x6C840000, 15);

            set_halt_until_mbus_tx();
        }
        //----------------------------------------------------------------------------------------------------------    
        // End of Testing
        else {
            *REG_SYS_CONF = 0x60;

            if (irq_history == (0x1 << IRQ_SOFT_RESET)) {
                   pass (0x0, irq_history); irq_history = 0; disable_all_irq(); }
            else { fail (0x0, irq_history); disable_all_irq(); }

            arb_debug_reg(0x42, 0x00000004);
        }
    }
}
static void operation_goc_trigger_init(void){

	// This is critical
	set_halt_until_mbus_tx();
	mbus_write_message32(0xAA,0xABCD1234);
	mbus_write_message32(0xAA,wakeup_data);

	// Initialize variables & registers
	sns_running = 0;
	Pstack_state = PSTK_IDLE;
	
}
Example #13
0
void cycle11 (void) {
    if (do_cycle11 == 1) {
        arb_debug_reg (0x3B, 0x00000000);
        set_halt_until_mbus_tx();

        // Watch-Dog Timer (You should see TIMERWD triggered)
        arb_debug_reg (0x3B, 0x00000001);
        config_timerwd(100);

        // Wait here until PMU resets everything
        while(1);
    }
}
Example #14
0
void cycle9 (void) {
    if (do_cycle9 == 1) {
        // Set Halt
        set_halt_until_mbus_tx();

        // Watch-Dog Timer (You should see TIMERWD triggered)
        config_timerwd(100);
        delay(200);

        // Reset Watch-Dog Timer
        config_timerwd(0x001E8480); // Default value. Approx. ~20 sec @ 100kHz
    }
}
//*******************************************************************
// USER FUNCTIONS
//*******************************************************************
void initialization (void) {

    enumerated = 0xDEADBEEF;
    cyc_num = 0;
    irq_history = 0;

    // Set Halt
    set_halt_until_mbus_rx();

    // Enumeration
    //mbus_enumerate(DLC_ADDR);

    //Set Halt
    set_halt_until_mbus_tx();
}
static void operation_goc_trigger_init(void){

	// This is critical
	set_halt_until_mbus_tx();
	mbus_write_message32(0xAA,0xABCD1234);
	mbus_write_message32(0xAA,wakeup_data);

	// Initialize variables & registers
	temp_running = 0;
	Tstack_state = TSTK_IDLE;
	
	radio_power_off();
	ldo_power_off();
	temp_power_off();
}
Example #17
0
//*******************************************************************
// USER FUNCTIONS
//*******************************************************************
void initialization (void) {

    set_flag(FLAG_ENUM, 1);
    cyc_num = 0;
    irq_history = 0;

    // Set Halt
    set_halt_until_mbus_trx();

    // Enumeration
    mbus_enumerate(FLP_ADDR);
    mbus_enumerate(VIM_ADDR);
    mbus_enumerate(PMU_ADDR);

    //Set Halt
    set_halt_until_mbus_tx();
}
Example #18
0
//*******************************************************************
// USER FUNCTIONS
//*******************************************************************
void initialization (void) {

    enumerated = 0xDEADBEEF;
    cyc_num = 0;
    irq_history = 0;

    // Set Halt
    set_halt_until_mbus_rx();

    // Enumeration
    mbus_enumerate(FLS_ADDR);
    mbus_enumerate(NODE_A_ADDR);
    mbus_enumerate(NODE_B_ADDR);
    mbus_enumerate(PMU_ADDR);

    //Set Halt
    set_halt_until_mbus_tx();
}
Example #19
0
void cycle11 (void) {
    if (do_cycle11 == 1) {
        // Set Halt
        set_halt_until_mbus_tx();

        gpio_init(0xFFFF); // All Output
        gpio_write_data(0xF0F0); // 1111 0000 1111 0000
        gpio_kill_bit(15);       // 0111 0000 1111 0000
        gpio_set_bit(1);         // 0111 0000 1111 0010
        gpio_set_2bits(11, 8);   // 0111 1001 1111 0010
        gpio_kill_bit(12);       // 0110 1001 1111 0010

        if (gpio_get_data() == 0xF2) {pass (0xC, gpio_get_data());}
        else {fail (0xC, gpio_get_data());}

        gpio_close();
    }
}
Example #20
0
//*******************************************************************
// USER FUNCTIONS
//*******************************************************************
void initialization (void) {

    set_flag(FLAG_ENUM, 1);
    cyc_num = 0;

    // Set Halt
    set_halt_until_mbus_trx();

    // Enumeration
    mbus_enumerate(FLP_ADDR);
    mbus_enumerate(NODE_A_ADDR);
    mbus_enumerate(SNS_ADDR);
    mbus_enumerate(RDC_ADDR);
    mbus_enumerate(PMU_ADDR);

    //Set Halt
    set_halt_until_mbus_tx();
}
Example #21
0
void cycle10 (void) {
    if (do_cycle10 == 1) {
        // Set Halt
        set_halt_until_mbus_tx();

        // Enable I/O Pads
        enable_io_pad();

        *SPI_SSPCR0 = 0x0287; // Motorola Mode
        *SPI_SSPCR1 = 0x2;
        *SPI_SSPCPSR = 0x02; // Clock Prescale Register
        //*SPI_SSPDMACR = 0x3; 
        *SPI_SSPDR = 0x1234;

        delay(1000);

        // Disable I/O Pads
        disable_io_pad();
    }
}
Example #22
0
int main() {
    // Initialize IRQ
    disable_all_irq();

    if (*REG_CHIP_ID != 0xBEEF) {
        set_halt_until_mbus_rx();
        mbus_enumerate(FLS_ADDR);
        set_halt_until_mbus_tx();
    }

    mbus_write_message32(0xE0, *REG0);
    delay(MBUS_DELAY);
    mbus_write_message32(0xE1, *REG1);
    delay(MBUS_DELAY);
    mbus_write_message32(0xE2, *REG2);
    delay(MBUS_DELAY);
    mbus_write_message32(0xE3, *REG3);
    delay(MBUS_DELAY);
    mbus_write_message32(0xE4, *REG4);
    delay(MBUS_DELAY);
    mbus_write_message32(0xE5, *REG5);
    delay(MBUS_DELAY);
    mbus_write_message32(0xE6, *REG6);
    delay(MBUS_DELAY);

    set_halt_until_mbus_rx();
    mbus_copy_registers_from_remote_to_local(FLS_ADDR, 0x26, 0x07, 0);
    delay(MBUS_DELAY);
    mbus_copy_registers_from_remote_to_local(FLS_ADDR, 0x27, 0x07, 0);
    delay(MBUS_DELAY);
    set_halt_until_mbus_rx();

    // Go to indefinite sleep
    mbus_sleep_all();
    while(1) {
        asm("nop;");
    }

    return 1;
}
Example #23
0
void cycle1 (void) { 
    if (do_cycle1 == 1) { 
        // Set up RDC IRQ Configuration
        RDCv2_REG_BRDC_IRQ_2.BRDC_IRQ_LENGTH_1 = 3;
        RDCv2_REG_BRDC_IRQ_2.BRDC_IRQ_PAYLOAD_ADDR = 0x20;
        mbus_remote_register_write(RDC_ADDR, 0x11, RDCv2_REG_BRDC_IRQ_2.as_int);

        // Un-isolate BRDC
        RDCv2_REG_BRDC_ISOL.BRDC_ISOLATE = 0;
        RDCv2_REG_BRDC_ISOL.BRDC_V3P6_PG_EN = 0;
        RDCv2_REG_BRDC_ISOL.BRDC_V3P6_ISOLB = 1;
        RDCv2_REG_BRDC_ISOL.BRDC_V1P2_PG_EN = 0;
        RDCv2_REG_BRDC_ISOL.BRDC_OSC_V1P2_PG_EN = 0;
        RDCv2_REG_BRDC_ISOL.BRDC_OSC_ISOLATE = 0;
        RDCv2_REG_BRDC_ISOL.BRDC_ISOLATE_DOUT = 0;
        mbus_remote_register_write(RDC_ADDR, 0x13, RDCv2_REG_BRDC_ISOL.as_int);

        // Start BRDC
        set_halt_until_mbus_trx();
        RDCv2_REG_BRDC_RST.BRDC_RSTB = 1;
        RDCv2_REG_BRDC_RST.BRDC_IB_ENB = 0;
        RDCv2_REG_BRDC_RST.BRDC_OSC_RESET = 0;
        mbus_remote_register_write(RDC_ADDR, 0x12, RDCv2_REG_BRDC_RST.as_int);

        set_halt_until_mbus_tx();

        // Isolate BRDC
        RDCv2_REG_BRDC_ISOL.BRDC_ISOLATE = 1;
        RDCv2_REG_BRDC_ISOL.BRDC_V3P6_PG_EN = 1;
        RDCv2_REG_BRDC_ISOL.BRDC_V3P6_ISOLB = 0;
        RDCv2_REG_BRDC_ISOL.BRDC_V1P2_PG_EN = 1;
        RDCv2_REG_BRDC_ISOL.BRDC_OSC_V1P2_PG_EN = 1;
        RDCv2_REG_BRDC_ISOL.BRDC_OSC_ISOLATE = 1;
        RDCv2_REG_BRDC_ISOL.BRDC_ISOLATE_DOUT = 1;
        mbus_remote_register_write(RDC_ADDR, 0x13, RDCv2_REG_BRDC_ISOL.as_int);
    } 
}
Example #24
0
void cycle7 (void) {
    if (do_cycle7 == 1) {
        // Set Halt
        set_halt_until_mbus_tx();

        // Enable TIMER16 IRQ
        clear_all_pend_irq();
        *NVIC_ISER =  (0 /*GPIO*/ << 16)    | (0 /*SPI*/ << 15)     | (0 /*GOCEP*/ << 14)  | (0 /*MBUS_FWD*/ << 13) 
                    | (0 /*MBUS_TX*/ << 12) | (0 /*MBUS_RX*/ << 11) | (0 /*MEM_WR*/ << 10) | (0 /*REG7*/ << 9) 
                    | (0 /*REG6*/ << 8)     | (0 /*REG5*/ << 7)     | (0 /*REG4*/ << 6)    | (0 /*REG3*/ << 5) 
                    | (0 /*REG2*/ << 4)     | (0 /*REG1*/ << 3)     | (0 /*REG0*/ << 2)     
                    | (1 /*TIMER16*/ << 1)  | (0 /*TIMER32*/ << 0);

        // Timer16
        config_timer16(/*cmp0*/ 0x1000, /*cmp1*/0xF000, /*irq_en*/0x3, /*cnt*/0x0, /*status*/0x0);  // Start Timer16. Trigger when it reaches 0x1000 or 0xF000.

        // Wait for Interrupt
        WFI();

        // 1 IRQ: TIMER16
        if (irq_history == (1 << 1)) { 
               pass (0x9, irq_history); irq_history = 0;}
        else { fail (0x9, irq_history); }

        // Wait for Interrupt
        WFI();

        // 1 IRQ: TIMER16
        if (irq_history == (1 << 1)) {
               pass (0xA, irq_history); irq_history = 0; disable_all_irq(); }
        else { fail (0xA, irq_history); disable_all_irq(); }

        // Reset Timer16
        *TIMER16_GO = 0x0;
        *TIMER16_CNT = 0x0;
    }
}
Example #25
0
//*******************************************************************
// USER FUNCTIONS
//*******************************************************************
static void initialization(void){
  
    //Enumeration
    enumerated = 0xDEADBEEF;

    //Chip ID
    write_regfile (REG_CHIP_ID, 0xDEAD);

    // Notify the start of the program
    mbus_write_message32(0xAA, 0xAAAAAAAA);

    //Set Halt
    set_halt_until_mbus_rx();

    //Enumeration
    mbus_enumerate(COR_ADDR);
    delay(1000);
    mbus_enumerate(AFE_ADDR);

    //Set Halt
    set_halt_until_mbus_tx();

    //Enable DSP
    afev1_rB.DSP_EN = 1;
    afev1_rB.ADC_EN = 1;
    mbus_remote_register_write(AFE_ADDR,0x0B,afev1_rB.as_int);
    
    afev1_rB.DSP_EN = 1;
    afev1_rB.ADC_EN = 1;
    mbus_remote_register_write(AFE_ADDR,0x0B,afev1_rB.as_int);
    
    //DSP Reset
    afev1_rA.DSP_RESET_N = 0;
    mbus_remote_register_write(AFE_ADDR,0x0A,afev1_rA.as_int);
    
    delay(20000);
    //Release DSP Reset
    afev1_rA.DSP_RESET_N = 1;
    mbus_remote_register_write(AFE_ADDR,0x0A,afev1_rA.as_int);
    
    //Set DSP configuation - external clk on
    afev1_rA.DSP_CONFIG = 0x16A15A;
    mbus_remote_register_write(AFE_ADDR,0x0A,afev1_rA.as_int);
    afev1_rA.DSP_CONFIG = 0x16A15A;
    mbus_remote_register_write(AFE_ADDR,0x0A,afev1_rA.as_int);
    delay(10000);
    
    //PLL Tuning
    afev1_r7.PLL_TRI_7_8_EN = 1;
    afev1_r7.PLL_TRI_CK_EN = 0; // Not working,
    afev1_r7.PLL_TRI_MODE = 0; //1:Tri state(24MHz), 0:L1 band(2.4MHz)
    afev1_r7.PLL_L1_CK_EN = 1; //0:Tri state, 1:L1 band   , Not working
    afev1_r7.PLL_CK_DIV = 0;
    afev1_r7.PLL_REFDIV_EN = 1; //Not working
    afev1_r7.PLL_VCO_TRIM = 3;  //3b,
    afev1_r7.PLL_FBDIV_EN =1;
    afev1_r7.PLL_VCO_EN =1;
    mbus_remote_register_write(AFE_ADDR,7,afev1_r7.as_int);
    delay(10000);

    afev1_r8.PLL_MISC =0x07;
    afev1_r8.PLL_PFD_EN =1;
    afev1_r8.PLL_CP_EN =1;
    afev1_r8.PLL_IREF_EN =1;
    afev1_r8.PLL_CP_IMISM_TRIM =0x7;
    afev1_r8.PLL_VCO_IBIAS_TRIM =0x7;
    afev1_r8.PLL_CP_IBIAS_TRIM =0x7;
    mbus_remote_register_write(AFE_ADDR,8,afev1_r8.as_int);
    delay(10000);

    afev1_r9.PLL_PFD_DEL_TRIM =0x00F7;
    mbus_remote_register_write(AFE_ADDR,9,afev1_r9.as_int);
    delay(10000);
    
    //Rx Tuning	
    afev1_r5.RX_GA2_b2 =  0xF; 
    afev1_r5.RX_GA2_b1 =  0xF;
    afev1_r5.RX_GA2_b0 =  0x6;	
    afev1_r5.RX_GA2_EN =  1;	// VGA Enalber, Active high
    afev1_r5.RX_BETA_b =  0x0; //BETA_b is tuning bits for DAC_ANT
    afev1_r5.RX_BETA_EN =  1;  //Enabler for BETA multiplier 
    mbus_remote_register_write(AFE_ADDR,5,afev1_r5.as_int);
    delay(10000);
   
    afev1_r6.RX_BGR_b0 =0x4;
    afev1_r6.RX_BGR_b1 =0x2;
    afev1_r6.RX_BGR_b2 =0x1; 
    afev1_r6.RX_BGR_b3 =0x0;

    mbus_remote_register_write(AFE_ADDR,6,afev1_r6.as_int);
    delay(10000);	

    afev1_r1.RX_LNA_EN =  1;
    afev1_r1.RX_LNA_b =  0x3;
    afev1_r1.RX_FLTR1_b0 =  0x0;
    afev1_r1.RX_FLTR1_b1 =  0x0;
    afev1_r1.RX_FLTR1_BYPASS =  0; //EN1 Enable at GMC, Active low
    afev1_r1.RX_GA1_EN = 0; //EN0 Enabler at GMC, Active low
    afev1_r1.RX_GA1_b = 1; //4b, Tuning bits for VR, VC
    afev1_r1.RX_FLTR2_EN = 1; //GMC BQ, Active high
    afev1_r1.RX_FLTR2_SEL = 1;  //2b, 1: band pass, 2: low pass at GMC filter
    mbus_remote_register_write(AFE_ADDR,1,afev1_r1.as_int);
    delay(10000);

	//Band pass mode
    afev1_r2.RX_FLTR2_BQ1_b3 =	0x0;
    afev1_r2.RX_FLTR2_BQ1_b2 =	0xE;
    afev1_r2.RX_FLTR2_BQ1_b1 =	0x0;
    afev1_r2.RX_FLTR2_BQ1_b0 =	0x4;

    mbus_remote_register_write(AFE_ADDR,2,afev1_r2.as_int);
    delay(10000);

    afev1_r3.RX_FLTR2_BQ2_b3 =	0x0;
    afev1_r3.RX_FLTR2_BQ2_b2 =	0xF;
    afev1_r3.RX_FLTR2_BQ2_b1 =	0x0;
    afev1_r3.RX_FLTR2_BQ2_b0 =	0xF;

    mbus_remote_register_write(AFE_ADDR,3,afev1_r3.as_int);
    delay(10000);

    afev1_r4.RX_FLTR2_BQ_b4 =	0x2; //3bit BQ cap tuning    
    afev1_r4.RX_FLTR2_BQ3_b3 =	0xF;
    afev1_r4.RX_FLTR2_BQ3_b2 =	0xF;
    afev1_r4.RX_FLTR2_BQ3_b1 =	0x0;
    afev1_r4.RX_FLTR2_BQ3_b0 =	0xF;

    mbus_remote_register_write(AFE_ADDR,4,afev1_r4.as_int);
    delay(10000);
	

    //Low pass mode
    /*
      afev1_r2.RX_FLTR2_BQ1_b3 =	0x3;
      afev1_r2.RX_FLTR2_BQ1_b2 =	0x4;
      afev1_r2.RX_FLTR2_BQ1_b1 =	0x0;
      
      afev1_r2.RX_FLTR2_BQ1_b0 =	0xF;
      
      mbus_remote_register_write(AFE_ADDR,2,afev1_r2.as_int);
      delay(10000);
      
      afev1_r3.RX_FLTR2_BQ2_b3 =	0x3;
      afev1_r3.RX_FLTR2_BQ2_b2 =	0x4;
      afev1_r3.RX_FLTR2_BQ2_b1 =	0x0;
      afev1_r3.RX_FLTR2_BQ2_b0 =	0xF;
      
      mbus_remote_register_write(AFE_ADDR,3,afev1_r3.as_int);
      delay(10000);
      
      afev1_r4.RX_FLTR2_BQ_b4 =	0x1; //3bit BQ cap tuning    
      afev1_r4.RX_FLTR2_BQ3_b3 =	0x3;
      afev1_r4.RX_FLTR2_BQ3_b2 =	0x4;
      afev1_r4.RX_FLTR2_BQ3_b1 =	0x1;
      afev1_r4.RX_FLTR2_BQ3_b0 =	0xF;
      
      mbus_remote_register_write(AFE_ADDR,4,afev1_r4.as_int);
      delay(10000);
    */
    
    //ADC test
    afev1_rB.ADC_COMP3_T2_I =	0x7;
    afev1_rB.ADC_COMP3_T1_I =	0;
    afev1_rB.ADC_COMP2_T2_I =	0x0;    
    afev1_rB.ADC_COMP2_T1_I =	0x0;

    mbus_remote_register_write(AFE_ADDR,0xB,afev1_rB.as_int);

    afev1_rC.ADC_COMP1_T2_I =	0;
    afev1_rC.ADC_COMP1_T1_I =	0x7;
    afev1_rC.ADC_COMP3_T2_Q =	0x1;    
    afev1_rC.ADC_COMP3_T1_Q =	0;

    mbus_remote_register_write(AFE_ADDR,0xC,afev1_rC.as_int);
   
    afev1_rD.ADC_COMP2_T2_Q =	0;
    afev1_rD.ADC_COMP2_T1_Q =	0;
    afev1_rD.ADC_COMP1_T2_Q =	0;    
    afev1_rD.ADC_COMP1_T1_Q =	0x1;

    mbus_remote_register_write(AFE_ADDR,0xD,afev1_rD.as_int);

    //Set DSP configuation - external clk off/Internal clk on
    afev1_rA.DSP_CONFIG = 0x16A15A;
    mbus_remote_register_write(AFE_ADDR,0xA,afev1_rA.as_int);
    afev1_rA.DSP_CONFIG = 0x16A15A;
    mbus_remote_register_write(AFE_ADDR,0xA,afev1_rA.as_int);
    delay(10000);
    
}
Example #26
0
inline static void mbus_pmu_register_read(uint32_t reg_id){
    set_halt_until_mbus_rx();
    mbus_remote_register_write(PMU_ADDR,0x00,reg_id); 
    set_halt_until_mbus_tx();
}
Example #27
0
//*******************************************************************
// USER FUNCTIONS
//*******************************************************************
inline static void mbus_pmu_register_write(uint32_t reg_id, uint32_t reg_data){
    set_halt_until_mbus_rx();
    mbus_remote_register_write(PMU_ADDR,reg_id,reg_data); 
    set_halt_until_mbus_tx();
}
Example #28
0
void cycle0 (void) {
    if (do_cycle0 == 1) {
        arb_debug_reg(0x70, 0x00000000);

        if (!get_flag(FLAG_VCO)) {
            set_flag(FLAG_VCO, 1);

            // Reset VCO_CNT_ENABLE (unnecessary, but..)
            PMUv9_REG_VCO.VCO_CNT_ENABLE    = 0x0;
            PMUv9_REG_VCO.VCO_CNT_MODE      = 0x0;
            PMUv9_REG_VCO.VCO_CNT_THRESHOLD = 0x0;
            mbus_remote_register_write(PMU_ADDR, 0x53, PMUv9_REG_VCO.as_int);

            // Reset TIMER32 (unnecessary, but..)
            *TIMER32_GO   = 0;
            *TIMER32_CMP  = 0;
	        *TIMER32_ROI  = 0;
	        *TIMER32_CNT  = 0;
	        *TIMER32_STAT = 0;
	        *TIMER32_GO   = 0x1;

            // Start Active Measurement
            arb_debug_reg(0x70, 0x10000000);
            set_halt_until_mbus_trx();
            PMUv9_REG_VCO.VCO_CNT_ENABLE    = 0x1;
            PMUv9_REG_VCO.VCO_CNT_MODE      = 0x1;
            PMUv9_REG_VCO.VCO_CNT_THRESHOLD = 1000;
            mbus_remote_register_write(PMU_ADDR, 0x53, PMUv9_REG_VCO.as_int);

            // Get TIMER32 measurement
            temp_val = *TIMER32_CNT;
            *TIMER32_GO = 0;
            set_halt_until_mbus_tx();

            arb_debug_reg(0x70, (0x20 << 24) | temp_val);

            // Reset VCO_CNT_ENABLE
            PMUv9_REG_VCO.VCO_CNT_ENABLE    = 0x0;
            PMUv9_REG_VCO.VCO_CNT_MODE      = 0x0;
            PMUv9_REG_VCO.VCO_CNT_THRESHOLD = 0x0;
            mbus_remote_register_write(PMU_ADDR, 0x53, PMUv9_REG_VCO.as_int);

            // Start Sleep Measurement
            PMUv9_REG_VCO.VCO_CNT_ENABLE    = 0x1;
            PMUv9_REG_VCO.VCO_CNT_MODE      = 0x0;
            PMUv9_REG_VCO.VCO_CNT_THRESHOLD = 0x1000;
            mbus_remote_register_write(PMU_ADDR, 0x53, PMUv9_REG_VCO.as_int);

            // Go to sleep 
            arb_debug_reg(0x70, 0x30000000);
            set_wakeup_timer(100, 0, 1);
            mbus_sleep_all();
        }
        else {
            // Reset VCO_CNT_ENABLE
            PMUv9_REG_VCO.VCO_CNT_ENABLE    = 0x0;
            PMUv9_REG_VCO.VCO_CNT_MODE      = 0x0;
            PMUv9_REG_VCO.VCO_CNT_THRESHOLD = 0x0;
            mbus_remote_register_write(PMU_ADDR, 0x53, PMUv9_REG_VCO.as_int);

            arb_debug_reg(0x70, 0x40000000);
        }
    }
}
Example #29
0
//*****************************************************************************
// Temperature, battery voltage, light intensity measurement operation (SNSv7)
//*****************************************************************************
static void operation_run(void){

    	uint32_t count; 

	if (Tstack_state == TSTK_IDLE){
		#ifdef DEBUG_MBUS_MSG 
			mbus_write_message32(0xAA, 0x0);
			delay(MBUS_DELAY*10);
		#endif
		Tstack_state = TSTK_TEMP_LDO;

		mbus_remote_register_read(HRV_ADDR,0x02,1);
		delay(MBUS_DELAY);
		read_data_lux = *((volatile uint32_t *) REG1);
		delay(MBUS_DELAY);
		snail_cnt_reset();

		temp_reset_timeout_count = 0;

		// Power on radio
		if (radio_tx_option || ((exec_count+1) < SENSING_CYCLE_INIT)){
			radio_power_on();
		}

		snsv7_r18.ADC_LDO_ADC_LDO_ENB = 0x0;
		mbus_remote_register_write(SNS_ADDR,18,snsv7_r18.as_int);

		// Put system to sleep
		set_wakeup_timer(WAKEUP_PERIOD_LDO, 0x1, 0x1);
		operation_sleep_noirqreset();

    	}else if (Tstack_state == TSTK_TEMP_LDO){
		#ifdef DEBUG_MBUS_MSG
			mbus_write_message32(0xAA, 0x1);
			delay(MBUS_DELAY*10);
		#endif
		Tstack_state = TSTK_TEMP_RSTRL;
		snsv7_r18.ADC_LDO_ADC_LDO_DLY_ENB = 0x0;
		mbus_remote_register_write(SNS_ADDR,18,snsv7_r18.as_int);

		// Put system to sleep
		set_wakeup_timer(WAKEUP_PERIOD_LDO, 0x1, 0x1);
		operation_sleep_noirqreset();

	}else if (Tstack_state == TSTK_TEMP_RSTRL){
		#ifdef DEBUG_MBUS_MSG
			mbus_write_message32(0xAA, 0x2);
			delay(MBUS_DELAY*10);
		#endif
		Tstack_state = TSTK_TEMP_START;

		// Release Temp Sensor Reset
		temp_sensor_release_reset();


	}else if (Tstack_state == TSTK_TEMP_START){
	// Start temp measurement
	#ifdef DEBUG_MBUS_MSG
		mbus_write_message32(0xAA, 0x3);
		delay(MBUS_DELAY*10);
	#endif

		mbus_msg_flag = 0;
		temp_sensor_enable();

		for(count=0; count<TEMP_TIMEOUT_COUNT; count++){
			if( mbus_msg_flag ){
				mbus_msg_flag = 0;
				temp_reset_timeout_count = 0;
				Tstack_state = TSTK_DATA_READ;
				return;
			}else{
				delay(MBUS_DELAY);
			}
		}

		// Time out
		mbus_write_message32(0xAA, 0xFAFAFAFA);
		temp_sensor_disable();

		temp_reset_timeout_count++;
		Tstack_state = TSTK_DATA_READ;


	}else if (Tstack_state == TSTK_DATA_READ){
		#ifdef DEBUG_MBUS_MSG
			mbus_write_message32(0xAA, 0x4);
			delay(MBUS_DELAY*10);
		#endif


		//***************************************************
		// Grab Data
		//***************************************************

		uint32_t read_data_temp_done; // [0] Temp Sensor Done
		uint32_t read_data_temp_data; // [23:0] Temp Sensor D Out

		// PMUv2 register read is handled differently
		mbus_remote_register_write(PMU_ADDR,0x00,0x03);
		delay(MBUS_DELAY);
		read_data_batadc = *((volatile uint32_t *) REG0) & 0xFF;
		delay(MBUS_DELAY);
		batadc_reset();
		delay(MBUS_DELAY);
		
		// Set CPU Halt Option as Rx --> Use for register read e.g.
		set_halt_until_mbus_rx();

		mbus_remote_register_read(SNS_ADDR,0x10,1);
		read_data_temp_done = *((volatile uint32_t *) REG1);
		delay(MBUS_DELAY);
		if (temp_reset_timeout_count == 0){
			mbus_remote_register_read(SNS_ADDR,0x11,1);
			read_data_temp_data = *((volatile uint32_t *) REG1);
		}else{
			read_data_temp_data = 0;
			temp_reset_timeout_count = 0;
			temp_error_count++;
		}
		delay(MBUS_DELAY);

		// Set CPU Halt Option as TX --> Use for register write e.g.
		set_halt_until_mbus_tx();
		delay(MBUS_DELAY);
		batadc_resetrelease();

		//***************************************************
		// Finalize Sensing Operation 
		//***************************************************
		temp_sensor_disable();
		temp_sensor_assert_reset();	
		temp_power_off();
		Tstack_state = TSTK_IDLE;	


	#ifdef DEBUG_MBUS_MSG
		mbus_write_message32(0xCC, exec_count);
		delay(MBUS_DELAY);
		mbus_write_message32(0xCC, read_data_temp_done);
		delay(MBUS_DELAY);
		mbus_write_message32(0xCC, read_data_temp_data);
		delay(MBUS_DELAY);
		mbus_write_message32(0xCC, read_data_lux);
		delay(MBUS_DELAY);
		mbus_write_message32(0xCC, read_data_batadc);
		delay(MBUS_DELAY);
	#endif

	#ifdef DEBUG_MBUS_MSG_1
		mbus_write_message32(0xCC, exec_count);
		delay(MBUS_DELAY);
		mbus_write_message32(0xCC, read_data_temp_done);
		delay(MBUS_DELAY);
		mbus_write_message32(0xCC, read_data_temp_data);
		delay(MBUS_DELAY);
		mbus_write_message32(0xCC, read_data_lux);
		delay(MBUS_DELAY);
		mbus_write_message32(0xCC, read_data_batadc);
		delay(MBUS_DELAY);
	#endif

		exec_count++;
		// Store results in memory; unless buffer is full
		if (data_storage_count < DATA_STORAGE_SIZE){
			data_storage[data_storage_count] = (read_data_batadc<<16) | read_data_temp_data ;

	#ifdef DEBUG_MBUS_MSG_1
		mbus_write_message32(0xDD,data_storage_count);
		delay(MBUS_DELAY);
		mbus_write_message32(0xDD,data_storage[data_storage_count]);
		delay(MBUS_DELAY);
	#endif

		data_storage_count++;
		data_storage[data_storage_count] = read_data_lux;

	#ifdef DEBUG_MBUS_MSG_1
		mbus_write_message32(0xDD,data_storage_count);
		delay(MBUS_DELAY);
		mbus_write_message32(0xDD,data_storage[data_storage_count]);
		delay(MBUS_DELAY);
	#endif

		radio_tx_count = data_storage_count;
		data_storage_count++;
		}

		// Optionally transmit the data
		if (radio_tx_option){
			send_radio_data_ppm(0, read_data_temp_done);
			delay(RADIO_PACKET_DELAY);
			send_radio_data_ppm(0, read_data_temp_data);
			delay(RADIO_PACKET_DELAY);
			send_radio_data_ppm(0, read_data_lux);
			delay(RADIO_PACKET_DELAY);
			send_radio_data_ppm(0, read_data_batadc);
		}

		// Enter long sleep
		if(exec_count < SENSING_CYCLE_INIT){
			delay(RADIO_PACKET_DELAY);
			send_radio_data_ppm(0, 0xABC000+exec_count);
			set_wakeup_timer(WAKEUP_PERIOD_CONT_INIT, 0x1, 0x1);
			if(exec_count == (SENSING_CYCLE_INIT-1)){
				delay(RADIO_PACKET_DELAY);
				send_radio_data_ppm(1, 0xFAF000);
			}

		}else{
			set_wakeup_timer(WAKEUP_PERIOD_CONT, 0x1, 0x1);
		}
		
		// Make sure Radio is off
		if (radio_on){
			radio_ready = 0;
			radio_power_off();
		}

		// Restart HRV counter 
		snail_cnt_start();

		// Discharge battery if vbat is too high
		if ((read_data_batadc != 0) && (read_data_batadc < bat_discharge_threshold)){
    			snsv7_r18.ADC_LDO_ADC_LDO_DLY_ENB = 0;
    			snsv7_r18.ADC_LDO_ADC_LDO_ENB = 0;
    			snsv7_r18.CDC_LDO_CDC_LDO_DLY_ENB = 0;
    			snsv7_r18.CDC_LDO_CDC_LDO_ENB = 0;

	#ifdef DEBUG_MBUS_MSG_1
		mbus_write_message32(0xBB, read_data_batadc);
		delay(MBUS_DELAY);
		mbus_write_message32(0xBB, bat_discharge_threshold);
		delay(MBUS_DELAY);
	#endif

		}else{ 
    			snsv7_r18.ADC_LDO_ADC_LDO_DLY_ENB = 1;
    			snsv7_r18.ADC_LDO_ADC_LDO_ENB = 1;
    			snsv7_r18.CDC_LDO_CDC_LDO_DLY_ENB = 1;
    			snsv7_r18.CDC_LDO_CDC_LDO_ENB = 1;
		}

    		mbus_remote_register_write(SNS_ADDR,18,snsv7_r18.as_int);
		delay(MBUS_DELAY);
			

		if ((set_max_exec_count != 0) && (exec_count > (50<<set_max_exec_count))){
			// No more measurement required
			// Make sure temp sensor is off
			sensor_running = 0;
			temp_power_off();
			operation_sleep_notimer();
		}else{
			operation_sleep_noirqreset();
		}

    }else{
        // default: // THIS SHOULD NOT HAPPEN
		// Reset Temp Sensor 
		temp_sensor_assert_reset();
		temp_power_off();
		operation_sleep_notimer();
    }

}
static void operation_sns_run(void){

	if (Pstack_state == PSTK_IDLE){

		wfi_timeout_flag = 0;
		meas_count = 0;

		Pstack_state = PSTK_RDC_RUN;
		RDC_ADDR = 6;

    }else if (Pstack_state == PSTK_RDC_RUN){
	// Start RDC measurement

		wfi_timeout_flag = 0;

		if (meas_count == 0){
			// Release RDC power gates / isolation
			rdc_release_v1p2_pg();
			rdc_release_pg();
			delay(MBUS_DELAY);
			rdc_release_isolate();

			// Need delay for osc to stabilize
			rdc_osc_enable();
			delay(MBUS_DELAY*2);
		}

		// Use Timer32 as timeout counter
		config_timer32(TIMER32_VAL, 1, 0, 0); // 1/10 of MBUS watchdog timer default

		// Start RDC
		rdc_enable();

		// Wait for output
		WFI();

		// Turn off Timer32
		*TIMER32_GO = 0;
		Pstack_state = PSTK_RDC_READ;

	}else if (Pstack_state == PSTK_RDC_READ){

		// Grab RDC Data
		if (wfi_timeout_flag){
			read_data_rdc = 0xFAFA;
			mbus_write_message32(0xFA, 0xFAFAFAFA);
		}else{
			// Read register
			set_halt_until_mbus_rx();
			mbus_remote_register_read(RDC_ADDR,0x20,1);
			read_data_rdc = *REG1;
			set_halt_until_mbus_tx();
		}
		rdc_data[meas_count] = read_data_rdc;
		meas_count++;

		// Option to take multiple measurements per wakeup
		if (meas_count < RDC_NUM_MEAS){	
			// Repeat measurement while awake
			rdc_disable();
			Pstack_state = PSTK_RDC_RUN;
				
		}else{
			meas_count = 0;

			// Assert RDC isolation & turn off RDC power
			rdc_disable();
			rdc_osc_disable();
			rdc_assert_pg();

			RDC_ADDR = 7;
			Pstack_state = PSTK_RDC2_RUN;

			mbus_write_message32(0xCC, exec_count);
			mbus_write_message32(0xC1, read_data_rdc);
				
		}


	}else if (Pstack_state == PSTK_RDC2_RUN){
	// Start RDC measurement

		wfi_timeout_flag = 0;

		if (meas_count == 0){
			// Release RDC power gates / isolation
			rdc_release_v1p2_pg();
			rdc_release_pg();
			delay(MBUS_DELAY);
			rdc_release_isolate();

			// Need delay for osc to stabilize
			rdc_osc_enable();
			delay(MBUS_DELAY*2);
		}

		// Use Timer32 as timeout counter
		config_timer32(TIMER32_VAL, 1, 0, 0); // 1/10 of MBUS watchdog timer default

		// Start RDC
		rdc_enable();

		// Wait for output
		WFI();

		// Turn off Timer32
		*TIMER32_GO = 0;
		Pstack_state = PSTK_RDC2_READ;

	}else if (Pstack_state == PSTK_RDC2_READ){

		// Grab RDC Data
		if (wfi_timeout_flag){
			read_data_rdc = 0xFAFA;
			mbus_write_message32(0xFA, 0xFAFAFAFA);
		}else{
			// Read register
			set_halt_until_mbus_rx();
			mbus_remote_register_read(RDC_ADDR,0x20,1);
			read_data_rdc = *REG1;
			set_halt_until_mbus_tx();
		}
		rdc_data[meas_count] = read_data_rdc;
		meas_count++;

		// Option to take multiple measurements per wakeup
		if (meas_count < RDC_NUM_MEAS){	
			// Repeat measurement while awake
			rdc_disable();
			Pstack_state = PSTK_RDC2_RUN;
				
		}else{
			meas_count = 0;

			// Assert RDC isolation & turn off RDC power
			rdc_disable();
			rdc_osc_disable();
			rdc_assert_pg();

			RDC_ADDR = 8;
			Pstack_state = PSTK_RDC3_RUN;

			mbus_write_message32(0xCC, exec_count);
			mbus_write_message32(0xC2, read_data_rdc);
				
		}

}else if (Pstack_state == PSTK_RDC3_RUN){
	// Start RDC measurement

		wfi_timeout_flag = 0;

		if (meas_count == 0){
			// Release RDC power gates / isolation
			rdc_release_v1p2_pg();
			rdc_release_pg();
			delay(MBUS_DELAY);
			rdc_release_isolate();

			// Need delay for osc to stabilize
			rdc_osc_enable();
			delay(MBUS_DELAY*2);
		}

		// Use Timer32 as timeout counter
		config_timer32(TIMER32_VAL, 1, 0, 0); // 1/10 of MBUS watchdog timer default

		// Start RDC
		rdc_enable();

		// Wait for output
		WFI();

		// Turn off Timer32
		*TIMER32_GO = 0;
		Pstack_state = PSTK_RDC3_READ;

	}else if (Pstack_state == PSTK_RDC3_READ){

		// Grab RDC Data
		if (wfi_timeout_flag){
			read_data_rdc = 0xFAFA;
			mbus_write_message32(0xFA, 0xFAFAFAFA);
		}else{
			// Read register
			set_halt_until_mbus_rx();
			mbus_remote_register_read(RDC_ADDR,0x20,1);
			read_data_rdc = *REG1;
			set_halt_until_mbus_tx();
		}
		rdc_data[meas_count] = read_data_rdc;
		meas_count++;

		// Option to take multiple measurements per wakeup
		if (meas_count < RDC_NUM_MEAS){	
			// Repeat measurement while awake
			rdc_disable();
			Pstack_state = PSTK_RDC3_RUN;
				
		}else{
			meas_count = 0;

			// Assert RDC isolation & turn off RDC power
			rdc_disable();
			rdc_osc_disable();
			rdc_assert_pg();

			RDC_ADDR = 9;
			Pstack_state = PSTK_RDC4_RUN;

			mbus_write_message32(0xCC, exec_count);
			mbus_write_message32(0xC3, read_data_rdc);
				
		}

	}else if (Pstack_state == PSTK_RDC4_RUN){
	// Start RDC measurement

		wfi_timeout_flag = 0;

		if (meas_count == 0){
			// Release RDC power gates / isolation
			rdc_release_v1p2_pg();
			rdc_release_pg();
			delay(MBUS_DELAY);
			rdc_release_isolate();

			// Need delay for osc to stabilize
			rdc_osc_enable();
			delay(MBUS_DELAY*2);
		}

		// Use Timer32 as timeout counter
		config_timer32(TIMER32_VAL, 1, 0, 0); // 1/10 of MBUS watchdog timer default

		// Start RDC
		rdc_enable();

		// Wait for output
		WFI();

		// Turn off Timer32
		*TIMER32_GO = 0;
		Pstack_state = PSTK_RDC4_READ;

	}else if (Pstack_state == PSTK_RDC4_READ){

		// Grab RDC Data
		if (wfi_timeout_flag){
			read_data_rdc = 0xFAFA;
			mbus_write_message32(0xFA, 0xFAFAFAFA);
		}else{
			// Read register
			set_halt_until_mbus_rx();
			mbus_remote_register_read(RDC_ADDR,0x20,1);
			read_data_rdc = *REG1;
			set_halt_until_mbus_tx();
		}
		rdc_data[meas_count] = read_data_rdc;
		meas_count++;

		// Option to take multiple measurements per wakeup
		if (meas_count < RDC_NUM_MEAS){	
			// Repeat measurement while awake
			rdc_disable();
			Pstack_state = PSTK_RDC4_RUN;
				
		}else{
			meas_count = 0;

			// Assert RDC isolation & turn off RDC power
			rdc_disable();
			rdc_osc_disable();
			rdc_assert_pg();
			Pstack_state = PSTK_IDLE;

			mbus_write_message32(0xC4, read_data_rdc);
				
			exec_count++;


			// Enter long sleep
			set_wakeup_timer(WAKEUP_PERIOD_CONT, 0x1, 0x1);
			operation_sleep();

		}

    }else{
        //default:  // THIS SHOULD NOT HAPPEN
		// Reset RDC 
		rdc_assert_pg();
		rdc_disable();
		rdc_osc_disable();
		operation_sleep_notimer();
    }

}