Hi,
I developing in C code a application that communication in I2C with VL53L1X sensor. The communication work well because i receive the response 0xEACC at the request MODEL_ID.The my problem is that i don’t read the distance in mm. Can you help me ?
I post my code :
bool VL53L1X_init ( bool io_2v8 , uint8_t tmp_addr )
{
writeReg ( SOFT_RESET, 0x00 ) ;
nrf_delay_ms ( 1 ) ;
writeReg ( SOFT_RESET, 0x01 ) ;
nrf_delay_ms ( 1000 ) ;
// Setto il nuovo address
setAddress ( tmp_addr ) ;
nrf_delay_ms ( 100 ) ;
// check model ID and module type registers (values specified in datasheet)
if ( readReg16Bit ( IDENTIFICATION__MODEL_ID ) != 0xEACC )
return false ;
nrf_delay_ms ( 1 ) ;
if ( ( readReg ( FIRMWARE__SYSTEM_STATUS ) & 0x01 ) == 0 )
return false ;
if ( io_2v8 )
{
writeReg ( PAD_I2C_HV__EXTSUP_CONFIG,
readReg ( PAD_I2C_HV__EXTSUP_CONFIG ) | 0x01 ) ;
}
uint16_t fast_osc_frequency ;
// store oscillator info for later use
fast_osc_frequency = readReg16Bit ( OSC_MEASURED__FAST_OSC__FREQUENCY ) ;
// osc_calibrate_val = readReg16Bit ( RESULT__OSC_CALIBRATE_VAL ) ;
writeReg16Bit ( DSS_CONFIG__TARGET_TOTAL_RATE_MCPS, TargetRate ) ; // should already be this value after reset
writeReg ( GPIO__TIO_HV_STATUS, 0x02 ) ;
writeReg ( SIGMA_ESTIMATOR__EFFECTIVE_PULSE_WIDTH_NS, 8 ) ; // tuning parm default
writeReg ( SIGMA_ESTIMATOR__EFFECTIVE_AMBIENT_WIDTH_NS, 16 ) ; // tuning parm default
writeReg ( ALGO__CROSSTALK_COMPENSATION_VALID_HEIGHT_MM, 0x01 ) ;
writeReg ( ALGO__RANGE_IGNORE_VALID_HEIGHT_MM, 0xFF ) ;
writeReg ( ALGO__RANGE_MIN_CLIP, 0 ) ; // tuning parm default
writeReg ( ALGO__CONSISTENCY_CHECK__TOLERANCE, 2 ) ; // tuning parm default
// general config
writeReg16Bit ( SYSTEM__THRESH_RATE_HIGH, 0x0000 ) ;
writeReg16Bit ( SYSTEM__THRESH_RATE_LOW, 0x0000 ) ;
writeReg ( DSS_CONFIG__APERTURE_ATTENUATION, 0x38 ) ;
// timing config
writeReg16Bit ( RANGE_CONFIG__SIGMA_THRESH, 360 ) ; // tuning parm default
writeReg16Bit ( RANGE_CONFIG__MIN_COUNT_RATE_RTN_LIMIT_MCPS, 192 ) ; // tuning parm default
// dynamic config
writeReg ( SYSTEM__GROUPED_PARAMETER_HOLD_0, 0x01 ) ;
writeReg ( SYSTEM__GROUPED_PARAMETER_HOLD_1, 0x01 ) ;
writeReg ( SD_CONFIG__QUANTIFIER, 2 ) ;
writeReg ( SYSTEM__GROUPED_PARAMETER_HOLD, 0x00 ) ;
writeReg ( SYSTEM__SEED_CONFIG, 1 ) ; // tuning parm default
// from VL53L1_config_low_power_auto_mode
writeReg ( SYSTEM__SEQUENCE_CONFIG, 0x8B ) ; // VHV, PHASECAL, DSS1, RANGE
writeReg16Bit ( DSS_CONFIG__MANUAL_EFFECTIVE_SPADS_SELECT, 200 << 8 ) ;
writeReg ( DSS_CONFIG__ROI_MODE_CONTROL, 2 ) ; // REQUESTED_EFFFECTIVE_SPADS
// default to long range
setDistanceMode( Long ) ;
// the API triggers this change in VL53L1_init_and_start_range() once a
// measurement is started; assumes MM1 and MM2 are disabled
writeReg16Bit ( ALGO__PART_TO_PART_RANGE_OFFSET_MM ,
readReg16Bit ( MM_CONFIG__OUTER_OFFSET_MM ) * 4 ) ;
nrf_delay_ms ( 100 ) ;
startContinuous ( 100 ) ;
return true ;
}
//////////////////////////////////////////////////////////////////
void startContinuous ( uint32_t period_ms )
{
uint16_t osc_calibrate_val = readReg16Bit(RESULT__OSC_CALIBRATE_VAL);
// from VL53L1_set_inter_measurement_period_ms()
writeReg32Bit ( SYSTEM__INTERMEASUREMENT_PERIOD , period_ms * osc_calibrate_val ) ;
writeReg ( SYSTEM__INTERRUPT_CLEAR , 0x01 ) ; // sys_interrupt_clear_range
writeReg ( SYSTEM__MODE_START , 0x40 ); // mode_range__timed
}
//////////////////////////////////////////////////////////////////
void readResults ( void )
{
uint8_t buff_reg [ 2 ] = "" ;
buff_reg [ 0 ] = ( RESULT__RANGE_STATUS >> 8 ) & 0xFF ; // reg high byte
buff_reg [ 1 ] = RESULT__RANGE_STATUS & 0xFF ; // reg low byte
nrf_drv_twi_tx ( &m_twi , address , buff_reg , 2 , false ) ;
uint8_t buff_resp [ 20 ] = "" ;
nrf_drv_twi_rx ( &m_twi , address , buff_resp , 17 ) ;
range_status = buff_resp [ 0 ] ;
// buff_resp [ 1 ] // report_status: not used
stream_count = buff_resp [ 2 ] ;
dss_actual_effective_spads_sd0 = ( uint16_t ) buff_resp [ 3 ] << 8 ; // high byte
dss_actual_effective_spads_sd0 |= buff_resp [ 4 ] ; // low byte
// buff_resp [ 5 ] ; // peak_signal_count_rate_mcps_sd0: not used
// buff_resp [ 6 ] ;
ambient_count_rate_mcps_sd0 = ( uint16_t ) buff_resp [ 7 ] << 8 ; // high byte
ambient_count_rate_mcps_sd0 |= buff_resp [ 8 ] ; // low byte
// buff_resp [ 9 ] ; // sigma_sd0: not used
// buff_resp [ 10 ] ;
// buff_resp [ 11 ] ; // phase_sd0: not used
// buff_resp [ 12 ] ;
final_crosstalk_corrected_range_mm_sd0 = ( uint16_t ) buff_resp [ 13 ] << 8 ; // high byte
final_crosstalk_corrected_range_mm_sd0 |= buff_resp [ 14 ] ; // low byte
peak_signal_count_rate_crosstalk_corrected_mcps_sd0 = (uint16_t) buff_resp [ 15 ] << 8 ; // high byte
peak_signal_count_rate_crosstalk_corrected_mcps_sd0 |= buff_resp [ 16 ] ; // low byte
}
//////////////////////////////////////////////////////////////////
void main ( void )
{
VL53L1X_init ( true , 0x29 );
while( 1 )
{
readResults ( ) ;
}
}