This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AFE49I30: Not able to change PPG data rate to 50Hz

Part Number: AFE49I30
Other Parts Discussed in Thread: AFE4960

Hello,

I am using AFE49I30 with SFH7072. For PPG data collection used two RED and IR LEDs. In the attachment I shared C file to confirm is it correct configuration or not. Configured FIFO to get the reading of RED_AC, IR_AC, RED_DC, IR_DC

Configuration:

1. 128 kHz internal oscillator

2.  REG_NUMAV = 1

3. REG_DEC1_FACTOR, REG_DEC2_FACTOR, REG_DEC3_FACTOR and REG_DEC4_FACTOR set to 3 for averaging the 16 samples. (Register 0x96)

4. REG_PRPCT (Register 0x1D) = The PRF timer count value set to 0xA0 [Decimal 160]

 

If I am using configure register 0x96 to 0x004444 than I am getting 25Hz sampling rate.

As my understanding if configure register 0x96 to 0x003333 than I should get 50Hz sampling rate but in this case I getting 40Hz sampling rate. Please correct me if I am doing wrong configuration or calculation.

Thanks

PPG_Config.c
#define AFE49I30_ADDR                   (0x5B<<1)

#define AFE49I30_PAGE_SELECT			(0x01)
#define AFE49I30_TIMER_ENGINE_REG		(0x1D)
#define AFE49I30_FIFO_CONFIG_REG		(0x00)
#define AFE49I30_FIFO_SAMPLE_COUNT_REG	(0x6D)
#define AFE49I30_FIFO_DATA_REG			(0xFF)
#define AFE49I30_MAX_FIFO_SAMPLE		(128)
#define AFE49I30_PPG_FIFO_RDY_CNT		(12)


//==============================================================================
/**
 * @brief getting points from a chip
 * @param device 
 */
static void AFE49I30_ReadPPG(AFE49I30_ControlT* device)
{
	uint32_t rx_buffer = 0;
	bool ignore_rx_buff = false;
	AFE49I30_GetRegValue(&device->Driver, AFE49I30_FIFO_SAMPLE_COUNT_REG, &rx_buffer);
	device->FifoSamplesCount = ((rx_buffer & 0xff) + 1) / 4;
	if(rx_buffer > 128)
	{
		ignore_rx_buff = true;
	}

	for (uint16_t samples_count = 0; samples_count < device->FifoSamplesCount; samples_count++)
	{
		AFE49I30_PPG_ValueT value;

		AFE49I30_GetRegValue(&device->Driver, AFE49I30_FIFO_DATA_REG, &device->FifoData);
		value.RED_AC = device->FifoData;

		AFE49I30_GetRegValue(&device->Driver, AFE49I30_FIFO_DATA_REG, &device->FifoData);
		value.IR_AC = device->FifoData;

		AFE49I30_GetRegValue(&device->Driver, AFE49I30_FIFO_DATA_REG, &device->FifoData);
		value.RED_DC = device->FifoData;

		AFE49I30_GetRegValue(&device->Driver, AFE49I30_FIFO_DATA_REG, &device->FifoData);
		value.IR_DC = device->FifoData;

		AFE49I30_PutValuesToBuffer(device, (AFE49I30_ValueT*)&value, sizeof(value) / sizeof(AFE49I30_ValueT));
	}
}

/********************************************************************************
 * Function        AFE49I30_PPG_Init
 * Description     Configure AFE for PPG and Start PPG
 * Parameters      None
 * Return Value    int32_t
 * *****************************************************************************/
