Hi,
We are using ADPD4101 sensor which is using I2C interface. I am unable to drive the LED which is present in ADPD4101 sensor.
I have attached my code snippet here. I am looking ahead for your suggestion on ADPD4101 sensor LED drive.
int32_t adpd410x_reg_read(nrf_drv_twi_t const *p_instance, uint16_t address, uint16_t *store_data)
{
uint32_t ret_code;
uint8_t buff[] = {0, 0, 0, 0};
buff[0] = ((address >> 8) & 0x00ff) | 0x80;
buff[1] = address & 0xff;
/* No stop bit */
ret_code = nrf_drv_twi_tx(p_instance, HRM_I2C_ADDRESS, buff, 2, true);
if(ret_code != NRF_SUCCESS)
return ret_code;
ret_code = nrf_drv_twi_rx(p_instance, HRM_I2C_ADDRESS, (buff + 2), 2);
if(ret_code != NRF_SUCCESS)
return ret_code;
*store_data = ((uint16_t)buff[2] << 8) & 0xff00;
*store_data |= buff[3] & 0xff;
return NRF_SUCCESS;
}
/**
* @brief Write device register.
* @param address - Register address.
* @param data - New register value.
* @return NRF_SUCCESS in case of success, FAILURE otherwise.
*/
int32_t adpd410x_reg_write(nrf_drv_twi_t const *p_instance, uint16_t address, uint16_t data)
{
uint8_t buff[] = {0, 0, 0, 0};
buff[0] = ((address >> 8) & 0x00ff) | 0x80;
buff[1] = address & 0xff;
buff[2] = (data >> 8) & 0x00ff;
buff[3] = data & 0xff;
return nrf_drv_twi_tx(p_instance, HRM_I2C_ADDRESS, buff, 4, false);
}
/**
* @brief Do a software reset.
* @return NRF_SUCCESS in case of success, FAILURE otherwise.
*/
int32_t adpd410x_reset(nrf_drv_twi_t const *p_instance)
{
int32_t ret;
ret = adpd410x_reg_write(p_instance, ADPD410X_REG_SYS_CTL, BITM_SYS_CTL_SW_RESET);
if(ret != NRF_SUCCESS)
return ret;
}
uint16_t reg_temp_1, val_1;
void get_ADPD4_chip_ID(nrf_drv_twi_t const *p_instance, uint8_t i2c_line)
{
int32_t ret_code;
ret_code = adpd410x_reg_read(p_instance, ADPD410X_REG_CHIP_ID, ®_temp_1);
if(ret_code != NRF_SUCCESS){
NRF_LOG_INFO("HRM I2C read failure");
return;
}
val_1 = reg_temp_1 & BITM_CHIP_ID;
if((val_1) == (uint16_t)ADPD410X_CHIP_ID){
NRF_LOG_INFO("ADPD4101 CHIP-ID read success");
}
else{
NRF_LOG_INFO("ADPD4101 CHIP-ID read failure");
}
}
/**
* @brief Set operation mode.
* @return NRF_SUCCESS in case of success, FAILURE otherwise.
*/
int32_t adpd410x_set_opmode(nrf_drv_twi_t const *p_instance, uint16_t opmode)
{
return adpd410x_reg_write(p_instance, ADPD410X_REG_OPMODE, opmode);
}
/**
* @brief Set number of active time slots.
* @param timeslot_no - Last time slot to be enabled.
* @return NRF_SUCCESS in case of success, FAILURE otherwise.
*/
int32_t adpd410x_set_last_timeslot(nrf_drv_twi_t const *p_instance, enum adpd410x_timeslots timeslot_no)
{
return adpd410x_reg_write(p_instance, ADPD410X_REG_OPMODE, timeslot_no);
}
/**
* @brief Set device sampling frequency.
* @param sampling_freq - New sampling frequency.
* @return NRF_SUCCESS in case of success, FAILURE otherwise.
*/
int32_t adpd410x_set_sampling_freq(nrf_drv_twi_t const *p_instance, uint32_t sampling_freq)
{
int32_t ret;
uint32_t reg_load;
uint16_t reg_temp;
#if 1
ret = adpd410x_reg_read(p_instance, ADPD410X_REG_SYS_CTL, ®_temp);
if(ret != NRF_SUCCESS)
return ret;
if(reg_temp & BITP_SYS_CTL_LFOSC_SEL)
reg_load = ADPD410X_LOW_FREQ_OSCILLATOR_FREQ1;
else
reg_load = ADPD410X_LOW_FREQ_OSCILLATOR_FREQ2;
reg_load /= sampling_freq;
#endif
reg_load = ADPD410X_LOW_FREQ_OSCILLATOR_FREQ2;
ret = adpd410x_reg_write(p_instance, ADPD410X_REG_TS_FREQ, (reg_load & 0xFFFF));
if(ret != NRF_SUCCESS)
return ret;
}
int32_t ADPD410x_device_setup(nrf_drv_twi_t const *p_instance, enum adpd410x_timeslots m_timeslot_no, uint8_t i2c_line)
{
int32_t ret;
uint16_t data;
data = 0x4000; //Enable Channel 2
ret = adpd410x_reg_write(p_instance, ADPD410X_REG_TS_CTRL(m_timeslot_no), data); //0x0100
if(ret != NRF_SUCCESS)
return ret;
if(i2c_line == 1)
{
data = 0x1000; //IN2 connected to VC1...IN7
ret = adpd410x_reg_write(p_instance, ADPD410X_REG_INPUTS(m_timeslot_no), data); //0x0102
if(ret != NRF_SUCCESS)
return ret;
}
else
{
//m_timeslot_no = 6; //Setup inputs
data = 0x4043; //IN2 connected to VC1...IN4, IN8 connected to VC2
ret = adpd410x_reg_write(p_instance, ADPD410X_REG_INPUTS(m_timeslot_no), data); //0x01C2-G slot //0x0102
if(ret != NRF_SUCCESS)
return ret;
}
data = 0x0E0E; //21 mA output current & slot A has been selected 1A, 2A
ret = adpd410x_reg_write(p_instance, ADPD410X_REG_LED_POW12(m_timeslot_no), data); //0x0105
if(ret != NRF_SUCCESS)
return ret;
data = 0x0E0E; //21 mA output current & slot A has been selected 3A, 4A
ret = adpd410x_reg_write(p_instance, ADPD410X_REG_LED_POW34(m_timeslot_no), data); //0x0106
if(ret != NRF_SUCCESS)
return ret;
data = 0xFF0A; //Pulse width max & offset max/2
ret = adpd410x_reg_write(p_instance, ADPD410X_REG_LED_PULSE(m_timeslot_no), data); //0x0109
if(ret != NRF_SUCCESS)
return ret;
#if 0
data = 0x1E00; //21 mA output current & slot B has been selected 4B
ret = adpd410x_reg_write(p_instance, ADPD410X_REG_LED_POW34(m_timeslot_no), data); //0x0126
if(ret != NRF_SUCCESS)
return ret;
#endif
}
int32_t adpd410x_set_clock_freq(nrf_drv_twi_t const *p_instance)
{
int32_t ret;
ret = adpd410x_reg_write(p_instance, ADPD410X_REG_SYS_CTL, 0x0002); //1 Mhz low freq internal oscillator selected
if(ret != NRF_SUCCESS)
return ret;
}
void init_ADPD410x(nrf_drv_twi_t const *p_instance)
{
adpd410x_reset(p_instance); //SW reset
adpd410x_set_opmode(p_instance, BITP_OPMODE_OP_MODE); //standby mode
adpd410x_set_clock_freq(p_instance); //1 Mhz sampling freq
//adpd410x_set_sampling_freq(p_instance, SAMPLING_FREQ); //For 1MHz freq - Sampling rate will be 100Hz
adpd410x_set_last_timeslot(p_instance, ADPD410X_TS_A); //Time slot A
}
main()
{
/*Check ADPD4101 sensor */
get_ADPD4_chip_ID(&m_twi, I2C_LINE0);
get_ADPD4_chip_ID(&m_twi_1, I2C_LINE1);
ADPD410x_device_setup(&m_twi, ADPD410X_TS_A, I2C_LINE1);
nrf_delay_ms(10);
ADPD410x_device_setup(&m_twi_1, ADPD410X_TS_A, I2C_LINE0);
nrf_delay_ms(10);
adpd410x_set_opmode(&m_twi, 0x0001); // Changing from standby mode to Go mode
adpd410x_set_opmode(&m_twi_1, 0x0001); // Changing from standby mode to Go mode
}
Regards
Sudharsan
