Joel von Rotz / VL53L0X

Dependents:   BigBot_v1 PololuDistanceSensorTest Lidar Ares test ... more

Committer:
joelvonrotz
Date:
Tue Jul 30 13:49:02 2019 +0000
Revision:
0:11ad6aaed10a
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
joelvonrotz 0:11ad6aaed10a 1 /*******************************************************************************
joelvonrotz 0:11ad6aaed10a 2 Copyright � 2016, STMicroelectronics International N.V.
joelvonrotz 0:11ad6aaed10a 3 All rights reserved.
joelvonrotz 0:11ad6aaed10a 4
joelvonrotz 0:11ad6aaed10a 5 Redistribution and use in source and binary forms, with or without
joelvonrotz 0:11ad6aaed10a 6 modification, are permitted provided that the following conditions are met:
joelvonrotz 0:11ad6aaed10a 7 * Redistributions of source code must retain the above copyright
joelvonrotz 0:11ad6aaed10a 8 notice, this list of conditions and the following disclaimer.
joelvonrotz 0:11ad6aaed10a 9 * Redistributions in binary form must reproduce the above copyright
joelvonrotz 0:11ad6aaed10a 10 notice, this list of conditions and the following disclaimer in the
joelvonrotz 0:11ad6aaed10a 11 documentation and/or other materials provided with the distribution.
joelvonrotz 0:11ad6aaed10a 12 * Neither the name of STMicroelectronics nor the
joelvonrotz 0:11ad6aaed10a 13 names of its contributors may be used to endorse or promote products
joelvonrotz 0:11ad6aaed10a 14 derived from this software without specific prior written permission.
joelvonrotz 0:11ad6aaed10a 15
joelvonrotz 0:11ad6aaed10a 16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
joelvonrotz 0:11ad6aaed10a 17 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
joelvonrotz 0:11ad6aaed10a 18 WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
joelvonrotz 0:11ad6aaed10a 19 NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED.
joelvonrotz 0:11ad6aaed10a 20 IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY
joelvonrotz 0:11ad6aaed10a 21 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
joelvonrotz 0:11ad6aaed10a 22 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
joelvonrotz 0:11ad6aaed10a 23 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
joelvonrotz 0:11ad6aaed10a 24 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
joelvonrotz 0:11ad6aaed10a 25 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
joelvonrotz 0:11ad6aaed10a 26 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
joelvonrotz 0:11ad6aaed10a 27 ******************************************************************************/
joelvonrotz 0:11ad6aaed10a 28
joelvonrotz 0:11ad6aaed10a 29 #include "vl53l0x_api.h"
joelvonrotz 0:11ad6aaed10a 30 #include "vl53l0x_tuning.h"
joelvonrotz 0:11ad6aaed10a 31 #include "vl53l0x_interrupt_threshold_settings.h"
joelvonrotz 0:11ad6aaed10a 32 #include "vl53l0x_api_core.h"
joelvonrotz 0:11ad6aaed10a 33 #include "vl53l0x_api_calibration.h"
joelvonrotz 0:11ad6aaed10a 34 #include "vl53l0x_api_strings.h"
joelvonrotz 0:11ad6aaed10a 35
joelvonrotz 0:11ad6aaed10a 36 #ifndef __KERNEL__
joelvonrotz 0:11ad6aaed10a 37 #include <stdlib.h>
joelvonrotz 0:11ad6aaed10a 38 #endif
joelvonrotz 0:11ad6aaed10a 39
joelvonrotz 0:11ad6aaed10a 40
joelvonrotz 0:11ad6aaed10a 41 /* Group PAL General Functions */
joelvonrotz 0:11ad6aaed10a 42
joelvonrotz 0:11ad6aaed10a 43 VL53L0X_Error VL53L0X_GetVersion(VL53L0X_Version_t *pVersion)
joelvonrotz 0:11ad6aaed10a 44 {
joelvonrotz 0:11ad6aaed10a 45 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 46
joelvonrotz 0:11ad6aaed10a 47 pVersion->major = VL53L0X_IMPLEMENTATION_VER_MAJOR;
joelvonrotz 0:11ad6aaed10a 48 pVersion->minor = VL53L0X_IMPLEMENTATION_VER_MINOR;
joelvonrotz 0:11ad6aaed10a 49 pVersion->build = VL53L0X_IMPLEMENTATION_VER_SUB;
joelvonrotz 0:11ad6aaed10a 50
joelvonrotz 0:11ad6aaed10a 51 pVersion->revision = VL53L0X_IMPLEMENTATION_VER_REVISION;
joelvonrotz 0:11ad6aaed10a 52
joelvonrotz 0:11ad6aaed10a 53 return Status;
joelvonrotz 0:11ad6aaed10a 54 }
joelvonrotz 0:11ad6aaed10a 55
joelvonrotz 0:11ad6aaed10a 56 VL53L0X_Error VL53L0X_GetPalSpecVersion(VL53L0X_Version_t *pPalSpecVersion)
joelvonrotz 0:11ad6aaed10a 57 {
joelvonrotz 0:11ad6aaed10a 58 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 59
joelvonrotz 0:11ad6aaed10a 60
joelvonrotz 0:11ad6aaed10a 61 pPalSpecVersion->major = VL53L0X_SPECIFICATION_VER_MAJOR;
joelvonrotz 0:11ad6aaed10a 62 pPalSpecVersion->minor = VL53L0X_SPECIFICATION_VER_MINOR;
joelvonrotz 0:11ad6aaed10a 63 pPalSpecVersion->build = VL53L0X_SPECIFICATION_VER_SUB;
joelvonrotz 0:11ad6aaed10a 64
joelvonrotz 0:11ad6aaed10a 65 pPalSpecVersion->revision = VL53L0X_SPECIFICATION_VER_REVISION;
joelvonrotz 0:11ad6aaed10a 66
joelvonrotz 0:11ad6aaed10a 67 return Status;
joelvonrotz 0:11ad6aaed10a 68 }
joelvonrotz 0:11ad6aaed10a 69
joelvonrotz 0:11ad6aaed10a 70 VL53L0X_Error VL53L0X_GetProductRevision(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 71 uint8_t *pProductRevisionMajor, uint8_t *pProductRevisionMinor)
joelvonrotz 0:11ad6aaed10a 72 {
joelvonrotz 0:11ad6aaed10a 73 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 74 uint8_t revision_id;
joelvonrotz 0:11ad6aaed10a 75
joelvonrotz 0:11ad6aaed10a 76
joelvonrotz 0:11ad6aaed10a 77 Status = VL53L0X_RdByte(Dev, VL53L0X_REG_IDENTIFICATION_REVISION_ID,
joelvonrotz 0:11ad6aaed10a 78 &revision_id);
joelvonrotz 0:11ad6aaed10a 79 *pProductRevisionMajor = 1;
joelvonrotz 0:11ad6aaed10a 80 *pProductRevisionMinor = (revision_id & 0xF0) >> 4;
joelvonrotz 0:11ad6aaed10a 81
joelvonrotz 0:11ad6aaed10a 82 return Status;
joelvonrotz 0:11ad6aaed10a 83
joelvonrotz 0:11ad6aaed10a 84 }
joelvonrotz 0:11ad6aaed10a 85
joelvonrotz 0:11ad6aaed10a 86 VL53L0X_Error VL53L0X_GetDeviceInfo(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 87 VL53L0X_DeviceInfo_t *pVL53L0X_DeviceInfo)
joelvonrotz 0:11ad6aaed10a 88 {
joelvonrotz 0:11ad6aaed10a 89 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 90
joelvonrotz 0:11ad6aaed10a 91 Status = VL53L0X_get_device_info(Dev, pVL53L0X_DeviceInfo);
joelvonrotz 0:11ad6aaed10a 92
joelvonrotz 0:11ad6aaed10a 93 return Status;
joelvonrotz 0:11ad6aaed10a 94 }
joelvonrotz 0:11ad6aaed10a 95
joelvonrotz 0:11ad6aaed10a 96 VL53L0X_Error VL53L0X_GetDeviceErrorStatus(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 97 VL53L0X_DeviceError *pDeviceErrorStatus)
joelvonrotz 0:11ad6aaed10a 98 {
joelvonrotz 0:11ad6aaed10a 99 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 100 uint8_t RangeStatus;
joelvonrotz 0:11ad6aaed10a 101
joelvonrotz 0:11ad6aaed10a 102
joelvonrotz 0:11ad6aaed10a 103 Status = VL53L0X_RdByte(Dev, VL53L0X_REG_RESULT_RANGE_STATUS,
joelvonrotz 0:11ad6aaed10a 104 &RangeStatus);
joelvonrotz 0:11ad6aaed10a 105
joelvonrotz 0:11ad6aaed10a 106 *pDeviceErrorStatus = (VL53L0X_DeviceError)((RangeStatus & 0x78) >> 3);
joelvonrotz 0:11ad6aaed10a 107
joelvonrotz 0:11ad6aaed10a 108 return Status;
joelvonrotz 0:11ad6aaed10a 109 }
joelvonrotz 0:11ad6aaed10a 110
joelvonrotz 0:11ad6aaed10a 111
joelvonrotz 0:11ad6aaed10a 112 VL53L0X_Error VL53L0X_GetDeviceErrorString(VL53L0X_DeviceError ErrorCode,
joelvonrotz 0:11ad6aaed10a 113 char *pDeviceErrorString)
joelvonrotz 0:11ad6aaed10a 114 {
joelvonrotz 0:11ad6aaed10a 115 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 116
joelvonrotz 0:11ad6aaed10a 117
joelvonrotz 0:11ad6aaed10a 118 Status = VL53L0X_get_device_error_string(ErrorCode, pDeviceErrorString);
joelvonrotz 0:11ad6aaed10a 119
joelvonrotz 0:11ad6aaed10a 120 return Status;
joelvonrotz 0:11ad6aaed10a 121 }
joelvonrotz 0:11ad6aaed10a 122
joelvonrotz 0:11ad6aaed10a 123 VL53L0X_Error VL53L0X_GetRangeStatusString(uint8_t RangeStatus,
joelvonrotz 0:11ad6aaed10a 124 char *pRangeStatusString)
joelvonrotz 0:11ad6aaed10a 125 {
joelvonrotz 0:11ad6aaed10a 126 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 127
joelvonrotz 0:11ad6aaed10a 128 Status = VL53L0X_get_range_status_string(RangeStatus,
joelvonrotz 0:11ad6aaed10a 129 pRangeStatusString);
joelvonrotz 0:11ad6aaed10a 130
joelvonrotz 0:11ad6aaed10a 131 return Status;
joelvonrotz 0:11ad6aaed10a 132 }
joelvonrotz 0:11ad6aaed10a 133
joelvonrotz 0:11ad6aaed10a 134 VL53L0X_Error VL53L0X_GetPalErrorString(VL53L0X_Error PalErrorCode,
joelvonrotz 0:11ad6aaed10a 135 char *pPalErrorString)
joelvonrotz 0:11ad6aaed10a 136 {
joelvonrotz 0:11ad6aaed10a 137 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 138
joelvonrotz 0:11ad6aaed10a 139 Status = VL53L0X_get_pal_error_string(PalErrorCode, pPalErrorString);
joelvonrotz 0:11ad6aaed10a 140
joelvonrotz 0:11ad6aaed10a 141 return Status;
joelvonrotz 0:11ad6aaed10a 142 }
joelvonrotz 0:11ad6aaed10a 143
joelvonrotz 0:11ad6aaed10a 144 VL53L0X_Error VL53L0X_GetPalStateString(VL53L0X_State PalStateCode,
joelvonrotz 0:11ad6aaed10a 145 char *pPalStateString)
joelvonrotz 0:11ad6aaed10a 146 {
joelvonrotz 0:11ad6aaed10a 147 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 148
joelvonrotz 0:11ad6aaed10a 149 Status = VL53L0X_get_pal_state_string(PalStateCode, pPalStateString);
joelvonrotz 0:11ad6aaed10a 150
joelvonrotz 0:11ad6aaed10a 151 return Status;
joelvonrotz 0:11ad6aaed10a 152 }
joelvonrotz 0:11ad6aaed10a 153
joelvonrotz 0:11ad6aaed10a 154 VL53L0X_Error VL53L0X_GetPalState(VL53L0X_DEV Dev, VL53L0X_State *pPalState)
joelvonrotz 0:11ad6aaed10a 155 {
joelvonrotz 0:11ad6aaed10a 156 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 157
joelvonrotz 0:11ad6aaed10a 158 *pPalState = PALDevDataGet(Dev, PalState);
joelvonrotz 0:11ad6aaed10a 159
joelvonrotz 0:11ad6aaed10a 160 return Status;
joelvonrotz 0:11ad6aaed10a 161 }
joelvonrotz 0:11ad6aaed10a 162
joelvonrotz 0:11ad6aaed10a 163 VL53L0X_Error VL53L0X_SetPowerMode(VL53L0X_DEV Dev, VL53L0X_PowerModes PowerMode)
joelvonrotz 0:11ad6aaed10a 164 {
joelvonrotz 0:11ad6aaed10a 165 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 166
joelvonrotz 0:11ad6aaed10a 167 /* Only level1 of Power mode exists */
joelvonrotz 0:11ad6aaed10a 168 if ((PowerMode != VL53L0X_POWERMODE_STANDBY_LEVEL1)
joelvonrotz 0:11ad6aaed10a 169 && (PowerMode != VL53L0X_POWERMODE_IDLE_LEVEL1)) {
joelvonrotz 0:11ad6aaed10a 170 Status = VL53L0X_ERROR_MODE_NOT_SUPPORTED;
joelvonrotz 0:11ad6aaed10a 171 } else if (PowerMode == VL53L0X_POWERMODE_STANDBY_LEVEL1) {
joelvonrotz 0:11ad6aaed10a 172 /* set the standby level1 of power mode */
joelvonrotz 0:11ad6aaed10a 173 Status = VL53L0X_WrByte(Dev, 0x80, 0x00);
joelvonrotz 0:11ad6aaed10a 174 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 175 /* Set PAL State to standby */
joelvonrotz 0:11ad6aaed10a 176 PALDevDataSet(Dev, PalState, VL53L0X_STATE_STANDBY);
joelvonrotz 0:11ad6aaed10a 177 PALDevDataSet(Dev, PowerMode,
joelvonrotz 0:11ad6aaed10a 178 VL53L0X_POWERMODE_STANDBY_LEVEL1);
joelvonrotz 0:11ad6aaed10a 179 }
joelvonrotz 0:11ad6aaed10a 180
joelvonrotz 0:11ad6aaed10a 181 } else {
joelvonrotz 0:11ad6aaed10a 182 /* VL53L0X_POWERMODE_IDLE_LEVEL1 */
joelvonrotz 0:11ad6aaed10a 183 Status = VL53L0X_WrByte(Dev, 0x80, 0x00);
joelvonrotz 0:11ad6aaed10a 184 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 185 Status = VL53L0X_StaticInit(Dev);
joelvonrotz 0:11ad6aaed10a 186
joelvonrotz 0:11ad6aaed10a 187 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 188 PALDevDataSet(Dev, PowerMode,
joelvonrotz 0:11ad6aaed10a 189 VL53L0X_POWERMODE_IDLE_LEVEL1);
joelvonrotz 0:11ad6aaed10a 190
joelvonrotz 0:11ad6aaed10a 191 }
joelvonrotz 0:11ad6aaed10a 192
joelvonrotz 0:11ad6aaed10a 193 return Status;
joelvonrotz 0:11ad6aaed10a 194 }
joelvonrotz 0:11ad6aaed10a 195
joelvonrotz 0:11ad6aaed10a 196 VL53L0X_Error VL53L0X_GetPowerMode(VL53L0X_DEV Dev, VL53L0X_PowerModes *pPowerMode)
joelvonrotz 0:11ad6aaed10a 197 {
joelvonrotz 0:11ad6aaed10a 198 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 199 uint8_t Byte;
joelvonrotz 0:11ad6aaed10a 200
joelvonrotz 0:11ad6aaed10a 201 /* Only level1 of Power mode exists */
joelvonrotz 0:11ad6aaed10a 202 Status = VL53L0X_RdByte(Dev, 0x80, &Byte);
joelvonrotz 0:11ad6aaed10a 203
joelvonrotz 0:11ad6aaed10a 204 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 205 if (Byte == 1) {
joelvonrotz 0:11ad6aaed10a 206 PALDevDataSet(Dev, PowerMode,
joelvonrotz 0:11ad6aaed10a 207 VL53L0X_POWERMODE_IDLE_LEVEL1);
joelvonrotz 0:11ad6aaed10a 208 } else {
joelvonrotz 0:11ad6aaed10a 209 PALDevDataSet(Dev, PowerMode,
joelvonrotz 0:11ad6aaed10a 210 VL53L0X_POWERMODE_STANDBY_LEVEL1);
joelvonrotz 0:11ad6aaed10a 211 }
joelvonrotz 0:11ad6aaed10a 212 }
joelvonrotz 0:11ad6aaed10a 213
joelvonrotz 0:11ad6aaed10a 214 return Status;
joelvonrotz 0:11ad6aaed10a 215 }
joelvonrotz 0:11ad6aaed10a 216
joelvonrotz 0:11ad6aaed10a 217 VL53L0X_Error VL53L0X_SetOffsetCalibrationDataMicroMeter(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 218 int32_t OffsetCalibrationDataMicroMeter)
joelvonrotz 0:11ad6aaed10a 219 {
joelvonrotz 0:11ad6aaed10a 220 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 221
joelvonrotz 0:11ad6aaed10a 222 Status = VL53L0X_set_offset_calibration_data_micro_meter(Dev,
joelvonrotz 0:11ad6aaed10a 223 OffsetCalibrationDataMicroMeter);
joelvonrotz 0:11ad6aaed10a 224
joelvonrotz 0:11ad6aaed10a 225 return Status;
joelvonrotz 0:11ad6aaed10a 226 }
joelvonrotz 0:11ad6aaed10a 227
joelvonrotz 0:11ad6aaed10a 228 VL53L0X_Error VL53L0X_GetOffsetCalibrationDataMicroMeter(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 229 int32_t *pOffsetCalibrationDataMicroMeter)
joelvonrotz 0:11ad6aaed10a 230 {
joelvonrotz 0:11ad6aaed10a 231 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 232
joelvonrotz 0:11ad6aaed10a 233 Status = VL53L0X_get_offset_calibration_data_micro_meter(Dev,
joelvonrotz 0:11ad6aaed10a 234 pOffsetCalibrationDataMicroMeter);
joelvonrotz 0:11ad6aaed10a 235
joelvonrotz 0:11ad6aaed10a 236 return Status;
joelvonrotz 0:11ad6aaed10a 237 }
joelvonrotz 0:11ad6aaed10a 238
joelvonrotz 0:11ad6aaed10a 239 VL53L0X_Error VL53L0X_SetLinearityCorrectiveGain(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 240 int16_t LinearityCorrectiveGain)
joelvonrotz 0:11ad6aaed10a 241 {
joelvonrotz 0:11ad6aaed10a 242 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 243
joelvonrotz 0:11ad6aaed10a 244 if ((LinearityCorrectiveGain < 0) || (LinearityCorrectiveGain > 1000))
joelvonrotz 0:11ad6aaed10a 245 Status = VL53L0X_ERROR_INVALID_PARAMS;
joelvonrotz 0:11ad6aaed10a 246 else {
joelvonrotz 0:11ad6aaed10a 247 PALDevDataSet(Dev, LinearityCorrectiveGain,
joelvonrotz 0:11ad6aaed10a 248 LinearityCorrectiveGain);
joelvonrotz 0:11ad6aaed10a 249
joelvonrotz 0:11ad6aaed10a 250 if (LinearityCorrectiveGain != 1000) {
joelvonrotz 0:11ad6aaed10a 251 /* Disable FW Xtalk */
joelvonrotz 0:11ad6aaed10a 252 Status = VL53L0X_WrWord(Dev,
joelvonrotz 0:11ad6aaed10a 253 VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS, 0);
joelvonrotz 0:11ad6aaed10a 254 }
joelvonrotz 0:11ad6aaed10a 255 }
joelvonrotz 0:11ad6aaed10a 256
joelvonrotz 0:11ad6aaed10a 257 return Status;
joelvonrotz 0:11ad6aaed10a 258 }
joelvonrotz 0:11ad6aaed10a 259
joelvonrotz 0:11ad6aaed10a 260 VL53L0X_Error VL53L0X_GetLinearityCorrectiveGain(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 261 uint16_t *pLinearityCorrectiveGain)
joelvonrotz 0:11ad6aaed10a 262 {
joelvonrotz 0:11ad6aaed10a 263 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 264
joelvonrotz 0:11ad6aaed10a 265 *pLinearityCorrectiveGain = PALDevDataGet(Dev, LinearityCorrectiveGain);
joelvonrotz 0:11ad6aaed10a 266
joelvonrotz 0:11ad6aaed10a 267 return Status;
joelvonrotz 0:11ad6aaed10a 268 }
joelvonrotz 0:11ad6aaed10a 269
joelvonrotz 0:11ad6aaed10a 270 VL53L0X_Error VL53L0X_SetGroupParamHold(VL53L0X_DEV Dev, uint8_t GroupParamHold)
joelvonrotz 0:11ad6aaed10a 271 {
joelvonrotz 0:11ad6aaed10a 272 VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED;
joelvonrotz 0:11ad6aaed10a 273
joelvonrotz 0:11ad6aaed10a 274 /* not implemented on VL53L0X */
joelvonrotz 0:11ad6aaed10a 275
joelvonrotz 0:11ad6aaed10a 276 return Status;
joelvonrotz 0:11ad6aaed10a 277 }
joelvonrotz 0:11ad6aaed10a 278
joelvonrotz 0:11ad6aaed10a 279 VL53L0X_Error VL53L0X_GetUpperLimitMilliMeter(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 280 uint16_t *pUpperLimitMilliMeter)
joelvonrotz 0:11ad6aaed10a 281 {
joelvonrotz 0:11ad6aaed10a 282 VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED;
joelvonrotz 0:11ad6aaed10a 283
joelvonrotz 0:11ad6aaed10a 284 /* not implemented on VL53L0X */
joelvonrotz 0:11ad6aaed10a 285
joelvonrotz 0:11ad6aaed10a 286 return Status;
joelvonrotz 0:11ad6aaed10a 287 }
joelvonrotz 0:11ad6aaed10a 288
joelvonrotz 0:11ad6aaed10a 289 VL53L0X_Error VL53L0X_GetTotalSignalRate(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 290 FixPoint1616_t *pTotalSignalRate)
joelvonrotz 0:11ad6aaed10a 291 {
joelvonrotz 0:11ad6aaed10a 292 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 293 VL53L0X_RangingMeasurementData_t LastRangeDataBuffer;
joelvonrotz 0:11ad6aaed10a 294
joelvonrotz 0:11ad6aaed10a 295
joelvonrotz 0:11ad6aaed10a 296 LastRangeDataBuffer = PALDevDataGet(Dev, LastRangeMeasure);
joelvonrotz 0:11ad6aaed10a 297
joelvonrotz 0:11ad6aaed10a 298 Status = VL53L0X_get_total_signal_rate(
joelvonrotz 0:11ad6aaed10a 299 Dev, &LastRangeDataBuffer, pTotalSignalRate);
joelvonrotz 0:11ad6aaed10a 300
joelvonrotz 0:11ad6aaed10a 301 return Status;
joelvonrotz 0:11ad6aaed10a 302 }
joelvonrotz 0:11ad6aaed10a 303
joelvonrotz 0:11ad6aaed10a 304 /* End Group PAL General Functions */
joelvonrotz 0:11ad6aaed10a 305
joelvonrotz 0:11ad6aaed10a 306 /* Group PAL Init Functions */
joelvonrotz 0:11ad6aaed10a 307 VL53L0X_Error VL53L0X_SetDeviceAddress(VL53L0X_DEV Dev, uint8_t DeviceAddress)
joelvonrotz 0:11ad6aaed10a 308 {
joelvonrotz 0:11ad6aaed10a 309 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 310
joelvonrotz 0:11ad6aaed10a 311 Status = VL53L0X_WrByte(Dev, VL53L0X_REG_I2C_SLAVE_DEVICE_ADDRESS,
joelvonrotz 0:11ad6aaed10a 312 DeviceAddress / 2);
joelvonrotz 0:11ad6aaed10a 313
joelvonrotz 0:11ad6aaed10a 314 return Status;
joelvonrotz 0:11ad6aaed10a 315 }
joelvonrotz 0:11ad6aaed10a 316
joelvonrotz 0:11ad6aaed10a 317 VL53L0X_Error VL53L0X_DataInit(VL53L0X_DEV Dev)
joelvonrotz 0:11ad6aaed10a 318 {
joelvonrotz 0:11ad6aaed10a 319 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 320 VL53L0X_DeviceParameters_t CurrentParameters;
joelvonrotz 0:11ad6aaed10a 321 int i;
joelvonrotz 0:11ad6aaed10a 322 uint8_t StopVariable;
joelvonrotz 0:11ad6aaed10a 323
joelvonrotz 0:11ad6aaed10a 324
joelvonrotz 0:11ad6aaed10a 325 /* by default the I2C is running at 1V8 if you want to change it you
joelvonrotz 0:11ad6aaed10a 326 * need to include this define at compilation level. */
joelvonrotz 0:11ad6aaed10a 327 #ifdef USE_I2C_2V8
joelvonrotz 0:11ad6aaed10a 328 Status = VL53L0X_UpdateByte(Dev,
joelvonrotz 0:11ad6aaed10a 329 VL53L0X_REG_VHV_CONFIG_PAD_SCL_SDA__EXTSUP_HV,
joelvonrotz 0:11ad6aaed10a 330 0xFE,
joelvonrotz 0:11ad6aaed10a 331 0x01);
joelvonrotz 0:11ad6aaed10a 332 #endif
joelvonrotz 0:11ad6aaed10a 333
joelvonrotz 0:11ad6aaed10a 334 /* Set I2C standard mode */
joelvonrotz 0:11ad6aaed10a 335 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 336 Status = VL53L0X_WrByte(Dev, 0x88, 0x00);
joelvonrotz 0:11ad6aaed10a 337
joelvonrotz 0:11ad6aaed10a 338 VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, ReadDataFromDeviceDone, 0);
joelvonrotz 0:11ad6aaed10a 339
joelvonrotz 0:11ad6aaed10a 340 #ifdef USE_IQC_STATION
joelvonrotz 0:11ad6aaed10a 341 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 342 Status = VL53L0X_apply_offset_adjustment(Dev);
joelvonrotz 0:11ad6aaed10a 343 #endif
joelvonrotz 0:11ad6aaed10a 344
joelvonrotz 0:11ad6aaed10a 345 /* Default value is 1000 for Linearity Corrective Gain */
joelvonrotz 0:11ad6aaed10a 346 PALDevDataSet(Dev, LinearityCorrectiveGain, 1000);
joelvonrotz 0:11ad6aaed10a 347
joelvonrotz 0:11ad6aaed10a 348 /* Dmax default Parameter */
joelvonrotz 0:11ad6aaed10a 349 PALDevDataSet(Dev, DmaxCalRangeMilliMeter, 400);
joelvonrotz 0:11ad6aaed10a 350 PALDevDataSet(Dev, DmaxCalSignalRateRtnMegaCps,
joelvonrotz 0:11ad6aaed10a 351 (FixPoint1616_t)((0x00016B85))); /* 1.42 No Cover Glass*/
joelvonrotz 0:11ad6aaed10a 352
joelvonrotz 0:11ad6aaed10a 353 /* Set Default static parameters
joelvonrotz 0:11ad6aaed10a 354 *set first temporary values 9.44MHz * 65536 = 618660 */
joelvonrotz 0:11ad6aaed10a 355 VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, OscFrequencyMHz, 618660);
joelvonrotz 0:11ad6aaed10a 356
joelvonrotz 0:11ad6aaed10a 357 /* Set Default XTalkCompensationRateMegaCps to 0 */
joelvonrotz 0:11ad6aaed10a 358 VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationRateMegaCps, 0);
joelvonrotz 0:11ad6aaed10a 359
joelvonrotz 0:11ad6aaed10a 360 /* Get default parameters */
joelvonrotz 0:11ad6aaed10a 361 Status = VL53L0X_GetDeviceParameters(Dev, &CurrentParameters);
joelvonrotz 0:11ad6aaed10a 362 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 363 /* initialize PAL values */
joelvonrotz 0:11ad6aaed10a 364 CurrentParameters.DeviceMode = VL53L0X_DEVICEMODE_SINGLE_RANGING;
joelvonrotz 0:11ad6aaed10a 365 CurrentParameters.HistogramMode = VL53L0X_HISTOGRAMMODE_DISABLED;
joelvonrotz 0:11ad6aaed10a 366 PALDevDataSet(Dev, CurrentParameters, CurrentParameters);
joelvonrotz 0:11ad6aaed10a 367 }
joelvonrotz 0:11ad6aaed10a 368
joelvonrotz 0:11ad6aaed10a 369 /* Sigma estimator variable */
joelvonrotz 0:11ad6aaed10a 370 PALDevDataSet(Dev, SigmaEstRefArray, 100);
joelvonrotz 0:11ad6aaed10a 371 PALDevDataSet(Dev, SigmaEstEffPulseWidth, 900);
joelvonrotz 0:11ad6aaed10a 372 PALDevDataSet(Dev, SigmaEstEffAmbWidth, 500);
joelvonrotz 0:11ad6aaed10a 373 PALDevDataSet(Dev, targetRefRate, 0x0A00); /* 20 MCPS in 9:7 format */
joelvonrotz 0:11ad6aaed10a 374
joelvonrotz 0:11ad6aaed10a 375 /* Use internal default settings */
joelvonrotz 0:11ad6aaed10a 376 PALDevDataSet(Dev, UseInternalTuningSettings, 1);
joelvonrotz 0:11ad6aaed10a 377
joelvonrotz 0:11ad6aaed10a 378 Status |= VL53L0X_WrByte(Dev, 0x80, 0x01);
joelvonrotz 0:11ad6aaed10a 379 Status |= VL53L0X_WrByte(Dev, 0xFF, 0x01);
joelvonrotz 0:11ad6aaed10a 380 Status |= VL53L0X_WrByte(Dev, 0x00, 0x00);
joelvonrotz 0:11ad6aaed10a 381 Status |= VL53L0X_RdByte(Dev, 0x91, &StopVariable);
joelvonrotz 0:11ad6aaed10a 382 PALDevDataSet(Dev, StopVariable, StopVariable);
joelvonrotz 0:11ad6aaed10a 383 Status |= VL53L0X_WrByte(Dev, 0x00, 0x01);
joelvonrotz 0:11ad6aaed10a 384 Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00);
joelvonrotz 0:11ad6aaed10a 385 Status |= VL53L0X_WrByte(Dev, 0x80, 0x00);
joelvonrotz 0:11ad6aaed10a 386
joelvonrotz 0:11ad6aaed10a 387 /* Enable all check */
joelvonrotz 0:11ad6aaed10a 388 for (i = 0; i < VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; i++) {
joelvonrotz 0:11ad6aaed10a 389 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 390 Status |= VL53L0X_SetLimitCheckEnable(Dev, i, 1);
joelvonrotz 0:11ad6aaed10a 391 else
joelvonrotz 0:11ad6aaed10a 392 break;
joelvonrotz 0:11ad6aaed10a 393
joelvonrotz 0:11ad6aaed10a 394 }
joelvonrotz 0:11ad6aaed10a 395
joelvonrotz 0:11ad6aaed10a 396 /* Disable the following checks */
joelvonrotz 0:11ad6aaed10a 397 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 398 Status = VL53L0X_SetLimitCheckEnable(Dev,
joelvonrotz 0:11ad6aaed10a 399 VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, 0);
joelvonrotz 0:11ad6aaed10a 400
joelvonrotz 0:11ad6aaed10a 401 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 402 Status = VL53L0X_SetLimitCheckEnable(Dev,
joelvonrotz 0:11ad6aaed10a 403 VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, 0);
joelvonrotz 0:11ad6aaed10a 404
joelvonrotz 0:11ad6aaed10a 405 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 406 Status = VL53L0X_SetLimitCheckEnable(Dev,
joelvonrotz 0:11ad6aaed10a 407 VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC, 0);
joelvonrotz 0:11ad6aaed10a 408
joelvonrotz 0:11ad6aaed10a 409 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 410 Status = VL53L0X_SetLimitCheckEnable(Dev,
joelvonrotz 0:11ad6aaed10a 411 VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE, 0);
joelvonrotz 0:11ad6aaed10a 412
joelvonrotz 0:11ad6aaed10a 413 /* Limit default values */
joelvonrotz 0:11ad6aaed10a 414 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 415 Status = VL53L0X_SetLimitCheckValue(Dev,
joelvonrotz 0:11ad6aaed10a 416 VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,
joelvonrotz 0:11ad6aaed10a 417 (FixPoint1616_t)(18 * 65536));
joelvonrotz 0:11ad6aaed10a 418 }
joelvonrotz 0:11ad6aaed10a 419 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 420 Status = VL53L0X_SetLimitCheckValue(Dev,
joelvonrotz 0:11ad6aaed10a 421 VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,
joelvonrotz 0:11ad6aaed10a 422 (FixPoint1616_t)(25 * 65536 / 100));
joelvonrotz 0:11ad6aaed10a 423 /* 0.25 * 65536 */
joelvonrotz 0:11ad6aaed10a 424 }
joelvonrotz 0:11ad6aaed10a 425
joelvonrotz 0:11ad6aaed10a 426 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 427 Status = VL53L0X_SetLimitCheckValue(Dev,
joelvonrotz 0:11ad6aaed10a 428 VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP,
joelvonrotz 0:11ad6aaed10a 429 (FixPoint1616_t)(35 * 65536));
joelvonrotz 0:11ad6aaed10a 430 }
joelvonrotz 0:11ad6aaed10a 431
joelvonrotz 0:11ad6aaed10a 432 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 433 Status = VL53L0X_SetLimitCheckValue(Dev,
joelvonrotz 0:11ad6aaed10a 434 VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD,
joelvonrotz 0:11ad6aaed10a 435 (FixPoint1616_t)(0 * 65536));
joelvonrotz 0:11ad6aaed10a 436 }
joelvonrotz 0:11ad6aaed10a 437
joelvonrotz 0:11ad6aaed10a 438 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 439
joelvonrotz 0:11ad6aaed10a 440 PALDevDataSet(Dev, SequenceConfig, 0xFF);
joelvonrotz 0:11ad6aaed10a 441 Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG,
joelvonrotz 0:11ad6aaed10a 442 0xFF);
joelvonrotz 0:11ad6aaed10a 443
joelvonrotz 0:11ad6aaed10a 444 /* Set PAL state to tell that we are waiting for call to
joelvonrotz 0:11ad6aaed10a 445 * VL53L0X_StaticInit */
joelvonrotz 0:11ad6aaed10a 446 PALDevDataSet(Dev, PalState, VL53L0X_STATE_WAIT_STATICINIT);
joelvonrotz 0:11ad6aaed10a 447 }
joelvonrotz 0:11ad6aaed10a 448
joelvonrotz 0:11ad6aaed10a 449 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 450 VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, RefSpadsInitialised, 0);
joelvonrotz 0:11ad6aaed10a 451
joelvonrotz 0:11ad6aaed10a 452
joelvonrotz 0:11ad6aaed10a 453 return Status;
joelvonrotz 0:11ad6aaed10a 454 }
joelvonrotz 0:11ad6aaed10a 455
joelvonrotz 0:11ad6aaed10a 456 VL53L0X_Error VL53L0X_SetTuningSettingBuffer(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 457 uint8_t *pTuningSettingBuffer, uint8_t UseInternalTuningSettings)
joelvonrotz 0:11ad6aaed10a 458 {
joelvonrotz 0:11ad6aaed10a 459 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 460
joelvonrotz 0:11ad6aaed10a 461
joelvonrotz 0:11ad6aaed10a 462 if (UseInternalTuningSettings == 1) {
joelvonrotz 0:11ad6aaed10a 463 /* Force use internal settings */
joelvonrotz 0:11ad6aaed10a 464 PALDevDataSet(Dev, UseInternalTuningSettings, 1);
joelvonrotz 0:11ad6aaed10a 465 } else {
joelvonrotz 0:11ad6aaed10a 466
joelvonrotz 0:11ad6aaed10a 467 /* check that the first byte is not 0 */
joelvonrotz 0:11ad6aaed10a 468 if (*pTuningSettingBuffer != 0) {
joelvonrotz 0:11ad6aaed10a 469 PALDevDataSet(Dev, pTuningSettingsPointer,
joelvonrotz 0:11ad6aaed10a 470 pTuningSettingBuffer);
joelvonrotz 0:11ad6aaed10a 471 PALDevDataSet(Dev, UseInternalTuningSettings, 0);
joelvonrotz 0:11ad6aaed10a 472
joelvonrotz 0:11ad6aaed10a 473 } else {
joelvonrotz 0:11ad6aaed10a 474 Status = VL53L0X_ERROR_INVALID_PARAMS;
joelvonrotz 0:11ad6aaed10a 475 }
joelvonrotz 0:11ad6aaed10a 476 }
joelvonrotz 0:11ad6aaed10a 477
joelvonrotz 0:11ad6aaed10a 478 return Status;
joelvonrotz 0:11ad6aaed10a 479 }
joelvonrotz 0:11ad6aaed10a 480
joelvonrotz 0:11ad6aaed10a 481 VL53L0X_Error VL53L0X_GetTuningSettingBuffer(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 482 uint8_t **ppTuningSettingBuffer, uint8_t *pUseInternalTuningSettings)
joelvonrotz 0:11ad6aaed10a 483 {
joelvonrotz 0:11ad6aaed10a 484 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 485
joelvonrotz 0:11ad6aaed10a 486
joelvonrotz 0:11ad6aaed10a 487 *ppTuningSettingBuffer = PALDevDataGet(Dev, pTuningSettingsPointer);
joelvonrotz 0:11ad6aaed10a 488 *pUseInternalTuningSettings = PALDevDataGet(Dev,
joelvonrotz 0:11ad6aaed10a 489 UseInternalTuningSettings);
joelvonrotz 0:11ad6aaed10a 490
joelvonrotz 0:11ad6aaed10a 491 return Status;
joelvonrotz 0:11ad6aaed10a 492 }
joelvonrotz 0:11ad6aaed10a 493
joelvonrotz 0:11ad6aaed10a 494 VL53L0X_Error VL53L0X_StaticInit(VL53L0X_DEV Dev)
joelvonrotz 0:11ad6aaed10a 495 {
joelvonrotz 0:11ad6aaed10a 496 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 497 VL53L0X_DeviceParameters_t CurrentParameters = {0};
joelvonrotz 0:11ad6aaed10a 498 uint8_t *pTuningSettingBuffer;
joelvonrotz 0:11ad6aaed10a 499 uint16_t tempword = 0;
joelvonrotz 0:11ad6aaed10a 500 uint8_t tempbyte = 0;
joelvonrotz 0:11ad6aaed10a 501 uint8_t UseInternalTuningSettings = 0;
joelvonrotz 0:11ad6aaed10a 502 uint32_t count = 0;
joelvonrotz 0:11ad6aaed10a 503 uint8_t isApertureSpads = 0;
joelvonrotz 0:11ad6aaed10a 504 uint32_t refSpadCount = 0;
joelvonrotz 0:11ad6aaed10a 505 uint8_t ApertureSpads = 0;
joelvonrotz 0:11ad6aaed10a 506 uint8_t vcselPulsePeriodPCLK;
joelvonrotz 0:11ad6aaed10a 507 uint32_t seqTimeoutMicroSecs;
joelvonrotz 0:11ad6aaed10a 508
joelvonrotz 0:11ad6aaed10a 509 Status = VL53L0X_get_info_from_device(Dev, 1);
joelvonrotz 0:11ad6aaed10a 510
joelvonrotz 0:11ad6aaed10a 511
joelvonrotz 0:11ad6aaed10a 512 /* set the ref spad from NVM */
joelvonrotz 0:11ad6aaed10a 513 count = (uint32_t)VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, ReferenceSpadCount);
joelvonrotz 0:11ad6aaed10a 514 ApertureSpads = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev, ReferenceSpadType);
joelvonrotz 0:11ad6aaed10a 515
joelvonrotz 0:11ad6aaed10a 516
joelvonrotz 0:11ad6aaed10a 517 /* NVM value invalid */
joelvonrotz 0:11ad6aaed10a 518 if ((ApertureSpads > 1) || ((ApertureSpads == 1) && (count > 32)) || ((ApertureSpads == 0) && (count > 12)))
joelvonrotz 0:11ad6aaed10a 519 {
joelvonrotz 0:11ad6aaed10a 520 Status = VL53L0X_perform_ref_spad_management(Dev, &refSpadCount, &isApertureSpads);
joelvonrotz 0:11ad6aaed10a 521 }
joelvonrotz 0:11ad6aaed10a 522 else
joelvonrotz 0:11ad6aaed10a 523 {
joelvonrotz 0:11ad6aaed10a 524 Status = VL53L0X_set_reference_spads(Dev, count, ApertureSpads);
joelvonrotz 0:11ad6aaed10a 525 }
joelvonrotz 0:11ad6aaed10a 526
joelvonrotz 0:11ad6aaed10a 527 /* Initialize tuning settings buffer to prevent compiler warning. */
joelvonrotz 0:11ad6aaed10a 528 pTuningSettingBuffer = DefaultTuningSettings;
joelvonrotz 0:11ad6aaed10a 529
joelvonrotz 0:11ad6aaed10a 530 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 531 {
joelvonrotz 0:11ad6aaed10a 532 UseInternalTuningSettings = PALDevDataGet(Dev, UseInternalTuningSettings);
joelvonrotz 0:11ad6aaed10a 533
joelvonrotz 0:11ad6aaed10a 534 if (UseInternalTuningSettings == 0)
joelvonrotz 0:11ad6aaed10a 535 {
joelvonrotz 0:11ad6aaed10a 536 pTuningSettingBuffer = PALDevDataGet(Dev, pTuningSettingsPointer);
joelvonrotz 0:11ad6aaed10a 537 }
joelvonrotz 0:11ad6aaed10a 538 else
joelvonrotz 0:11ad6aaed10a 539 {
joelvonrotz 0:11ad6aaed10a 540 pTuningSettingBuffer = DefaultTuningSettings;
joelvonrotz 0:11ad6aaed10a 541 }
joelvonrotz 0:11ad6aaed10a 542 }
joelvonrotz 0:11ad6aaed10a 543
joelvonrotz 0:11ad6aaed10a 544 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 545 {
joelvonrotz 0:11ad6aaed10a 546 Status = VL53L0X_load_tuning_settings(Dev, pTuningSettingBuffer);
joelvonrotz 0:11ad6aaed10a 547 }
joelvonrotz 0:11ad6aaed10a 548
joelvonrotz 0:11ad6aaed10a 549 /* Set interrupt config to new sample ready */
joelvonrotz 0:11ad6aaed10a 550 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 551 Status = VL53L0X_SetGpioConfig(Dev, 0, 0, VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY, VL53L0X_INTERRUPTPOLARITY_LOW);
joelvonrotz 0:11ad6aaed10a 552 }
joelvonrotz 0:11ad6aaed10a 553
joelvonrotz 0:11ad6aaed10a 554 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 555 Status = VL53L0X_WrByte(Dev, 0xFF, 0x01);
joelvonrotz 0:11ad6aaed10a 556 Status |= VL53L0X_RdWord(Dev, 0x84, &tempword);
joelvonrotz 0:11ad6aaed10a 557 Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00);
joelvonrotz 0:11ad6aaed10a 558 }
joelvonrotz 0:11ad6aaed10a 559
joelvonrotz 0:11ad6aaed10a 560 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 561 VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, OscFrequencyMHz, VL53L0X_FIXPOINT412TOFIXPOINT1616(tempword));
joelvonrotz 0:11ad6aaed10a 562 }
joelvonrotz 0:11ad6aaed10a 563
joelvonrotz 0:11ad6aaed10a 564 /* After static init, some device parameters may be changed,
joelvonrotz 0:11ad6aaed10a 565 * so update them */
joelvonrotz 0:11ad6aaed10a 566 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 567 {
joelvonrotz 0:11ad6aaed10a 568 Status = VL53L0X_GetDeviceParameters(Dev, &CurrentParameters);
joelvonrotz 0:11ad6aaed10a 569 }
joelvonrotz 0:11ad6aaed10a 570
joelvonrotz 0:11ad6aaed10a 571 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 572 {
joelvonrotz 0:11ad6aaed10a 573 Status = VL53L0X_GetFractionEnable(Dev, &tempbyte);
joelvonrotz 0:11ad6aaed10a 574
joelvonrotz 0:11ad6aaed10a 575 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 576 {
joelvonrotz 0:11ad6aaed10a 577 PALDevDataSet(Dev, RangeFractionalEnable, tempbyte);
joelvonrotz 0:11ad6aaed10a 578 }
joelvonrotz 0:11ad6aaed10a 579 }
joelvonrotz 0:11ad6aaed10a 580
joelvonrotz 0:11ad6aaed10a 581 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 582 {
joelvonrotz 0:11ad6aaed10a 583 PALDevDataSet(Dev, CurrentParameters, CurrentParameters);
joelvonrotz 0:11ad6aaed10a 584 }
joelvonrotz 0:11ad6aaed10a 585
joelvonrotz 0:11ad6aaed10a 586 /* read the sequence config and save it */
joelvonrotz 0:11ad6aaed10a 587 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 588 {
joelvonrotz 0:11ad6aaed10a 589 Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, &tempbyte);
joelvonrotz 0:11ad6aaed10a 590
joelvonrotz 0:11ad6aaed10a 591 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 592 {
joelvonrotz 0:11ad6aaed10a 593 PALDevDataSet(Dev, SequenceConfig, tempbyte);
joelvonrotz 0:11ad6aaed10a 594 }
joelvonrotz 0:11ad6aaed10a 595 }
joelvonrotz 0:11ad6aaed10a 596
joelvonrotz 0:11ad6aaed10a 597 /* Disable MSRC and TCC by default */
joelvonrotz 0:11ad6aaed10a 598 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 599 {
joelvonrotz 0:11ad6aaed10a 600 Status = VL53L0X_SetSequenceStepEnable(Dev, VL53L0X_SEQUENCESTEP_TCC, 0);
joelvonrotz 0:11ad6aaed10a 601 }
joelvonrotz 0:11ad6aaed10a 602
joelvonrotz 0:11ad6aaed10a 603
joelvonrotz 0:11ad6aaed10a 604 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 605 {
joelvonrotz 0:11ad6aaed10a 606 Status = VL53L0X_SetSequenceStepEnable(Dev, VL53L0X_SEQUENCESTEP_MSRC, 0);
joelvonrotz 0:11ad6aaed10a 607 }
joelvonrotz 0:11ad6aaed10a 608
joelvonrotz 0:11ad6aaed10a 609
joelvonrotz 0:11ad6aaed10a 610 /* Set PAL State to standby */
joelvonrotz 0:11ad6aaed10a 611 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 612 {
joelvonrotz 0:11ad6aaed10a 613 PALDevDataSet(Dev, PalState, VL53L0X_STATE_IDLE);
joelvonrotz 0:11ad6aaed10a 614 }
joelvonrotz 0:11ad6aaed10a 615
joelvonrotz 0:11ad6aaed10a 616
joelvonrotz 0:11ad6aaed10a 617 /* Store pre-range vcsel period */
joelvonrotz 0:11ad6aaed10a 618 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 619 {
joelvonrotz 0:11ad6aaed10a 620 Status = VL53L0X_GetVcselPulsePeriod(Dev, VL53L0X_VCSEL_PERIOD_PRE_RANGE, &vcselPulsePeriodPCLK);
joelvonrotz 0:11ad6aaed10a 621 }
joelvonrotz 0:11ad6aaed10a 622
joelvonrotz 0:11ad6aaed10a 623 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 624 {
joelvonrotz 0:11ad6aaed10a 625 VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, PreRangeVcselPulsePeriod, vcselPulsePeriodPCLK);
joelvonrotz 0:11ad6aaed10a 626 }
joelvonrotz 0:11ad6aaed10a 627
joelvonrotz 0:11ad6aaed10a 628 /* Store final-range vcsel period */
joelvonrotz 0:11ad6aaed10a 629 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 630 {
joelvonrotz 0:11ad6aaed10a 631 Status = VL53L0X_GetVcselPulsePeriod(Dev, VL53L0X_VCSEL_PERIOD_FINAL_RANGE, &vcselPulsePeriodPCLK);
joelvonrotz 0:11ad6aaed10a 632 }
joelvonrotz 0:11ad6aaed10a 633
joelvonrotz 0:11ad6aaed10a 634 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 635 {
joelvonrotz 0:11ad6aaed10a 636 VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, FinalRangeVcselPulsePeriod, vcselPulsePeriodPCLK);
joelvonrotz 0:11ad6aaed10a 637 }
joelvonrotz 0:11ad6aaed10a 638
joelvonrotz 0:11ad6aaed10a 639 /* Store pre-range timeout */
joelvonrotz 0:11ad6aaed10a 640 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 641 {
joelvonrotz 0:11ad6aaed10a 642 Status = get_sequence_step_timeout(Dev, VL53L0X_SEQUENCESTEP_PRE_RANGE, &seqTimeoutMicroSecs);
joelvonrotz 0:11ad6aaed10a 643 }
joelvonrotz 0:11ad6aaed10a 644
joelvonrotz 0:11ad6aaed10a 645 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 646 VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, PreRangeTimeoutMicroSecs, seqTimeoutMicroSecs);
joelvonrotz 0:11ad6aaed10a 647 }
joelvonrotz 0:11ad6aaed10a 648
joelvonrotz 0:11ad6aaed10a 649 /* Store final-range timeout */
joelvonrotz 0:11ad6aaed10a 650 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 651 {
joelvonrotz 0:11ad6aaed10a 652 Status = get_sequence_step_timeout(Dev, VL53L0X_SEQUENCESTEP_FINAL_RANGE, &seqTimeoutMicroSecs);
joelvonrotz 0:11ad6aaed10a 653 }
joelvonrotz 0:11ad6aaed10a 654
joelvonrotz 0:11ad6aaed10a 655 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 656 VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, FinalRangeTimeoutMicroSecs, seqTimeoutMicroSecs);
joelvonrotz 0:11ad6aaed10a 657 }
joelvonrotz 0:11ad6aaed10a 658
joelvonrotz 0:11ad6aaed10a 659 return Status;
joelvonrotz 0:11ad6aaed10a 660 }
joelvonrotz 0:11ad6aaed10a 661
joelvonrotz 0:11ad6aaed10a 662 VL53L0X_Error VL53L0X_WaitDeviceBooted(VL53L0X_DEV Dev)
joelvonrotz 0:11ad6aaed10a 663 {
joelvonrotz 0:11ad6aaed10a 664 VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED;
joelvonrotz 0:11ad6aaed10a 665
joelvonrotz 0:11ad6aaed10a 666 /* not implemented on VL53L0X */
joelvonrotz 0:11ad6aaed10a 667
joelvonrotz 0:11ad6aaed10a 668 return Status;
joelvonrotz 0:11ad6aaed10a 669 }
joelvonrotz 0:11ad6aaed10a 670
joelvonrotz 0:11ad6aaed10a 671 VL53L0X_Error VL53L0X_ResetDevice(VL53L0X_DEV Dev)
joelvonrotz 0:11ad6aaed10a 672 {
joelvonrotz 0:11ad6aaed10a 673 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 674 uint8_t Byte;
joelvonrotz 0:11ad6aaed10a 675
joelvonrotz 0:11ad6aaed10a 676 /* Set reset bit */
joelvonrotz 0:11ad6aaed10a 677 Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SOFT_RESET_GO2_SOFT_RESET_N,
joelvonrotz 0:11ad6aaed10a 678 0x00);
joelvonrotz 0:11ad6aaed10a 679
joelvonrotz 0:11ad6aaed10a 680 /* Wait for some time */
joelvonrotz 0:11ad6aaed10a 681 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 682 do {
joelvonrotz 0:11ad6aaed10a 683 Status = VL53L0X_RdByte(Dev,
joelvonrotz 0:11ad6aaed10a 684 VL53L0X_REG_IDENTIFICATION_MODEL_ID, &Byte);
joelvonrotz 0:11ad6aaed10a 685 } while (Byte != 0x00);
joelvonrotz 0:11ad6aaed10a 686 }
joelvonrotz 0:11ad6aaed10a 687
joelvonrotz 0:11ad6aaed10a 688 VL53L0X_PollingDelay(Dev);
joelvonrotz 0:11ad6aaed10a 689
joelvonrotz 0:11ad6aaed10a 690 /* Release reset */
joelvonrotz 0:11ad6aaed10a 691 Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SOFT_RESET_GO2_SOFT_RESET_N,
joelvonrotz 0:11ad6aaed10a 692 0x01);
joelvonrotz 0:11ad6aaed10a 693
joelvonrotz 0:11ad6aaed10a 694 /* Wait until correct boot-up of the device */
joelvonrotz 0:11ad6aaed10a 695 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 696 do {
joelvonrotz 0:11ad6aaed10a 697 Status = VL53L0X_RdByte(Dev,
joelvonrotz 0:11ad6aaed10a 698 VL53L0X_REG_IDENTIFICATION_MODEL_ID, &Byte);
joelvonrotz 0:11ad6aaed10a 699 } while (Byte == 0x00);
joelvonrotz 0:11ad6aaed10a 700 }
joelvonrotz 0:11ad6aaed10a 701
joelvonrotz 0:11ad6aaed10a 702 VL53L0X_PollingDelay(Dev);
joelvonrotz 0:11ad6aaed10a 703
joelvonrotz 0:11ad6aaed10a 704 /* Set PAL State to VL53L0X_STATE_POWERDOWN */
joelvonrotz 0:11ad6aaed10a 705 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 706 PALDevDataSet(Dev, PalState, VL53L0X_STATE_POWERDOWN);
joelvonrotz 0:11ad6aaed10a 707
joelvonrotz 0:11ad6aaed10a 708
joelvonrotz 0:11ad6aaed10a 709 return Status;
joelvonrotz 0:11ad6aaed10a 710 }
joelvonrotz 0:11ad6aaed10a 711 /* End Group PAL Init Functions */
joelvonrotz 0:11ad6aaed10a 712
joelvonrotz 0:11ad6aaed10a 713 /* Group PAL Parameters Functions */
joelvonrotz 0:11ad6aaed10a 714 VL53L0X_Error VL53L0X_SetDeviceParameters(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 715 const VL53L0X_DeviceParameters_t *pDeviceParameters)
joelvonrotz 0:11ad6aaed10a 716 {
joelvonrotz 0:11ad6aaed10a 717 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 718 int i;
joelvonrotz 0:11ad6aaed10a 719 Status = VL53L0X_SetDeviceMode(Dev, pDeviceParameters->DeviceMode);
joelvonrotz 0:11ad6aaed10a 720
joelvonrotz 0:11ad6aaed10a 721 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 722 Status = VL53L0X_SetInterMeasurementPeriodMilliSeconds(Dev,
joelvonrotz 0:11ad6aaed10a 723 pDeviceParameters->InterMeasurementPeriodMilliSeconds);
joelvonrotz 0:11ad6aaed10a 724
joelvonrotz 0:11ad6aaed10a 725
joelvonrotz 0:11ad6aaed10a 726 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 727 Status = VL53L0X_SetXTalkCompensationRateMegaCps(Dev,
joelvonrotz 0:11ad6aaed10a 728 pDeviceParameters->XTalkCompensationRateMegaCps);
joelvonrotz 0:11ad6aaed10a 729
joelvonrotz 0:11ad6aaed10a 730
joelvonrotz 0:11ad6aaed10a 731 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 732 Status = VL53L0X_SetOffsetCalibrationDataMicroMeter(Dev,
joelvonrotz 0:11ad6aaed10a 733 pDeviceParameters->RangeOffsetMicroMeters);
joelvonrotz 0:11ad6aaed10a 734
joelvonrotz 0:11ad6aaed10a 735
joelvonrotz 0:11ad6aaed10a 736 for (i = 0; i < VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; i++) {
joelvonrotz 0:11ad6aaed10a 737 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 738 Status |= VL53L0X_SetLimitCheckEnable(Dev, i,
joelvonrotz 0:11ad6aaed10a 739 pDeviceParameters->LimitChecksEnable[i]);
joelvonrotz 0:11ad6aaed10a 740 else
joelvonrotz 0:11ad6aaed10a 741 break;
joelvonrotz 0:11ad6aaed10a 742
joelvonrotz 0:11ad6aaed10a 743 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 744 Status |= VL53L0X_SetLimitCheckValue(Dev, i,
joelvonrotz 0:11ad6aaed10a 745 pDeviceParameters->LimitChecksValue[i]);
joelvonrotz 0:11ad6aaed10a 746 else
joelvonrotz 0:11ad6aaed10a 747 break;
joelvonrotz 0:11ad6aaed10a 748
joelvonrotz 0:11ad6aaed10a 749 }
joelvonrotz 0:11ad6aaed10a 750
joelvonrotz 0:11ad6aaed10a 751 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 752 Status = VL53L0X_SetWrapAroundCheckEnable(Dev,
joelvonrotz 0:11ad6aaed10a 753 pDeviceParameters->WrapAroundCheckEnable);
joelvonrotz 0:11ad6aaed10a 754
joelvonrotz 0:11ad6aaed10a 755 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 756 Status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(Dev,
joelvonrotz 0:11ad6aaed10a 757 pDeviceParameters->MeasurementTimingBudgetMicroSeconds);
joelvonrotz 0:11ad6aaed10a 758
joelvonrotz 0:11ad6aaed10a 759
joelvonrotz 0:11ad6aaed10a 760 return Status;
joelvonrotz 0:11ad6aaed10a 761 }
joelvonrotz 0:11ad6aaed10a 762
joelvonrotz 0:11ad6aaed10a 763 VL53L0X_Error VL53L0X_GetDeviceParameters(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 764 VL53L0X_DeviceParameters_t *pDeviceParameters)
joelvonrotz 0:11ad6aaed10a 765 {
joelvonrotz 0:11ad6aaed10a 766 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 767 int i;
joelvonrotz 0:11ad6aaed10a 768
joelvonrotz 0:11ad6aaed10a 769
joelvonrotz 0:11ad6aaed10a 770 Status = VL53L0X_GetDeviceMode(Dev, &(pDeviceParameters->DeviceMode));
joelvonrotz 0:11ad6aaed10a 771
joelvonrotz 0:11ad6aaed10a 772 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 773 Status = VL53L0X_GetInterMeasurementPeriodMilliSeconds(Dev,
joelvonrotz 0:11ad6aaed10a 774 &(pDeviceParameters->InterMeasurementPeriodMilliSeconds));
joelvonrotz 0:11ad6aaed10a 775
joelvonrotz 0:11ad6aaed10a 776
joelvonrotz 0:11ad6aaed10a 777 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 778 pDeviceParameters->XTalkCompensationEnable = 0;
joelvonrotz 0:11ad6aaed10a 779
joelvonrotz 0:11ad6aaed10a 780 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 781 Status = VL53L0X_GetXTalkCompensationRateMegaCps(Dev,
joelvonrotz 0:11ad6aaed10a 782 &(pDeviceParameters->XTalkCompensationRateMegaCps));
joelvonrotz 0:11ad6aaed10a 783
joelvonrotz 0:11ad6aaed10a 784
joelvonrotz 0:11ad6aaed10a 785 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 786 Status = VL53L0X_GetOffsetCalibrationDataMicroMeter(Dev,
joelvonrotz 0:11ad6aaed10a 787 &(pDeviceParameters->RangeOffsetMicroMeters));
joelvonrotz 0:11ad6aaed10a 788
joelvonrotz 0:11ad6aaed10a 789
joelvonrotz 0:11ad6aaed10a 790 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 791 for (i = 0; i < VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; i++) {
joelvonrotz 0:11ad6aaed10a 792 /* get first the values, then the enables.
joelvonrotz 0:11ad6aaed10a 793 * VL53L0X_GetLimitCheckValue will modify the enable
joelvonrotz 0:11ad6aaed10a 794 * flags
joelvonrotz 0:11ad6aaed10a 795 */
joelvonrotz 0:11ad6aaed10a 796 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 797 Status |= VL53L0X_GetLimitCheckValue(Dev, i,
joelvonrotz 0:11ad6aaed10a 798 &(pDeviceParameters->LimitChecksValue[i]));
joelvonrotz 0:11ad6aaed10a 799 } else {
joelvonrotz 0:11ad6aaed10a 800 break;
joelvonrotz 0:11ad6aaed10a 801 }
joelvonrotz 0:11ad6aaed10a 802 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 803 Status |= VL53L0X_GetLimitCheckEnable(Dev, i,
joelvonrotz 0:11ad6aaed10a 804 &(pDeviceParameters->LimitChecksEnable[i]));
joelvonrotz 0:11ad6aaed10a 805 } else {
joelvonrotz 0:11ad6aaed10a 806 break;
joelvonrotz 0:11ad6aaed10a 807 }
joelvonrotz 0:11ad6aaed10a 808 }
joelvonrotz 0:11ad6aaed10a 809 }
joelvonrotz 0:11ad6aaed10a 810
joelvonrotz 0:11ad6aaed10a 811 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 812 Status = VL53L0X_GetWrapAroundCheckEnable(Dev,
joelvonrotz 0:11ad6aaed10a 813 &(pDeviceParameters->WrapAroundCheckEnable));
joelvonrotz 0:11ad6aaed10a 814 }
joelvonrotz 0:11ad6aaed10a 815
joelvonrotz 0:11ad6aaed10a 816 /* Need to be done at the end as it uses VCSELPulsePeriod */
joelvonrotz 0:11ad6aaed10a 817 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 818 Status = VL53L0X_GetMeasurementTimingBudgetMicroSeconds(Dev,
joelvonrotz 0:11ad6aaed10a 819 &(pDeviceParameters->MeasurementTimingBudgetMicroSeconds));
joelvonrotz 0:11ad6aaed10a 820 }
joelvonrotz 0:11ad6aaed10a 821
joelvonrotz 0:11ad6aaed10a 822 return Status;
joelvonrotz 0:11ad6aaed10a 823 }
joelvonrotz 0:11ad6aaed10a 824
joelvonrotz 0:11ad6aaed10a 825 VL53L0X_Error VL53L0X_SetDeviceMode(VL53L0X_DEV Dev, VL53L0X_DeviceModes DeviceMode)
joelvonrotz 0:11ad6aaed10a 826 {
joelvonrotz 0:11ad6aaed10a 827 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 828
joelvonrotz 0:11ad6aaed10a 829
joelvonrotz 0:11ad6aaed10a 830 switch (DeviceMode) {
joelvonrotz 0:11ad6aaed10a 831 case VL53L0X_DEVICEMODE_SINGLE_RANGING:
joelvonrotz 0:11ad6aaed10a 832 case VL53L0X_DEVICEMODE_CONTINUOUS_RANGING:
joelvonrotz 0:11ad6aaed10a 833 case VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING:
joelvonrotz 0:11ad6aaed10a 834 case VL53L0X_DEVICEMODE_GPIO_DRIVE:
joelvonrotz 0:11ad6aaed10a 835 case VL53L0X_DEVICEMODE_GPIO_OSC:
joelvonrotz 0:11ad6aaed10a 836 /* Supported modes */
joelvonrotz 0:11ad6aaed10a 837 VL53L0X_SETPARAMETERFIELD(Dev, DeviceMode, DeviceMode);
joelvonrotz 0:11ad6aaed10a 838 break;
joelvonrotz 0:11ad6aaed10a 839 default:
joelvonrotz 0:11ad6aaed10a 840 /* Unsupported mode */
joelvonrotz 0:11ad6aaed10a 841 Status = VL53L0X_ERROR_MODE_NOT_SUPPORTED;
joelvonrotz 0:11ad6aaed10a 842 }
joelvonrotz 0:11ad6aaed10a 843
joelvonrotz 0:11ad6aaed10a 844 return Status;
joelvonrotz 0:11ad6aaed10a 845 }
joelvonrotz 0:11ad6aaed10a 846
joelvonrotz 0:11ad6aaed10a 847 VL53L0X_Error VL53L0X_GetDeviceMode(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 848 VL53L0X_DeviceModes *pDeviceMode)
joelvonrotz 0:11ad6aaed10a 849 {
joelvonrotz 0:11ad6aaed10a 850 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 851
joelvonrotz 0:11ad6aaed10a 852 VL53L0X_GETPARAMETERFIELD(Dev, DeviceMode, *pDeviceMode);
joelvonrotz 0:11ad6aaed10a 853
joelvonrotz 0:11ad6aaed10a 854 return Status;
joelvonrotz 0:11ad6aaed10a 855 }
joelvonrotz 0:11ad6aaed10a 856
joelvonrotz 0:11ad6aaed10a 857 VL53L0X_Error VL53L0X_SetRangeFractionEnable(VL53L0X_DEV Dev, uint8_t Enable)
joelvonrotz 0:11ad6aaed10a 858 {
joelvonrotz 0:11ad6aaed10a 859 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 860
joelvonrotz 0:11ad6aaed10a 861
joelvonrotz 0:11ad6aaed10a 862 Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_RANGE_CONFIG, Enable);
joelvonrotz 0:11ad6aaed10a 863
joelvonrotz 0:11ad6aaed10a 864 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 865 PALDevDataSet(Dev, RangeFractionalEnable, Enable);
joelvonrotz 0:11ad6aaed10a 866
joelvonrotz 0:11ad6aaed10a 867 return Status;
joelvonrotz 0:11ad6aaed10a 868 }
joelvonrotz 0:11ad6aaed10a 869
joelvonrotz 0:11ad6aaed10a 870 VL53L0X_Error VL53L0X_GetFractionEnable(VL53L0X_DEV Dev, uint8_t *pEnabled)
joelvonrotz 0:11ad6aaed10a 871 {
joelvonrotz 0:11ad6aaed10a 872 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 873
joelvonrotz 0:11ad6aaed10a 874 Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_RANGE_CONFIG, pEnabled);
joelvonrotz 0:11ad6aaed10a 875
joelvonrotz 0:11ad6aaed10a 876 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 877 *pEnabled = (*pEnabled & 1);
joelvonrotz 0:11ad6aaed10a 878
joelvonrotz 0:11ad6aaed10a 879 return Status;
joelvonrotz 0:11ad6aaed10a 880 }
joelvonrotz 0:11ad6aaed10a 881
joelvonrotz 0:11ad6aaed10a 882 VL53L0X_Error VL53L0X_SetHistogramMode(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 883 VL53L0X_HistogramModes HistogramMode)
joelvonrotz 0:11ad6aaed10a 884 {
joelvonrotz 0:11ad6aaed10a 885 VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED;
joelvonrotz 0:11ad6aaed10a 886
joelvonrotz 0:11ad6aaed10a 887 /* not implemented on VL53L0X */
joelvonrotz 0:11ad6aaed10a 888
joelvonrotz 0:11ad6aaed10a 889 return Status;
joelvonrotz 0:11ad6aaed10a 890 }
joelvonrotz 0:11ad6aaed10a 891
joelvonrotz 0:11ad6aaed10a 892 VL53L0X_Error VL53L0X_GetHistogramMode(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 893 VL53L0X_HistogramModes *pHistogramMode)
joelvonrotz 0:11ad6aaed10a 894 {
joelvonrotz 0:11ad6aaed10a 895 VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED;
joelvonrotz 0:11ad6aaed10a 896
joelvonrotz 0:11ad6aaed10a 897 /* not implemented on VL53L0X */
joelvonrotz 0:11ad6aaed10a 898
joelvonrotz 0:11ad6aaed10a 899 return Status;
joelvonrotz 0:11ad6aaed10a 900 }
joelvonrotz 0:11ad6aaed10a 901
joelvonrotz 0:11ad6aaed10a 902 VL53L0X_Error VL53L0X_SetMeasurementTimingBudgetMicroSeconds(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 903 uint32_t MeasurementTimingBudgetMicroSeconds)
joelvonrotz 0:11ad6aaed10a 904 {
joelvonrotz 0:11ad6aaed10a 905 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 906
joelvonrotz 0:11ad6aaed10a 907 Status = VL53L0X_set_measurement_timing_budget_micro_seconds(Dev,
joelvonrotz 0:11ad6aaed10a 908 MeasurementTimingBudgetMicroSeconds);
joelvonrotz 0:11ad6aaed10a 909
joelvonrotz 0:11ad6aaed10a 910
joelvonrotz 0:11ad6aaed10a 911 return Status;
joelvonrotz 0:11ad6aaed10a 912 }
joelvonrotz 0:11ad6aaed10a 913
joelvonrotz 0:11ad6aaed10a 914 VL53L0X_Error VL53L0X_GetMeasurementTimingBudgetMicroSeconds(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 915 uint32_t *pMeasurementTimingBudgetMicroSeconds)
joelvonrotz 0:11ad6aaed10a 916 {
joelvonrotz 0:11ad6aaed10a 917 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 918
joelvonrotz 0:11ad6aaed10a 919 Status = VL53L0X_get_measurement_timing_budget_micro_seconds(Dev,
joelvonrotz 0:11ad6aaed10a 920 pMeasurementTimingBudgetMicroSeconds);
joelvonrotz 0:11ad6aaed10a 921
joelvonrotz 0:11ad6aaed10a 922 return Status;
joelvonrotz 0:11ad6aaed10a 923 }
joelvonrotz 0:11ad6aaed10a 924
joelvonrotz 0:11ad6aaed10a 925 VL53L0X_Error VL53L0X_SetVcselPulsePeriod(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 926 VL53L0X_VcselPeriod VcselPeriodType, uint8_t VCSELPulsePeriodPCLK)
joelvonrotz 0:11ad6aaed10a 927 {
joelvonrotz 0:11ad6aaed10a 928 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 929
joelvonrotz 0:11ad6aaed10a 930 Status = VL53L0X_set_vcsel_pulse_period(Dev, VcselPeriodType,
joelvonrotz 0:11ad6aaed10a 931 VCSELPulsePeriodPCLK);
joelvonrotz 0:11ad6aaed10a 932
joelvonrotz 0:11ad6aaed10a 933 return Status;
joelvonrotz 0:11ad6aaed10a 934 }
joelvonrotz 0:11ad6aaed10a 935
joelvonrotz 0:11ad6aaed10a 936 VL53L0X_Error VL53L0X_GetVcselPulsePeriod(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 937 VL53L0X_VcselPeriod VcselPeriodType, uint8_t *pVCSELPulsePeriodPCLK)
joelvonrotz 0:11ad6aaed10a 938 {
joelvonrotz 0:11ad6aaed10a 939 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 940
joelvonrotz 0:11ad6aaed10a 941 Status = VL53L0X_get_vcsel_pulse_period(Dev, VcselPeriodType,
joelvonrotz 0:11ad6aaed10a 942 pVCSELPulsePeriodPCLK);
joelvonrotz 0:11ad6aaed10a 943
joelvonrotz 0:11ad6aaed10a 944 return Status;
joelvonrotz 0:11ad6aaed10a 945 }
joelvonrotz 0:11ad6aaed10a 946
joelvonrotz 0:11ad6aaed10a 947 VL53L0X_Error VL53L0X_SetSequenceStepEnable(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 948 VL53L0X_SequenceStepId SequenceStepId, uint8_t SequenceStepEnabled)
joelvonrotz 0:11ad6aaed10a 949 {
joelvonrotz 0:11ad6aaed10a 950 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 951 uint8_t SequenceConfig = 0;
joelvonrotz 0:11ad6aaed10a 952 uint8_t SequenceConfigNew = 0;
joelvonrotz 0:11ad6aaed10a 953 uint32_t MeasurementTimingBudgetMicroSeconds;
joelvonrotz 0:11ad6aaed10a 954
joelvonrotz 0:11ad6aaed10a 955 Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG,
joelvonrotz 0:11ad6aaed10a 956 &SequenceConfig);
joelvonrotz 0:11ad6aaed10a 957
joelvonrotz 0:11ad6aaed10a 958 SequenceConfigNew = SequenceConfig;
joelvonrotz 0:11ad6aaed10a 959
joelvonrotz 0:11ad6aaed10a 960 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 961 if (SequenceStepEnabled == 1) {
joelvonrotz 0:11ad6aaed10a 962
joelvonrotz 0:11ad6aaed10a 963 /* Enable requested sequence step
joelvonrotz 0:11ad6aaed10a 964 */
joelvonrotz 0:11ad6aaed10a 965 switch (SequenceStepId) {
joelvonrotz 0:11ad6aaed10a 966 case VL53L0X_SEQUENCESTEP_TCC:
joelvonrotz 0:11ad6aaed10a 967 SequenceConfigNew |= 0x10;
joelvonrotz 0:11ad6aaed10a 968 break;
joelvonrotz 0:11ad6aaed10a 969 case VL53L0X_SEQUENCESTEP_DSS:
joelvonrotz 0:11ad6aaed10a 970 SequenceConfigNew |= 0x28;
joelvonrotz 0:11ad6aaed10a 971 break;
joelvonrotz 0:11ad6aaed10a 972 case VL53L0X_SEQUENCESTEP_MSRC:
joelvonrotz 0:11ad6aaed10a 973 SequenceConfigNew |= 0x04;
joelvonrotz 0:11ad6aaed10a 974 break;
joelvonrotz 0:11ad6aaed10a 975 case VL53L0X_SEQUENCESTEP_PRE_RANGE:
joelvonrotz 0:11ad6aaed10a 976 SequenceConfigNew |= 0x40;
joelvonrotz 0:11ad6aaed10a 977 break;
joelvonrotz 0:11ad6aaed10a 978 case VL53L0X_SEQUENCESTEP_FINAL_RANGE:
joelvonrotz 0:11ad6aaed10a 979 SequenceConfigNew |= 0x80;
joelvonrotz 0:11ad6aaed10a 980 break;
joelvonrotz 0:11ad6aaed10a 981 default:
joelvonrotz 0:11ad6aaed10a 982 Status = VL53L0X_ERROR_INVALID_PARAMS;
joelvonrotz 0:11ad6aaed10a 983 }
joelvonrotz 0:11ad6aaed10a 984 } else {
joelvonrotz 0:11ad6aaed10a 985 /* Disable requested sequence step
joelvonrotz 0:11ad6aaed10a 986 */
joelvonrotz 0:11ad6aaed10a 987 switch (SequenceStepId) {
joelvonrotz 0:11ad6aaed10a 988 case VL53L0X_SEQUENCESTEP_TCC:
joelvonrotz 0:11ad6aaed10a 989 SequenceConfigNew &= 0xef;
joelvonrotz 0:11ad6aaed10a 990 break;
joelvonrotz 0:11ad6aaed10a 991 case VL53L0X_SEQUENCESTEP_DSS:
joelvonrotz 0:11ad6aaed10a 992 SequenceConfigNew &= 0xd7;
joelvonrotz 0:11ad6aaed10a 993 break;
joelvonrotz 0:11ad6aaed10a 994 case VL53L0X_SEQUENCESTEP_MSRC:
joelvonrotz 0:11ad6aaed10a 995 SequenceConfigNew &= 0xfb;
joelvonrotz 0:11ad6aaed10a 996 break;
joelvonrotz 0:11ad6aaed10a 997 case VL53L0X_SEQUENCESTEP_PRE_RANGE:
joelvonrotz 0:11ad6aaed10a 998 SequenceConfigNew &= 0xbf;
joelvonrotz 0:11ad6aaed10a 999 break;
joelvonrotz 0:11ad6aaed10a 1000 case VL53L0X_SEQUENCESTEP_FINAL_RANGE:
joelvonrotz 0:11ad6aaed10a 1001 SequenceConfigNew &= 0x7f;
joelvonrotz 0:11ad6aaed10a 1002 break;
joelvonrotz 0:11ad6aaed10a 1003 default:
joelvonrotz 0:11ad6aaed10a 1004 Status = VL53L0X_ERROR_INVALID_PARAMS;
joelvonrotz 0:11ad6aaed10a 1005 }
joelvonrotz 0:11ad6aaed10a 1006 }
joelvonrotz 0:11ad6aaed10a 1007 }
joelvonrotz 0:11ad6aaed10a 1008
joelvonrotz 0:11ad6aaed10a 1009 if (SequenceConfigNew != SequenceConfig) {
joelvonrotz 0:11ad6aaed10a 1010 /* Apply New Setting */
joelvonrotz 0:11ad6aaed10a 1011 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1012 Status = VL53L0X_WrByte(Dev,
joelvonrotz 0:11ad6aaed10a 1013 VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, SequenceConfigNew);
joelvonrotz 0:11ad6aaed10a 1014 }
joelvonrotz 0:11ad6aaed10a 1015 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 1016 PALDevDataSet(Dev, SequenceConfig, SequenceConfigNew);
joelvonrotz 0:11ad6aaed10a 1017
joelvonrotz 0:11ad6aaed10a 1018
joelvonrotz 0:11ad6aaed10a 1019 /* Recalculate timing budget */
joelvonrotz 0:11ad6aaed10a 1020 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1021 VL53L0X_GETPARAMETERFIELD(Dev,
joelvonrotz 0:11ad6aaed10a 1022 MeasurementTimingBudgetMicroSeconds,
joelvonrotz 0:11ad6aaed10a 1023 MeasurementTimingBudgetMicroSeconds);
joelvonrotz 0:11ad6aaed10a 1024
joelvonrotz 0:11ad6aaed10a 1025 VL53L0X_SetMeasurementTimingBudgetMicroSeconds(Dev,
joelvonrotz 0:11ad6aaed10a 1026 MeasurementTimingBudgetMicroSeconds);
joelvonrotz 0:11ad6aaed10a 1027 }
joelvonrotz 0:11ad6aaed10a 1028 }
joelvonrotz 0:11ad6aaed10a 1029
joelvonrotz 0:11ad6aaed10a 1030
joelvonrotz 0:11ad6aaed10a 1031 return Status;
joelvonrotz 0:11ad6aaed10a 1032 }
joelvonrotz 0:11ad6aaed10a 1033
joelvonrotz 0:11ad6aaed10a 1034 VL53L0X_Error sequence_step_enabled(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 1035 VL53L0X_SequenceStepId SequenceStepId, uint8_t SequenceConfig,
joelvonrotz 0:11ad6aaed10a 1036 uint8_t *pSequenceStepEnabled)
joelvonrotz 0:11ad6aaed10a 1037 {
joelvonrotz 0:11ad6aaed10a 1038 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1039 *pSequenceStepEnabled = 0;
joelvonrotz 0:11ad6aaed10a 1040
joelvonrotz 0:11ad6aaed10a 1041 switch (SequenceStepId) {
joelvonrotz 0:11ad6aaed10a 1042 case VL53L0X_SEQUENCESTEP_TCC:
joelvonrotz 0:11ad6aaed10a 1043 *pSequenceStepEnabled = (SequenceConfig & 0x10) >> 4;
joelvonrotz 0:11ad6aaed10a 1044 break;
joelvonrotz 0:11ad6aaed10a 1045 case VL53L0X_SEQUENCESTEP_DSS:
joelvonrotz 0:11ad6aaed10a 1046 *pSequenceStepEnabled = (SequenceConfig & 0x08) >> 3;
joelvonrotz 0:11ad6aaed10a 1047 break;
joelvonrotz 0:11ad6aaed10a 1048 case VL53L0X_SEQUENCESTEP_MSRC:
joelvonrotz 0:11ad6aaed10a 1049 *pSequenceStepEnabled = (SequenceConfig & 0x04) >> 2;
joelvonrotz 0:11ad6aaed10a 1050 break;
joelvonrotz 0:11ad6aaed10a 1051 case VL53L0X_SEQUENCESTEP_PRE_RANGE:
joelvonrotz 0:11ad6aaed10a 1052 *pSequenceStepEnabled = (SequenceConfig & 0x40) >> 6;
joelvonrotz 0:11ad6aaed10a 1053 break;
joelvonrotz 0:11ad6aaed10a 1054 case VL53L0X_SEQUENCESTEP_FINAL_RANGE:
joelvonrotz 0:11ad6aaed10a 1055 *pSequenceStepEnabled = (SequenceConfig & 0x80) >> 7;
joelvonrotz 0:11ad6aaed10a 1056 break;
joelvonrotz 0:11ad6aaed10a 1057 default:
joelvonrotz 0:11ad6aaed10a 1058 Status = VL53L0X_ERROR_INVALID_PARAMS;
joelvonrotz 0:11ad6aaed10a 1059 }
joelvonrotz 0:11ad6aaed10a 1060
joelvonrotz 0:11ad6aaed10a 1061 return Status;
joelvonrotz 0:11ad6aaed10a 1062 }
joelvonrotz 0:11ad6aaed10a 1063
joelvonrotz 0:11ad6aaed10a 1064 VL53L0X_Error VL53L0X_GetSequenceStepEnable(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 1065 VL53L0X_SequenceStepId SequenceStepId, uint8_t *pSequenceStepEnabled)
joelvonrotz 0:11ad6aaed10a 1066 {
joelvonrotz 0:11ad6aaed10a 1067 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1068 uint8_t SequenceConfig = 0;
joelvonrotz 0:11ad6aaed10a 1069
joelvonrotz 0:11ad6aaed10a 1070 Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG,
joelvonrotz 0:11ad6aaed10a 1071 &SequenceConfig);
joelvonrotz 0:11ad6aaed10a 1072
joelvonrotz 0:11ad6aaed10a 1073 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1074 Status = sequence_step_enabled(Dev, SequenceStepId,
joelvonrotz 0:11ad6aaed10a 1075 SequenceConfig, pSequenceStepEnabled);
joelvonrotz 0:11ad6aaed10a 1076 }
joelvonrotz 0:11ad6aaed10a 1077
joelvonrotz 0:11ad6aaed10a 1078 return Status;
joelvonrotz 0:11ad6aaed10a 1079 }
joelvonrotz 0:11ad6aaed10a 1080
joelvonrotz 0:11ad6aaed10a 1081 VL53L0X_Error VL53L0X_GetSequenceStepEnables(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 1082 VL53L0X_SchedulerSequenceSteps_t *pSchedulerSequenceSteps)
joelvonrotz 0:11ad6aaed10a 1083 {
joelvonrotz 0:11ad6aaed10a 1084 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1085 uint8_t SequenceConfig = 0;
joelvonrotz 0:11ad6aaed10a 1086
joelvonrotz 0:11ad6aaed10a 1087 Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG,
joelvonrotz 0:11ad6aaed10a 1088 &SequenceConfig);
joelvonrotz 0:11ad6aaed10a 1089
joelvonrotz 0:11ad6aaed10a 1090 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1091 Status = sequence_step_enabled(Dev,
joelvonrotz 0:11ad6aaed10a 1092 VL53L0X_SEQUENCESTEP_TCC, SequenceConfig,
joelvonrotz 0:11ad6aaed10a 1093 &pSchedulerSequenceSteps->TccOn);
joelvonrotz 0:11ad6aaed10a 1094 }
joelvonrotz 0:11ad6aaed10a 1095 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1096 Status = sequence_step_enabled(Dev,
joelvonrotz 0:11ad6aaed10a 1097 VL53L0X_SEQUENCESTEP_DSS, SequenceConfig,
joelvonrotz 0:11ad6aaed10a 1098 &pSchedulerSequenceSteps->DssOn);
joelvonrotz 0:11ad6aaed10a 1099 }
joelvonrotz 0:11ad6aaed10a 1100 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1101 Status = sequence_step_enabled(Dev,
joelvonrotz 0:11ad6aaed10a 1102 VL53L0X_SEQUENCESTEP_MSRC, SequenceConfig,
joelvonrotz 0:11ad6aaed10a 1103 &pSchedulerSequenceSteps->MsrcOn);
joelvonrotz 0:11ad6aaed10a 1104 }
joelvonrotz 0:11ad6aaed10a 1105 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1106 Status = sequence_step_enabled(Dev,
joelvonrotz 0:11ad6aaed10a 1107 VL53L0X_SEQUENCESTEP_PRE_RANGE, SequenceConfig,
joelvonrotz 0:11ad6aaed10a 1108 &pSchedulerSequenceSteps->PreRangeOn);
joelvonrotz 0:11ad6aaed10a 1109 }
joelvonrotz 0:11ad6aaed10a 1110 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1111 Status = sequence_step_enabled(Dev,
joelvonrotz 0:11ad6aaed10a 1112 VL53L0X_SEQUENCESTEP_FINAL_RANGE, SequenceConfig,
joelvonrotz 0:11ad6aaed10a 1113 &pSchedulerSequenceSteps->FinalRangeOn);
joelvonrotz 0:11ad6aaed10a 1114 }
joelvonrotz 0:11ad6aaed10a 1115
joelvonrotz 0:11ad6aaed10a 1116 return Status;
joelvonrotz 0:11ad6aaed10a 1117 }
joelvonrotz 0:11ad6aaed10a 1118
joelvonrotz 0:11ad6aaed10a 1119 VL53L0X_Error VL53L0X_GetNumberOfSequenceSteps(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 1120 uint8_t *pNumberOfSequenceSteps)
joelvonrotz 0:11ad6aaed10a 1121 {
joelvonrotz 0:11ad6aaed10a 1122 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1123
joelvonrotz 0:11ad6aaed10a 1124 *pNumberOfSequenceSteps = VL53L0X_SEQUENCESTEP_NUMBER_OF_CHECKS;
joelvonrotz 0:11ad6aaed10a 1125
joelvonrotz 0:11ad6aaed10a 1126 return Status;
joelvonrotz 0:11ad6aaed10a 1127 }
joelvonrotz 0:11ad6aaed10a 1128
joelvonrotz 0:11ad6aaed10a 1129 VL53L0X_Error VL53L0X_GetSequenceStepsInfo(VL53L0X_SequenceStepId SequenceStepId,
joelvonrotz 0:11ad6aaed10a 1130 char *pSequenceStepsString)
joelvonrotz 0:11ad6aaed10a 1131 {
joelvonrotz 0:11ad6aaed10a 1132 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1133
joelvonrotz 0:11ad6aaed10a 1134 Status = VL53L0X_get_sequence_steps_info(
joelvonrotz 0:11ad6aaed10a 1135 SequenceStepId,
joelvonrotz 0:11ad6aaed10a 1136 pSequenceStepsString);
joelvonrotz 0:11ad6aaed10a 1137
joelvonrotz 0:11ad6aaed10a 1138
joelvonrotz 0:11ad6aaed10a 1139 return Status;
joelvonrotz 0:11ad6aaed10a 1140 }
joelvonrotz 0:11ad6aaed10a 1141
joelvonrotz 0:11ad6aaed10a 1142 VL53L0X_Error VL53L0X_SetSequenceStepTimeout(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 1143 VL53L0X_SequenceStepId SequenceStepId, FixPoint1616_t TimeOutMilliSecs)
joelvonrotz 0:11ad6aaed10a 1144 {
joelvonrotz 0:11ad6aaed10a 1145 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1146 VL53L0X_Error Status1 = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1147 uint32_t TimeoutMicroSeconds = ((TimeOutMilliSecs * 1000) + 0x8000)
joelvonrotz 0:11ad6aaed10a 1148 >> 16;
joelvonrotz 0:11ad6aaed10a 1149 uint32_t MeasurementTimingBudgetMicroSeconds;
joelvonrotz 0:11ad6aaed10a 1150 FixPoint1616_t OldTimeOutMicroSeconds;
joelvonrotz 0:11ad6aaed10a 1151
joelvonrotz 0:11ad6aaed10a 1152
joelvonrotz 0:11ad6aaed10a 1153 /* Read back the current value in case we need to revert back to this.
joelvonrotz 0:11ad6aaed10a 1154 */
joelvonrotz 0:11ad6aaed10a 1155 Status = get_sequence_step_timeout(Dev, SequenceStepId,
joelvonrotz 0:11ad6aaed10a 1156 &OldTimeOutMicroSeconds);
joelvonrotz 0:11ad6aaed10a 1157
joelvonrotz 0:11ad6aaed10a 1158 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1159 Status = set_sequence_step_timeout(Dev, SequenceStepId,
joelvonrotz 0:11ad6aaed10a 1160 TimeoutMicroSeconds);
joelvonrotz 0:11ad6aaed10a 1161 }
joelvonrotz 0:11ad6aaed10a 1162
joelvonrotz 0:11ad6aaed10a 1163 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1164 VL53L0X_GETPARAMETERFIELD(Dev,
joelvonrotz 0:11ad6aaed10a 1165 MeasurementTimingBudgetMicroSeconds,
joelvonrotz 0:11ad6aaed10a 1166 MeasurementTimingBudgetMicroSeconds);
joelvonrotz 0:11ad6aaed10a 1167
joelvonrotz 0:11ad6aaed10a 1168 /* At this point we don't know if the requested value is valid,
joelvonrotz 0:11ad6aaed10a 1169 therefore proceed to update the entire timing budget and
joelvonrotz 0:11ad6aaed10a 1170 if this fails, revert back to the previous value.
joelvonrotz 0:11ad6aaed10a 1171 */
joelvonrotz 0:11ad6aaed10a 1172 Status = VL53L0X_SetMeasurementTimingBudgetMicroSeconds(Dev,
joelvonrotz 0:11ad6aaed10a 1173 MeasurementTimingBudgetMicroSeconds);
joelvonrotz 0:11ad6aaed10a 1174
joelvonrotz 0:11ad6aaed10a 1175 if (Status != VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1176 Status1 = set_sequence_step_timeout(Dev, SequenceStepId,
joelvonrotz 0:11ad6aaed10a 1177 OldTimeOutMicroSeconds);
joelvonrotz 0:11ad6aaed10a 1178
joelvonrotz 0:11ad6aaed10a 1179 if (Status1 == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1180 Status1 =
joelvonrotz 0:11ad6aaed10a 1181 VL53L0X_SetMeasurementTimingBudgetMicroSeconds(
joelvonrotz 0:11ad6aaed10a 1182 Dev,
joelvonrotz 0:11ad6aaed10a 1183 MeasurementTimingBudgetMicroSeconds);
joelvonrotz 0:11ad6aaed10a 1184 }
joelvonrotz 0:11ad6aaed10a 1185
joelvonrotz 0:11ad6aaed10a 1186 Status = Status1;
joelvonrotz 0:11ad6aaed10a 1187 }
joelvonrotz 0:11ad6aaed10a 1188 }
joelvonrotz 0:11ad6aaed10a 1189
joelvonrotz 0:11ad6aaed10a 1190
joelvonrotz 0:11ad6aaed10a 1191 return Status;
joelvonrotz 0:11ad6aaed10a 1192 }
joelvonrotz 0:11ad6aaed10a 1193
joelvonrotz 0:11ad6aaed10a 1194 VL53L0X_Error VL53L0X_GetSequenceStepTimeout(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 1195 VL53L0X_SequenceStepId SequenceStepId, FixPoint1616_t *pTimeOutMilliSecs)
joelvonrotz 0:11ad6aaed10a 1196 {
joelvonrotz 0:11ad6aaed10a 1197 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1198 uint32_t TimeoutMicroSeconds;
joelvonrotz 0:11ad6aaed10a 1199
joelvonrotz 0:11ad6aaed10a 1200 Status = get_sequence_step_timeout(Dev, SequenceStepId,
joelvonrotz 0:11ad6aaed10a 1201 &TimeoutMicroSeconds);
joelvonrotz 0:11ad6aaed10a 1202 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1203 TimeoutMicroSeconds <<= 8;
joelvonrotz 0:11ad6aaed10a 1204 *pTimeOutMilliSecs = (TimeoutMicroSeconds + 500)/1000;
joelvonrotz 0:11ad6aaed10a 1205 *pTimeOutMilliSecs <<= 8;
joelvonrotz 0:11ad6aaed10a 1206 }
joelvonrotz 0:11ad6aaed10a 1207
joelvonrotz 0:11ad6aaed10a 1208 return Status;
joelvonrotz 0:11ad6aaed10a 1209 }
joelvonrotz 0:11ad6aaed10a 1210
joelvonrotz 0:11ad6aaed10a 1211 VL53L0X_Error VL53L0X_SetInterMeasurementPeriodMilliSeconds(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 1212 uint32_t InterMeasurementPeriodMilliSeconds)
joelvonrotz 0:11ad6aaed10a 1213 {
joelvonrotz 0:11ad6aaed10a 1214 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1215 uint16_t osc_calibrate_val;
joelvonrotz 0:11ad6aaed10a 1216 uint32_t IMPeriodMilliSeconds;
joelvonrotz 0:11ad6aaed10a 1217
joelvonrotz 0:11ad6aaed10a 1218
joelvonrotz 0:11ad6aaed10a 1219 Status = VL53L0X_RdWord(Dev, VL53L0X_REG_OSC_CALIBRATE_VAL,
joelvonrotz 0:11ad6aaed10a 1220 &osc_calibrate_val);
joelvonrotz 0:11ad6aaed10a 1221
joelvonrotz 0:11ad6aaed10a 1222 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1223 if (osc_calibrate_val != 0) {
joelvonrotz 0:11ad6aaed10a 1224 IMPeriodMilliSeconds =
joelvonrotz 0:11ad6aaed10a 1225 InterMeasurementPeriodMilliSeconds
joelvonrotz 0:11ad6aaed10a 1226 * osc_calibrate_val;
joelvonrotz 0:11ad6aaed10a 1227 } else {
joelvonrotz 0:11ad6aaed10a 1228 IMPeriodMilliSeconds =
joelvonrotz 0:11ad6aaed10a 1229 InterMeasurementPeriodMilliSeconds;
joelvonrotz 0:11ad6aaed10a 1230 }
joelvonrotz 0:11ad6aaed10a 1231 Status = VL53L0X_WrDWord(Dev,
joelvonrotz 0:11ad6aaed10a 1232 VL53L0X_REG_SYSTEM_INTERMEASUREMENT_PERIOD,
joelvonrotz 0:11ad6aaed10a 1233 IMPeriodMilliSeconds);
joelvonrotz 0:11ad6aaed10a 1234 }
joelvonrotz 0:11ad6aaed10a 1235
joelvonrotz 0:11ad6aaed10a 1236 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1237 VL53L0X_SETPARAMETERFIELD(Dev,
joelvonrotz 0:11ad6aaed10a 1238 InterMeasurementPeriodMilliSeconds,
joelvonrotz 0:11ad6aaed10a 1239 InterMeasurementPeriodMilliSeconds);
joelvonrotz 0:11ad6aaed10a 1240 }
joelvonrotz 0:11ad6aaed10a 1241
joelvonrotz 0:11ad6aaed10a 1242 return Status;
joelvonrotz 0:11ad6aaed10a 1243 }
joelvonrotz 0:11ad6aaed10a 1244
joelvonrotz 0:11ad6aaed10a 1245 VL53L0X_Error VL53L0X_GetInterMeasurementPeriodMilliSeconds(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 1246 uint32_t *pInterMeasurementPeriodMilliSeconds)
joelvonrotz 0:11ad6aaed10a 1247 {
joelvonrotz 0:11ad6aaed10a 1248 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1249 uint16_t osc_calibrate_val;
joelvonrotz 0:11ad6aaed10a 1250 uint32_t IMPeriodMilliSeconds;
joelvonrotz 0:11ad6aaed10a 1251
joelvonrotz 0:11ad6aaed10a 1252
joelvonrotz 0:11ad6aaed10a 1253 Status = VL53L0X_RdWord(Dev, VL53L0X_REG_OSC_CALIBRATE_VAL,
joelvonrotz 0:11ad6aaed10a 1254 &osc_calibrate_val);
joelvonrotz 0:11ad6aaed10a 1255
joelvonrotz 0:11ad6aaed10a 1256 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1257 Status = VL53L0X_RdDWord(Dev,
joelvonrotz 0:11ad6aaed10a 1258 VL53L0X_REG_SYSTEM_INTERMEASUREMENT_PERIOD,
joelvonrotz 0:11ad6aaed10a 1259 &IMPeriodMilliSeconds);
joelvonrotz 0:11ad6aaed10a 1260 }
joelvonrotz 0:11ad6aaed10a 1261
joelvonrotz 0:11ad6aaed10a 1262 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1263 if (osc_calibrate_val != 0) {
joelvonrotz 0:11ad6aaed10a 1264 *pInterMeasurementPeriodMilliSeconds =
joelvonrotz 0:11ad6aaed10a 1265 IMPeriodMilliSeconds / osc_calibrate_val;
joelvonrotz 0:11ad6aaed10a 1266 }
joelvonrotz 0:11ad6aaed10a 1267 VL53L0X_SETPARAMETERFIELD(Dev,
joelvonrotz 0:11ad6aaed10a 1268 InterMeasurementPeriodMilliSeconds,
joelvonrotz 0:11ad6aaed10a 1269 *pInterMeasurementPeriodMilliSeconds);
joelvonrotz 0:11ad6aaed10a 1270 }
joelvonrotz 0:11ad6aaed10a 1271
joelvonrotz 0:11ad6aaed10a 1272 return Status;
joelvonrotz 0:11ad6aaed10a 1273 }
joelvonrotz 0:11ad6aaed10a 1274
joelvonrotz 0:11ad6aaed10a 1275 VL53L0X_Error VL53L0X_SetXTalkCompensationEnable(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 1276 uint8_t XTalkCompensationEnable)
joelvonrotz 0:11ad6aaed10a 1277 {
joelvonrotz 0:11ad6aaed10a 1278 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1279 FixPoint1616_t TempFix1616;
joelvonrotz 0:11ad6aaed10a 1280 uint16_t LinearityCorrectiveGain;
joelvonrotz 0:11ad6aaed10a 1281
joelvonrotz 0:11ad6aaed10a 1282
joelvonrotz 0:11ad6aaed10a 1283 LinearityCorrectiveGain = PALDevDataGet(Dev, LinearityCorrectiveGain);
joelvonrotz 0:11ad6aaed10a 1284
joelvonrotz 0:11ad6aaed10a 1285 if ((XTalkCompensationEnable == 0)
joelvonrotz 0:11ad6aaed10a 1286 || (LinearityCorrectiveGain != 1000)) {
joelvonrotz 0:11ad6aaed10a 1287 TempFix1616 = 0;
joelvonrotz 0:11ad6aaed10a 1288 } else {
joelvonrotz 0:11ad6aaed10a 1289 VL53L0X_GETPARAMETERFIELD(Dev, XTalkCompensationRateMegaCps,
joelvonrotz 0:11ad6aaed10a 1290 TempFix1616);
joelvonrotz 0:11ad6aaed10a 1291 }
joelvonrotz 0:11ad6aaed10a 1292
joelvonrotz 0:11ad6aaed10a 1293 /* the following register has a format 3.13 */
joelvonrotz 0:11ad6aaed10a 1294 Status = VL53L0X_WrWord(Dev,
joelvonrotz 0:11ad6aaed10a 1295 VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS,
joelvonrotz 0:11ad6aaed10a 1296 VL53L0X_FIXPOINT1616TOFIXPOINT313(TempFix1616));
joelvonrotz 0:11ad6aaed10a 1297
joelvonrotz 0:11ad6aaed10a 1298 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1299 if (XTalkCompensationEnable == 0) {
joelvonrotz 0:11ad6aaed10a 1300 VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationEnable,
joelvonrotz 0:11ad6aaed10a 1301 0);
joelvonrotz 0:11ad6aaed10a 1302 } else {
joelvonrotz 0:11ad6aaed10a 1303 VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationEnable,
joelvonrotz 0:11ad6aaed10a 1304 1);
joelvonrotz 0:11ad6aaed10a 1305 }
joelvonrotz 0:11ad6aaed10a 1306 }
joelvonrotz 0:11ad6aaed10a 1307
joelvonrotz 0:11ad6aaed10a 1308 return Status;
joelvonrotz 0:11ad6aaed10a 1309 }
joelvonrotz 0:11ad6aaed10a 1310
joelvonrotz 0:11ad6aaed10a 1311 VL53L0X_Error VL53L0X_GetXTalkCompensationEnable(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 1312 uint8_t *pXTalkCompensationEnable)
joelvonrotz 0:11ad6aaed10a 1313 {
joelvonrotz 0:11ad6aaed10a 1314 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1315 uint8_t Temp8;
joelvonrotz 0:11ad6aaed10a 1316
joelvonrotz 0:11ad6aaed10a 1317 VL53L0X_GETPARAMETERFIELD(Dev, XTalkCompensationEnable, Temp8);
joelvonrotz 0:11ad6aaed10a 1318 *pXTalkCompensationEnable = Temp8;
joelvonrotz 0:11ad6aaed10a 1319
joelvonrotz 0:11ad6aaed10a 1320 return Status;
joelvonrotz 0:11ad6aaed10a 1321 }
joelvonrotz 0:11ad6aaed10a 1322
joelvonrotz 0:11ad6aaed10a 1323 VL53L0X_Error VL53L0X_SetXTalkCompensationRateMegaCps(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 1324 FixPoint1616_t XTalkCompensationRateMegaCps)
joelvonrotz 0:11ad6aaed10a 1325 {
joelvonrotz 0:11ad6aaed10a 1326 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1327 uint8_t Temp8;
joelvonrotz 0:11ad6aaed10a 1328 uint16_t LinearityCorrectiveGain;
joelvonrotz 0:11ad6aaed10a 1329 uint16_t data;
joelvonrotz 0:11ad6aaed10a 1330
joelvonrotz 0:11ad6aaed10a 1331 VL53L0X_GETPARAMETERFIELD(Dev, XTalkCompensationEnable, Temp8);
joelvonrotz 0:11ad6aaed10a 1332 LinearityCorrectiveGain = PALDevDataGet(Dev, LinearityCorrectiveGain);
joelvonrotz 0:11ad6aaed10a 1333
joelvonrotz 0:11ad6aaed10a 1334 if (Temp8 == 0) { /* disabled write only internal value */
joelvonrotz 0:11ad6aaed10a 1335 VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationRateMegaCps,
joelvonrotz 0:11ad6aaed10a 1336 XTalkCompensationRateMegaCps);
joelvonrotz 0:11ad6aaed10a 1337 } else {
joelvonrotz 0:11ad6aaed10a 1338 /* the following register has a format 3.13 */
joelvonrotz 0:11ad6aaed10a 1339 if (LinearityCorrectiveGain == 1000) {
joelvonrotz 0:11ad6aaed10a 1340 data = VL53L0X_FIXPOINT1616TOFIXPOINT313(
joelvonrotz 0:11ad6aaed10a 1341 XTalkCompensationRateMegaCps);
joelvonrotz 0:11ad6aaed10a 1342 } else {
joelvonrotz 0:11ad6aaed10a 1343 data = 0;
joelvonrotz 0:11ad6aaed10a 1344 }
joelvonrotz 0:11ad6aaed10a 1345
joelvonrotz 0:11ad6aaed10a 1346 Status = VL53L0X_WrWord(Dev,
joelvonrotz 0:11ad6aaed10a 1347 VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS, data);
joelvonrotz 0:11ad6aaed10a 1348
joelvonrotz 0:11ad6aaed10a 1349 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1350 VL53L0X_SETPARAMETERFIELD(Dev,
joelvonrotz 0:11ad6aaed10a 1351 XTalkCompensationRateMegaCps,
joelvonrotz 0:11ad6aaed10a 1352 XTalkCompensationRateMegaCps);
joelvonrotz 0:11ad6aaed10a 1353 }
joelvonrotz 0:11ad6aaed10a 1354 }
joelvonrotz 0:11ad6aaed10a 1355
joelvonrotz 0:11ad6aaed10a 1356 return Status;
joelvonrotz 0:11ad6aaed10a 1357 }
joelvonrotz 0:11ad6aaed10a 1358
joelvonrotz 0:11ad6aaed10a 1359 VL53L0X_Error VL53L0X_GetXTalkCompensationRateMegaCps(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 1360 FixPoint1616_t *pXTalkCompensationRateMegaCps)
joelvonrotz 0:11ad6aaed10a 1361 {
joelvonrotz 0:11ad6aaed10a 1362 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1363 uint16_t Value;
joelvonrotz 0:11ad6aaed10a 1364 FixPoint1616_t TempFix1616;
joelvonrotz 0:11ad6aaed10a 1365
joelvonrotz 0:11ad6aaed10a 1366
joelvonrotz 0:11ad6aaed10a 1367 Status = VL53L0X_RdWord(Dev,
joelvonrotz 0:11ad6aaed10a 1368 VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS, (uint16_t *)&Value);
joelvonrotz 0:11ad6aaed10a 1369 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1370 if (Value == 0) {
joelvonrotz 0:11ad6aaed10a 1371 /* the Xtalk is disabled return value from memory */
joelvonrotz 0:11ad6aaed10a 1372 VL53L0X_GETPARAMETERFIELD(Dev,
joelvonrotz 0:11ad6aaed10a 1373 XTalkCompensationRateMegaCps, TempFix1616);
joelvonrotz 0:11ad6aaed10a 1374 *pXTalkCompensationRateMegaCps = TempFix1616;
joelvonrotz 0:11ad6aaed10a 1375 VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationEnable,
joelvonrotz 0:11ad6aaed10a 1376 0);
joelvonrotz 0:11ad6aaed10a 1377 } else {
joelvonrotz 0:11ad6aaed10a 1378 TempFix1616 = VL53L0X_FIXPOINT313TOFIXPOINT1616(Value);
joelvonrotz 0:11ad6aaed10a 1379 *pXTalkCompensationRateMegaCps = TempFix1616;
joelvonrotz 0:11ad6aaed10a 1380 VL53L0X_SETPARAMETERFIELD(Dev,
joelvonrotz 0:11ad6aaed10a 1381 XTalkCompensationRateMegaCps, TempFix1616);
joelvonrotz 0:11ad6aaed10a 1382 VL53L0X_SETPARAMETERFIELD(Dev, XTalkCompensationEnable,
joelvonrotz 0:11ad6aaed10a 1383 1);
joelvonrotz 0:11ad6aaed10a 1384 }
joelvonrotz 0:11ad6aaed10a 1385 }
joelvonrotz 0:11ad6aaed10a 1386
joelvonrotz 0:11ad6aaed10a 1387 return Status;
joelvonrotz 0:11ad6aaed10a 1388 }
joelvonrotz 0:11ad6aaed10a 1389
joelvonrotz 0:11ad6aaed10a 1390 VL53L0X_Error VL53L0X_SetRefCalibration(VL53L0X_DEV Dev, uint8_t VhvSettings,
joelvonrotz 0:11ad6aaed10a 1391 uint8_t PhaseCal)
joelvonrotz 0:11ad6aaed10a 1392 {
joelvonrotz 0:11ad6aaed10a 1393 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1394
joelvonrotz 0:11ad6aaed10a 1395 Status = VL53L0X_set_ref_calibration(Dev, VhvSettings, PhaseCal);
joelvonrotz 0:11ad6aaed10a 1396
joelvonrotz 0:11ad6aaed10a 1397 return Status;
joelvonrotz 0:11ad6aaed10a 1398 }
joelvonrotz 0:11ad6aaed10a 1399
joelvonrotz 0:11ad6aaed10a 1400 VL53L0X_Error VL53L0X_GetRefCalibration(VL53L0X_DEV Dev, uint8_t *pVhvSettings,
joelvonrotz 0:11ad6aaed10a 1401 uint8_t *pPhaseCal)
joelvonrotz 0:11ad6aaed10a 1402 {
joelvonrotz 0:11ad6aaed10a 1403 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1404
joelvonrotz 0:11ad6aaed10a 1405 Status = VL53L0X_get_ref_calibration(Dev, pVhvSettings, pPhaseCal);
joelvonrotz 0:11ad6aaed10a 1406
joelvonrotz 0:11ad6aaed10a 1407 return Status;
joelvonrotz 0:11ad6aaed10a 1408 }
joelvonrotz 0:11ad6aaed10a 1409
joelvonrotz 0:11ad6aaed10a 1410 /*
joelvonrotz 0:11ad6aaed10a 1411 * CHECK LIMIT FUNCTIONS
joelvonrotz 0:11ad6aaed10a 1412 */
joelvonrotz 0:11ad6aaed10a 1413
joelvonrotz 0:11ad6aaed10a 1414 VL53L0X_Error VL53L0X_GetNumberOfLimitCheck(uint16_t *pNumberOfLimitCheck)
joelvonrotz 0:11ad6aaed10a 1415 {
joelvonrotz 0:11ad6aaed10a 1416 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1417
joelvonrotz 0:11ad6aaed10a 1418 *pNumberOfLimitCheck = VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS;
joelvonrotz 0:11ad6aaed10a 1419
joelvonrotz 0:11ad6aaed10a 1420 return Status;
joelvonrotz 0:11ad6aaed10a 1421 }
joelvonrotz 0:11ad6aaed10a 1422
joelvonrotz 0:11ad6aaed10a 1423 VL53L0X_Error VL53L0X_GetLimitCheckInfo(VL53L0X_DEV Dev, uint16_t LimitCheckId,
joelvonrotz 0:11ad6aaed10a 1424 char *pLimitCheckString)
joelvonrotz 0:11ad6aaed10a 1425 {
joelvonrotz 0:11ad6aaed10a 1426 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1427
joelvonrotz 0:11ad6aaed10a 1428
joelvonrotz 0:11ad6aaed10a 1429 Status = VL53L0X_get_limit_check_info(Dev, LimitCheckId,
joelvonrotz 0:11ad6aaed10a 1430 pLimitCheckString);
joelvonrotz 0:11ad6aaed10a 1431
joelvonrotz 0:11ad6aaed10a 1432 return Status;
joelvonrotz 0:11ad6aaed10a 1433 }
joelvonrotz 0:11ad6aaed10a 1434
joelvonrotz 0:11ad6aaed10a 1435 VL53L0X_Error VL53L0X_GetLimitCheckStatus(VL53L0X_DEV Dev, uint16_t LimitCheckId,
joelvonrotz 0:11ad6aaed10a 1436 uint8_t *pLimitCheckStatus)
joelvonrotz 0:11ad6aaed10a 1437 {
joelvonrotz 0:11ad6aaed10a 1438 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1439 uint8_t Temp8;
joelvonrotz 0:11ad6aaed10a 1440
joelvonrotz 0:11ad6aaed10a 1441
joelvonrotz 0:11ad6aaed10a 1442 if (LimitCheckId >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS) {
joelvonrotz 0:11ad6aaed10a 1443 Status = VL53L0X_ERROR_INVALID_PARAMS;
joelvonrotz 0:11ad6aaed10a 1444 } else {
joelvonrotz 0:11ad6aaed10a 1445
joelvonrotz 0:11ad6aaed10a 1446 VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksStatus,
joelvonrotz 0:11ad6aaed10a 1447 LimitCheckId, Temp8);
joelvonrotz 0:11ad6aaed10a 1448
joelvonrotz 0:11ad6aaed10a 1449 *pLimitCheckStatus = Temp8;
joelvonrotz 0:11ad6aaed10a 1450
joelvonrotz 0:11ad6aaed10a 1451 }
joelvonrotz 0:11ad6aaed10a 1452
joelvonrotz 0:11ad6aaed10a 1453 return Status;
joelvonrotz 0:11ad6aaed10a 1454 }
joelvonrotz 0:11ad6aaed10a 1455
joelvonrotz 0:11ad6aaed10a 1456 VL53L0X_Error VL53L0X_SetLimitCheckEnable(VL53L0X_DEV Dev, uint16_t LimitCheckId,
joelvonrotz 0:11ad6aaed10a 1457 uint8_t LimitCheckEnable)
joelvonrotz 0:11ad6aaed10a 1458 {
joelvonrotz 0:11ad6aaed10a 1459 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1460 FixPoint1616_t TempFix1616 = 0;
joelvonrotz 0:11ad6aaed10a 1461 uint8_t LimitCheckEnableInt = 0;
joelvonrotz 0:11ad6aaed10a 1462 uint8_t LimitCheckDisable = 0;
joelvonrotz 0:11ad6aaed10a 1463 uint8_t Temp8;
joelvonrotz 0:11ad6aaed10a 1464
joelvonrotz 0:11ad6aaed10a 1465
joelvonrotz 0:11ad6aaed10a 1466 if (LimitCheckId >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS) {
joelvonrotz 0:11ad6aaed10a 1467 Status = VL53L0X_ERROR_INVALID_PARAMS;
joelvonrotz 0:11ad6aaed10a 1468 } else {
joelvonrotz 0:11ad6aaed10a 1469 if (LimitCheckEnable == 0) {
joelvonrotz 0:11ad6aaed10a 1470 TempFix1616 = 0;
joelvonrotz 0:11ad6aaed10a 1471 LimitCheckEnableInt = 0;
joelvonrotz 0:11ad6aaed10a 1472 LimitCheckDisable = 1;
joelvonrotz 0:11ad6aaed10a 1473
joelvonrotz 0:11ad6aaed10a 1474 } else {
joelvonrotz 0:11ad6aaed10a 1475 VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksValue,
joelvonrotz 0:11ad6aaed10a 1476 LimitCheckId, TempFix1616);
joelvonrotz 0:11ad6aaed10a 1477 LimitCheckDisable = 0;
joelvonrotz 0:11ad6aaed10a 1478 /* this to be sure to have either 0 or 1 */
joelvonrotz 0:11ad6aaed10a 1479 LimitCheckEnableInt = 1;
joelvonrotz 0:11ad6aaed10a 1480 }
joelvonrotz 0:11ad6aaed10a 1481
joelvonrotz 0:11ad6aaed10a 1482 switch (LimitCheckId) {
joelvonrotz 0:11ad6aaed10a 1483
joelvonrotz 0:11ad6aaed10a 1484 case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE:
joelvonrotz 0:11ad6aaed10a 1485 /* internal computation: */
joelvonrotz 0:11ad6aaed10a 1486 VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable,
joelvonrotz 0:11ad6aaed10a 1487 VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,
joelvonrotz 0:11ad6aaed10a 1488 LimitCheckEnableInt);
joelvonrotz 0:11ad6aaed10a 1489
joelvonrotz 0:11ad6aaed10a 1490 break;
joelvonrotz 0:11ad6aaed10a 1491
joelvonrotz 0:11ad6aaed10a 1492 case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE:
joelvonrotz 0:11ad6aaed10a 1493
joelvonrotz 0:11ad6aaed10a 1494 Status = VL53L0X_WrWord(Dev,
joelvonrotz 0:11ad6aaed10a 1495 VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT,
joelvonrotz 0:11ad6aaed10a 1496 VL53L0X_FIXPOINT1616TOFIXPOINT97(TempFix1616));
joelvonrotz 0:11ad6aaed10a 1497
joelvonrotz 0:11ad6aaed10a 1498 break;
joelvonrotz 0:11ad6aaed10a 1499
joelvonrotz 0:11ad6aaed10a 1500 case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP:
joelvonrotz 0:11ad6aaed10a 1501
joelvonrotz 0:11ad6aaed10a 1502 /* internal computation: */
joelvonrotz 0:11ad6aaed10a 1503 VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable,
joelvonrotz 0:11ad6aaed10a 1504 VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP,
joelvonrotz 0:11ad6aaed10a 1505 LimitCheckEnableInt);
joelvonrotz 0:11ad6aaed10a 1506
joelvonrotz 0:11ad6aaed10a 1507 break;
joelvonrotz 0:11ad6aaed10a 1508
joelvonrotz 0:11ad6aaed10a 1509 case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD:
joelvonrotz 0:11ad6aaed10a 1510
joelvonrotz 0:11ad6aaed10a 1511 /* internal computation: */
joelvonrotz 0:11ad6aaed10a 1512 VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable,
joelvonrotz 0:11ad6aaed10a 1513 VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD,
joelvonrotz 0:11ad6aaed10a 1514 LimitCheckEnableInt);
joelvonrotz 0:11ad6aaed10a 1515
joelvonrotz 0:11ad6aaed10a 1516 break;
joelvonrotz 0:11ad6aaed10a 1517
joelvonrotz 0:11ad6aaed10a 1518 case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC:
joelvonrotz 0:11ad6aaed10a 1519
joelvonrotz 0:11ad6aaed10a 1520 Temp8 = (uint8_t)(LimitCheckDisable << 1);
joelvonrotz 0:11ad6aaed10a 1521 Status = VL53L0X_UpdateByte(Dev,
joelvonrotz 0:11ad6aaed10a 1522 VL53L0X_REG_MSRC_CONFIG_CONTROL,
joelvonrotz 0:11ad6aaed10a 1523 0xFE, Temp8);
joelvonrotz 0:11ad6aaed10a 1524
joelvonrotz 0:11ad6aaed10a 1525 break;
joelvonrotz 0:11ad6aaed10a 1526
joelvonrotz 0:11ad6aaed10a 1527 case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE:
joelvonrotz 0:11ad6aaed10a 1528
joelvonrotz 0:11ad6aaed10a 1529 Temp8 = (uint8_t)(LimitCheckDisable << 4);
joelvonrotz 0:11ad6aaed10a 1530 Status = VL53L0X_UpdateByte(Dev,
joelvonrotz 0:11ad6aaed10a 1531 VL53L0X_REG_MSRC_CONFIG_CONTROL,
joelvonrotz 0:11ad6aaed10a 1532 0xEF, Temp8);
joelvonrotz 0:11ad6aaed10a 1533
joelvonrotz 0:11ad6aaed10a 1534 break;
joelvonrotz 0:11ad6aaed10a 1535
joelvonrotz 0:11ad6aaed10a 1536
joelvonrotz 0:11ad6aaed10a 1537 default:
joelvonrotz 0:11ad6aaed10a 1538 Status = VL53L0X_ERROR_INVALID_PARAMS;
joelvonrotz 0:11ad6aaed10a 1539
joelvonrotz 0:11ad6aaed10a 1540 }
joelvonrotz 0:11ad6aaed10a 1541
joelvonrotz 0:11ad6aaed10a 1542 }
joelvonrotz 0:11ad6aaed10a 1543
joelvonrotz 0:11ad6aaed10a 1544 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1545 if (LimitCheckEnable == 0) {
joelvonrotz 0:11ad6aaed10a 1546 VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable,
joelvonrotz 0:11ad6aaed10a 1547 LimitCheckId, 0);
joelvonrotz 0:11ad6aaed10a 1548 } else {
joelvonrotz 0:11ad6aaed10a 1549 VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksEnable,
joelvonrotz 0:11ad6aaed10a 1550 LimitCheckId, 1);
joelvonrotz 0:11ad6aaed10a 1551 }
joelvonrotz 0:11ad6aaed10a 1552 }
joelvonrotz 0:11ad6aaed10a 1553
joelvonrotz 0:11ad6aaed10a 1554 return Status;
joelvonrotz 0:11ad6aaed10a 1555 }
joelvonrotz 0:11ad6aaed10a 1556
joelvonrotz 0:11ad6aaed10a 1557 VL53L0X_Error VL53L0X_GetLimitCheckEnable(VL53L0X_DEV Dev, uint16_t LimitCheckId,
joelvonrotz 0:11ad6aaed10a 1558 uint8_t *pLimitCheckEnable)
joelvonrotz 0:11ad6aaed10a 1559 {
joelvonrotz 0:11ad6aaed10a 1560 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1561 uint8_t Temp8;
joelvonrotz 0:11ad6aaed10a 1562
joelvonrotz 0:11ad6aaed10a 1563
joelvonrotz 0:11ad6aaed10a 1564 if (LimitCheckId >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS) {
joelvonrotz 0:11ad6aaed10a 1565 Status = VL53L0X_ERROR_INVALID_PARAMS;
joelvonrotz 0:11ad6aaed10a 1566 *pLimitCheckEnable = 0;
joelvonrotz 0:11ad6aaed10a 1567 } else {
joelvonrotz 0:11ad6aaed10a 1568 VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksEnable,
joelvonrotz 0:11ad6aaed10a 1569 LimitCheckId, Temp8);
joelvonrotz 0:11ad6aaed10a 1570 *pLimitCheckEnable = Temp8;
joelvonrotz 0:11ad6aaed10a 1571 }
joelvonrotz 0:11ad6aaed10a 1572
joelvonrotz 0:11ad6aaed10a 1573 return Status;
joelvonrotz 0:11ad6aaed10a 1574 }
joelvonrotz 0:11ad6aaed10a 1575
joelvonrotz 0:11ad6aaed10a 1576 VL53L0X_Error VL53L0X_SetLimitCheckValue(VL53L0X_DEV Dev, uint16_t LimitCheckId,
joelvonrotz 0:11ad6aaed10a 1577 FixPoint1616_t LimitCheckValue)
joelvonrotz 0:11ad6aaed10a 1578 {
joelvonrotz 0:11ad6aaed10a 1579 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1580 uint8_t Temp8;
joelvonrotz 0:11ad6aaed10a 1581
joelvonrotz 0:11ad6aaed10a 1582
joelvonrotz 0:11ad6aaed10a 1583 VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksEnable, LimitCheckId,
joelvonrotz 0:11ad6aaed10a 1584 Temp8);
joelvonrotz 0:11ad6aaed10a 1585
joelvonrotz 0:11ad6aaed10a 1586 if (Temp8 == 0) { /* disabled write only internal value */
joelvonrotz 0:11ad6aaed10a 1587 VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue,
joelvonrotz 0:11ad6aaed10a 1588 LimitCheckId, LimitCheckValue);
joelvonrotz 0:11ad6aaed10a 1589 } else {
joelvonrotz 0:11ad6aaed10a 1590
joelvonrotz 0:11ad6aaed10a 1591 switch (LimitCheckId) {
joelvonrotz 0:11ad6aaed10a 1592
joelvonrotz 0:11ad6aaed10a 1593 case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE:
joelvonrotz 0:11ad6aaed10a 1594 /* internal computation: */
joelvonrotz 0:11ad6aaed10a 1595 VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue,
joelvonrotz 0:11ad6aaed10a 1596 VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,
joelvonrotz 0:11ad6aaed10a 1597 LimitCheckValue);
joelvonrotz 0:11ad6aaed10a 1598 break;
joelvonrotz 0:11ad6aaed10a 1599
joelvonrotz 0:11ad6aaed10a 1600 case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE:
joelvonrotz 0:11ad6aaed10a 1601
joelvonrotz 0:11ad6aaed10a 1602 Status = VL53L0X_WrWord(Dev,
joelvonrotz 0:11ad6aaed10a 1603 VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT,
joelvonrotz 0:11ad6aaed10a 1604 VL53L0X_FIXPOINT1616TOFIXPOINT97(
joelvonrotz 0:11ad6aaed10a 1605 LimitCheckValue));
joelvonrotz 0:11ad6aaed10a 1606
joelvonrotz 0:11ad6aaed10a 1607 break;
joelvonrotz 0:11ad6aaed10a 1608
joelvonrotz 0:11ad6aaed10a 1609 case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP:
joelvonrotz 0:11ad6aaed10a 1610
joelvonrotz 0:11ad6aaed10a 1611 /* internal computation: */
joelvonrotz 0:11ad6aaed10a 1612 VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue,
joelvonrotz 0:11ad6aaed10a 1613 VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP,
joelvonrotz 0:11ad6aaed10a 1614 LimitCheckValue);
joelvonrotz 0:11ad6aaed10a 1615
joelvonrotz 0:11ad6aaed10a 1616 break;
joelvonrotz 0:11ad6aaed10a 1617
joelvonrotz 0:11ad6aaed10a 1618 case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD:
joelvonrotz 0:11ad6aaed10a 1619
joelvonrotz 0:11ad6aaed10a 1620 /* internal computation: */
joelvonrotz 0:11ad6aaed10a 1621 VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue,
joelvonrotz 0:11ad6aaed10a 1622 VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD,
joelvonrotz 0:11ad6aaed10a 1623 LimitCheckValue);
joelvonrotz 0:11ad6aaed10a 1624
joelvonrotz 0:11ad6aaed10a 1625 break;
joelvonrotz 0:11ad6aaed10a 1626
joelvonrotz 0:11ad6aaed10a 1627 case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC:
joelvonrotz 0:11ad6aaed10a 1628 case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE:
joelvonrotz 0:11ad6aaed10a 1629
joelvonrotz 0:11ad6aaed10a 1630 Status = VL53L0X_WrWord(Dev,
joelvonrotz 0:11ad6aaed10a 1631 VL53L0X_REG_PRE_RANGE_MIN_COUNT_RATE_RTN_LIMIT,
joelvonrotz 0:11ad6aaed10a 1632 VL53L0X_FIXPOINT1616TOFIXPOINT97(
joelvonrotz 0:11ad6aaed10a 1633 LimitCheckValue));
joelvonrotz 0:11ad6aaed10a 1634
joelvonrotz 0:11ad6aaed10a 1635 break;
joelvonrotz 0:11ad6aaed10a 1636
joelvonrotz 0:11ad6aaed10a 1637 default:
joelvonrotz 0:11ad6aaed10a 1638 Status = VL53L0X_ERROR_INVALID_PARAMS;
joelvonrotz 0:11ad6aaed10a 1639
joelvonrotz 0:11ad6aaed10a 1640 }
joelvonrotz 0:11ad6aaed10a 1641
joelvonrotz 0:11ad6aaed10a 1642 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1643 VL53L0X_SETARRAYPARAMETERFIELD(Dev, LimitChecksValue,
joelvonrotz 0:11ad6aaed10a 1644 LimitCheckId, LimitCheckValue);
joelvonrotz 0:11ad6aaed10a 1645 }
joelvonrotz 0:11ad6aaed10a 1646 }
joelvonrotz 0:11ad6aaed10a 1647
joelvonrotz 0:11ad6aaed10a 1648 return Status;
joelvonrotz 0:11ad6aaed10a 1649 }
joelvonrotz 0:11ad6aaed10a 1650
joelvonrotz 0:11ad6aaed10a 1651 VL53L0X_Error VL53L0X_GetLimitCheckValue(VL53L0X_DEV Dev, uint16_t LimitCheckId,
joelvonrotz 0:11ad6aaed10a 1652 FixPoint1616_t *pLimitCheckValue)
joelvonrotz 0:11ad6aaed10a 1653 {
joelvonrotz 0:11ad6aaed10a 1654 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1655 uint8_t EnableZeroValue = 0;
joelvonrotz 0:11ad6aaed10a 1656 uint16_t Temp16;
joelvonrotz 0:11ad6aaed10a 1657 FixPoint1616_t TempFix1616;
joelvonrotz 0:11ad6aaed10a 1658
joelvonrotz 0:11ad6aaed10a 1659
joelvonrotz 0:11ad6aaed10a 1660 switch (LimitCheckId) {
joelvonrotz 0:11ad6aaed10a 1661
joelvonrotz 0:11ad6aaed10a 1662 case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE:
joelvonrotz 0:11ad6aaed10a 1663 /* internal computation: */
joelvonrotz 0:11ad6aaed10a 1664 VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksValue,
joelvonrotz 0:11ad6aaed10a 1665 VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, TempFix1616);
joelvonrotz 0:11ad6aaed10a 1666 EnableZeroValue = 0;
joelvonrotz 0:11ad6aaed10a 1667 break;
joelvonrotz 0:11ad6aaed10a 1668
joelvonrotz 0:11ad6aaed10a 1669 case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE:
joelvonrotz 0:11ad6aaed10a 1670 Status = VL53L0X_RdWord(Dev,
joelvonrotz 0:11ad6aaed10a 1671 VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT,
joelvonrotz 0:11ad6aaed10a 1672 &Temp16);
joelvonrotz 0:11ad6aaed10a 1673 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 1674 TempFix1616 = VL53L0X_FIXPOINT97TOFIXPOINT1616(Temp16);
joelvonrotz 0:11ad6aaed10a 1675
joelvonrotz 0:11ad6aaed10a 1676
joelvonrotz 0:11ad6aaed10a 1677 EnableZeroValue = 1;
joelvonrotz 0:11ad6aaed10a 1678 break;
joelvonrotz 0:11ad6aaed10a 1679
joelvonrotz 0:11ad6aaed10a 1680 case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP:
joelvonrotz 0:11ad6aaed10a 1681 /* internal computation: */
joelvonrotz 0:11ad6aaed10a 1682 VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksValue,
joelvonrotz 0:11ad6aaed10a 1683 VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, TempFix1616);
joelvonrotz 0:11ad6aaed10a 1684 EnableZeroValue = 0;
joelvonrotz 0:11ad6aaed10a 1685 break;
joelvonrotz 0:11ad6aaed10a 1686
joelvonrotz 0:11ad6aaed10a 1687 case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD:
joelvonrotz 0:11ad6aaed10a 1688 /* internal computation: */
joelvonrotz 0:11ad6aaed10a 1689 VL53L0X_GETARRAYPARAMETERFIELD(Dev, LimitChecksValue,
joelvonrotz 0:11ad6aaed10a 1690 VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, TempFix1616);
joelvonrotz 0:11ad6aaed10a 1691 EnableZeroValue = 0;
joelvonrotz 0:11ad6aaed10a 1692 break;
joelvonrotz 0:11ad6aaed10a 1693
joelvonrotz 0:11ad6aaed10a 1694 case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC:
joelvonrotz 0:11ad6aaed10a 1695 case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE:
joelvonrotz 0:11ad6aaed10a 1696 Status = VL53L0X_RdWord(Dev,
joelvonrotz 0:11ad6aaed10a 1697 VL53L0X_REG_PRE_RANGE_MIN_COUNT_RATE_RTN_LIMIT,
joelvonrotz 0:11ad6aaed10a 1698 &Temp16);
joelvonrotz 0:11ad6aaed10a 1699 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 1700 TempFix1616 = VL53L0X_FIXPOINT97TOFIXPOINT1616(Temp16);
joelvonrotz 0:11ad6aaed10a 1701
joelvonrotz 0:11ad6aaed10a 1702
joelvonrotz 0:11ad6aaed10a 1703 EnableZeroValue = 0;
joelvonrotz 0:11ad6aaed10a 1704 break;
joelvonrotz 0:11ad6aaed10a 1705
joelvonrotz 0:11ad6aaed10a 1706 default:
joelvonrotz 0:11ad6aaed10a 1707 Status = VL53L0X_ERROR_INVALID_PARAMS;
joelvonrotz 0:11ad6aaed10a 1708
joelvonrotz 0:11ad6aaed10a 1709 }
joelvonrotz 0:11ad6aaed10a 1710
joelvonrotz 0:11ad6aaed10a 1711 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1712
joelvonrotz 0:11ad6aaed10a 1713 if (EnableZeroValue == 1) {
joelvonrotz 0:11ad6aaed10a 1714
joelvonrotz 0:11ad6aaed10a 1715 if (TempFix1616 == 0) {
joelvonrotz 0:11ad6aaed10a 1716 /* disabled: return value from memory */
joelvonrotz 0:11ad6aaed10a 1717 VL53L0X_GETARRAYPARAMETERFIELD(Dev,
joelvonrotz 0:11ad6aaed10a 1718 LimitChecksValue, LimitCheckId,
joelvonrotz 0:11ad6aaed10a 1719 TempFix1616);
joelvonrotz 0:11ad6aaed10a 1720 *pLimitCheckValue = TempFix1616;
joelvonrotz 0:11ad6aaed10a 1721 VL53L0X_SETARRAYPARAMETERFIELD(Dev,
joelvonrotz 0:11ad6aaed10a 1722 LimitChecksEnable, LimitCheckId, 0);
joelvonrotz 0:11ad6aaed10a 1723 } else {
joelvonrotz 0:11ad6aaed10a 1724 *pLimitCheckValue = TempFix1616;
joelvonrotz 0:11ad6aaed10a 1725 VL53L0X_SETARRAYPARAMETERFIELD(Dev,
joelvonrotz 0:11ad6aaed10a 1726 LimitChecksValue, LimitCheckId,
joelvonrotz 0:11ad6aaed10a 1727 TempFix1616);
joelvonrotz 0:11ad6aaed10a 1728 VL53L0X_SETARRAYPARAMETERFIELD(Dev,
joelvonrotz 0:11ad6aaed10a 1729 LimitChecksEnable, LimitCheckId, 1);
joelvonrotz 0:11ad6aaed10a 1730 }
joelvonrotz 0:11ad6aaed10a 1731 } else {
joelvonrotz 0:11ad6aaed10a 1732 *pLimitCheckValue = TempFix1616;
joelvonrotz 0:11ad6aaed10a 1733 }
joelvonrotz 0:11ad6aaed10a 1734 }
joelvonrotz 0:11ad6aaed10a 1735
joelvonrotz 0:11ad6aaed10a 1736 return Status;
joelvonrotz 0:11ad6aaed10a 1737
joelvonrotz 0:11ad6aaed10a 1738 }
joelvonrotz 0:11ad6aaed10a 1739
joelvonrotz 0:11ad6aaed10a 1740 VL53L0X_Error VL53L0X_GetLimitCheckCurrent(VL53L0X_DEV Dev, uint16_t LimitCheckId,
joelvonrotz 0:11ad6aaed10a 1741 FixPoint1616_t *pLimitCheckCurrent)
joelvonrotz 0:11ad6aaed10a 1742 {
joelvonrotz 0:11ad6aaed10a 1743 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1744 VL53L0X_RangingMeasurementData_t LastRangeDataBuffer;
joelvonrotz 0:11ad6aaed10a 1745
joelvonrotz 0:11ad6aaed10a 1746
joelvonrotz 0:11ad6aaed10a 1747 if (LimitCheckId >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS) {
joelvonrotz 0:11ad6aaed10a 1748 Status = VL53L0X_ERROR_INVALID_PARAMS;
joelvonrotz 0:11ad6aaed10a 1749 } else {
joelvonrotz 0:11ad6aaed10a 1750 switch (LimitCheckId) {
joelvonrotz 0:11ad6aaed10a 1751 case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE:
joelvonrotz 0:11ad6aaed10a 1752 /* Need to run a ranging to have the latest values */
joelvonrotz 0:11ad6aaed10a 1753 *pLimitCheckCurrent = PALDevDataGet(Dev, SigmaEstimate);
joelvonrotz 0:11ad6aaed10a 1754
joelvonrotz 0:11ad6aaed10a 1755 break;
joelvonrotz 0:11ad6aaed10a 1756
joelvonrotz 0:11ad6aaed10a 1757 case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE:
joelvonrotz 0:11ad6aaed10a 1758 /* Need to run a ranging to have the latest values */
joelvonrotz 0:11ad6aaed10a 1759 LastRangeDataBuffer = PALDevDataGet(Dev,
joelvonrotz 0:11ad6aaed10a 1760 LastRangeMeasure);
joelvonrotz 0:11ad6aaed10a 1761 *pLimitCheckCurrent =
joelvonrotz 0:11ad6aaed10a 1762 LastRangeDataBuffer.SignalRateRtnMegaCps;
joelvonrotz 0:11ad6aaed10a 1763
joelvonrotz 0:11ad6aaed10a 1764 break;
joelvonrotz 0:11ad6aaed10a 1765
joelvonrotz 0:11ad6aaed10a 1766 case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP:
joelvonrotz 0:11ad6aaed10a 1767 /* Need to run a ranging to have the latest values */
joelvonrotz 0:11ad6aaed10a 1768 *pLimitCheckCurrent = PALDevDataGet(Dev,
joelvonrotz 0:11ad6aaed10a 1769 LastSignalRefMcps);
joelvonrotz 0:11ad6aaed10a 1770
joelvonrotz 0:11ad6aaed10a 1771 break;
joelvonrotz 0:11ad6aaed10a 1772
joelvonrotz 0:11ad6aaed10a 1773 case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD:
joelvonrotz 0:11ad6aaed10a 1774 /* Need to run a ranging to have the latest values */
joelvonrotz 0:11ad6aaed10a 1775 LastRangeDataBuffer = PALDevDataGet(Dev,
joelvonrotz 0:11ad6aaed10a 1776 LastRangeMeasure);
joelvonrotz 0:11ad6aaed10a 1777 *pLimitCheckCurrent =
joelvonrotz 0:11ad6aaed10a 1778 LastRangeDataBuffer.SignalRateRtnMegaCps;
joelvonrotz 0:11ad6aaed10a 1779
joelvonrotz 0:11ad6aaed10a 1780 break;
joelvonrotz 0:11ad6aaed10a 1781
joelvonrotz 0:11ad6aaed10a 1782 case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC:
joelvonrotz 0:11ad6aaed10a 1783 /* Need to run a ranging to have the latest values */
joelvonrotz 0:11ad6aaed10a 1784 LastRangeDataBuffer = PALDevDataGet(Dev,
joelvonrotz 0:11ad6aaed10a 1785 LastRangeMeasure);
joelvonrotz 0:11ad6aaed10a 1786 *pLimitCheckCurrent =
joelvonrotz 0:11ad6aaed10a 1787 LastRangeDataBuffer.SignalRateRtnMegaCps;
joelvonrotz 0:11ad6aaed10a 1788
joelvonrotz 0:11ad6aaed10a 1789 break;
joelvonrotz 0:11ad6aaed10a 1790
joelvonrotz 0:11ad6aaed10a 1791 case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE:
joelvonrotz 0:11ad6aaed10a 1792 /* Need to run a ranging to have the latest values */
joelvonrotz 0:11ad6aaed10a 1793 LastRangeDataBuffer = PALDevDataGet(Dev,
joelvonrotz 0:11ad6aaed10a 1794 LastRangeMeasure);
joelvonrotz 0:11ad6aaed10a 1795 *pLimitCheckCurrent =
joelvonrotz 0:11ad6aaed10a 1796 LastRangeDataBuffer.SignalRateRtnMegaCps;
joelvonrotz 0:11ad6aaed10a 1797
joelvonrotz 0:11ad6aaed10a 1798 break;
joelvonrotz 0:11ad6aaed10a 1799
joelvonrotz 0:11ad6aaed10a 1800 default:
joelvonrotz 0:11ad6aaed10a 1801 Status = VL53L0X_ERROR_INVALID_PARAMS;
joelvonrotz 0:11ad6aaed10a 1802 }
joelvonrotz 0:11ad6aaed10a 1803 }
joelvonrotz 0:11ad6aaed10a 1804
joelvonrotz 0:11ad6aaed10a 1805 return Status;
joelvonrotz 0:11ad6aaed10a 1806
joelvonrotz 0:11ad6aaed10a 1807 }
joelvonrotz 0:11ad6aaed10a 1808
joelvonrotz 0:11ad6aaed10a 1809 /*
joelvonrotz 0:11ad6aaed10a 1810 * WRAPAROUND Check
joelvonrotz 0:11ad6aaed10a 1811 */
joelvonrotz 0:11ad6aaed10a 1812 VL53L0X_Error VL53L0X_SetWrapAroundCheckEnable(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 1813 uint8_t WrapAroundCheckEnable)
joelvonrotz 0:11ad6aaed10a 1814 {
joelvonrotz 0:11ad6aaed10a 1815 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1816 uint8_t Byte;
joelvonrotz 0:11ad6aaed10a 1817 uint8_t WrapAroundCheckEnableInt;
joelvonrotz 0:11ad6aaed10a 1818
joelvonrotz 0:11ad6aaed10a 1819
joelvonrotz 0:11ad6aaed10a 1820 Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, &Byte);
joelvonrotz 0:11ad6aaed10a 1821 if (WrapAroundCheckEnable == 0) {
joelvonrotz 0:11ad6aaed10a 1822 /* Disable wraparound */
joelvonrotz 0:11ad6aaed10a 1823 Byte = Byte & 0x7F;
joelvonrotz 0:11ad6aaed10a 1824 WrapAroundCheckEnableInt = 0;
joelvonrotz 0:11ad6aaed10a 1825 } else {
joelvonrotz 0:11ad6aaed10a 1826 /*Enable wraparound */
joelvonrotz 0:11ad6aaed10a 1827 Byte = Byte | 0x80;
joelvonrotz 0:11ad6aaed10a 1828 WrapAroundCheckEnableInt = 1;
joelvonrotz 0:11ad6aaed10a 1829 }
joelvonrotz 0:11ad6aaed10a 1830
joelvonrotz 0:11ad6aaed10a 1831 Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, Byte);
joelvonrotz 0:11ad6aaed10a 1832
joelvonrotz 0:11ad6aaed10a 1833 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1834 PALDevDataSet(Dev, SequenceConfig, Byte);
joelvonrotz 0:11ad6aaed10a 1835 VL53L0X_SETPARAMETERFIELD(Dev, WrapAroundCheckEnable,
joelvonrotz 0:11ad6aaed10a 1836 WrapAroundCheckEnableInt);
joelvonrotz 0:11ad6aaed10a 1837 }
joelvonrotz 0:11ad6aaed10a 1838
joelvonrotz 0:11ad6aaed10a 1839 return Status;
joelvonrotz 0:11ad6aaed10a 1840 }
joelvonrotz 0:11ad6aaed10a 1841
joelvonrotz 0:11ad6aaed10a 1842 VL53L0X_Error VL53L0X_GetWrapAroundCheckEnable(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 1843 uint8_t *pWrapAroundCheckEnable)
joelvonrotz 0:11ad6aaed10a 1844 {
joelvonrotz 0:11ad6aaed10a 1845 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1846 uint8_t data;
joelvonrotz 0:11ad6aaed10a 1847
joelvonrotz 0:11ad6aaed10a 1848
joelvonrotz 0:11ad6aaed10a 1849 Status = VL53L0X_RdByte(Dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, &data);
joelvonrotz 0:11ad6aaed10a 1850 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1851 PALDevDataSet(Dev, SequenceConfig, data);
joelvonrotz 0:11ad6aaed10a 1852 if (data & (0x01 << 7))
joelvonrotz 0:11ad6aaed10a 1853 *pWrapAroundCheckEnable = 0x01;
joelvonrotz 0:11ad6aaed10a 1854 else
joelvonrotz 0:11ad6aaed10a 1855 *pWrapAroundCheckEnable = 0x00;
joelvonrotz 0:11ad6aaed10a 1856 }
joelvonrotz 0:11ad6aaed10a 1857 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 1858 VL53L0X_SETPARAMETERFIELD(Dev, WrapAroundCheckEnable,
joelvonrotz 0:11ad6aaed10a 1859 *pWrapAroundCheckEnable);
joelvonrotz 0:11ad6aaed10a 1860 }
joelvonrotz 0:11ad6aaed10a 1861
joelvonrotz 0:11ad6aaed10a 1862 return Status;
joelvonrotz 0:11ad6aaed10a 1863 }
joelvonrotz 0:11ad6aaed10a 1864
joelvonrotz 0:11ad6aaed10a 1865 VL53L0X_Error VL53L0X_SetDmaxCalParameters(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 1866 uint16_t RangeMilliMeter, FixPoint1616_t SignalRateRtnMegaCps)
joelvonrotz 0:11ad6aaed10a 1867 {
joelvonrotz 0:11ad6aaed10a 1868 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1869 FixPoint1616_t SignalRateRtnMegaCpsTemp = 0;
joelvonrotz 0:11ad6aaed10a 1870
joelvonrotz 0:11ad6aaed10a 1871
joelvonrotz 0:11ad6aaed10a 1872 /* Check if one of input parameter is zero, in that case the
joelvonrotz 0:11ad6aaed10a 1873 * value are get from NVM */
joelvonrotz 0:11ad6aaed10a 1874 if ((RangeMilliMeter == 0) || (SignalRateRtnMegaCps == 0)) {
joelvonrotz 0:11ad6aaed10a 1875 /* NVM parameters */
joelvonrotz 0:11ad6aaed10a 1876 /* Run VL53L0X_get_info_from_device wit option 4 to get
joelvonrotz 0:11ad6aaed10a 1877 * signal rate at 400 mm if the value have been already
joelvonrotz 0:11ad6aaed10a 1878 * get this function will return with no access to device */
joelvonrotz 0:11ad6aaed10a 1879 VL53L0X_get_info_from_device(Dev, 4);
joelvonrotz 0:11ad6aaed10a 1880
joelvonrotz 0:11ad6aaed10a 1881 SignalRateRtnMegaCpsTemp = VL53L0X_GETDEVICESPECIFICPARAMETER(
joelvonrotz 0:11ad6aaed10a 1882 Dev, SignalRateMeasFixed400mm);
joelvonrotz 0:11ad6aaed10a 1883
joelvonrotz 0:11ad6aaed10a 1884 PALDevDataSet(Dev, DmaxCalRangeMilliMeter, 400);
joelvonrotz 0:11ad6aaed10a 1885 PALDevDataSet(Dev, DmaxCalSignalRateRtnMegaCps,
joelvonrotz 0:11ad6aaed10a 1886 SignalRateRtnMegaCpsTemp);
joelvonrotz 0:11ad6aaed10a 1887 } else {
joelvonrotz 0:11ad6aaed10a 1888 /* User parameters */
joelvonrotz 0:11ad6aaed10a 1889 PALDevDataSet(Dev, DmaxCalRangeMilliMeter, RangeMilliMeter);
joelvonrotz 0:11ad6aaed10a 1890 PALDevDataSet(Dev, DmaxCalSignalRateRtnMegaCps,
joelvonrotz 0:11ad6aaed10a 1891 SignalRateRtnMegaCps);
joelvonrotz 0:11ad6aaed10a 1892 }
joelvonrotz 0:11ad6aaed10a 1893
joelvonrotz 0:11ad6aaed10a 1894 return Status;
joelvonrotz 0:11ad6aaed10a 1895 }
joelvonrotz 0:11ad6aaed10a 1896
joelvonrotz 0:11ad6aaed10a 1897 VL53L0X_Error VL53L0X_GetDmaxCalParameters(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 1898 uint16_t *pRangeMilliMeter, FixPoint1616_t *pSignalRateRtnMegaCps)
joelvonrotz 0:11ad6aaed10a 1899 {
joelvonrotz 0:11ad6aaed10a 1900 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1901
joelvonrotz 0:11ad6aaed10a 1902
joelvonrotz 0:11ad6aaed10a 1903 *pRangeMilliMeter = PALDevDataGet(Dev, DmaxCalRangeMilliMeter);
joelvonrotz 0:11ad6aaed10a 1904 *pSignalRateRtnMegaCps = PALDevDataGet(Dev,
joelvonrotz 0:11ad6aaed10a 1905 DmaxCalSignalRateRtnMegaCps);
joelvonrotz 0:11ad6aaed10a 1906
joelvonrotz 0:11ad6aaed10a 1907 return Status;
joelvonrotz 0:11ad6aaed10a 1908 }
joelvonrotz 0:11ad6aaed10a 1909
joelvonrotz 0:11ad6aaed10a 1910 /* End Group PAL Parameters Functions */
joelvonrotz 0:11ad6aaed10a 1911
joelvonrotz 0:11ad6aaed10a 1912 /* Group PAL Measurement Functions */
joelvonrotz 0:11ad6aaed10a 1913 VL53L0X_Error VL53L0X_PerformSingleMeasurement(VL53L0X_DEV Dev)
joelvonrotz 0:11ad6aaed10a 1914 {
joelvonrotz 0:11ad6aaed10a 1915 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1916 VL53L0X_DeviceModes DeviceMode;
joelvonrotz 0:11ad6aaed10a 1917
joelvonrotz 0:11ad6aaed10a 1918
joelvonrotz 0:11ad6aaed10a 1919 /* Get Current DeviceMode */
joelvonrotz 0:11ad6aaed10a 1920 Status = VL53L0X_GetDeviceMode(Dev, &DeviceMode);
joelvonrotz 0:11ad6aaed10a 1921
joelvonrotz 0:11ad6aaed10a 1922 /* Start immediately to run a single ranging measurement in case of
joelvonrotz 0:11ad6aaed10a 1923 * single ranging or single histogram */
joelvonrotz 0:11ad6aaed10a 1924 if (Status == VL53L0X_ERROR_NONE
joelvonrotz 0:11ad6aaed10a 1925 && DeviceMode == VL53L0X_DEVICEMODE_SINGLE_RANGING)
joelvonrotz 0:11ad6aaed10a 1926 Status = VL53L0X_StartMeasurement(Dev);
joelvonrotz 0:11ad6aaed10a 1927
joelvonrotz 0:11ad6aaed10a 1928
joelvonrotz 0:11ad6aaed10a 1929 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 1930 Status = VL53L0X_measurement_poll_for_completion(Dev);
joelvonrotz 0:11ad6aaed10a 1931
joelvonrotz 0:11ad6aaed10a 1932
joelvonrotz 0:11ad6aaed10a 1933 /* Change PAL State in case of single ranging or single histogram */
joelvonrotz 0:11ad6aaed10a 1934 if (Status == VL53L0X_ERROR_NONE
joelvonrotz 0:11ad6aaed10a 1935 && DeviceMode == VL53L0X_DEVICEMODE_SINGLE_RANGING)
joelvonrotz 0:11ad6aaed10a 1936 PALDevDataSet(Dev, PalState, VL53L0X_STATE_IDLE);
joelvonrotz 0:11ad6aaed10a 1937
joelvonrotz 0:11ad6aaed10a 1938
joelvonrotz 0:11ad6aaed10a 1939 return Status;
joelvonrotz 0:11ad6aaed10a 1940 }
joelvonrotz 0:11ad6aaed10a 1941
joelvonrotz 0:11ad6aaed10a 1942 VL53L0X_Error VL53L0X_PerformSingleHistogramMeasurement(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 1943 VL53L0X_HistogramMeasurementData_t *pHistogramMeasurementData)
joelvonrotz 0:11ad6aaed10a 1944 {
joelvonrotz 0:11ad6aaed10a 1945 VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED;
joelvonrotz 0:11ad6aaed10a 1946
joelvonrotz 0:11ad6aaed10a 1947 /* not implemented on VL53L0X */
joelvonrotz 0:11ad6aaed10a 1948
joelvonrotz 0:11ad6aaed10a 1949 return Status;
joelvonrotz 0:11ad6aaed10a 1950 }
joelvonrotz 0:11ad6aaed10a 1951
joelvonrotz 0:11ad6aaed10a 1952 VL53L0X_Error VL53L0X_PerformRefCalibration(VL53L0X_DEV Dev, uint8_t *pVhvSettings,
joelvonrotz 0:11ad6aaed10a 1953 uint8_t *pPhaseCal)
joelvonrotz 0:11ad6aaed10a 1954 {
joelvonrotz 0:11ad6aaed10a 1955 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1956
joelvonrotz 0:11ad6aaed10a 1957 Status = VL53L0X_perform_ref_calibration(Dev, pVhvSettings,
joelvonrotz 0:11ad6aaed10a 1958 pPhaseCal, 1);
joelvonrotz 0:11ad6aaed10a 1959
joelvonrotz 0:11ad6aaed10a 1960 return Status;
joelvonrotz 0:11ad6aaed10a 1961 }
joelvonrotz 0:11ad6aaed10a 1962
joelvonrotz 0:11ad6aaed10a 1963 VL53L0X_Error VL53L0X_PerformXTalkMeasurement(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 1964 uint32_t TimeoutMs, FixPoint1616_t *pXtalkPerSpad,
joelvonrotz 0:11ad6aaed10a 1965 uint8_t *pAmbientTooHigh)
joelvonrotz 0:11ad6aaed10a 1966 {
joelvonrotz 0:11ad6aaed10a 1967 VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED;
joelvonrotz 0:11ad6aaed10a 1968
joelvonrotz 0:11ad6aaed10a 1969 /* not implemented on VL53L0X */
joelvonrotz 0:11ad6aaed10a 1970
joelvonrotz 0:11ad6aaed10a 1971 return Status;
joelvonrotz 0:11ad6aaed10a 1972 }
joelvonrotz 0:11ad6aaed10a 1973
joelvonrotz 0:11ad6aaed10a 1974 VL53L0X_Error VL53L0X_PerformXTalkCalibration(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 1975 FixPoint1616_t XTalkCalDistance,
joelvonrotz 0:11ad6aaed10a 1976 FixPoint1616_t *pXTalkCompensationRateMegaCps)
joelvonrotz 0:11ad6aaed10a 1977 {
joelvonrotz 0:11ad6aaed10a 1978 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1979
joelvonrotz 0:11ad6aaed10a 1980 Status = VL53L0X_perform_xtalk_calibration(Dev, XTalkCalDistance,
joelvonrotz 0:11ad6aaed10a 1981 pXTalkCompensationRateMegaCps);
joelvonrotz 0:11ad6aaed10a 1982
joelvonrotz 0:11ad6aaed10a 1983 return Status;
joelvonrotz 0:11ad6aaed10a 1984 }
joelvonrotz 0:11ad6aaed10a 1985
joelvonrotz 0:11ad6aaed10a 1986 VL53L0X_Error VL53L0X_PerformOffsetCalibration(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 1987 FixPoint1616_t CalDistanceMilliMeter, int32_t *pOffsetMicroMeter)
joelvonrotz 0:11ad6aaed10a 1988 {
joelvonrotz 0:11ad6aaed10a 1989 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 1990
joelvonrotz 0:11ad6aaed10a 1991 Status = VL53L0X_perform_offset_calibration(Dev, CalDistanceMilliMeter,
joelvonrotz 0:11ad6aaed10a 1992 pOffsetMicroMeter);
joelvonrotz 0:11ad6aaed10a 1993
joelvonrotz 0:11ad6aaed10a 1994 return Status;
joelvonrotz 0:11ad6aaed10a 1995 }
joelvonrotz 0:11ad6aaed10a 1996
joelvonrotz 0:11ad6aaed10a 1997 VL53L0X_Error VL53L0X_CheckAndLoadInterruptSettings(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 1998 uint8_t StartNotStopFlag)
joelvonrotz 0:11ad6aaed10a 1999 {
joelvonrotz 0:11ad6aaed10a 2000 uint8_t InterruptConfig;
joelvonrotz 0:11ad6aaed10a 2001 FixPoint1616_t ThresholdLow;
joelvonrotz 0:11ad6aaed10a 2002 FixPoint1616_t ThresholdHigh;
joelvonrotz 0:11ad6aaed10a 2003 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2004
joelvonrotz 0:11ad6aaed10a 2005 InterruptConfig = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev,
joelvonrotz 0:11ad6aaed10a 2006 Pin0GpioFunctionality);
joelvonrotz 0:11ad6aaed10a 2007
joelvonrotz 0:11ad6aaed10a 2008 if ((InterruptConfig ==
joelvonrotz 0:11ad6aaed10a 2009 VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW) ||
joelvonrotz 0:11ad6aaed10a 2010 (InterruptConfig ==
joelvonrotz 0:11ad6aaed10a 2011 VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH) ||
joelvonrotz 0:11ad6aaed10a 2012 (InterruptConfig ==
joelvonrotz 0:11ad6aaed10a 2013 VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT)) {
joelvonrotz 0:11ad6aaed10a 2014
joelvonrotz 0:11ad6aaed10a 2015 Status = VL53L0X_GetInterruptThresholds(Dev,
joelvonrotz 0:11ad6aaed10a 2016 VL53L0X_DEVICEMODE_CONTINUOUS_RANGING,
joelvonrotz 0:11ad6aaed10a 2017 &ThresholdLow, &ThresholdHigh);
joelvonrotz 0:11ad6aaed10a 2018
joelvonrotz 0:11ad6aaed10a 2019 if (((ThresholdLow > 255*65536) ||
joelvonrotz 0:11ad6aaed10a 2020 (ThresholdHigh > 255*65536)) &&
joelvonrotz 0:11ad6aaed10a 2021 (Status == VL53L0X_ERROR_NONE)) {
joelvonrotz 0:11ad6aaed10a 2022
joelvonrotz 0:11ad6aaed10a 2023 if (StartNotStopFlag != 0) {
joelvonrotz 0:11ad6aaed10a 2024 Status = VL53L0X_load_tuning_settings(Dev,
joelvonrotz 0:11ad6aaed10a 2025 InterruptThresholdSettings);
joelvonrotz 0:11ad6aaed10a 2026 } else {
joelvonrotz 0:11ad6aaed10a 2027 Status |= VL53L0X_WrByte(Dev, 0xFF, 0x04);
joelvonrotz 0:11ad6aaed10a 2028 Status |= VL53L0X_WrByte(Dev, 0x70, 0x00);
joelvonrotz 0:11ad6aaed10a 2029 Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00);
joelvonrotz 0:11ad6aaed10a 2030 Status |= VL53L0X_WrByte(Dev, 0x80, 0x00);
joelvonrotz 0:11ad6aaed10a 2031 }
joelvonrotz 0:11ad6aaed10a 2032
joelvonrotz 0:11ad6aaed10a 2033 }
joelvonrotz 0:11ad6aaed10a 2034
joelvonrotz 0:11ad6aaed10a 2035
joelvonrotz 0:11ad6aaed10a 2036 }
joelvonrotz 0:11ad6aaed10a 2037
joelvonrotz 0:11ad6aaed10a 2038 return Status;
joelvonrotz 0:11ad6aaed10a 2039
joelvonrotz 0:11ad6aaed10a 2040 }
joelvonrotz 0:11ad6aaed10a 2041
joelvonrotz 0:11ad6aaed10a 2042
joelvonrotz 0:11ad6aaed10a 2043 VL53L0X_Error VL53L0X_StartMeasurement(VL53L0X_DEV Dev)
joelvonrotz 0:11ad6aaed10a 2044 {
joelvonrotz 0:11ad6aaed10a 2045 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2046 VL53L0X_DeviceModes DeviceMode;
joelvonrotz 0:11ad6aaed10a 2047 uint8_t Byte;
joelvonrotz 0:11ad6aaed10a 2048 uint8_t StartStopByte = VL53L0X_REG_SYSRANGE_MODE_START_STOP;
joelvonrotz 0:11ad6aaed10a 2049 uint32_t LoopNb;
joelvonrotz 0:11ad6aaed10a 2050
joelvonrotz 0:11ad6aaed10a 2051 /* Get Current DeviceMode */
joelvonrotz 0:11ad6aaed10a 2052 VL53L0X_GetDeviceMode(Dev, &DeviceMode);
joelvonrotz 0:11ad6aaed10a 2053
joelvonrotz 0:11ad6aaed10a 2054 Status = VL53L0X_WrByte(Dev, 0x80, 0x01);
joelvonrotz 0:11ad6aaed10a 2055 Status = VL53L0X_WrByte(Dev, 0xFF, 0x01);
joelvonrotz 0:11ad6aaed10a 2056 Status = VL53L0X_WrByte(Dev, 0x00, 0x00);
joelvonrotz 0:11ad6aaed10a 2057 Status = VL53L0X_WrByte(Dev, 0x91, PALDevDataGet(Dev, StopVariable));
joelvonrotz 0:11ad6aaed10a 2058 Status = VL53L0X_WrByte(Dev, 0x00, 0x01);
joelvonrotz 0:11ad6aaed10a 2059 Status = VL53L0X_WrByte(Dev, 0xFF, 0x00);
joelvonrotz 0:11ad6aaed10a 2060 Status = VL53L0X_WrByte(Dev, 0x80, 0x00);
joelvonrotz 0:11ad6aaed10a 2061
joelvonrotz 0:11ad6aaed10a 2062 switch (DeviceMode) {
joelvonrotz 0:11ad6aaed10a 2063 case VL53L0X_DEVICEMODE_SINGLE_RANGING:
joelvonrotz 0:11ad6aaed10a 2064 Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSRANGE_START, 0x01);
joelvonrotz 0:11ad6aaed10a 2065
joelvonrotz 0:11ad6aaed10a 2066 Byte = StartStopByte;
joelvonrotz 0:11ad6aaed10a 2067 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 2068 /* Wait until start bit has been cleared */
joelvonrotz 0:11ad6aaed10a 2069 LoopNb = 0;
joelvonrotz 0:11ad6aaed10a 2070 do {
joelvonrotz 0:11ad6aaed10a 2071 if (LoopNb > 0)
joelvonrotz 0:11ad6aaed10a 2072 Status = VL53L0X_RdByte(Dev,
joelvonrotz 0:11ad6aaed10a 2073 VL53L0X_REG_SYSRANGE_START, &Byte);
joelvonrotz 0:11ad6aaed10a 2074 LoopNb = LoopNb + 1;
joelvonrotz 0:11ad6aaed10a 2075 } while (((Byte & StartStopByte) == StartStopByte)
joelvonrotz 0:11ad6aaed10a 2076 && (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 2077 && (LoopNb < VL53L0X_DEFAULT_MAX_LOOP));
joelvonrotz 0:11ad6aaed10a 2078
joelvonrotz 0:11ad6aaed10a 2079 if (LoopNb >= VL53L0X_DEFAULT_MAX_LOOP)
joelvonrotz 0:11ad6aaed10a 2080 Status = VL53L0X_ERROR_TIME_OUT;
joelvonrotz 0:11ad6aaed10a 2081
joelvonrotz 0:11ad6aaed10a 2082 }
joelvonrotz 0:11ad6aaed10a 2083
joelvonrotz 0:11ad6aaed10a 2084 break;
joelvonrotz 0:11ad6aaed10a 2085 case VL53L0X_DEVICEMODE_CONTINUOUS_RANGING:
joelvonrotz 0:11ad6aaed10a 2086 /* Back-to-back mode */
joelvonrotz 0:11ad6aaed10a 2087
joelvonrotz 0:11ad6aaed10a 2088 /* Check if need to apply interrupt settings */
joelvonrotz 0:11ad6aaed10a 2089 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 2090 Status = VL53L0X_CheckAndLoadInterruptSettings(Dev, 1);
joelvonrotz 0:11ad6aaed10a 2091
joelvonrotz 0:11ad6aaed10a 2092 Status = VL53L0X_WrByte(Dev,
joelvonrotz 0:11ad6aaed10a 2093 VL53L0X_REG_SYSRANGE_START,
joelvonrotz 0:11ad6aaed10a 2094 VL53L0X_REG_SYSRANGE_MODE_BACKTOBACK);
joelvonrotz 0:11ad6aaed10a 2095 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 2096 /* Set PAL State to Running */
joelvonrotz 0:11ad6aaed10a 2097 PALDevDataSet(Dev, PalState, VL53L0X_STATE_RUNNING);
joelvonrotz 0:11ad6aaed10a 2098 }
joelvonrotz 0:11ad6aaed10a 2099 break;
joelvonrotz 0:11ad6aaed10a 2100 case VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING:
joelvonrotz 0:11ad6aaed10a 2101 /* Continuous mode */
joelvonrotz 0:11ad6aaed10a 2102 /* Check if need to apply interrupt settings */
joelvonrotz 0:11ad6aaed10a 2103 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 2104 Status = VL53L0X_CheckAndLoadInterruptSettings(Dev, 1);
joelvonrotz 0:11ad6aaed10a 2105
joelvonrotz 0:11ad6aaed10a 2106 Status = VL53L0X_WrByte(Dev,
joelvonrotz 0:11ad6aaed10a 2107 VL53L0X_REG_SYSRANGE_START,
joelvonrotz 0:11ad6aaed10a 2108 VL53L0X_REG_SYSRANGE_MODE_TIMED);
joelvonrotz 0:11ad6aaed10a 2109
joelvonrotz 0:11ad6aaed10a 2110 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 2111 /* Set PAL State to Running */
joelvonrotz 0:11ad6aaed10a 2112 PALDevDataSet(Dev, PalState, VL53L0X_STATE_RUNNING);
joelvonrotz 0:11ad6aaed10a 2113 }
joelvonrotz 0:11ad6aaed10a 2114 break;
joelvonrotz 0:11ad6aaed10a 2115 default:
joelvonrotz 0:11ad6aaed10a 2116 /* Selected mode not supported */
joelvonrotz 0:11ad6aaed10a 2117 Status = VL53L0X_ERROR_MODE_NOT_SUPPORTED;
joelvonrotz 0:11ad6aaed10a 2118 }
joelvonrotz 0:11ad6aaed10a 2119
joelvonrotz 0:11ad6aaed10a 2120
joelvonrotz 0:11ad6aaed10a 2121 return Status;
joelvonrotz 0:11ad6aaed10a 2122 }
joelvonrotz 0:11ad6aaed10a 2123
joelvonrotz 0:11ad6aaed10a 2124 VL53L0X_Error VL53L0X_StopMeasurement(VL53L0X_DEV Dev)
joelvonrotz 0:11ad6aaed10a 2125 {
joelvonrotz 0:11ad6aaed10a 2126 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2127
joelvonrotz 0:11ad6aaed10a 2128 Status = VL53L0X_WrByte(Dev, VL53L0X_REG_SYSRANGE_START,
joelvonrotz 0:11ad6aaed10a 2129 VL53L0X_REG_SYSRANGE_MODE_SINGLESHOT);
joelvonrotz 0:11ad6aaed10a 2130
joelvonrotz 0:11ad6aaed10a 2131 Status = VL53L0X_WrByte(Dev, 0xFF, 0x01);
joelvonrotz 0:11ad6aaed10a 2132 Status = VL53L0X_WrByte(Dev, 0x00, 0x00);
joelvonrotz 0:11ad6aaed10a 2133 Status = VL53L0X_WrByte(Dev, 0x91, 0x00);
joelvonrotz 0:11ad6aaed10a 2134 Status = VL53L0X_WrByte(Dev, 0x00, 0x01);
joelvonrotz 0:11ad6aaed10a 2135 Status = VL53L0X_WrByte(Dev, 0xFF, 0x00);
joelvonrotz 0:11ad6aaed10a 2136
joelvonrotz 0:11ad6aaed10a 2137 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 2138 /* Set PAL State to Idle */
joelvonrotz 0:11ad6aaed10a 2139 PALDevDataSet(Dev, PalState, VL53L0X_STATE_IDLE);
joelvonrotz 0:11ad6aaed10a 2140 }
joelvonrotz 0:11ad6aaed10a 2141
joelvonrotz 0:11ad6aaed10a 2142 /* Check if need to apply interrupt settings */
joelvonrotz 0:11ad6aaed10a 2143 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 2144 Status = VL53L0X_CheckAndLoadInterruptSettings(Dev, 0);
joelvonrotz 0:11ad6aaed10a 2145
joelvonrotz 0:11ad6aaed10a 2146 return Status;
joelvonrotz 0:11ad6aaed10a 2147 }
joelvonrotz 0:11ad6aaed10a 2148
joelvonrotz 0:11ad6aaed10a 2149 VL53L0X_Error VL53L0X_GetMeasurementDataReady(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 2150 uint8_t *pMeasurementDataReady)
joelvonrotz 0:11ad6aaed10a 2151 {
joelvonrotz 0:11ad6aaed10a 2152 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2153 uint8_t SysRangeStatusRegister;
joelvonrotz 0:11ad6aaed10a 2154 uint8_t InterruptConfig;
joelvonrotz 0:11ad6aaed10a 2155 uint32_t InterruptMask;
joelvonrotz 0:11ad6aaed10a 2156
joelvonrotz 0:11ad6aaed10a 2157 InterruptConfig = VL53L0X_GETDEVICESPECIFICPARAMETER(Dev,
joelvonrotz 0:11ad6aaed10a 2158 Pin0GpioFunctionality);
joelvonrotz 0:11ad6aaed10a 2159
joelvonrotz 0:11ad6aaed10a 2160 if (InterruptConfig ==
joelvonrotz 0:11ad6aaed10a 2161 VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY) {
joelvonrotz 0:11ad6aaed10a 2162 Status = VL53L0X_GetInterruptMaskStatus(Dev, &InterruptMask);
joelvonrotz 0:11ad6aaed10a 2163 if (InterruptMask ==
joelvonrotz 0:11ad6aaed10a 2164 VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY)
joelvonrotz 0:11ad6aaed10a 2165 *pMeasurementDataReady = 1;
joelvonrotz 0:11ad6aaed10a 2166 else
joelvonrotz 0:11ad6aaed10a 2167 *pMeasurementDataReady = 0;
joelvonrotz 0:11ad6aaed10a 2168 } else {
joelvonrotz 0:11ad6aaed10a 2169 Status = VL53L0X_RdByte(Dev, VL53L0X_REG_RESULT_RANGE_STATUS,
joelvonrotz 0:11ad6aaed10a 2170 &SysRangeStatusRegister);
joelvonrotz 0:11ad6aaed10a 2171 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 2172 if (SysRangeStatusRegister & 0x01)
joelvonrotz 0:11ad6aaed10a 2173 *pMeasurementDataReady = 1;
joelvonrotz 0:11ad6aaed10a 2174 else
joelvonrotz 0:11ad6aaed10a 2175 *pMeasurementDataReady = 0;
joelvonrotz 0:11ad6aaed10a 2176 }
joelvonrotz 0:11ad6aaed10a 2177 }
joelvonrotz 0:11ad6aaed10a 2178
joelvonrotz 0:11ad6aaed10a 2179 return Status;
joelvonrotz 0:11ad6aaed10a 2180 }
joelvonrotz 0:11ad6aaed10a 2181
joelvonrotz 0:11ad6aaed10a 2182 VL53L0X_Error VL53L0X_WaitDeviceReadyForNewMeasurement(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 2183 uint32_t MaxLoop)
joelvonrotz 0:11ad6aaed10a 2184 {
joelvonrotz 0:11ad6aaed10a 2185 VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED;
joelvonrotz 0:11ad6aaed10a 2186
joelvonrotz 0:11ad6aaed10a 2187 /* not implemented for VL53L0X */
joelvonrotz 0:11ad6aaed10a 2188
joelvonrotz 0:11ad6aaed10a 2189 return Status;
joelvonrotz 0:11ad6aaed10a 2190 }
joelvonrotz 0:11ad6aaed10a 2191
joelvonrotz 0:11ad6aaed10a 2192
joelvonrotz 0:11ad6aaed10a 2193 VL53L0X_Error VL53L0X_GetRangingMeasurementData(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 2194 VL53L0X_RangingMeasurementData_t *pRangingMeasurementData)
joelvonrotz 0:11ad6aaed10a 2195 {
joelvonrotz 0:11ad6aaed10a 2196 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2197 uint8_t DeviceRangeStatus;
joelvonrotz 0:11ad6aaed10a 2198 uint8_t RangeFractionalEnable;
joelvonrotz 0:11ad6aaed10a 2199 uint8_t PalRangeStatus;
joelvonrotz 0:11ad6aaed10a 2200 uint8_t XTalkCompensationEnable;
joelvonrotz 0:11ad6aaed10a 2201 uint16_t AmbientRate;
joelvonrotz 0:11ad6aaed10a 2202 FixPoint1616_t SignalRate;
joelvonrotz 0:11ad6aaed10a 2203 uint16_t XTalkCompensationRateMegaCps;
joelvonrotz 0:11ad6aaed10a 2204 uint16_t EffectiveSpadRtnCount;
joelvonrotz 0:11ad6aaed10a 2205 uint16_t tmpuint16;
joelvonrotz 0:11ad6aaed10a 2206 uint16_t XtalkRangeMilliMeter;
joelvonrotz 0:11ad6aaed10a 2207 uint16_t LinearityCorrectiveGain;
joelvonrotz 0:11ad6aaed10a 2208 uint8_t localBuffer[12];
joelvonrotz 0:11ad6aaed10a 2209 VL53L0X_RangingMeasurementData_t LastRangeDataBuffer;
joelvonrotz 0:11ad6aaed10a 2210
joelvonrotz 0:11ad6aaed10a 2211
joelvonrotz 0:11ad6aaed10a 2212 /*
joelvonrotz 0:11ad6aaed10a 2213 * use multi read even if some registers are not useful, result will
joelvonrotz 0:11ad6aaed10a 2214 * be more efficient
joelvonrotz 0:11ad6aaed10a 2215 * start reading at 0x14 dec20
joelvonrotz 0:11ad6aaed10a 2216 * end reading at 0x21 dec33 total 14 bytes to read
joelvonrotz 0:11ad6aaed10a 2217 */
joelvonrotz 0:11ad6aaed10a 2218 Status = VL53L0X_ReadMulti(Dev, 0x14, localBuffer, 12);
joelvonrotz 0:11ad6aaed10a 2219
joelvonrotz 0:11ad6aaed10a 2220 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 2221
joelvonrotz 0:11ad6aaed10a 2222 pRangingMeasurementData->ZoneId = 0; /* Only one zone */
joelvonrotz 0:11ad6aaed10a 2223 pRangingMeasurementData->TimeStamp = 0; /* Not Implemented */
joelvonrotz 0:11ad6aaed10a 2224
joelvonrotz 0:11ad6aaed10a 2225 tmpuint16 = VL53L0X_MAKEUINT16(localBuffer[11], localBuffer[10]);
joelvonrotz 0:11ad6aaed10a 2226 /* cut1.1 if SYSTEM__RANGE_CONFIG if 1 range is 2bits fractional
joelvonrotz 0:11ad6aaed10a 2227 *(format 11.2) else no fractional
joelvonrotz 0:11ad6aaed10a 2228 */
joelvonrotz 0:11ad6aaed10a 2229
joelvonrotz 0:11ad6aaed10a 2230 pRangingMeasurementData->MeasurementTimeUsec = 0;
joelvonrotz 0:11ad6aaed10a 2231
joelvonrotz 0:11ad6aaed10a 2232 SignalRate = VL53L0X_FIXPOINT97TOFIXPOINT1616(
joelvonrotz 0:11ad6aaed10a 2233 VL53L0X_MAKEUINT16(localBuffer[7], localBuffer[6]));
joelvonrotz 0:11ad6aaed10a 2234 /* peak_signal_count_rate_rtn_mcps */
joelvonrotz 0:11ad6aaed10a 2235 pRangingMeasurementData->SignalRateRtnMegaCps = SignalRate;
joelvonrotz 0:11ad6aaed10a 2236
joelvonrotz 0:11ad6aaed10a 2237 AmbientRate = VL53L0X_MAKEUINT16(localBuffer[9], localBuffer[8]);
joelvonrotz 0:11ad6aaed10a 2238 pRangingMeasurementData->AmbientRateRtnMegaCps =
joelvonrotz 0:11ad6aaed10a 2239 VL53L0X_FIXPOINT97TOFIXPOINT1616(AmbientRate);
joelvonrotz 0:11ad6aaed10a 2240
joelvonrotz 0:11ad6aaed10a 2241 EffectiveSpadRtnCount = VL53L0X_MAKEUINT16(localBuffer[3],
joelvonrotz 0:11ad6aaed10a 2242 localBuffer[2]);
joelvonrotz 0:11ad6aaed10a 2243 /* EffectiveSpadRtnCount is 8.8 format */
joelvonrotz 0:11ad6aaed10a 2244 pRangingMeasurementData->EffectiveSpadRtnCount =
joelvonrotz 0:11ad6aaed10a 2245 EffectiveSpadRtnCount;
joelvonrotz 0:11ad6aaed10a 2246
joelvonrotz 0:11ad6aaed10a 2247 DeviceRangeStatus = localBuffer[0];
joelvonrotz 0:11ad6aaed10a 2248
joelvonrotz 0:11ad6aaed10a 2249 /* Get Linearity Corrective Gain */
joelvonrotz 0:11ad6aaed10a 2250 LinearityCorrectiveGain = PALDevDataGet(Dev,
joelvonrotz 0:11ad6aaed10a 2251 LinearityCorrectiveGain);
joelvonrotz 0:11ad6aaed10a 2252
joelvonrotz 0:11ad6aaed10a 2253 /* Get ranging configuration */
joelvonrotz 0:11ad6aaed10a 2254 RangeFractionalEnable = PALDevDataGet(Dev,
joelvonrotz 0:11ad6aaed10a 2255 RangeFractionalEnable);
joelvonrotz 0:11ad6aaed10a 2256
joelvonrotz 0:11ad6aaed10a 2257 if (LinearityCorrectiveGain != 1000) {
joelvonrotz 0:11ad6aaed10a 2258
joelvonrotz 0:11ad6aaed10a 2259 tmpuint16 = (uint16_t)((LinearityCorrectiveGain
joelvonrotz 0:11ad6aaed10a 2260 * tmpuint16 + 500) / 1000);
joelvonrotz 0:11ad6aaed10a 2261
joelvonrotz 0:11ad6aaed10a 2262 /* Implement Xtalk */
joelvonrotz 0:11ad6aaed10a 2263 VL53L0X_GETPARAMETERFIELD(Dev,
joelvonrotz 0:11ad6aaed10a 2264 XTalkCompensationRateMegaCps,
joelvonrotz 0:11ad6aaed10a 2265 XTalkCompensationRateMegaCps);
joelvonrotz 0:11ad6aaed10a 2266 VL53L0X_GETPARAMETERFIELD(Dev, XTalkCompensationEnable,
joelvonrotz 0:11ad6aaed10a 2267 XTalkCompensationEnable);
joelvonrotz 0:11ad6aaed10a 2268
joelvonrotz 0:11ad6aaed10a 2269 if (XTalkCompensationEnable) {
joelvonrotz 0:11ad6aaed10a 2270
joelvonrotz 0:11ad6aaed10a 2271 if ((SignalRate
joelvonrotz 0:11ad6aaed10a 2272 - ((XTalkCompensationRateMegaCps
joelvonrotz 0:11ad6aaed10a 2273 * EffectiveSpadRtnCount) >> 8))
joelvonrotz 0:11ad6aaed10a 2274 <= 0) {
joelvonrotz 0:11ad6aaed10a 2275 if (RangeFractionalEnable)
joelvonrotz 0:11ad6aaed10a 2276 XtalkRangeMilliMeter = 8888;
joelvonrotz 0:11ad6aaed10a 2277 else
joelvonrotz 0:11ad6aaed10a 2278 XtalkRangeMilliMeter = 8888
joelvonrotz 0:11ad6aaed10a 2279 << 2;
joelvonrotz 0:11ad6aaed10a 2280 } else {
joelvonrotz 0:11ad6aaed10a 2281 XtalkRangeMilliMeter =
joelvonrotz 0:11ad6aaed10a 2282 (tmpuint16 * SignalRate)
joelvonrotz 0:11ad6aaed10a 2283 / (SignalRate
joelvonrotz 0:11ad6aaed10a 2284 - ((XTalkCompensationRateMegaCps
joelvonrotz 0:11ad6aaed10a 2285 * EffectiveSpadRtnCount)
joelvonrotz 0:11ad6aaed10a 2286 >> 8));
joelvonrotz 0:11ad6aaed10a 2287 }
joelvonrotz 0:11ad6aaed10a 2288
joelvonrotz 0:11ad6aaed10a 2289 tmpuint16 = XtalkRangeMilliMeter;
joelvonrotz 0:11ad6aaed10a 2290 }
joelvonrotz 0:11ad6aaed10a 2291
joelvonrotz 0:11ad6aaed10a 2292 }
joelvonrotz 0:11ad6aaed10a 2293
joelvonrotz 0:11ad6aaed10a 2294 if (RangeFractionalEnable) {
joelvonrotz 0:11ad6aaed10a 2295 pRangingMeasurementData->RangeMilliMeter =
joelvonrotz 0:11ad6aaed10a 2296 (uint16_t)((tmpuint16) >> 2);
joelvonrotz 0:11ad6aaed10a 2297 pRangingMeasurementData->RangeFractionalPart =
joelvonrotz 0:11ad6aaed10a 2298 (uint8_t)((tmpuint16 & 0x03) << 6);
joelvonrotz 0:11ad6aaed10a 2299 } else {
joelvonrotz 0:11ad6aaed10a 2300 pRangingMeasurementData->RangeMilliMeter = tmpuint16;
joelvonrotz 0:11ad6aaed10a 2301 pRangingMeasurementData->RangeFractionalPart = 0;
joelvonrotz 0:11ad6aaed10a 2302 }
joelvonrotz 0:11ad6aaed10a 2303
joelvonrotz 0:11ad6aaed10a 2304 /*
joelvonrotz 0:11ad6aaed10a 2305 * For a standard definition of RangeStatus, this should
joelvonrotz 0:11ad6aaed10a 2306 * return 0 in case of good result after a ranging
joelvonrotz 0:11ad6aaed10a 2307 * The range status depends on the device so call a device
joelvonrotz 0:11ad6aaed10a 2308 * specific function to obtain the right Status.
joelvonrotz 0:11ad6aaed10a 2309 */
joelvonrotz 0:11ad6aaed10a 2310 Status |= VL53L0X_get_pal_range_status(Dev, DeviceRangeStatus,
joelvonrotz 0:11ad6aaed10a 2311 SignalRate, EffectiveSpadRtnCount,
joelvonrotz 0:11ad6aaed10a 2312 pRangingMeasurementData, &PalRangeStatus);
joelvonrotz 0:11ad6aaed10a 2313
joelvonrotz 0:11ad6aaed10a 2314 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 2315 pRangingMeasurementData->RangeStatus = PalRangeStatus;
joelvonrotz 0:11ad6aaed10a 2316
joelvonrotz 0:11ad6aaed10a 2317 }
joelvonrotz 0:11ad6aaed10a 2318
joelvonrotz 0:11ad6aaed10a 2319 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 2320 /* Copy last read data into Dev buffer */
joelvonrotz 0:11ad6aaed10a 2321 LastRangeDataBuffer = PALDevDataGet(Dev, LastRangeMeasure);
joelvonrotz 0:11ad6aaed10a 2322
joelvonrotz 0:11ad6aaed10a 2323 LastRangeDataBuffer.RangeMilliMeter =
joelvonrotz 0:11ad6aaed10a 2324 pRangingMeasurementData->RangeMilliMeter;
joelvonrotz 0:11ad6aaed10a 2325 LastRangeDataBuffer.RangeFractionalPart =
joelvonrotz 0:11ad6aaed10a 2326 pRangingMeasurementData->RangeFractionalPart;
joelvonrotz 0:11ad6aaed10a 2327 LastRangeDataBuffer.RangeDMaxMilliMeter =
joelvonrotz 0:11ad6aaed10a 2328 pRangingMeasurementData->RangeDMaxMilliMeter;
joelvonrotz 0:11ad6aaed10a 2329 LastRangeDataBuffer.MeasurementTimeUsec =
joelvonrotz 0:11ad6aaed10a 2330 pRangingMeasurementData->MeasurementTimeUsec;
joelvonrotz 0:11ad6aaed10a 2331 LastRangeDataBuffer.SignalRateRtnMegaCps =
joelvonrotz 0:11ad6aaed10a 2332 pRangingMeasurementData->SignalRateRtnMegaCps;
joelvonrotz 0:11ad6aaed10a 2333 LastRangeDataBuffer.AmbientRateRtnMegaCps =
joelvonrotz 0:11ad6aaed10a 2334 pRangingMeasurementData->AmbientRateRtnMegaCps;
joelvonrotz 0:11ad6aaed10a 2335 LastRangeDataBuffer.EffectiveSpadRtnCount =
joelvonrotz 0:11ad6aaed10a 2336 pRangingMeasurementData->EffectiveSpadRtnCount;
joelvonrotz 0:11ad6aaed10a 2337 LastRangeDataBuffer.RangeStatus =
joelvonrotz 0:11ad6aaed10a 2338 pRangingMeasurementData->RangeStatus;
joelvonrotz 0:11ad6aaed10a 2339
joelvonrotz 0:11ad6aaed10a 2340 PALDevDataSet(Dev, LastRangeMeasure, LastRangeDataBuffer);
joelvonrotz 0:11ad6aaed10a 2341 }
joelvonrotz 0:11ad6aaed10a 2342
joelvonrotz 0:11ad6aaed10a 2343 return Status;
joelvonrotz 0:11ad6aaed10a 2344 }
joelvonrotz 0:11ad6aaed10a 2345
joelvonrotz 0:11ad6aaed10a 2346 VL53L0X_Error VL53L0X_GetMeasurementRefSignal(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 2347 FixPoint1616_t *pMeasurementRefSignal)
joelvonrotz 0:11ad6aaed10a 2348 {
joelvonrotz 0:11ad6aaed10a 2349 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2350 uint8_t SignalRefClipLimitCheckEnable = 0;
joelvonrotz 0:11ad6aaed10a 2351
joelvonrotz 0:11ad6aaed10a 2352 Status = VL53L0X_GetLimitCheckEnable(Dev,
joelvonrotz 0:11ad6aaed10a 2353 VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP,
joelvonrotz 0:11ad6aaed10a 2354 &SignalRefClipLimitCheckEnable);
joelvonrotz 0:11ad6aaed10a 2355 if (SignalRefClipLimitCheckEnable != 0) {
joelvonrotz 0:11ad6aaed10a 2356 *pMeasurementRefSignal = PALDevDataGet(Dev, LastSignalRefMcps);
joelvonrotz 0:11ad6aaed10a 2357 } else {
joelvonrotz 0:11ad6aaed10a 2358 Status = VL53L0X_ERROR_INVALID_COMMAND;
joelvonrotz 0:11ad6aaed10a 2359 }
joelvonrotz 0:11ad6aaed10a 2360
joelvonrotz 0:11ad6aaed10a 2361 return Status;
joelvonrotz 0:11ad6aaed10a 2362 }
joelvonrotz 0:11ad6aaed10a 2363
joelvonrotz 0:11ad6aaed10a 2364 VL53L0X_Error VL53L0X_GetHistogramMeasurementData(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 2365 VL53L0X_HistogramMeasurementData_t *pHistogramMeasurementData)
joelvonrotz 0:11ad6aaed10a 2366 {
joelvonrotz 0:11ad6aaed10a 2367 VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED;
joelvonrotz 0:11ad6aaed10a 2368
joelvonrotz 0:11ad6aaed10a 2369 return Status;
joelvonrotz 0:11ad6aaed10a 2370 }
joelvonrotz 0:11ad6aaed10a 2371
joelvonrotz 0:11ad6aaed10a 2372 VL53L0X_Error VL53L0X_PerformSingleRangingMeasurement(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 2373 VL53L0X_RangingMeasurementData_t *pRangingMeasurementData)
joelvonrotz 0:11ad6aaed10a 2374 {
joelvonrotz 0:11ad6aaed10a 2375 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2376
joelvonrotz 0:11ad6aaed10a 2377
joelvonrotz 0:11ad6aaed10a 2378 /* This function will do a complete single ranging
joelvonrotz 0:11ad6aaed10a 2379 * Here we fix the mode! */
joelvonrotz 0:11ad6aaed10a 2380 Status = VL53L0X_SetDeviceMode(Dev, VL53L0X_DEVICEMODE_SINGLE_RANGING);
joelvonrotz 0:11ad6aaed10a 2381
joelvonrotz 0:11ad6aaed10a 2382 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 2383 Status = VL53L0X_PerformSingleMeasurement(Dev);
joelvonrotz 0:11ad6aaed10a 2384
joelvonrotz 0:11ad6aaed10a 2385
joelvonrotz 0:11ad6aaed10a 2386 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 2387 Status = VL53L0X_GetRangingMeasurementData(Dev,
joelvonrotz 0:11ad6aaed10a 2388 pRangingMeasurementData);
joelvonrotz 0:11ad6aaed10a 2389
joelvonrotz 0:11ad6aaed10a 2390
joelvonrotz 0:11ad6aaed10a 2391 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 2392 Status = VL53L0X_ClearInterruptMask(Dev, 0);
joelvonrotz 0:11ad6aaed10a 2393
joelvonrotz 0:11ad6aaed10a 2394
joelvonrotz 0:11ad6aaed10a 2395 return Status;
joelvonrotz 0:11ad6aaed10a 2396 }
joelvonrotz 0:11ad6aaed10a 2397
joelvonrotz 0:11ad6aaed10a 2398 VL53L0X_Error VL53L0X_SetNumberOfROIZones(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 2399 uint8_t NumberOfROIZones)
joelvonrotz 0:11ad6aaed10a 2400 {
joelvonrotz 0:11ad6aaed10a 2401 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2402
joelvonrotz 0:11ad6aaed10a 2403
joelvonrotz 0:11ad6aaed10a 2404 if (NumberOfROIZones != 1)
joelvonrotz 0:11ad6aaed10a 2405 Status = VL53L0X_ERROR_INVALID_PARAMS;
joelvonrotz 0:11ad6aaed10a 2406
joelvonrotz 0:11ad6aaed10a 2407
joelvonrotz 0:11ad6aaed10a 2408 return Status;
joelvonrotz 0:11ad6aaed10a 2409 }
joelvonrotz 0:11ad6aaed10a 2410
joelvonrotz 0:11ad6aaed10a 2411 VL53L0X_Error VL53L0X_GetNumberOfROIZones(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 2412 uint8_t *pNumberOfROIZones)
joelvonrotz 0:11ad6aaed10a 2413 {
joelvonrotz 0:11ad6aaed10a 2414 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2415
joelvonrotz 0:11ad6aaed10a 2416
joelvonrotz 0:11ad6aaed10a 2417 *pNumberOfROIZones = 1;
joelvonrotz 0:11ad6aaed10a 2418
joelvonrotz 0:11ad6aaed10a 2419 return Status;
joelvonrotz 0:11ad6aaed10a 2420 }
joelvonrotz 0:11ad6aaed10a 2421
joelvonrotz 0:11ad6aaed10a 2422 VL53L0X_Error VL53L0X_GetMaxNumberOfROIZones(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 2423 uint8_t *pMaxNumberOfROIZones)
joelvonrotz 0:11ad6aaed10a 2424 {
joelvonrotz 0:11ad6aaed10a 2425 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2426
joelvonrotz 0:11ad6aaed10a 2427
joelvonrotz 0:11ad6aaed10a 2428 *pMaxNumberOfROIZones = 1;
joelvonrotz 0:11ad6aaed10a 2429
joelvonrotz 0:11ad6aaed10a 2430 return Status;
joelvonrotz 0:11ad6aaed10a 2431 }
joelvonrotz 0:11ad6aaed10a 2432
joelvonrotz 0:11ad6aaed10a 2433 /* End Group PAL Measurement Functions */
joelvonrotz 0:11ad6aaed10a 2434
joelvonrotz 0:11ad6aaed10a 2435 VL53L0X_Error VL53L0X_SetGpioConfig(VL53L0X_DEV Dev, uint8_t Pin,
joelvonrotz 0:11ad6aaed10a 2436 VL53L0X_DeviceModes DeviceMode, VL53L0X_GpioFunctionality Functionality,
joelvonrotz 0:11ad6aaed10a 2437 VL53L0X_InterruptPolarity Polarity)
joelvonrotz 0:11ad6aaed10a 2438 {
joelvonrotz 0:11ad6aaed10a 2439 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2440 uint8_t data;
joelvonrotz 0:11ad6aaed10a 2441
joelvonrotz 0:11ad6aaed10a 2442
joelvonrotz 0:11ad6aaed10a 2443 if (Pin != 0) {
joelvonrotz 0:11ad6aaed10a 2444 Status = VL53L0X_ERROR_GPIO_NOT_EXISTING;
joelvonrotz 0:11ad6aaed10a 2445 } else if (DeviceMode == VL53L0X_DEVICEMODE_GPIO_DRIVE) {
joelvonrotz 0:11ad6aaed10a 2446 if (Polarity == VL53L0X_INTERRUPTPOLARITY_LOW)
joelvonrotz 0:11ad6aaed10a 2447 data = 0x10;
joelvonrotz 0:11ad6aaed10a 2448 else
joelvonrotz 0:11ad6aaed10a 2449 data = 1;
joelvonrotz 0:11ad6aaed10a 2450
joelvonrotz 0:11ad6aaed10a 2451 Status = VL53L0X_WrByte(Dev,
joelvonrotz 0:11ad6aaed10a 2452 VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH, data);
joelvonrotz 0:11ad6aaed10a 2453
joelvonrotz 0:11ad6aaed10a 2454 } else if (DeviceMode == VL53L0X_DEVICEMODE_GPIO_OSC) {
joelvonrotz 0:11ad6aaed10a 2455
joelvonrotz 0:11ad6aaed10a 2456 Status |= VL53L0X_WrByte(Dev, 0xff, 0x01);
joelvonrotz 0:11ad6aaed10a 2457 Status |= VL53L0X_WrByte(Dev, 0x00, 0x00);
joelvonrotz 0:11ad6aaed10a 2458
joelvonrotz 0:11ad6aaed10a 2459 Status |= VL53L0X_WrByte(Dev, 0xff, 0x00);
joelvonrotz 0:11ad6aaed10a 2460 Status |= VL53L0X_WrByte(Dev, 0x80, 0x01);
joelvonrotz 0:11ad6aaed10a 2461 Status |= VL53L0X_WrByte(Dev, 0x85, 0x02);
joelvonrotz 0:11ad6aaed10a 2462
joelvonrotz 0:11ad6aaed10a 2463 Status |= VL53L0X_WrByte(Dev, 0xff, 0x04);
joelvonrotz 0:11ad6aaed10a 2464 Status |= VL53L0X_WrByte(Dev, 0xcd, 0x00);
joelvonrotz 0:11ad6aaed10a 2465 Status |= VL53L0X_WrByte(Dev, 0xcc, 0x11);
joelvonrotz 0:11ad6aaed10a 2466
joelvonrotz 0:11ad6aaed10a 2467 Status |= VL53L0X_WrByte(Dev, 0xff, 0x07);
joelvonrotz 0:11ad6aaed10a 2468 Status |= VL53L0X_WrByte(Dev, 0xbe, 0x00);
joelvonrotz 0:11ad6aaed10a 2469
joelvonrotz 0:11ad6aaed10a 2470 Status |= VL53L0X_WrByte(Dev, 0xff, 0x06);
joelvonrotz 0:11ad6aaed10a 2471 Status |= VL53L0X_WrByte(Dev, 0xcc, 0x09);
joelvonrotz 0:11ad6aaed10a 2472
joelvonrotz 0:11ad6aaed10a 2473 Status |= VL53L0X_WrByte(Dev, 0xff, 0x00);
joelvonrotz 0:11ad6aaed10a 2474 Status |= VL53L0X_WrByte(Dev, 0xff, 0x01);
joelvonrotz 0:11ad6aaed10a 2475 Status |= VL53L0X_WrByte(Dev, 0x00, 0x00);
joelvonrotz 0:11ad6aaed10a 2476
joelvonrotz 0:11ad6aaed10a 2477 } else {
joelvonrotz 0:11ad6aaed10a 2478
joelvonrotz 0:11ad6aaed10a 2479 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 2480 switch (Functionality) {
joelvonrotz 0:11ad6aaed10a 2481 case VL53L0X_GPIOFUNCTIONALITY_OFF:
joelvonrotz 0:11ad6aaed10a 2482 data = 0x00;
joelvonrotz 0:11ad6aaed10a 2483 break;
joelvonrotz 0:11ad6aaed10a 2484 case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW:
joelvonrotz 0:11ad6aaed10a 2485 data = 0x01;
joelvonrotz 0:11ad6aaed10a 2486 break;
joelvonrotz 0:11ad6aaed10a 2487 case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH:
joelvonrotz 0:11ad6aaed10a 2488 data = 0x02;
joelvonrotz 0:11ad6aaed10a 2489 break;
joelvonrotz 0:11ad6aaed10a 2490 case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT:
joelvonrotz 0:11ad6aaed10a 2491 data = 0x03;
joelvonrotz 0:11ad6aaed10a 2492 break;
joelvonrotz 0:11ad6aaed10a 2493 case VL53L0X_GPIOFUNCTIONALITY_NEW_MEASURE_READY:
joelvonrotz 0:11ad6aaed10a 2494 data = 0x04;
joelvonrotz 0:11ad6aaed10a 2495 break;
joelvonrotz 0:11ad6aaed10a 2496 default:
joelvonrotz 0:11ad6aaed10a 2497 Status =
joelvonrotz 0:11ad6aaed10a 2498 VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED;
joelvonrotz 0:11ad6aaed10a 2499 }
joelvonrotz 0:11ad6aaed10a 2500 }
joelvonrotz 0:11ad6aaed10a 2501
joelvonrotz 0:11ad6aaed10a 2502 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 2503 Status = VL53L0X_WrByte(Dev,
joelvonrotz 0:11ad6aaed10a 2504 VL53L0X_REG_SYSTEM_INTERRUPT_CONFIG_GPIO, data);
joelvonrotz 0:11ad6aaed10a 2505
joelvonrotz 0:11ad6aaed10a 2506 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 2507 if (Polarity == VL53L0X_INTERRUPTPOLARITY_LOW)
joelvonrotz 0:11ad6aaed10a 2508 data = 0;
joelvonrotz 0:11ad6aaed10a 2509 else
joelvonrotz 0:11ad6aaed10a 2510 data = (uint8_t)(1 << 4);
joelvonrotz 0:11ad6aaed10a 2511
joelvonrotz 0:11ad6aaed10a 2512 Status = VL53L0X_UpdateByte(Dev,
joelvonrotz 0:11ad6aaed10a 2513 VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH, 0xEF, data);
joelvonrotz 0:11ad6aaed10a 2514 }
joelvonrotz 0:11ad6aaed10a 2515
joelvonrotz 0:11ad6aaed10a 2516 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 2517 VL53L0X_SETDEVICESPECIFICPARAMETER(Dev,
joelvonrotz 0:11ad6aaed10a 2518 Pin0GpioFunctionality, Functionality);
joelvonrotz 0:11ad6aaed10a 2519
joelvonrotz 0:11ad6aaed10a 2520 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 2521 Status = VL53L0X_ClearInterruptMask(Dev, 0);
joelvonrotz 0:11ad6aaed10a 2522
joelvonrotz 0:11ad6aaed10a 2523 }
joelvonrotz 0:11ad6aaed10a 2524
joelvonrotz 0:11ad6aaed10a 2525 return Status;
joelvonrotz 0:11ad6aaed10a 2526 }
joelvonrotz 0:11ad6aaed10a 2527
joelvonrotz 0:11ad6aaed10a 2528 VL53L0X_Error VL53L0X_GetGpioConfig(VL53L0X_DEV Dev, uint8_t Pin,
joelvonrotz 0:11ad6aaed10a 2529 VL53L0X_DeviceModes *pDeviceMode,
joelvonrotz 0:11ad6aaed10a 2530 VL53L0X_GpioFunctionality *pFunctionality,
joelvonrotz 0:11ad6aaed10a 2531 VL53L0X_InterruptPolarity *pPolarity)
joelvonrotz 0:11ad6aaed10a 2532 {
joelvonrotz 0:11ad6aaed10a 2533 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2534 VL53L0X_GpioFunctionality GpioFunctionality;
joelvonrotz 0:11ad6aaed10a 2535 uint8_t data;
joelvonrotz 0:11ad6aaed10a 2536
joelvonrotz 0:11ad6aaed10a 2537
joelvonrotz 0:11ad6aaed10a 2538 /* pDeviceMode not managed by Ewok it return the current mode */
joelvonrotz 0:11ad6aaed10a 2539
joelvonrotz 0:11ad6aaed10a 2540 Status = VL53L0X_GetDeviceMode(Dev, pDeviceMode);
joelvonrotz 0:11ad6aaed10a 2541
joelvonrotz 0:11ad6aaed10a 2542 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 2543 if (Pin != 0) {
joelvonrotz 0:11ad6aaed10a 2544 Status = VL53L0X_ERROR_GPIO_NOT_EXISTING;
joelvonrotz 0:11ad6aaed10a 2545 } else {
joelvonrotz 0:11ad6aaed10a 2546 Status = VL53L0X_RdByte(Dev,
joelvonrotz 0:11ad6aaed10a 2547 VL53L0X_REG_SYSTEM_INTERRUPT_CONFIG_GPIO, &data);
joelvonrotz 0:11ad6aaed10a 2548 }
joelvonrotz 0:11ad6aaed10a 2549 }
joelvonrotz 0:11ad6aaed10a 2550
joelvonrotz 0:11ad6aaed10a 2551 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 2552 switch (data & 0x07) {
joelvonrotz 0:11ad6aaed10a 2553 case 0x00:
joelvonrotz 0:11ad6aaed10a 2554 GpioFunctionality = VL53L0X_GPIOFUNCTIONALITY_OFF;
joelvonrotz 0:11ad6aaed10a 2555 break;
joelvonrotz 0:11ad6aaed10a 2556 case 0x01:
joelvonrotz 0:11ad6aaed10a 2557 GpioFunctionality =
joelvonrotz 0:11ad6aaed10a 2558 VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW;
joelvonrotz 0:11ad6aaed10a 2559 break;
joelvonrotz 0:11ad6aaed10a 2560 case 0x02:
joelvonrotz 0:11ad6aaed10a 2561 GpioFunctionality =
joelvonrotz 0:11ad6aaed10a 2562 VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH;
joelvonrotz 0:11ad6aaed10a 2563 break;
joelvonrotz 0:11ad6aaed10a 2564 case 0x03:
joelvonrotz 0:11ad6aaed10a 2565 GpioFunctionality =
joelvonrotz 0:11ad6aaed10a 2566 VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT;
joelvonrotz 0:11ad6aaed10a 2567 break;
joelvonrotz 0:11ad6aaed10a 2568 case 0x04:
joelvonrotz 0:11ad6aaed10a 2569 GpioFunctionality =
joelvonrotz 0:11ad6aaed10a 2570 VL53L0X_GPIOFUNCTIONALITY_NEW_MEASURE_READY;
joelvonrotz 0:11ad6aaed10a 2571 break;
joelvonrotz 0:11ad6aaed10a 2572 default:
joelvonrotz 0:11ad6aaed10a 2573 Status = VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED;
joelvonrotz 0:11ad6aaed10a 2574 }
joelvonrotz 0:11ad6aaed10a 2575 }
joelvonrotz 0:11ad6aaed10a 2576
joelvonrotz 0:11ad6aaed10a 2577 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 2578 Status = VL53L0X_RdByte(Dev, VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH,
joelvonrotz 0:11ad6aaed10a 2579 &data);
joelvonrotz 0:11ad6aaed10a 2580
joelvonrotz 0:11ad6aaed10a 2581 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 2582 if ((data & (uint8_t)(1 << 4)) == 0)
joelvonrotz 0:11ad6aaed10a 2583 *pPolarity = VL53L0X_INTERRUPTPOLARITY_LOW;
joelvonrotz 0:11ad6aaed10a 2584 else
joelvonrotz 0:11ad6aaed10a 2585 *pPolarity = VL53L0X_INTERRUPTPOLARITY_HIGH;
joelvonrotz 0:11ad6aaed10a 2586 }
joelvonrotz 0:11ad6aaed10a 2587
joelvonrotz 0:11ad6aaed10a 2588 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 2589 *pFunctionality = GpioFunctionality;
joelvonrotz 0:11ad6aaed10a 2590 VL53L0X_SETDEVICESPECIFICPARAMETER(Dev, Pin0GpioFunctionality,
joelvonrotz 0:11ad6aaed10a 2591 GpioFunctionality);
joelvonrotz 0:11ad6aaed10a 2592 }
joelvonrotz 0:11ad6aaed10a 2593
joelvonrotz 0:11ad6aaed10a 2594 return Status;
joelvonrotz 0:11ad6aaed10a 2595 }
joelvonrotz 0:11ad6aaed10a 2596
joelvonrotz 0:11ad6aaed10a 2597 VL53L0X_Error VL53L0X_SetInterruptThresholds(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 2598 VL53L0X_DeviceModes DeviceMode, FixPoint1616_t ThresholdLow,
joelvonrotz 0:11ad6aaed10a 2599 FixPoint1616_t ThresholdHigh)
joelvonrotz 0:11ad6aaed10a 2600 {
joelvonrotz 0:11ad6aaed10a 2601 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2602 uint16_t Threshold16;
joelvonrotz 0:11ad6aaed10a 2603
joelvonrotz 0:11ad6aaed10a 2604 /* no dependency on DeviceMode for Ewok */
joelvonrotz 0:11ad6aaed10a 2605 /* Need to divide by 2 because the FW will apply a x2 */
joelvonrotz 0:11ad6aaed10a 2606 Threshold16 = (uint16_t)((ThresholdLow >> 17) & 0x00fff);
joelvonrotz 0:11ad6aaed10a 2607 Status = VL53L0X_WrWord(Dev, VL53L0X_REG_SYSTEM_THRESH_LOW, Threshold16);
joelvonrotz 0:11ad6aaed10a 2608
joelvonrotz 0:11ad6aaed10a 2609 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 2610 /* Need to divide by 2 because the FW will apply a x2 */
joelvonrotz 0:11ad6aaed10a 2611 Threshold16 = (uint16_t)((ThresholdHigh >> 17) & 0x00fff);
joelvonrotz 0:11ad6aaed10a 2612 Status = VL53L0X_WrWord(Dev, VL53L0X_REG_SYSTEM_THRESH_HIGH,
joelvonrotz 0:11ad6aaed10a 2613 Threshold16);
joelvonrotz 0:11ad6aaed10a 2614 }
joelvonrotz 0:11ad6aaed10a 2615
joelvonrotz 0:11ad6aaed10a 2616 return Status;
joelvonrotz 0:11ad6aaed10a 2617 }
joelvonrotz 0:11ad6aaed10a 2618
joelvonrotz 0:11ad6aaed10a 2619 VL53L0X_Error VL53L0X_GetInterruptThresholds(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 2620 VL53L0X_DeviceModes DeviceMode, FixPoint1616_t *pThresholdLow,
joelvonrotz 0:11ad6aaed10a 2621 FixPoint1616_t *pThresholdHigh)
joelvonrotz 0:11ad6aaed10a 2622 {
joelvonrotz 0:11ad6aaed10a 2623 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2624 uint16_t Threshold16;
joelvonrotz 0:11ad6aaed10a 2625
joelvonrotz 0:11ad6aaed10a 2626 /* no dependency on DeviceMode for Ewok */
joelvonrotz 0:11ad6aaed10a 2627
joelvonrotz 0:11ad6aaed10a 2628 Status = VL53L0X_RdWord(Dev, VL53L0X_REG_SYSTEM_THRESH_LOW, &Threshold16);
joelvonrotz 0:11ad6aaed10a 2629 /* Need to multiply by 2 because the FW will apply a x2 */
joelvonrotz 0:11ad6aaed10a 2630 *pThresholdLow = (FixPoint1616_t)((0x00fff & Threshold16) << 17);
joelvonrotz 0:11ad6aaed10a 2631
joelvonrotz 0:11ad6aaed10a 2632 if (Status == VL53L0X_ERROR_NONE) {
joelvonrotz 0:11ad6aaed10a 2633 Status = VL53L0X_RdWord(Dev, VL53L0X_REG_SYSTEM_THRESH_HIGH,
joelvonrotz 0:11ad6aaed10a 2634 &Threshold16);
joelvonrotz 0:11ad6aaed10a 2635 /* Need to multiply by 2 because the FW will apply a x2 */
joelvonrotz 0:11ad6aaed10a 2636 *pThresholdHigh =
joelvonrotz 0:11ad6aaed10a 2637 (FixPoint1616_t)((0x00fff & Threshold16) << 17);
joelvonrotz 0:11ad6aaed10a 2638 }
joelvonrotz 0:11ad6aaed10a 2639
joelvonrotz 0:11ad6aaed10a 2640 return Status;
joelvonrotz 0:11ad6aaed10a 2641 }
joelvonrotz 0:11ad6aaed10a 2642
joelvonrotz 0:11ad6aaed10a 2643 VL53L0X_Error VL53L0X_GetStopCompletedStatus(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 2644 uint32_t *pStopStatus)
joelvonrotz 0:11ad6aaed10a 2645 {
joelvonrotz 0:11ad6aaed10a 2646 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2647 uint8_t Byte = 0;
joelvonrotz 0:11ad6aaed10a 2648
joelvonrotz 0:11ad6aaed10a 2649 Status = VL53L0X_WrByte(Dev, 0xFF, 0x01);
joelvonrotz 0:11ad6aaed10a 2650
joelvonrotz 0:11ad6aaed10a 2651 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 2652 Status = VL53L0X_RdByte(Dev, 0x04, &Byte);
joelvonrotz 0:11ad6aaed10a 2653
joelvonrotz 0:11ad6aaed10a 2654 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 2655 Status = VL53L0X_WrByte(Dev, 0xFF, 0x0);
joelvonrotz 0:11ad6aaed10a 2656
joelvonrotz 0:11ad6aaed10a 2657 *pStopStatus = Byte;
joelvonrotz 0:11ad6aaed10a 2658
joelvonrotz 0:11ad6aaed10a 2659 if (Byte == 0) {
joelvonrotz 0:11ad6aaed10a 2660 Status = VL53L0X_WrByte(Dev, 0x80, 0x01);
joelvonrotz 0:11ad6aaed10a 2661 Status = VL53L0X_WrByte(Dev, 0xFF, 0x01);
joelvonrotz 0:11ad6aaed10a 2662 Status = VL53L0X_WrByte(Dev, 0x00, 0x00);
joelvonrotz 0:11ad6aaed10a 2663 Status = VL53L0X_WrByte(Dev, 0x91,
joelvonrotz 0:11ad6aaed10a 2664 PALDevDataGet(Dev, StopVariable));
joelvonrotz 0:11ad6aaed10a 2665 Status = VL53L0X_WrByte(Dev, 0x00, 0x01);
joelvonrotz 0:11ad6aaed10a 2666 Status = VL53L0X_WrByte(Dev, 0xFF, 0x00);
joelvonrotz 0:11ad6aaed10a 2667 Status = VL53L0X_WrByte(Dev, 0x80, 0x00);
joelvonrotz 0:11ad6aaed10a 2668 }
joelvonrotz 0:11ad6aaed10a 2669
joelvonrotz 0:11ad6aaed10a 2670 return Status;
joelvonrotz 0:11ad6aaed10a 2671 }
joelvonrotz 0:11ad6aaed10a 2672
joelvonrotz 0:11ad6aaed10a 2673 /* Group PAL Interrupt Functions */
joelvonrotz 0:11ad6aaed10a 2674 VL53L0X_Error VL53L0X_ClearInterruptMask(VL53L0X_DEV Dev, uint32_t InterruptMask)
joelvonrotz 0:11ad6aaed10a 2675 {
joelvonrotz 0:11ad6aaed10a 2676 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2677 uint8_t LoopCount;
joelvonrotz 0:11ad6aaed10a 2678 uint8_t Byte;
joelvonrotz 0:11ad6aaed10a 2679
joelvonrotz 0:11ad6aaed10a 2680 /* clear bit 0 range interrupt, bit 1 error interrupt */
joelvonrotz 0:11ad6aaed10a 2681 LoopCount = 0;
joelvonrotz 0:11ad6aaed10a 2682 do {
joelvonrotz 0:11ad6aaed10a 2683 Status = VL53L0X_WrByte(Dev,
joelvonrotz 0:11ad6aaed10a 2684 VL53L0X_REG_SYSTEM_INTERRUPT_CLEAR, 0x01);
joelvonrotz 0:11ad6aaed10a 2685 Status |= VL53L0X_WrByte(Dev,
joelvonrotz 0:11ad6aaed10a 2686 VL53L0X_REG_SYSTEM_INTERRUPT_CLEAR, 0x00);
joelvonrotz 0:11ad6aaed10a 2687 Status |= VL53L0X_RdByte(Dev,
joelvonrotz 0:11ad6aaed10a 2688 VL53L0X_REG_RESULT_INTERRUPT_STATUS, &Byte);
joelvonrotz 0:11ad6aaed10a 2689 LoopCount++;
joelvonrotz 0:11ad6aaed10a 2690 } while (((Byte & 0x07) != 0x00)
joelvonrotz 0:11ad6aaed10a 2691 && (LoopCount < 3)
joelvonrotz 0:11ad6aaed10a 2692 && (Status == VL53L0X_ERROR_NONE));
joelvonrotz 0:11ad6aaed10a 2693
joelvonrotz 0:11ad6aaed10a 2694
joelvonrotz 0:11ad6aaed10a 2695 if (LoopCount >= 3)
joelvonrotz 0:11ad6aaed10a 2696 Status = VL53L0X_ERROR_INTERRUPT_NOT_CLEARED;
joelvonrotz 0:11ad6aaed10a 2697
joelvonrotz 0:11ad6aaed10a 2698 return Status;
joelvonrotz 0:11ad6aaed10a 2699 }
joelvonrotz 0:11ad6aaed10a 2700
joelvonrotz 0:11ad6aaed10a 2701 VL53L0X_Error VL53L0X_GetInterruptMaskStatus(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 2702 uint32_t *pInterruptMaskStatus)
joelvonrotz 0:11ad6aaed10a 2703 {
joelvonrotz 0:11ad6aaed10a 2704 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2705 uint8_t Byte;
joelvonrotz 0:11ad6aaed10a 2706
joelvonrotz 0:11ad6aaed10a 2707 Status = VL53L0X_RdByte(Dev, VL53L0X_REG_RESULT_INTERRUPT_STATUS, &Byte);
joelvonrotz 0:11ad6aaed10a 2708 *pInterruptMaskStatus = Byte & 0x07;
joelvonrotz 0:11ad6aaed10a 2709
joelvonrotz 0:11ad6aaed10a 2710 if (Byte & 0x18)
joelvonrotz 0:11ad6aaed10a 2711 Status = VL53L0X_ERROR_RANGE_ERROR;
joelvonrotz 0:11ad6aaed10a 2712
joelvonrotz 0:11ad6aaed10a 2713 return Status;
joelvonrotz 0:11ad6aaed10a 2714 }
joelvonrotz 0:11ad6aaed10a 2715
joelvonrotz 0:11ad6aaed10a 2716 VL53L0X_Error VL53L0X_EnableInterruptMask(VL53L0X_DEV Dev, uint32_t InterruptMask)
joelvonrotz 0:11ad6aaed10a 2717 {
joelvonrotz 0:11ad6aaed10a 2718 VL53L0X_Error Status = VL53L0X_ERROR_NOT_IMPLEMENTED;
joelvonrotz 0:11ad6aaed10a 2719
joelvonrotz 0:11ad6aaed10a 2720 /* not implemented for VL53L0X */
joelvonrotz 0:11ad6aaed10a 2721
joelvonrotz 0:11ad6aaed10a 2722 return Status;
joelvonrotz 0:11ad6aaed10a 2723 }
joelvonrotz 0:11ad6aaed10a 2724
joelvonrotz 0:11ad6aaed10a 2725 /* End Group PAL Interrupt Functions */
joelvonrotz 0:11ad6aaed10a 2726
joelvonrotz 0:11ad6aaed10a 2727 /* Group SPAD functions */
joelvonrotz 0:11ad6aaed10a 2728
joelvonrotz 0:11ad6aaed10a 2729 VL53L0X_Error VL53L0X_SetSpadAmbientDamperThreshold(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 2730 uint16_t SpadAmbientDamperThreshold)
joelvonrotz 0:11ad6aaed10a 2731 {
joelvonrotz 0:11ad6aaed10a 2732 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2733
joelvonrotz 0:11ad6aaed10a 2734 Status = VL53L0X_WrByte(Dev, 0xFF, 0x01);
joelvonrotz 0:11ad6aaed10a 2735 Status |= VL53L0X_WrWord(Dev, 0x40, SpadAmbientDamperThreshold);
joelvonrotz 0:11ad6aaed10a 2736 Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00);
joelvonrotz 0:11ad6aaed10a 2737
joelvonrotz 0:11ad6aaed10a 2738 return Status;
joelvonrotz 0:11ad6aaed10a 2739 }
joelvonrotz 0:11ad6aaed10a 2740
joelvonrotz 0:11ad6aaed10a 2741 VL53L0X_Error VL53L0X_GetSpadAmbientDamperThreshold(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 2742 uint16_t *pSpadAmbientDamperThreshold)
joelvonrotz 0:11ad6aaed10a 2743 {
joelvonrotz 0:11ad6aaed10a 2744 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2745
joelvonrotz 0:11ad6aaed10a 2746 Status = VL53L0X_WrByte(Dev, 0xFF, 0x01);
joelvonrotz 0:11ad6aaed10a 2747 Status |= VL53L0X_RdWord(Dev, 0x40, pSpadAmbientDamperThreshold);
joelvonrotz 0:11ad6aaed10a 2748 Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00);
joelvonrotz 0:11ad6aaed10a 2749
joelvonrotz 0:11ad6aaed10a 2750 return Status;
joelvonrotz 0:11ad6aaed10a 2751 }
joelvonrotz 0:11ad6aaed10a 2752
joelvonrotz 0:11ad6aaed10a 2753 VL53L0X_Error VL53L0X_SetSpadAmbientDamperFactor(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 2754 uint16_t SpadAmbientDamperFactor)
joelvonrotz 0:11ad6aaed10a 2755 {
joelvonrotz 0:11ad6aaed10a 2756 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2757 uint8_t Byte;
joelvonrotz 0:11ad6aaed10a 2758
joelvonrotz 0:11ad6aaed10a 2759 Byte = (uint8_t)(SpadAmbientDamperFactor & 0x00FF);
joelvonrotz 0:11ad6aaed10a 2760
joelvonrotz 0:11ad6aaed10a 2761 Status = VL53L0X_WrByte(Dev, 0xFF, 0x01);
joelvonrotz 0:11ad6aaed10a 2762 Status |= VL53L0X_WrByte(Dev, 0x42, Byte);
joelvonrotz 0:11ad6aaed10a 2763 Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00);
joelvonrotz 0:11ad6aaed10a 2764
joelvonrotz 0:11ad6aaed10a 2765 return Status;
joelvonrotz 0:11ad6aaed10a 2766 }
joelvonrotz 0:11ad6aaed10a 2767
joelvonrotz 0:11ad6aaed10a 2768 VL53L0X_Error VL53L0X_GetSpadAmbientDamperFactor(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 2769 uint16_t *pSpadAmbientDamperFactor)
joelvonrotz 0:11ad6aaed10a 2770 {
joelvonrotz 0:11ad6aaed10a 2771 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2772 uint8_t Byte;
joelvonrotz 0:11ad6aaed10a 2773
joelvonrotz 0:11ad6aaed10a 2774 Status = VL53L0X_WrByte(Dev, 0xFF, 0x01);
joelvonrotz 0:11ad6aaed10a 2775 Status |= VL53L0X_RdByte(Dev, 0x42, &Byte);
joelvonrotz 0:11ad6aaed10a 2776 Status |= VL53L0X_WrByte(Dev, 0xFF, 0x00);
joelvonrotz 0:11ad6aaed10a 2777 *pSpadAmbientDamperFactor = (uint16_t)Byte;
joelvonrotz 0:11ad6aaed10a 2778
joelvonrotz 0:11ad6aaed10a 2779 return Status;
joelvonrotz 0:11ad6aaed10a 2780 }
joelvonrotz 0:11ad6aaed10a 2781
joelvonrotz 0:11ad6aaed10a 2782 /* END Group SPAD functions */
joelvonrotz 0:11ad6aaed10a 2783
joelvonrotz 0:11ad6aaed10a 2784 /*****************************************************************************
joelvonrotz 0:11ad6aaed10a 2785 * Internal functions
joelvonrotz 0:11ad6aaed10a 2786 *****************************************************************************/
joelvonrotz 0:11ad6aaed10a 2787
joelvonrotz 0:11ad6aaed10a 2788 VL53L0X_Error VL53L0X_SetReferenceSpads(VL53L0X_DEV Dev, uint32_t count,
joelvonrotz 0:11ad6aaed10a 2789 uint8_t isApertureSpads)
joelvonrotz 0:11ad6aaed10a 2790 {
joelvonrotz 0:11ad6aaed10a 2791 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2792
joelvonrotz 0:11ad6aaed10a 2793 Status = VL53L0X_set_reference_spads(Dev, count, isApertureSpads);
joelvonrotz 0:11ad6aaed10a 2794
joelvonrotz 0:11ad6aaed10a 2795
joelvonrotz 0:11ad6aaed10a 2796 return Status;
joelvonrotz 0:11ad6aaed10a 2797 }
joelvonrotz 0:11ad6aaed10a 2798
joelvonrotz 0:11ad6aaed10a 2799 VL53L0X_Error VL53L0X_GetReferenceSpads(VL53L0X_DEV Dev, uint32_t *pSpadCount,
joelvonrotz 0:11ad6aaed10a 2800 uint8_t *pIsApertureSpads)
joelvonrotz 0:11ad6aaed10a 2801 {
joelvonrotz 0:11ad6aaed10a 2802 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2803
joelvonrotz 0:11ad6aaed10a 2804 Status = VL53L0X_get_reference_spads(Dev, pSpadCount, pIsApertureSpads);
joelvonrotz 0:11ad6aaed10a 2805
joelvonrotz 0:11ad6aaed10a 2806
joelvonrotz 0:11ad6aaed10a 2807 return Status;
joelvonrotz 0:11ad6aaed10a 2808 }
joelvonrotz 0:11ad6aaed10a 2809
joelvonrotz 0:11ad6aaed10a 2810 VL53L0X_Error VL53L0X_PerformRefSpadManagement(VL53L0X_DEV Dev,
joelvonrotz 0:11ad6aaed10a 2811 uint32_t *refSpadCount, uint8_t *isApertureSpads)
joelvonrotz 0:11ad6aaed10a 2812 {
joelvonrotz 0:11ad6aaed10a 2813 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 2814
joelvonrotz 0:11ad6aaed10a 2815 Status = VL53L0X_perform_ref_spad_management(Dev, refSpadCount,
joelvonrotz 0:11ad6aaed10a 2816 isApertureSpads);
joelvonrotz 0:11ad6aaed10a 2817
joelvonrotz 0:11ad6aaed10a 2818
joelvonrotz 0:11ad6aaed10a 2819 return Status;
joelvonrotz 0:11ad6aaed10a 2820 }