in boards/STM32L475_Discovery/BSP/Components/vl53l0x/vl53l0x_api.c [549:726]
VL53L0X_Error VL53L0X_StaticInit(VL53L0X_DEV Dev)
{
VL53L0X_Error Status = VL53L0X_ERROR_NONE;
VL53L0X_DeviceParameters_t CurrentParameters = {0};
uint8_t *pTuningSettingBuffer;
uint16_t tempword = 0;
uint8_t tempbyte = 0;
uint8_t UseInternalTuningSettings = 0;
uint32_t count = 0;
uint8_t isApertureSpads = 0;
uint32_t refSpadCount = 0;
uint8_t ApertureSpads = 0;
uint8_t vcselPulsePeriodPCLK;
FixPoint1616_t seqTimeoutMilliSecs;
LOG_FUNCTION_START("");
Status = VL53L0X_get_info_from_device(Dev, 1);
/* set the ref spad from NVM */
count = (uint32_t)VL53L0X_GETDEVICESPECIFICPARAMETER(Dev,
ReferenceSpadCount);
ApertureSpads = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev,
ReferenceSpadType);
/* NVM value invalid */
if ((ApertureSpads > 1) ||
((ApertureSpads == 1) && (count > 32)) ||
((ApertureSpads == 0) && (count > 12)))
Status = VL53L0X_perform_ref_spad_management(Dev, &refSpadCount,
&isApertureSpads);
else
Status = VL53L0X_set_reference_spads(Dev, count, ApertureSpads);
/* Initialize tuning settings buffer to prevent compiler warning. */
pTuningSettingBuffer = DefaultTuningSettings;
if (Status == VL53L0X_ERROR_NONE) {
UseInternalTuningSettings = PALDevDataGet(Dev,
UseInternalTuningSettings);
if (UseInternalTuningSettings == 0)
pTuningSettingBuffer = PALDevDataGet(Dev,
pTuningSettingsPointer);
else
pTuningSettingBuffer = DefaultTuningSettings;
}
if (Status == VL53L0X_ERROR_NONE)
Status = VL53L0X_load_tuning_settings(Dev, pTuningSettingBuffer);
/* Set interrupt config to new sample ready */
if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_SetGpioConfig(Dev, 0, 0,
VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY,
VL53L0X_INTERRUPTPOLARITY_LOW);
}
if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_WrByte(Dev, 0xFF, 0x01);
Status |= VL53L0X_RdWord(Dev, 0x84, &tempword);
Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00);
}
if (Status == VL53L0X_ERROR_NONE) {
VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, OscFrequencyMHz,
VL53L0X_FIXPOINT412TOFIXPOINT1616(tempword));
}
/* After static init, some device parameters may be changed,
* so update them */
if (Status == VL53L0X_ERROR_NONE)
Status = VL53L0X_GetDeviceParameters(Dev, &CurrentParameters);
if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_GetFractionEnable(Dev, &tempbyte);
if (Status == VL53L0X_ERROR_NONE)
PALDevDataSet(Dev, RangeFractionalEnable, tempbyte);
}
if (Status == VL53L0X_ERROR_NONE)
PALDevDataSet(Dev, CurrentParameters, CurrentParameters);
/* read the sequence config and save it */
if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_RdByte(Dev,
VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, &tempbyte);
if (Status == VL53L0X_ERROR_NONE)
PALDevDataSet(Dev, SequenceConfig, tempbyte);
}
/* Disable MSRC and TCC by default */
if (Status == VL53L0X_ERROR_NONE)
Status = VL53L0X_SetSequenceStepEnable(Dev,
VL53L0X_SEQUENCESTEP_TCC, 0);
if (Status == VL53L0X_ERROR_NONE)
Status = VL53L0X_SetSequenceStepEnable(Dev,
VL53L0X_SEQUENCESTEP_MSRC, 0);
/* Set PAL State to standby */
if (Status == VL53L0X_ERROR_NONE)
PALDevDataSet(Dev, PalState, VL53L0X_STATE_IDLE);
/* Store pre-range vcsel period */
if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_GetVcselPulsePeriod(
Dev,
VL53L0X_VCSEL_PERIOD_PRE_RANGE,
&vcselPulsePeriodPCLK);
}
if (Status == VL53L0X_ERROR_NONE) {
VL53L0X_SETDEVICESPECIFICPARAMETER(
Dev,
PreRangeVcselPulsePeriod,
vcselPulsePeriodPCLK);
}
/* Store final-range vcsel period */
if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_GetVcselPulsePeriod(
Dev,
VL53L0X_VCSEL_PERIOD_FINAL_RANGE,
&vcselPulsePeriodPCLK);
}
if (Status == VL53L0X_ERROR_NONE) {
VL53L0X_SETDEVICESPECIFICPARAMETER(
Dev,
FinalRangeVcselPulsePeriod,
vcselPulsePeriodPCLK);
}
/* Store pre-range timeout */
if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_GetSequenceStepTimeout(
Dev,
VL53L0X_SEQUENCESTEP_PRE_RANGE,
&seqTimeoutMilliSecs);
}
if (Status == VL53L0X_ERROR_NONE) {
VL53L0X_SETDEVICESPECIFICPARAMETER(
Dev,
PreRangeTimeoutMicroSecs,
seqTimeoutMilliSecs);
}
/* Store final-range timeout */
if (Status == VL53L0X_ERROR_NONE) {
Status = VL53L0X_GetSequenceStepTimeout(
Dev,
VL53L0X_SEQUENCESTEP_FINAL_RANGE,
&seqTimeoutMilliSecs);
}
if (Status == VL53L0X_ERROR_NONE) {
VL53L0X_SETDEVICESPECIFICPARAMETER(
Dev,
FinalRangeTimeoutMicroSecs,
seqTimeoutMilliSecs);
}
LOG_FUNCTION_END(Status);
return Status;
}