/** ****************************************************************************** * @file Cloud/AWS/Src/vl53l0x_proximity.c * @author MCD Application Team * @version V1.0.1 * @date 12-April-2017 * @brief High level API for VL53L0x proximity/time-of-flight sensor. ****************************************************************************** * @attention * *

© Copyright (c) 2017 STMicroelectronics International N.V. * All rights reserved.

* * Redistribution and use in source and binary forms, with or without * modification, are permitted, provided that the following conditions are met: * * 1. Redistribution of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright notice, * this list of conditions and the following disclaimer in the documentation * and/or other materials provided with the distribution. * 3. Neither the name of STMicroelectronics nor the names of other * contributors to this software may be used to endorse or promote products * derived from this software without specific written permission. * 4. This software, including modifications and/or derivative works of this * software, must execute solely and exclusively on microcontroller or * microprocessor devices manufactured by or for STMicroelectronics. * 5. Redistribution and use of this software other than as permitted under * this license is void and will automatically terminate your rights under * this license. * * THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS, IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY INTELLECTUAL PROPERTY * RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT * SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ****************************************************************************** */ /* Includes ------------------------------------------------------------------*/ #include "stm32l4xx_hal.h" #include "stm32l475e_iot01.h" #include "vl53l0x_proximity.h" #include "vl53l0x_def.h" #include "vl53l0x_api.h" #include "vl53l0x_platform.h" /* Private typedef -----------------------------------------------------------*/ /* Private defines -----------------------------------------------------------*/ #define PROXIMITY_I2C_ADDRESS ((uint16_t)0x0052) #define VL53L0X_ID ((uint16_t)0xEEAA) #define VL53L0X_XSHUT_Pin GPIO_PIN_6 #define VL53L0X_XSHUT_GPIO_Port GPIOC /* Private macros ------------------------------------------------------------*/ /* Private variables ---------------------------------------------------------*/ extern I2C_HandleTypeDef hI2cHandler; VL53L0X_Dev_t Dev = { .I2cHandle = &hI2cHandler, .I2cDevAddr = PROXIMITY_I2C_ADDRESS }; /* Private function prototypes -----------------------------------------------*/ void SENSOR_IO_Init(void); void SetupSingleShot(VL53L0X_Dev_t Dev); /** * @brief VL53L0X proximity sensor Initialization. */ void VL53L0X_PROXIMITY_Init(void) { uint16_t vl53l0x_id = 0; VL53L0X_DeviceInfo_t VL53L0X_DeviceInfo; /* Initialize IO interface */ SENSOR_IO_Init(); VL53L0X_PROXIMITY_MspInit(); memset(&VL53L0X_DeviceInfo, 0, sizeof(VL53L0X_DeviceInfo_t)); if (VL53L0X_ERROR_NONE == VL53L0X_GetDeviceInfo(&Dev, &VL53L0X_DeviceInfo)) { if (VL53L0X_ERROR_NONE == VL53L0X_RdWord(&Dev, VL53L0X_REG_IDENTIFICATION_MODEL_ID, (uint16_t *) &vl53l0x_id)) { if (vl53l0x_id == VL53L0X_ID) { if (VL53L0X_ERROR_NONE == VL53L0X_DataInit(&Dev)) { SetupSingleShot(Dev); } } } else { printf("VL53L0X Time of Flight Failed to Initialize!\n"); } } else { printf("VL53L0X Time of Flight Failed to get infos!\n"); } } /** * @brief Get distance from VL53L0X proximity sensor. * @retval Distance in mm */ uint16_t VL53L0X_PROXIMITY_GetDistance(void) { VL53L0X_RangingMeasurementData_t RangingMeasurementData; VL53L0X_PerformSingleRangingMeasurement(&Dev, &RangingMeasurementData); return RangingMeasurementData.RangeMilliMeter; } /** * @brief VL53L0X proximity sensor Msp Initialization. */ void VL53L0X_PROXIMITY_MspInit(void) { GPIO_InitTypeDef GPIO_InitStruct; /*Configure GPIO pin : VL53L0X_XSHUT_Pin */ GPIO_InitStruct.Pin = VL53L0X_XSHUT_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_PULLUP; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; HAL_GPIO_Init(VL53L0X_XSHUT_GPIO_Port, &GPIO_InitStruct); HAL_GPIO_WritePin(VL53L0X_XSHUT_GPIO_Port, VL53L0X_XSHUT_Pin, GPIO_PIN_SET); HAL_Delay(1000); } /** * Setup all detected sensors for single shot mode and setup ranging configuration */ void SetupSingleShot(VL53L0X_Dev_t Dev) { int status; uint8_t VhvSettings; uint8_t PhaseCal; uint32_t refSpadCount; uint8_t isApertureSpads; FixPoint1616_t signalLimit = (FixPoint1616_t)(0.25*65536); FixPoint1616_t sigmaLimit = (FixPoint1616_t)(18*65536); uint32_t timingBudget = 33000; uint8_t preRangeVcselPeriod = 14; uint8_t finalRangeVcselPeriod = 10; if( Dev.Present){ status=VL53L0X_StaticInit(&Dev); if( status ){ printf("VL53L0X_StaticInit failed\n"); } status = VL53L0X_PerformRefCalibration(&Dev, &VhvSettings, &PhaseCal); if( status ){ printf("VL53L0X_PerformRefCalibration failed\n"); } status = VL53L0X_PerformRefSpadManagement(&Dev, &refSpadCount, &isApertureSpads); if( status ){ printf("VL53L0X_PerformRefSpadManagement failed\n"); } status = VL53L0X_SetDeviceMode(&Dev, VL53L0X_DEVICEMODE_SINGLE_RANGING); // Setup in single ranging mode if( status ){ printf("VL53L0X_SetDeviceMode failed\n"); } status = VL53L0X_SetLimitCheckEnable(&Dev, VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, 1); // Enable Sigma limit if( status ){ printf("VL53L0X_SetLimitCheckEnable failed\n"); } status = VL53L0X_SetLimitCheckEnable(&Dev, VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, 1); // Enable Signa limit if( status ){ printf("VL53L0X_SetLimitCheckEnable failed\n"); } /* Ranging configuration */ signalLimit = (FixPoint1616_t)(0.1*65536); sigmaLimit = (FixPoint1616_t)(60*65536); timingBudget = 33000; preRangeVcselPeriod = 18; finalRangeVcselPeriod = 14; status = VL53L0X_SetLimitCheckValue(&Dev, VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, signalLimit); if( status ){ printf("VL53L0X_SetLimitCheckValue failed\n"); } status = VL53L0X_SetLimitCheckValue(&Dev, VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, sigmaLimit); if( status ){ printf("VL53L0X_SetLimitCheckValue failed\n"); } status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(&Dev, timingBudget); if( status ){ printf("VL53L0X_SetMeasurementTimingBudgetMicroSeconds failed\n"); } status = VL53L0X_SetVcselPulsePeriod(&Dev, VL53L0X_VCSEL_PERIOD_PRE_RANGE, preRangeVcselPeriod); if( status ){ printf("VL53L0X_SetVcselPulsePeriod failed\n"); } status = VL53L0X_SetVcselPulsePeriod(&Dev, VL53L0X_VCSEL_PERIOD_FINAL_RANGE, finalRangeVcselPeriod); if( status ){ printf("VL53L0X_SetVcselPulsePeriod failed\n"); } Dev.LeakyFirst=1; } } /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/