AFE49I30_Result AFE49I30_PPG_Init(AFE49I30_T* driver)
{
	AFE49I30_Result ret = AFE49I30_ResultAccept;
	AFE49I30_Reset(driver);

	//Set Page 0 Registers
	ret = ret | AFE49I30_SetRegValue(driver, AFE49I30_FIFO_CONFIG_REG, 0x000008);	// SW Reset
	ret = ret | AFE49I30_SetRegValue(driver, AFE49I30_PAGE_SELECT, 0x000000);		// PAGE 0
	ret = ret | AFE49I30_SetRegValue(driver, AFE49I30_FIFO_CONFIG_REG, 0x000002);	// This bit is used to suspend the count and keep the counter in a reset state.

	ret = ret | AFE49I30_SetRegValue(driver, 0x42,0x0003E0);	// REG_WM_FIFO = 0X0F, ADC_RDY = 0010 [FIFO Ready]
	ret = ret | AFE49I30_SetRegValue(driver, 0x02,0x600000);	// Polarity of LED Offset DAC - if anode of PD connects to INM and cathode of PD connects to INP, set polarity to ‘1’ to subtract offset DAC current from the PD current
	ret = ret | AFE49I30_SetRegValue(driver, 0x03,0x000000);	// Start count for INT_OUT2 (programmable interrupt on GPIO2)
	ret = ret | AFE49I30_SetRegValue(driver, 0x04,0x000000);	// End count for INT_OUT2 (programmable interrupt on GPIO2)
	ret = ret | AFE49I30_SetRegValue(driver, 0x19,0x000000);	// Register Not Available
	ret = ret | AFE49I30_SetRegValue(driver, 0x1A,0x000000);	// Register Not Available
	ret = ret | AFE49I30_SetRegValue(driver, 0x1E,0x000000);	// Register Not Available
	ret = ret | AFE49I30_SetRegValue(driver, 0x23,0x068000);	// Enables the LSB bit control of the Ambient DAC. Always set to ‘1’. // 11 – 2.5X mode: Typical full scale current of LED driver is ~125 mA, OSC_DISABLE_128K = 128kHz
	ret = ret | AFE49I30_SetRegValue(driver, 0x24,0x002000);	// Enables the LED Offset DAC corresponding to TIA1
	ret = ret | AFE49I30_SetRegValue(driver, 0x25,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x28,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x29,0x050000);	// Keep device in the ‘Always active’ state //Disables blocks getting powered down in Deep Sleep phase
	ret = ret | AFE49I30_SetRegValue(driver, 0x2A,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x2B,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x2C,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x2D,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x2E,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x2F,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x30,0x000000);	// Read out state of EN_LDO_BYP. [LDO enabled]
	ret = ret | AFE49I30_SetRegValue(driver, 0x31,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x34,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x35,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x39,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x41,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x49,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x4B,0x000000);	// ADC_RDY_OPEN_DRAIN [0 = CMOS output]
	ret = ret | AFE49I30_SetRegValue(driver, 0x4E,0xFE8000);	// Programs the polarity (as Source or Sink) for the current source connected to INM_ECG in DC lead-off detect scheme or starting value of polarity of current source connected to INM_ECG in AC lead-off detect scheme. Set to invert of POL_ILEADOFFP
																// PROG_VCOMP_LOW(111) = 0.5V , Programs the comparison voltage for the low-side comparator in DC lead-off scheme
																// PROG_VCOMP_HIGH (111) = 1.3V, Programs the comparison voltage for the high-side comparator in DC lead-off scheme
																// AC_LEADOFF_FREQ = Sets the switching frequency of input current sources in AC lead-off detect scheme, 0 = Switching frequency of current sources is PRF/4 , 1 = Switching frequency of current sources is PRF/2
	ret = ret | AFE49I30_SetRegValue(driver, 0x4F,0x010000);	// EN_LPF_ECG = Enable LPF in ECG signal chain
	ret = ret | AFE49I30_SetRegValue(driver, 0x50,0x1C0000);	// Setting NOT used bits // TODO
	ret = ret | AFE49I30_SetRegValue(driver, 0x51,0x000000);	// FIFO_OFFSET_TO_FORCE = FORCE_FIFO_OFFSET = MASK_FIFO_RDY = AUTO_MASK_FIFO_RDY
	ret = ret | AFE49I30_SetRegValue(driver, 0x57,0x000000);	// PROG_INT1_STC = Start count for INT_OUT1 (programmable interrupt on CLK pin)
	ret = ret | AFE49I30_SetRegValue(driver, 0x58,0x000000);	// PROG_INT1_ENDC = End count for INT_OUT1 (programmable interrupt on CLK pin)
	ret = ret | AFE49I30_SetRegValue(driver, 0x5D,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x5E,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x5F,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x60,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x61,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x62,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x63,0x000000);	// Read Only
	ret = ret | AFE49I30_SetRegValue(driver, 0x6C,0x000000);	// PDN_BG_IN_DEEP_SLEEP  = Powers down the Bandgap when device is in Deep Sleep phase as well as during Software power-down mode This bit should be set to ‘0’ when operating with the LDOs enabled.
	ret = ret | AFE49I30_SetRegValue(driver, 0x6D,0x000000);	// Read Only
	ret = ret | AFE49I30_SetRegValue(driver, 0x72,0x000000);	// IFS_OFFDAC_TIA2 = Full-scale current control for Ambient Offset DAC of TIA2
	ret = ret | AFE49I30_SetRegValue(driver, 0x73,0x047C3C);	// Need to Read
	ret = ret | AFE49I30_SetRegValue(driver, 0x74,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x78,0x80E005);	// Need to Read
	ret = ret | AFE49I30_SetRegValue(driver, 0x79,0x00E00E);	// Need to Read
	ret = ret | AFE49I30_SetRegValue(driver, 0x80,0x000000);	// Need to Read
	ret = ret | AFE49I30_SetRegValue(driver, 0x81,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x88,0x000007);	// REG_NUMPHASE(111) = Sets the number of active signal phases as (REG_NUMPHASE+1)
																// MODE_EN_FRAME_SYNC = Replaces MSB (D23) of each data going into the FIFO with a frame sync bit. Frame sync bit gets set to ‘1’ for the first FIFO data of every PRF cycle.
	ret = ret | AFE49I30_SetRegValue(driver, 0x8A,0x000000);	// Need to Read
	ret = ret | AFE49I30_SetRegValue(driver, 0x8B,0x000100);	// REG_TSEP_CONV_LED = Count that determines separation between end of CONV of previous phase and start of LED ON signal for the current phase when these signals are staggered (non-overlapping).
	ret = ret | AFE49I30_SetRegValue(driver, 0x8C,0x000000);	// Need to Read
	ret = ret | AFE49I30_SetRegValue(driver, 0x8D,0x000000);	// REG_TW_DATA_RDY = Count that determines width of the DATA_RDY pulse
	ret = ret | AFE49I30_SetRegValue(driver, 0x8E,0x000000);	// REG_TDEEP_SLEEP_PWDN = Count that determines DATA_RDY fall to start of Deep sleep phase
	ret = ret | AFE49I30_SetRegValue(driver, 0x8F,0x000000);	// Need to Read
	ret = ret | AFE49I30_SetRegValue(driver, 0x90,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x91,0x000000);	// Need to Read
	ret = ret | AFE49I30_SetRegValue(driver, 0x92,0x000000);	// Need to Read
	ret = ret | AFE49I30_SetRegValue(driver, 0x93,0x000000);	// Need to Read
	ret = ret | AFE49I30_SetRegValue(driver, 0x94,0x000084);	// Need to Read
	ret = ret | AFE49I30_SetRegValue(driver, 0x95,0x000050);	// Need to Read
	ret = ret | AFE49I30_SetRegValue(driver, 0x96,0x003333);	// 16 Average : REG_DEC1_FACTOR, REG_DEC2_FACTOR, REG_DEC3_FACTOR, REG_DEC4_FACTOR = 16 Number of sampled averaged
	ret = ret | AFE49I30_SetRegValue(driver, 0x97,0x8E2860);	// REG_NUMPHASE_DEC1 = 0, EN_DEC1 = 0, REG_NUMPHASE_DEC2 = 1, EN_DEC2 = 1, REG_NUMPHASE_DEC3 = 2, EN_DEC3 = 1, REG_NUMPHASE_DEC4 = 3, EN_DEC4 = 1
	ret = ret | AFE49I30_SetRegValue(driver, 0xAC,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0xAE,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0xB4,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0xB5,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x98,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x99,0x2002AB);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x9A,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x9C,0x000400);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x9D,0x0002AB);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x9E,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0xA0,0x000400);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0xA1,0x0002AB);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0xA2,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0xA4,0x000400);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0xA5,0x0002AB);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0xA6,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0xE6,0x000000);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0xE7,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0xE8,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0xF5,0x000000);

	ret = ret | AFE49I30_SetRegValue(driver, AFE49I30_PAGE_SELECT, 0x000001);	// PAGE 1
	ret = ret | AFE49I30_SetRegValue(driver, 0x20,0x020000);	// IN_TIA1<2> = Connect input pin set IN2 to TIA1
	ret = ret | AFE49I30_SetRegValue(driver, 0x21,0x0074A1);	// REG_NUMAV = 2
	ret = ret | AFE49I30_SetRegValue(driver, 0x22,0x02000E);	// REG_TWLED = 14,FIFO_DATA_CTRL = 2 [Phase [N] – Phase [N-1]: Determines the data associated with the phase to be stored in the FIFO]
	ret = ret | AFE49I30_SetRegValue(driver, 0x23,0x0017B0);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x24,0x000000);

	ret = ret | AFE49I30_SetRegValue(driver, 0x25,0x020202);	// IN_TIA1<2> = Connect input pin set IN2 to TIA1, LED_DRV1_TX<2> = Connect LED driver 1 to TX2 pin,LED_DRV2_TX<2> = Connect LED driver 2 to TX2 pin
	ret = ret | AFE49I30_SetRegValue(driver, 0x26,0x0094A1);
	ret = ret | AFE49I30_SetRegValue(driver, 0x27,0x04000E);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x28,0x0014B0);
	ret = ret | AFE49I30_SetRegValue(driver, 0x29,0x800404);

	ret = ret | AFE49I30_SetRegValue(driver, 0x2A,0x020000);	// IN_TIA1<2> = Connect input pin set IN2 to TIA1
	ret = ret | AFE49I30_SetRegValue(driver, 0x2B,0x0074A1);
	ret = ret | AFE49I30_SetRegValue(driver, 0x2C,0x02000E);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x2D,0x0014B0);
	ret = ret | AFE49I30_SetRegValue(driver, 0x2E,0x000000);

	ret = ret | AFE49I30_SetRegValue(driver, 0x2F,0x020404);	// IN_TIA1<2> = Connect input pin set IN2 to TIA1, LED_DRV1_TX<3> = Connect LED driver 1 to TX3 pin, LED_DRV2_TX<3> = Connect LED driver 2 to TX3 pin
	ret = ret | AFE49I30_SetRegValue(driver, 0x30,0x0095A1);
	ret = ret | AFE49I30_SetRegValue(driver, 0x31,0x04000E);	//
	ret = ret | AFE49I30_SetRegValue(driver, 0x32,0x000020);
	ret = ret | AFE49I30_SetRegValue(driver, 0x33,0x800404);

	ret = ret | AFE49I30_SetRegValue(driver, 0x34,0x020000);	// IN_TIA1<2> = Connect input pin set IN2 to TIA1
	ret = ret | AFE49I30_SetRegValue(driver, 0x35,0x007C20);
	ret = ret | AFE49I30_SetRegValue(driver, 0x36,0x020803);
	ret = ret | AFE49I30_SetRegValue(driver, 0x37,0x0014B0);
	ret = ret | AFE49I30_SetRegValue(driver, 0x38,0x050000);

	ret = ret | AFE49I30_SetRegValue(driver, 0x39,0x020202);	// IN_TIA1<2> = Connect input pin set IN2 to TIA1, LED_DRV1_TX<2> = Connect LED driver 1 to TX2 pin,LED_DRV2_TX<2> = Connect LED driver 2 to TX2 pin
	ret = ret | AFE49I30_SetRegValue(driver, 0x3A,0x005C20);
	ret = ret | AFE49I30_SetRegValue(driver, 0x3B,0x040803);
	ret = ret | AFE49I30_SetRegValue(driver, 0x3C,0x0014B0);
	ret = ret | AFE49I30_SetRegValue(driver, 0x3D,0x050404);

	ret = ret | AFE49I30_SetRegValue(driver, 0x3E,0x020000);	// IN_TIA1<2> = Connect input pin set IN2 to TIA1
	ret = ret | AFE49I30_SetRegValue(driver, 0x3F,0x005C20);
	ret = ret | AFE49I30_SetRegValue(driver, 0x40,0x020803);
	ret = ret | AFE49I30_SetRegValue(driver, 0x41,0x0014B0);
	ret = ret | AFE49I30_SetRegValue(driver, 0x42,0x050000);

	ret = ret | AFE49I30_SetRegValue(driver, 0x43,0x020404);	// IN_TIA1<2> = Connect input pin set IN2 to TIA1, LED_DRV1_TX<3> = Connect LED driver 1 to TX3 pin, LED_DRV2_TX<3> = Connect LED driver 2 to TX3 pin
	ret = ret | AFE49I30_SetRegValue(driver, 0x44,0x005C20);
	ret = ret | AFE49I30_SetRegValue(driver, 0x45,0x040803);
	ret = ret | AFE49I30_SetRegValue(driver, 0x46,0x0014B0);
	ret = ret | AFE49I30_SetRegValue(driver, 0x47,0x050404);

	ret = ret | AFE49I30_SetRegValue(driver, 0x48,0x080000);	//// IN_TIA1<4> = Connect input pin set IN4 to TIA1
	ret = ret | AFE49I30_SetRegValue(driver, 0x49,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x4A,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x4B,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x4C,0x000000);

	ret = ret | AFE49I30_SetRegValue(driver, 0x4D,0x080000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x4E,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x4F,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x50,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x51,0x000000);

	ret = ret | AFE49I30_SetRegValue(driver, 0x52,0x080000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x53,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x54,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x55,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x56,0x000000);

	ret = ret | AFE49I30_SetRegValue(driver, 0x57,0x080000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x58,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x59,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x5A,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x5B,0x000000);

	ret = ret | AFE49I30_SetRegValue(driver, 0x5C,0x020000);	// IN_TIA1<2> = Connect input pin set IN2 to TIA1
	ret = ret | AFE49I30_SetRegValue(driver, 0x5D,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x5E,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x5F,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x60,0x000000);

	ret = ret | AFE49I30_SetRegValue(driver, 0x61,0x020000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x62,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x63,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x64,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x65,0x000000);

	ret = ret | AFE49I30_SetRegValue(driver, 0x66,0x020000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x67,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x68,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x69,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x6A,0x000000);

	ret = ret | AFE49I30_SetRegValue(driver, 0x6B,0x020000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x6C,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x6D,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x6E,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x6F,0x000000);

	ret = ret | AFE49I30_SetRegValue(driver, 0x70,0x020000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x71,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x72,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x73,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x74,0x000000);

	ret = ret | AFE49I30_SetRegValue(driver, 0x75,0x020000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x76,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x77,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x78,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x79,0x000000);

	ret = ret | AFE49I30_SetRegValue(driver, 0x7A,0x020000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x7B,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x7C,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x7D,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x7E,0x000000);

	ret = ret | AFE49I30_SetRegValue(driver, 0x7F,0x020000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x80,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x81,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x82,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x83,0x000000);

	ret = ret | AFE49I30_SetRegValue(driver, 0x84,0x020000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x85,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x86,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x87,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x88,0x000000);

	ret = ret | AFE49I30_SetRegValue(driver, 0x89,0x020000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x8A,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x8B,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x8C,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x8D,0x000000);

	ret = ret | AFE49I30_SetRegValue(driver, 0x8E,0x020000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x8F,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x90,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x91,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x92,0x000000);

	ret = ret | AFE49I30_SetRegValue(driver, 0x93,0x020000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x94,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x95,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x96,0x000000);
	ret = ret | AFE49I30_SetRegValue(driver, 0x97,0x000000);

	/* Enable FIFO */
	ret = ret | AFE49I30_SetRegValue(driver, AFE49I30_PAGE_SELECT, 0x000000);		// PAGE 0
	ret = ret | AFE49I30_SetRegValue(driver, AFE49I30_FIFO_CONFIG_REG, 0x000002);	// This bit is used to suspend the count and keep the counter in a reset state.
	ret = ret | AFE49I30_SetRegValue(driver, AFE49I30_FIFO_CONFIG_REG, 0x000040);	// FIFO Enabled
	ret = ret | AFE49I30_SetRegValue(driver, AFE49I30_TIMER_ENGINE_REG, 0xC000A0);	// REG_PRPCT = 0xA0 [Decimal 160]

	if (ret == AFE49I30_ResultAccept)
	{
		driver->Config.MeasureMode = AFE49I30_PPG_MODE;
		driver->Config.SleepMode = AFE49I30_ACTIVE_MODE;
		driver->Config.SamplingRate = AFE49I30_PPG_SAMPLE_12;
	}
	return ret;
}