TOFs library corrected

Dependencies:   X_NUCLEO_COMMON ST_INTERFACES

Dependents:   EvitObst mbed-perceptron-2

Committer:
evgeniik
Date:
Fri Jul 17 09:44:46 2020 +0000
Revision:
8:ab04ed7aa3ec
Parent:
7:a4452bd2b83b
TOFs library correced for A.I.Mergence

Who changed what in which revision?

UserRevisionLine numberNew contents of line
johnAlexander 6:8ac15bf6d635 1 /**
johnAlexander 6:8ac15bf6d635 2 ******************************************************************************
johnAlexander 6:8ac15bf6d635 3 * @file VL53L0X_class.cpp
johnAlexander 6:8ac15bf6d635 4 * @author IMG
johnAlexander 6:8ac15bf6d635 5 * @version V0.0.1
johnAlexander 6:8ac15bf6d635 6 * @date 28-June-2016
johnAlexander 6:8ac15bf6d635 7 * @brief Implementation file for the VL53L0X driver class
johnAlexander 6:8ac15bf6d635 8 ******************************************************************************
johnAlexander 6:8ac15bf6d635 9 * @attention
johnAlexander 6:8ac15bf6d635 10 *
johnAlexander 6:8ac15bf6d635 11 * <h2><center>&copy; COPYRIGHT(c) 2016 STMicroelectronics</center></h2>
johnAlexander 6:8ac15bf6d635 12 *
johnAlexander 6:8ac15bf6d635 13 * Redistribution and use in source and binary forms, with or without modification,
johnAlexander 6:8ac15bf6d635 14 * are permitted provided that the following conditions are met:
johnAlexander 6:8ac15bf6d635 15 * 1. Redistributions of source code must retain the above copyright notice,
johnAlexander 6:8ac15bf6d635 16 * this list of conditions and the following disclaimer.
johnAlexander 6:8ac15bf6d635 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
johnAlexander 6:8ac15bf6d635 18 * this list of conditions and the following disclaimer in the documentation
johnAlexander 6:8ac15bf6d635 19 * and/or other materials provided with the distribution.
johnAlexander 6:8ac15bf6d635 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
johnAlexander 6:8ac15bf6d635 21 * may be used to endorse or promote products derived from this software
johnAlexander 6:8ac15bf6d635 22 * without specific prior written permission.
johnAlexander 6:8ac15bf6d635 23 *
johnAlexander 6:8ac15bf6d635 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
johnAlexander 6:8ac15bf6d635 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
johnAlexander 6:8ac15bf6d635 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
johnAlexander 6:8ac15bf6d635 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
johnAlexander 6:8ac15bf6d635 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
johnAlexander 6:8ac15bf6d635 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
johnAlexander 6:8ac15bf6d635 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
johnAlexander 6:8ac15bf6d635 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
johnAlexander 6:8ac15bf6d635 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
johnAlexander 6:8ac15bf6d635 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
johnAlexander 6:8ac15bf6d635 34 *
johnAlexander 6:8ac15bf6d635 35 ******************************************************************************
johnAlexander 6:8ac15bf6d635 36 */
johnAlexander 6:8ac15bf6d635 37
johnAlexander 6:8ac15bf6d635 38 /* Includes */
johnAlexander 6:8ac15bf6d635 39 #include <stdlib.h>
johnAlexander 6:8ac15bf6d635 40
johnAlexander 6:8ac15bf6d635 41 #include "VL53L0X.h"
johnAlexander 6:8ac15bf6d635 42
johnAlexander 6:8ac15bf6d635 43 //#include "VL53L0X_api_core.h"
johnAlexander 6:8ac15bf6d635 44 //#include "VL53L0X_api_calibration.h"
johnAlexander 6:8ac15bf6d635 45 //#include "VL53L0X_api_strings.h"
johnAlexander 6:8ac15bf6d635 46 #include "VL53L0X_interrupt_threshold_settings.h"
johnAlexander 6:8ac15bf6d635 47 #include "VL53L0X_tuning.h"
johnAlexander 6:8ac15bf6d635 48 #include "VL53L0X_types.h"
johnAlexander 6:8ac15bf6d635 49
johnAlexander 6:8ac15bf6d635 50
johnAlexander 6:8ac15bf6d635 51 /****************** define for i2c configuration *******************************/
johnAlexander 6:8ac15bf6d635 52
johnAlexander 6:8ac15bf6d635 53 #define TEMP_BUF_SIZE 64
johnAlexander 6:8ac15bf6d635 54
johnAlexander 6:8ac15bf6d635 55 /** Maximum buffer size to be used in i2c */
johnAlexander 6:8ac15bf6d635 56 #define VL53L0X_MAX_I2C_XFER_SIZE 64 /* Maximum buffer size to be used in i2c */
johnAlexander 6:8ac15bf6d635 57 #define VL53L0X_I2C_USER_VAR /* none but could be for a flag var to get/pass to mutex interruptible return flags and try again */
johnAlexander 6:8ac15bf6d635 58
johnAlexander 6:8ac15bf6d635 59
johnAlexander 6:8ac15bf6d635 60 #define LOG_FUNCTION_START(fmt, ...) \
johnAlexander 6:8ac15bf6d635 61 _LOG_FUNCTION_START(TRACE_MODULE_API, fmt, ##__VA_ARGS__)
johnAlexander 6:8ac15bf6d635 62 #define LOG_FUNCTION_END(status, ...) \
johnAlexander 6:8ac15bf6d635 63 _LOG_FUNCTION_END(TRACE_MODULE_API, status, ##__VA_ARGS__)
johnAlexander 6:8ac15bf6d635 64 #define LOG_FUNCTION_END_FMT(status, fmt, ...) \
johnAlexander 6:8ac15bf6d635 65 _LOG_FUNCTION_END_FMT(TRACE_MODULE_API, status, fmt, ##__VA_ARGS__)
johnAlexander 6:8ac15bf6d635 66
johnAlexander 6:8ac15bf6d635 67 #ifdef VL53L0X_LOG_ENABLE
johnAlexander 6:8ac15bf6d635 68 #define trace_print(level, ...) trace_print_module_function(TRACE_MODULE_API, \
johnAlexander 6:8ac15bf6d635 69 level, TRACE_FUNCTION_NONE, ##__VA_ARGS__)
johnAlexander 6:8ac15bf6d635 70 #endif
johnAlexander 6:8ac15bf6d635 71
johnAlexander 6:8ac15bf6d635 72 #define REF_ARRAY_SPAD_0 0
johnAlexander 6:8ac15bf6d635 73 #define REF_ARRAY_SPAD_5 5
johnAlexander 6:8ac15bf6d635 74 #define REF_ARRAY_SPAD_10 10
johnAlexander 6:8ac15bf6d635 75
johnAlexander 6:8ac15bf6d635 76 uint32_t refArrayQuadrants[4] = {REF_ARRAY_SPAD_10, REF_ARRAY_SPAD_5,
johnAlexander 6:8ac15bf6d635 77 REF_ARRAY_SPAD_0, REF_ARRAY_SPAD_5
johnAlexander 6:8ac15bf6d635 78 };
johnAlexander 6:8ac15bf6d635 79
johnAlexander 6:8ac15bf6d635 80
johnAlexander 6:8ac15bf6d635 81
johnAlexander 6:8ac15bf6d635 82
johnAlexander 6:8ac15bf6d635 83 VL53L0X_Error VL53L0X::VL53L0X_device_read_strobe(VL53L0X_DEV dev)
johnAlexander 6:8ac15bf6d635 84 {
johnAlexander 6:8ac15bf6d635 85 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 86 uint8_t strobe;
johnAlexander 6:8ac15bf6d635 87 uint32_t loop_nb;
johnAlexander 6:8ac15bf6d635 88 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 89
johnAlexander 6:8ac15bf6d635 90 status |= VL53L0X_write_byte(dev, 0x83, 0x00);
johnAlexander 6:8ac15bf6d635 91
johnAlexander 6:8ac15bf6d635 92 /* polling
johnAlexander 6:8ac15bf6d635 93 * use timeout to avoid deadlock*/
johnAlexander 6:8ac15bf6d635 94 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 95 loop_nb = 0;
johnAlexander 6:8ac15bf6d635 96 do {
johnAlexander 6:8ac15bf6d635 97 status = VL53L0X_read_byte(dev, 0x83, &strobe);
johnAlexander 6:8ac15bf6d635 98 if ((strobe != 0x00) || status != VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 99 break;
johnAlexander 6:8ac15bf6d635 100 }
johnAlexander 6:8ac15bf6d635 101
johnAlexander 6:8ac15bf6d635 102 loop_nb = loop_nb + 1;
johnAlexander 6:8ac15bf6d635 103 } while (loop_nb < VL53L0X_DEFAULT_MAX_LOOP);
johnAlexander 6:8ac15bf6d635 104
johnAlexander 6:8ac15bf6d635 105 if (loop_nb >= VL53L0X_DEFAULT_MAX_LOOP) {
johnAlexander 6:8ac15bf6d635 106 status = VL53L0X_ERROR_TIME_OUT;
johnAlexander 6:8ac15bf6d635 107 }
johnAlexander 6:8ac15bf6d635 108 }
johnAlexander 6:8ac15bf6d635 109
johnAlexander 6:8ac15bf6d635 110 status |= VL53L0X_write_byte(dev, 0x83, 0x01);
johnAlexander 6:8ac15bf6d635 111
johnAlexander 6:8ac15bf6d635 112 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 113 return status;
johnAlexander 6:8ac15bf6d635 114 }
johnAlexander 6:8ac15bf6d635 115
johnAlexander 6:8ac15bf6d635 116 VL53L0X_Error VL53L0X::VL53L0X_get_info_from_device(VL53L0X_DEV dev, uint8_t option)
johnAlexander 6:8ac15bf6d635 117 {
johnAlexander 6:8ac15bf6d635 118 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 119 uint8_t byte;
johnAlexander 6:8ac15bf6d635 120 uint32_t tmp_dword;
johnAlexander 6:8ac15bf6d635 121 uint8_t module_id;
johnAlexander 6:8ac15bf6d635 122 uint8_t revision;
johnAlexander 6:8ac15bf6d635 123 uint8_t reference_spad_count = 0;
johnAlexander 6:8ac15bf6d635 124 uint8_t reference_spad_type = 0;
johnAlexander 6:8ac15bf6d635 125 uint32_t part_uid_upper = 0;
johnAlexander 6:8ac15bf6d635 126 uint32_t part_uid_lower = 0;
johnAlexander 6:8ac15bf6d635 127 uint32_t offset_fixed1104_mm = 0;
johnAlexander 6:8ac15bf6d635 128 int16_t offset_micro_meters = 0;
johnAlexander 6:8ac15bf6d635 129 uint32_t dist_meas_tgt_fixed1104_mm = 400 << 4;
johnAlexander 6:8ac15bf6d635 130 uint32_t dist_meas_fixed1104_400_mm = 0;
johnAlexander 6:8ac15bf6d635 131 uint32_t signal_rate_meas_fixed1104_400_mm = 0;
johnAlexander 6:8ac15bf6d635 132 char product_id[19];
johnAlexander 6:8ac15bf6d635 133 char *product_id_tmp;
johnAlexander 6:8ac15bf6d635 134 uint8_t read_data_from_device_done;
johnAlexander 6:8ac15bf6d635 135 FixPoint1616_t signal_rate_meas_fixed400_mm_fix = 0;
johnAlexander 6:8ac15bf6d635 136 uint8_t nvm_ref_good_spad_map[VL53L0X_REF_SPAD_BUFFER_SIZE];
johnAlexander 6:8ac15bf6d635 137 int i;
johnAlexander 6:8ac15bf6d635 138
johnAlexander 6:8ac15bf6d635 139
johnAlexander 6:8ac15bf6d635 140 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 141
johnAlexander 6:8ac15bf6d635 142 read_data_from_device_done = VL53L0X_GETDEVICESPECIFICPARAMETER(dev,
johnAlexander 6:8ac15bf6d635 143 ReadDataFromDeviceDone);
johnAlexander 6:8ac15bf6d635 144
johnAlexander 6:8ac15bf6d635 145 /* This access is done only once after that a GetDeviceInfo or
johnAlexander 6:8ac15bf6d635 146 * datainit is done*/
johnAlexander 6:8ac15bf6d635 147 if (read_data_from_device_done != 7) {
johnAlexander 6:8ac15bf6d635 148
johnAlexander 6:8ac15bf6d635 149 status |= VL53L0X_write_byte(dev, 0x80, 0x01);
johnAlexander 6:8ac15bf6d635 150 status |= VL53L0X_write_byte(dev, 0xFF, 0x01);
johnAlexander 6:8ac15bf6d635 151 status |= VL53L0X_write_byte(dev, 0x00, 0x00);
johnAlexander 6:8ac15bf6d635 152
johnAlexander 6:8ac15bf6d635 153 status |= VL53L0X_write_byte(dev, 0xFF, 0x06);
johnAlexander 6:8ac15bf6d635 154 status |= VL53L0X_read_byte(dev, 0x83, &byte);
johnAlexander 6:8ac15bf6d635 155 status |= VL53L0X_write_byte(dev, 0x83, byte | 4);
johnAlexander 6:8ac15bf6d635 156 status |= VL53L0X_write_byte(dev, 0xFF, 0x07);
johnAlexander 6:8ac15bf6d635 157 status |= VL53L0X_write_byte(dev, 0x81, 0x01);
johnAlexander 6:8ac15bf6d635 158
johnAlexander 6:8ac15bf6d635 159 status |= VL53L0X_polling_delay(dev);
johnAlexander 6:8ac15bf6d635 160
johnAlexander 6:8ac15bf6d635 161 status |= VL53L0X_write_byte(dev, 0x80, 0x01);
johnAlexander 6:8ac15bf6d635 162
johnAlexander 6:8ac15bf6d635 163 if (((option & 1) == 1) &&
johnAlexander 6:8ac15bf6d635 164 ((read_data_from_device_done & 1) == 0)) {
johnAlexander 6:8ac15bf6d635 165 status |= VL53L0X_write_byte(dev, 0x94, 0x6b);
johnAlexander 6:8ac15bf6d635 166 status |= VL53L0X_device_read_strobe(dev);
johnAlexander 6:8ac15bf6d635 167 status |= VL53L0X_read_dword(dev, 0x90, &tmp_dword);
johnAlexander 6:8ac15bf6d635 168
johnAlexander 6:8ac15bf6d635 169 reference_spad_count = (uint8_t)((tmp_dword >> 8) & 0x07f);
johnAlexander 6:8ac15bf6d635 170 reference_spad_type = (uint8_t)((tmp_dword >> 15) & 0x01);
johnAlexander 6:8ac15bf6d635 171
johnAlexander 6:8ac15bf6d635 172 status |= VL53L0X_write_byte(dev, 0x94, 0x24);
johnAlexander 6:8ac15bf6d635 173 status |= VL53L0X_device_read_strobe(dev);
johnAlexander 6:8ac15bf6d635 174 status |= VL53L0X_read_dword(dev, 0x90, &tmp_dword);
johnAlexander 6:8ac15bf6d635 175
johnAlexander 6:8ac15bf6d635 176
johnAlexander 6:8ac15bf6d635 177 nvm_ref_good_spad_map[0] = (uint8_t)((tmp_dword >> 24)
johnAlexander 6:8ac15bf6d635 178 & 0xff);
johnAlexander 6:8ac15bf6d635 179 nvm_ref_good_spad_map[1] = (uint8_t)((tmp_dword >> 16)
johnAlexander 6:8ac15bf6d635 180 & 0xff);
johnAlexander 6:8ac15bf6d635 181 nvm_ref_good_spad_map[2] = (uint8_t)((tmp_dword >> 8)
johnAlexander 6:8ac15bf6d635 182 & 0xff);
johnAlexander 6:8ac15bf6d635 183 nvm_ref_good_spad_map[3] = (uint8_t)(tmp_dword & 0xff);
johnAlexander 6:8ac15bf6d635 184
johnAlexander 6:8ac15bf6d635 185 status |= VL53L0X_write_byte(dev, 0x94, 0x25);
johnAlexander 6:8ac15bf6d635 186 status |= VL53L0X_device_read_strobe(dev);
johnAlexander 6:8ac15bf6d635 187 status |= VL53L0X_read_dword(dev, 0x90, &tmp_dword);
johnAlexander 6:8ac15bf6d635 188
johnAlexander 6:8ac15bf6d635 189 nvm_ref_good_spad_map[4] = (uint8_t)((tmp_dword >> 24)
johnAlexander 6:8ac15bf6d635 190 & 0xff);
johnAlexander 6:8ac15bf6d635 191 nvm_ref_good_spad_map[5] = (uint8_t)((tmp_dword >> 16)
johnAlexander 6:8ac15bf6d635 192 & 0xff);
johnAlexander 6:8ac15bf6d635 193 }
johnAlexander 6:8ac15bf6d635 194
johnAlexander 6:8ac15bf6d635 195 if (((option & 2) == 2) &&
johnAlexander 6:8ac15bf6d635 196 ((read_data_from_device_done & 2) == 0)) {
johnAlexander 6:8ac15bf6d635 197
johnAlexander 6:8ac15bf6d635 198 status |= VL53L0X_write_byte(dev, 0x94, 0x02);
johnAlexander 6:8ac15bf6d635 199 status |= VL53L0X_device_read_strobe(dev);
johnAlexander 6:8ac15bf6d635 200 status |= VL53L0X_read_byte(dev, 0x90, &module_id);
johnAlexander 6:8ac15bf6d635 201
johnAlexander 6:8ac15bf6d635 202 status |= VL53L0X_write_byte(dev, 0x94, 0x7B);
johnAlexander 6:8ac15bf6d635 203 status |= VL53L0X_device_read_strobe(dev);
johnAlexander 6:8ac15bf6d635 204 status |= VL53L0X_read_byte(dev, 0x90, &revision);
johnAlexander 6:8ac15bf6d635 205
johnAlexander 6:8ac15bf6d635 206 status |= VL53L0X_write_byte(dev, 0x94, 0x77);
johnAlexander 6:8ac15bf6d635 207 status |= VL53L0X_device_read_strobe(dev);
johnAlexander 6:8ac15bf6d635 208 status |= VL53L0X_read_dword(dev, 0x90, &tmp_dword);
johnAlexander 6:8ac15bf6d635 209
johnAlexander 6:8ac15bf6d635 210 product_id[0] = (char)((tmp_dword >> 25) & 0x07f);
johnAlexander 6:8ac15bf6d635 211 product_id[1] = (char)((tmp_dword >> 18) & 0x07f);
johnAlexander 6:8ac15bf6d635 212 product_id[2] = (char)((tmp_dword >> 11) & 0x07f);
johnAlexander 6:8ac15bf6d635 213 product_id[3] = (char)((tmp_dword >> 4) & 0x07f);
johnAlexander 6:8ac15bf6d635 214
johnAlexander 6:8ac15bf6d635 215 byte = (uint8_t)((tmp_dword & 0x00f) << 3);
johnAlexander 6:8ac15bf6d635 216
johnAlexander 6:8ac15bf6d635 217 status |= VL53L0X_write_byte(dev, 0x94, 0x78);
johnAlexander 6:8ac15bf6d635 218 status |= VL53L0X_device_read_strobe(dev);
johnAlexander 6:8ac15bf6d635 219 status |= VL53L0X_read_dword(dev, 0x90, &tmp_dword);
johnAlexander 6:8ac15bf6d635 220
johnAlexander 6:8ac15bf6d635 221 product_id[4] = (char)(byte +
johnAlexander 6:8ac15bf6d635 222 ((tmp_dword >> 29) & 0x07f));
johnAlexander 6:8ac15bf6d635 223 product_id[5] = (char)((tmp_dword >> 22) & 0x07f);
johnAlexander 6:8ac15bf6d635 224 product_id[6] = (char)((tmp_dword >> 15) & 0x07f);
johnAlexander 6:8ac15bf6d635 225 product_id[7] = (char)((tmp_dword >> 8) & 0x07f);
johnAlexander 6:8ac15bf6d635 226 product_id[8] = (char)((tmp_dword >> 1) & 0x07f);
johnAlexander 6:8ac15bf6d635 227
johnAlexander 6:8ac15bf6d635 228 byte = (uint8_t)((tmp_dword & 0x001) << 6);
johnAlexander 6:8ac15bf6d635 229
johnAlexander 6:8ac15bf6d635 230 status |= VL53L0X_write_byte(dev, 0x94, 0x79);
johnAlexander 6:8ac15bf6d635 231
johnAlexander 6:8ac15bf6d635 232 status |= VL53L0X_device_read_strobe(dev);
johnAlexander 6:8ac15bf6d635 233
johnAlexander 6:8ac15bf6d635 234 status |= VL53L0X_read_dword(dev, 0x90, &tmp_dword);
johnAlexander 6:8ac15bf6d635 235
johnAlexander 6:8ac15bf6d635 236 product_id[9] = (char)(byte +
johnAlexander 6:8ac15bf6d635 237 ((tmp_dword >> 26) & 0x07f));
johnAlexander 6:8ac15bf6d635 238 product_id[10] = (char)((tmp_dword >> 19) & 0x07f);
johnAlexander 6:8ac15bf6d635 239 product_id[11] = (char)((tmp_dword >> 12) & 0x07f);
johnAlexander 6:8ac15bf6d635 240 product_id[12] = (char)((tmp_dword >> 5) & 0x07f);
johnAlexander 6:8ac15bf6d635 241
johnAlexander 6:8ac15bf6d635 242 byte = (uint8_t)((tmp_dword & 0x01f) << 2);
johnAlexander 6:8ac15bf6d635 243
johnAlexander 6:8ac15bf6d635 244 status |= VL53L0X_write_byte(dev, 0x94, 0x7A);
johnAlexander 6:8ac15bf6d635 245
johnAlexander 6:8ac15bf6d635 246 status |= VL53L0X_device_read_strobe(dev);
johnAlexander 6:8ac15bf6d635 247
johnAlexander 6:8ac15bf6d635 248 status |= VL53L0X_read_dword(dev, 0x90, &tmp_dword);
johnAlexander 6:8ac15bf6d635 249
johnAlexander 6:8ac15bf6d635 250 product_id[13] = (char)(byte +
johnAlexander 6:8ac15bf6d635 251 ((tmp_dword >> 30) & 0x07f));
johnAlexander 6:8ac15bf6d635 252 product_id[14] = (char)((tmp_dword >> 23) & 0x07f);
johnAlexander 6:8ac15bf6d635 253 product_id[15] = (char)((tmp_dword >> 16) & 0x07f);
johnAlexander 6:8ac15bf6d635 254 product_id[16] = (char)((tmp_dword >> 9) & 0x07f);
johnAlexander 6:8ac15bf6d635 255 product_id[17] = (char)((tmp_dword >> 2) & 0x07f);
johnAlexander 6:8ac15bf6d635 256 product_id[18] = '\0';
johnAlexander 6:8ac15bf6d635 257
johnAlexander 6:8ac15bf6d635 258 }
johnAlexander 6:8ac15bf6d635 259
johnAlexander 6:8ac15bf6d635 260 if (((option & 4) == 4) &&
johnAlexander 6:8ac15bf6d635 261 ((read_data_from_device_done & 4) == 0)) {
johnAlexander 6:8ac15bf6d635 262
johnAlexander 6:8ac15bf6d635 263 status |= VL53L0X_write_byte(dev, 0x94, 0x7B);
johnAlexander 6:8ac15bf6d635 264 status |= VL53L0X_device_read_strobe(dev);
johnAlexander 6:8ac15bf6d635 265 status |= VL53L0X_read_dword(dev, 0x90, &part_uid_upper);
johnAlexander 6:8ac15bf6d635 266
johnAlexander 6:8ac15bf6d635 267 status |= VL53L0X_write_byte(dev, 0x94, 0x7C);
johnAlexander 6:8ac15bf6d635 268 status |= VL53L0X_device_read_strobe(dev);
johnAlexander 6:8ac15bf6d635 269 status |= VL53L0X_read_dword(dev, 0x90, &part_uid_lower);
johnAlexander 6:8ac15bf6d635 270
johnAlexander 6:8ac15bf6d635 271 status |= VL53L0X_write_byte(dev, 0x94, 0x73);
johnAlexander 6:8ac15bf6d635 272 status |= VL53L0X_device_read_strobe(dev);
johnAlexander 6:8ac15bf6d635 273 status |= VL53L0X_read_dword(dev, 0x90, &tmp_dword);
johnAlexander 6:8ac15bf6d635 274
johnAlexander 6:8ac15bf6d635 275 signal_rate_meas_fixed1104_400_mm = (tmp_dword &
johnAlexander 6:8ac15bf6d635 276 0x0000000ff) << 8;
johnAlexander 6:8ac15bf6d635 277
johnAlexander 6:8ac15bf6d635 278 status |= VL53L0X_write_byte(dev, 0x94, 0x74);
johnAlexander 6:8ac15bf6d635 279 status |= VL53L0X_device_read_strobe(dev);
johnAlexander 6:8ac15bf6d635 280 status |= VL53L0X_read_dword(dev, 0x90, &tmp_dword);
johnAlexander 6:8ac15bf6d635 281
johnAlexander 6:8ac15bf6d635 282 signal_rate_meas_fixed1104_400_mm |= ((tmp_dword &
johnAlexander 6:8ac15bf6d635 283 0xff000000) >> 24);
johnAlexander 6:8ac15bf6d635 284
johnAlexander 6:8ac15bf6d635 285 status |= VL53L0X_write_byte(dev, 0x94, 0x75);
johnAlexander 6:8ac15bf6d635 286 status |= VL53L0X_device_read_strobe(dev);
johnAlexander 6:8ac15bf6d635 287 status |= VL53L0X_read_dword(dev, 0x90, &tmp_dword);
johnAlexander 6:8ac15bf6d635 288
johnAlexander 6:8ac15bf6d635 289 dist_meas_fixed1104_400_mm = (tmp_dword & 0x0000000ff)
johnAlexander 6:8ac15bf6d635 290 << 8;
johnAlexander 6:8ac15bf6d635 291
johnAlexander 6:8ac15bf6d635 292 status |= VL53L0X_write_byte(dev, 0x94, 0x76);
johnAlexander 6:8ac15bf6d635 293 status |= VL53L0X_device_read_strobe(dev);
johnAlexander 6:8ac15bf6d635 294 status |= VL53L0X_read_dword(dev, 0x90, &tmp_dword);
johnAlexander 6:8ac15bf6d635 295
johnAlexander 6:8ac15bf6d635 296 dist_meas_fixed1104_400_mm |= ((tmp_dword & 0xff000000)
johnAlexander 6:8ac15bf6d635 297 >> 24);
johnAlexander 6:8ac15bf6d635 298 }
johnAlexander 6:8ac15bf6d635 299
johnAlexander 6:8ac15bf6d635 300 status |= VL53L0X_write_byte(dev, 0x81, 0x00);
johnAlexander 6:8ac15bf6d635 301 status |= VL53L0X_write_byte(dev, 0xFF, 0x06);
johnAlexander 6:8ac15bf6d635 302 status |= VL53L0X_read_byte(dev, 0x83, &byte);
johnAlexander 6:8ac15bf6d635 303 status |= VL53L0X_write_byte(dev, 0x83, byte & 0xfb);
johnAlexander 6:8ac15bf6d635 304 status |= VL53L0X_write_byte(dev, 0xFF, 0x01);
johnAlexander 6:8ac15bf6d635 305 status |= VL53L0X_write_byte(dev, 0x00, 0x01);
johnAlexander 6:8ac15bf6d635 306
johnAlexander 6:8ac15bf6d635 307 status |= VL53L0X_write_byte(dev, 0xFF, 0x00);
johnAlexander 6:8ac15bf6d635 308 status |= VL53L0X_write_byte(dev, 0x80, 0x00);
johnAlexander 6:8ac15bf6d635 309 }
johnAlexander 6:8ac15bf6d635 310
johnAlexander 6:8ac15bf6d635 311 if ((status == VL53L0X_ERROR_NONE) &&
johnAlexander 6:8ac15bf6d635 312 (read_data_from_device_done != 7)) {
johnAlexander 6:8ac15bf6d635 313 /* Assign to variable if status is ok */
johnAlexander 6:8ac15bf6d635 314 if (((option & 1) == 1) &&
johnAlexander 6:8ac15bf6d635 315 ((read_data_from_device_done & 1) == 0)) {
johnAlexander 6:8ac15bf6d635 316 VL53L0X_SETDEVICESPECIFICPARAMETER(dev,
johnAlexander 6:8ac15bf6d635 317 ReferenceSpadCount, reference_spad_count);
johnAlexander 6:8ac15bf6d635 318
johnAlexander 6:8ac15bf6d635 319 VL53L0X_SETDEVICESPECIFICPARAMETER(dev,
johnAlexander 6:8ac15bf6d635 320 ReferenceSpadType, reference_spad_type);
johnAlexander 6:8ac15bf6d635 321
johnAlexander 6:8ac15bf6d635 322 for (i = 0; i < VL53L0X_REF_SPAD_BUFFER_SIZE; i++) {
johnAlexander 6:8ac15bf6d635 323 dev->Data.SpadData.RefGoodSpadMap[i] =
johnAlexander 6:8ac15bf6d635 324 nvm_ref_good_spad_map[i];
johnAlexander 6:8ac15bf6d635 325 }
johnAlexander 6:8ac15bf6d635 326 }
johnAlexander 6:8ac15bf6d635 327
johnAlexander 6:8ac15bf6d635 328 if (((option & 2) == 2) &&
johnAlexander 6:8ac15bf6d635 329 ((read_data_from_device_done & 2) == 0)) {
johnAlexander 6:8ac15bf6d635 330 VL53L0X_SETDEVICESPECIFICPARAMETER(dev,
johnAlexander 6:8ac15bf6d635 331 ModuleId, module_id);
johnAlexander 6:8ac15bf6d635 332
johnAlexander 6:8ac15bf6d635 333 VL53L0X_SETDEVICESPECIFICPARAMETER(dev,
johnAlexander 6:8ac15bf6d635 334 Revision, revision);
johnAlexander 6:8ac15bf6d635 335
johnAlexander 6:8ac15bf6d635 336 product_id_tmp = VL53L0X_GETDEVICESPECIFICPARAMETER(dev,
johnAlexander 6:8ac15bf6d635 337 ProductId);
johnAlexander 6:8ac15bf6d635 338 VL53L0X_COPYSTRING(product_id_tmp, product_id);
johnAlexander 6:8ac15bf6d635 339
johnAlexander 6:8ac15bf6d635 340 }
johnAlexander 6:8ac15bf6d635 341
johnAlexander 6:8ac15bf6d635 342 if (((option & 4) == 4) &&
johnAlexander 6:8ac15bf6d635 343 ((read_data_from_device_done & 4) == 0)) {
johnAlexander 6:8ac15bf6d635 344 VL53L0X_SETDEVICESPECIFICPARAMETER(dev,
johnAlexander 6:8ac15bf6d635 345 PartUIDUpper, part_uid_upper);
johnAlexander 6:8ac15bf6d635 346
johnAlexander 6:8ac15bf6d635 347 VL53L0X_SETDEVICESPECIFICPARAMETER(dev,
johnAlexander 6:8ac15bf6d635 348 PartUIDLower, part_uid_lower);
johnAlexander 6:8ac15bf6d635 349
johnAlexander 6:8ac15bf6d635 350 signal_rate_meas_fixed400_mm_fix =
johnAlexander 6:8ac15bf6d635 351 VL53L0X_FIXPOINT97TOFIXPOINT1616(
johnAlexander 6:8ac15bf6d635 352 signal_rate_meas_fixed1104_400_mm);
johnAlexander 6:8ac15bf6d635 353
johnAlexander 6:8ac15bf6d635 354 VL53L0X_SETDEVICESPECIFICPARAMETER(dev,
johnAlexander 6:8ac15bf6d635 355 SignalRateMeasFixed400mm,
johnAlexander 6:8ac15bf6d635 356 signal_rate_meas_fixed400_mm_fix);
johnAlexander 6:8ac15bf6d635 357
johnAlexander 6:8ac15bf6d635 358 offset_micro_meters = 0;
johnAlexander 6:8ac15bf6d635 359 if (dist_meas_fixed1104_400_mm != 0) {
johnAlexander 6:8ac15bf6d635 360 offset_fixed1104_mm =
johnAlexander 6:8ac15bf6d635 361 dist_meas_fixed1104_400_mm -
johnAlexander 6:8ac15bf6d635 362 dist_meas_tgt_fixed1104_mm;
johnAlexander 6:8ac15bf6d635 363 offset_micro_meters = (offset_fixed1104_mm
johnAlexander 6:8ac15bf6d635 364 * 1000) >> 4;
johnAlexander 6:8ac15bf6d635 365 offset_micro_meters *= -1;
johnAlexander 6:8ac15bf6d635 366 }
johnAlexander 6:8ac15bf6d635 367
johnAlexander 6:8ac15bf6d635 368 PALDevDataSet(dev,
johnAlexander 6:8ac15bf6d635 369 Part2PartOffsetAdjustmentNVMMicroMeter,
johnAlexander 6:8ac15bf6d635 370 offset_micro_meters);
johnAlexander 6:8ac15bf6d635 371 }
johnAlexander 6:8ac15bf6d635 372 byte = (uint8_t)(read_data_from_device_done | option);
johnAlexander 6:8ac15bf6d635 373 VL53L0X_SETDEVICESPECIFICPARAMETER(dev, ReadDataFromDeviceDone,
johnAlexander 6:8ac15bf6d635 374 byte);
johnAlexander 6:8ac15bf6d635 375 }
johnAlexander 6:8ac15bf6d635 376
johnAlexander 6:8ac15bf6d635 377 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 378 return status;
johnAlexander 6:8ac15bf6d635 379 }
johnAlexander 6:8ac15bf6d635 380
johnAlexander 6:8ac15bf6d635 381 VL53L0X_Error VL53L0X::wrapped_VL53L0X_get_offset_calibration_data_micro_meter(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 382 int32_t *p_offset_calibration_data_micro_meter)
johnAlexander 6:8ac15bf6d635 383 {
johnAlexander 6:8ac15bf6d635 384 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 385 uint16_t range_offset_register;
johnAlexander 6:8ac15bf6d635 386 int16_t c_max_offset = 2047;
johnAlexander 6:8ac15bf6d635 387 int16_t c_offset_range = 4096;
johnAlexander 6:8ac15bf6d635 388
johnAlexander 6:8ac15bf6d635 389 /* Note that offset has 10.2 format */
johnAlexander 6:8ac15bf6d635 390
johnAlexander 6:8ac15bf6d635 391 status = VL53L0X_read_word(dev,
johnAlexander 6:8ac15bf6d635 392 VL53L0X_REG_ALGO_PART_TO_PART_RANGE_OFFSET_MM,
johnAlexander 6:8ac15bf6d635 393 &range_offset_register);
johnAlexander 6:8ac15bf6d635 394
johnAlexander 6:8ac15bf6d635 395 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 396 range_offset_register = (range_offset_register & 0x0fff);
johnAlexander 6:8ac15bf6d635 397
johnAlexander 6:8ac15bf6d635 398 /* Apply 12 bit 2's compliment conversion */
johnAlexander 6:8ac15bf6d635 399 if (range_offset_register > c_max_offset) {
johnAlexander 6:8ac15bf6d635 400 *p_offset_calibration_data_micro_meter =
johnAlexander 6:8ac15bf6d635 401 (int16_t)(range_offset_register - c_offset_range)
johnAlexander 6:8ac15bf6d635 402 * 250;
johnAlexander 6:8ac15bf6d635 403 } else {
johnAlexander 6:8ac15bf6d635 404 *p_offset_calibration_data_micro_meter =
johnAlexander 6:8ac15bf6d635 405 (int16_t)range_offset_register * 250;
johnAlexander 6:8ac15bf6d635 406 }
johnAlexander 6:8ac15bf6d635 407
johnAlexander 6:8ac15bf6d635 408 }
johnAlexander 6:8ac15bf6d635 409
johnAlexander 6:8ac15bf6d635 410 return status;
johnAlexander 6:8ac15bf6d635 411 }
johnAlexander 6:8ac15bf6d635 412
johnAlexander 6:8ac15bf6d635 413 VL53L0X_Error VL53L0X::VL53L0X_get_offset_calibration_data_micro_meter(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 414 int32_t *p_offset_calibration_data_micro_meter)
johnAlexander 6:8ac15bf6d635 415 {
johnAlexander 6:8ac15bf6d635 416 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 417 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 418
johnAlexander 6:8ac15bf6d635 419 status = wrapped_VL53L0X_get_offset_calibration_data_micro_meter(dev,
johnAlexander 6:8ac15bf6d635 420 p_offset_calibration_data_micro_meter);
johnAlexander 6:8ac15bf6d635 421
johnAlexander 6:8ac15bf6d635 422 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 423 return status;
johnAlexander 6:8ac15bf6d635 424 }
johnAlexander 6:8ac15bf6d635 425
johnAlexander 6:8ac15bf6d635 426 VL53L0X_Error VL53L0X::wrapped_VL53L0X_set_offset_calibration_data_micro_meter(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 427 int32_t offset_calibration_data_micro_meter)
johnAlexander 6:8ac15bf6d635 428 {
johnAlexander 6:8ac15bf6d635 429 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 430 int32_t c_max_offset_micro_meter = 511000;
johnAlexander 6:8ac15bf6d635 431 int32_t c_min_offset_micro_meter = -512000;
johnAlexander 6:8ac15bf6d635 432 int16_t c_offset_range = 4096;
johnAlexander 6:8ac15bf6d635 433 uint32_t encoded_offset_val;
johnAlexander 6:8ac15bf6d635 434
johnAlexander 6:8ac15bf6d635 435 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 436
johnAlexander 6:8ac15bf6d635 437 if (offset_calibration_data_micro_meter > c_max_offset_micro_meter) {
johnAlexander 6:8ac15bf6d635 438 offset_calibration_data_micro_meter = c_max_offset_micro_meter;
johnAlexander 6:8ac15bf6d635 439 } else {
johnAlexander 6:8ac15bf6d635 440 if (offset_calibration_data_micro_meter < c_min_offset_micro_meter) {
johnAlexander 6:8ac15bf6d635 441 offset_calibration_data_micro_meter = c_min_offset_micro_meter;
johnAlexander 6:8ac15bf6d635 442 }
johnAlexander 6:8ac15bf6d635 443 }
johnAlexander 6:8ac15bf6d635 444
johnAlexander 6:8ac15bf6d635 445 /* The offset register is 10.2 format and units are mm
johnAlexander 6:8ac15bf6d635 446 * therefore conversion is applied by a division of
johnAlexander 6:8ac15bf6d635 447 * 250.
johnAlexander 6:8ac15bf6d635 448 */
johnAlexander 6:8ac15bf6d635 449 if (offset_calibration_data_micro_meter >= 0) {
johnAlexander 6:8ac15bf6d635 450 encoded_offset_val =
johnAlexander 6:8ac15bf6d635 451 offset_calibration_data_micro_meter / 250;
johnAlexander 6:8ac15bf6d635 452 } else {
johnAlexander 6:8ac15bf6d635 453 encoded_offset_val =
johnAlexander 6:8ac15bf6d635 454 c_offset_range +
johnAlexander 6:8ac15bf6d635 455 offset_calibration_data_micro_meter / 250;
johnAlexander 6:8ac15bf6d635 456 }
johnAlexander 6:8ac15bf6d635 457
johnAlexander 6:8ac15bf6d635 458 status = VL53L0X_write_word(dev,
johnAlexander 6:8ac15bf6d635 459 VL53L0X_REG_ALGO_PART_TO_PART_RANGE_OFFSET_MM,
johnAlexander 6:8ac15bf6d635 460 encoded_offset_val);
johnAlexander 6:8ac15bf6d635 461
johnAlexander 6:8ac15bf6d635 462 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 463 return status;
johnAlexander 6:8ac15bf6d635 464 }
johnAlexander 6:8ac15bf6d635 465
johnAlexander 6:8ac15bf6d635 466 VL53L0X_Error VL53L0X::VL53L0X_set_offset_calibration_data_micro_meter(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 467 int32_t offset_calibration_data_micro_meter)
johnAlexander 6:8ac15bf6d635 468 {
johnAlexander 6:8ac15bf6d635 469 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 470 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 471
johnAlexander 6:8ac15bf6d635 472 status = wrapped_VL53L0X_set_offset_calibration_data_micro_meter(dev,
johnAlexander 6:8ac15bf6d635 473 offset_calibration_data_micro_meter);
johnAlexander 6:8ac15bf6d635 474
johnAlexander 6:8ac15bf6d635 475 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 476 return status;
johnAlexander 6:8ac15bf6d635 477 }
johnAlexander 6:8ac15bf6d635 478
johnAlexander 6:8ac15bf6d635 479 VL53L0X_Error VL53L0X::VL53L0X_apply_offset_adjustment(VL53L0X_DEV dev)
johnAlexander 6:8ac15bf6d635 480 {
johnAlexander 6:8ac15bf6d635 481 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 482 int32_t corrected_offset_micro_meters;
johnAlexander 6:8ac15bf6d635 483 int32_t current_offset_micro_meters;
johnAlexander 6:8ac15bf6d635 484
johnAlexander 6:8ac15bf6d635 485 /* if we run on this function we can read all the NVM info
johnAlexander 6:8ac15bf6d635 486 * used by the API */
johnAlexander 6:8ac15bf6d635 487 status = VL53L0X_get_info_from_device(dev, 7);
johnAlexander 6:8ac15bf6d635 488
johnAlexander 6:8ac15bf6d635 489 /* Read back current device offset */
johnAlexander 6:8ac15bf6d635 490 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 491 status = VL53L0X_get_offset_calibration_data_micro_meter(dev,
johnAlexander 6:8ac15bf6d635 492 &current_offset_micro_meters);
johnAlexander 6:8ac15bf6d635 493 }
johnAlexander 6:8ac15bf6d635 494
johnAlexander 6:8ac15bf6d635 495 /* Apply Offset Adjustment derived from 400mm measurements */
johnAlexander 6:8ac15bf6d635 496 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 497
johnAlexander 6:8ac15bf6d635 498 /* Store initial device offset */
johnAlexander 6:8ac15bf6d635 499 PALDevDataSet(dev, Part2PartOffsetNVMMicroMeter,
johnAlexander 6:8ac15bf6d635 500 current_offset_micro_meters);
johnAlexander 6:8ac15bf6d635 501
johnAlexander 6:8ac15bf6d635 502 corrected_offset_micro_meters = current_offset_micro_meters +
johnAlexander 6:8ac15bf6d635 503 (int32_t)PALDevDataGet(dev,
johnAlexander 6:8ac15bf6d635 504 Part2PartOffsetAdjustmentNVMMicroMeter);
johnAlexander 6:8ac15bf6d635 505
johnAlexander 6:8ac15bf6d635 506 status = VL53L0X_set_offset_calibration_data_micro_meter(dev,
johnAlexander 6:8ac15bf6d635 507 corrected_offset_micro_meters);
johnAlexander 6:8ac15bf6d635 508
johnAlexander 6:8ac15bf6d635 509 /* store current, adjusted offset */
johnAlexander 6:8ac15bf6d635 510 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 511 VL53L0X_SETPARAMETERFIELD(dev, RangeOffsetMicroMeters,
johnAlexander 6:8ac15bf6d635 512 corrected_offset_micro_meters);
johnAlexander 6:8ac15bf6d635 513 }
johnAlexander 6:8ac15bf6d635 514 }
johnAlexander 6:8ac15bf6d635 515
johnAlexander 6:8ac15bf6d635 516 return status;
johnAlexander 6:8ac15bf6d635 517 }
johnAlexander 6:8ac15bf6d635 518
johnAlexander 6:8ac15bf6d635 519 VL53L0X_Error VL53L0X::VL53L0X_get_device_mode(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 520 VL53L0X_DeviceModes *p_device_mode)
johnAlexander 6:8ac15bf6d635 521 {
johnAlexander 6:8ac15bf6d635 522 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 523 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 524
johnAlexander 6:8ac15bf6d635 525 VL53L0X_GETPARAMETERFIELD(dev, DeviceMode, *p_device_mode);
johnAlexander 6:8ac15bf6d635 526
johnAlexander 6:8ac15bf6d635 527 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 528 return status;
johnAlexander 6:8ac15bf6d635 529 }
johnAlexander 6:8ac15bf6d635 530
johnAlexander 6:8ac15bf6d635 531 VL53L0X_Error VL53L0X::VL53L0X_get_inter_measurement_period_milli_seconds(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 532 uint32_t *p_inter_measurement_period_milli_seconds)
johnAlexander 6:8ac15bf6d635 533 {
johnAlexander 6:8ac15bf6d635 534 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 535 uint16_t osc_calibrate_val;
johnAlexander 6:8ac15bf6d635 536 uint32_t im_period_milli_seconds;
johnAlexander 6:8ac15bf6d635 537
johnAlexander 6:8ac15bf6d635 538 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 539
johnAlexander 6:8ac15bf6d635 540 status = VL53L0X_read_word(dev, VL53L0X_REG_OSC_CALIBRATE_VAL,
johnAlexander 6:8ac15bf6d635 541 &osc_calibrate_val);
johnAlexander 6:8ac15bf6d635 542
johnAlexander 6:8ac15bf6d635 543 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 544 status = VL53L0X_read_dword(dev,
johnAlexander 6:8ac15bf6d635 545 VL53L0X_REG_SYSTEM_INTERMEASUREMENT_PERIOD,
johnAlexander 6:8ac15bf6d635 546 &im_period_milli_seconds);
johnAlexander 6:8ac15bf6d635 547 }
johnAlexander 6:8ac15bf6d635 548
johnAlexander 6:8ac15bf6d635 549 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 550 if (osc_calibrate_val != 0) {
johnAlexander 6:8ac15bf6d635 551 *p_inter_measurement_period_milli_seconds =
johnAlexander 6:8ac15bf6d635 552 im_period_milli_seconds / osc_calibrate_val;
johnAlexander 6:8ac15bf6d635 553 }
johnAlexander 6:8ac15bf6d635 554 VL53L0X_SETPARAMETERFIELD(dev,
johnAlexander 6:8ac15bf6d635 555 InterMeasurementPeriodMilliSeconds,
johnAlexander 6:8ac15bf6d635 556 *p_inter_measurement_period_milli_seconds);
johnAlexander 6:8ac15bf6d635 557 }
johnAlexander 6:8ac15bf6d635 558
johnAlexander 6:8ac15bf6d635 559 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 560 return status;
johnAlexander 6:8ac15bf6d635 561 }
johnAlexander 6:8ac15bf6d635 562
johnAlexander 6:8ac15bf6d635 563 VL53L0X_Error VL53L0X::VL53L0X_get_x_talk_compensation_rate_mega_cps(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 564 FixPoint1616_t *p_xtalk_compensation_rate_mega_cps)
johnAlexander 6:8ac15bf6d635 565 {
johnAlexander 6:8ac15bf6d635 566 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 567 uint16_t value;
johnAlexander 6:8ac15bf6d635 568 FixPoint1616_t temp_fix1616;
johnAlexander 6:8ac15bf6d635 569
johnAlexander 6:8ac15bf6d635 570 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 571
johnAlexander 6:8ac15bf6d635 572 status = VL53L0X_read_word(dev,
johnAlexander 6:8ac15bf6d635 573 VL53L0X_REG_CROSSTALK_COMPENSATION_PEAK_RATE_MCPS, (uint16_t *)&value);
johnAlexander 6:8ac15bf6d635 574 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 575 if (value == 0) {
johnAlexander 6:8ac15bf6d635 576 /* the Xtalk is disabled return value from memory */
johnAlexander 6:8ac15bf6d635 577 VL53L0X_GETPARAMETERFIELD(dev,
johnAlexander 6:8ac15bf6d635 578 XTalkCompensationRateMegaCps, temp_fix1616);
johnAlexander 6:8ac15bf6d635 579 *p_xtalk_compensation_rate_mega_cps = temp_fix1616;
johnAlexander 6:8ac15bf6d635 580 VL53L0X_SETPARAMETERFIELD(dev, XTalkCompensationEnable,
johnAlexander 6:8ac15bf6d635 581 0);
johnAlexander 6:8ac15bf6d635 582 } else {
johnAlexander 6:8ac15bf6d635 583 temp_fix1616 = VL53L0X_FIXPOINT313TOFIXPOINT1616(value);
johnAlexander 6:8ac15bf6d635 584 *p_xtalk_compensation_rate_mega_cps = temp_fix1616;
johnAlexander 6:8ac15bf6d635 585 VL53L0X_SETPARAMETERFIELD(dev,
johnAlexander 6:8ac15bf6d635 586 XTalkCompensationRateMegaCps, temp_fix1616);
johnAlexander 6:8ac15bf6d635 587 VL53L0X_SETPARAMETERFIELD(dev, XTalkCompensationEnable,
johnAlexander 6:8ac15bf6d635 588 1);
johnAlexander 6:8ac15bf6d635 589 }
johnAlexander 6:8ac15bf6d635 590 }
johnAlexander 6:8ac15bf6d635 591
johnAlexander 6:8ac15bf6d635 592 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 593 return status;
johnAlexander 6:8ac15bf6d635 594 }
johnAlexander 6:8ac15bf6d635 595
johnAlexander 6:8ac15bf6d635 596 VL53L0X_Error VL53L0X::VL53L0X_get_limit_check_value(VL53L0X_DEV dev, uint16_t limit_check_id,
johnAlexander 6:8ac15bf6d635 597 FixPoint1616_t *p_limit_check_value)
johnAlexander 6:8ac15bf6d635 598 {
johnAlexander 6:8ac15bf6d635 599 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 600 uint8_t enable_zero_value = 0;
johnAlexander 6:8ac15bf6d635 601 uint16_t temp16;
johnAlexander 6:8ac15bf6d635 602 FixPoint1616_t temp_fix1616;
johnAlexander 6:8ac15bf6d635 603
johnAlexander 6:8ac15bf6d635 604 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 605
johnAlexander 6:8ac15bf6d635 606 switch (limit_check_id) {
johnAlexander 6:8ac15bf6d635 607
johnAlexander 6:8ac15bf6d635 608 case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE:
johnAlexander 6:8ac15bf6d635 609 /* internal computation: */
johnAlexander 6:8ac15bf6d635 610 VL53L0X_GETARRAYPARAMETERFIELD(dev, LimitChecksValue,
johnAlexander 6:8ac15bf6d635 611 VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, temp_fix1616);
johnAlexander 6:8ac15bf6d635 612 enable_zero_value = 0;
johnAlexander 6:8ac15bf6d635 613 break;
johnAlexander 6:8ac15bf6d635 614
johnAlexander 6:8ac15bf6d635 615 case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE:
johnAlexander 6:8ac15bf6d635 616 status = VL53L0X_read_word(dev,
johnAlexander 6:8ac15bf6d635 617 VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT,
johnAlexander 6:8ac15bf6d635 618 &temp16);
johnAlexander 6:8ac15bf6d635 619 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 620 temp_fix1616 = VL53L0X_FIXPOINT97TOFIXPOINT1616(temp16);
johnAlexander 6:8ac15bf6d635 621 }
johnAlexander 6:8ac15bf6d635 622
johnAlexander 6:8ac15bf6d635 623
johnAlexander 6:8ac15bf6d635 624 enable_zero_value = 1;
johnAlexander 6:8ac15bf6d635 625 break;
johnAlexander 6:8ac15bf6d635 626
johnAlexander 6:8ac15bf6d635 627 case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP:
johnAlexander 6:8ac15bf6d635 628 /* internal computation: */
johnAlexander 6:8ac15bf6d635 629 VL53L0X_GETARRAYPARAMETERFIELD(dev, LimitChecksValue,
johnAlexander 6:8ac15bf6d635 630 VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, temp_fix1616);
johnAlexander 6:8ac15bf6d635 631 enable_zero_value = 0;
johnAlexander 6:8ac15bf6d635 632 break;
johnAlexander 6:8ac15bf6d635 633
johnAlexander 6:8ac15bf6d635 634 case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD:
johnAlexander 6:8ac15bf6d635 635 /* internal computation: */
johnAlexander 6:8ac15bf6d635 636 VL53L0X_GETARRAYPARAMETERFIELD(dev, LimitChecksValue,
johnAlexander 6:8ac15bf6d635 637 VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, temp_fix1616);
johnAlexander 6:8ac15bf6d635 638 enable_zero_value = 0;
johnAlexander 6:8ac15bf6d635 639 break;
johnAlexander 6:8ac15bf6d635 640
johnAlexander 6:8ac15bf6d635 641 case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC:
johnAlexander 6:8ac15bf6d635 642 case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE:
johnAlexander 6:8ac15bf6d635 643 status = VL53L0X_read_word(dev,
johnAlexander 6:8ac15bf6d635 644 VL53L0X_REG_PRE_RANGE_MIN_COUNT_RATE_RTN_LIMIT,
johnAlexander 6:8ac15bf6d635 645 &temp16);
johnAlexander 6:8ac15bf6d635 646 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 647 temp_fix1616 = VL53L0X_FIXPOINT97TOFIXPOINT1616(temp16);
johnAlexander 6:8ac15bf6d635 648 }
johnAlexander 6:8ac15bf6d635 649
johnAlexander 6:8ac15bf6d635 650
johnAlexander 6:8ac15bf6d635 651 enable_zero_value = 0;
johnAlexander 6:8ac15bf6d635 652 break;
johnAlexander 6:8ac15bf6d635 653
johnAlexander 6:8ac15bf6d635 654 default:
johnAlexander 6:8ac15bf6d635 655 status = VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 656
johnAlexander 6:8ac15bf6d635 657 }
johnAlexander 6:8ac15bf6d635 658
johnAlexander 6:8ac15bf6d635 659 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 660
johnAlexander 6:8ac15bf6d635 661 if (enable_zero_value == 1) {
johnAlexander 6:8ac15bf6d635 662
johnAlexander 6:8ac15bf6d635 663 if (temp_fix1616 == 0) {
johnAlexander 6:8ac15bf6d635 664 /* disabled: return value from memory */
johnAlexander 6:8ac15bf6d635 665 VL53L0X_GETARRAYPARAMETERFIELD(dev,
johnAlexander 6:8ac15bf6d635 666 LimitChecksValue, limit_check_id,
johnAlexander 6:8ac15bf6d635 667 temp_fix1616);
johnAlexander 6:8ac15bf6d635 668 *p_limit_check_value = temp_fix1616;
johnAlexander 6:8ac15bf6d635 669 VL53L0X_SETARRAYPARAMETERFIELD(dev,
johnAlexander 6:8ac15bf6d635 670 LimitChecksEnable, limit_check_id, 0);
johnAlexander 6:8ac15bf6d635 671 } else {
johnAlexander 6:8ac15bf6d635 672 *p_limit_check_value = temp_fix1616;
johnAlexander 6:8ac15bf6d635 673 VL53L0X_SETARRAYPARAMETERFIELD(dev,
johnAlexander 6:8ac15bf6d635 674 LimitChecksValue, limit_check_id,
johnAlexander 6:8ac15bf6d635 675 temp_fix1616);
johnAlexander 6:8ac15bf6d635 676 VL53L0X_SETARRAYPARAMETERFIELD(dev,
johnAlexander 6:8ac15bf6d635 677 LimitChecksEnable, limit_check_id, 1);
johnAlexander 6:8ac15bf6d635 678 }
johnAlexander 6:8ac15bf6d635 679 } else {
johnAlexander 6:8ac15bf6d635 680 *p_limit_check_value = temp_fix1616;
johnAlexander 6:8ac15bf6d635 681 }
johnAlexander 6:8ac15bf6d635 682 }
johnAlexander 6:8ac15bf6d635 683
johnAlexander 6:8ac15bf6d635 684 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 685 return status;
johnAlexander 6:8ac15bf6d635 686
johnAlexander 6:8ac15bf6d635 687 }
johnAlexander 6:8ac15bf6d635 688
johnAlexander 6:8ac15bf6d635 689 VL53L0X_Error VL53L0X::VL53L0X_get_limit_check_enable(VL53L0X_DEV dev, uint16_t limit_check_id,
johnAlexander 6:8ac15bf6d635 690 uint8_t *p_limit_check_enable)
johnAlexander 6:8ac15bf6d635 691 {
johnAlexander 6:8ac15bf6d635 692 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 693 uint8_t temp8;
johnAlexander 6:8ac15bf6d635 694
johnAlexander 6:8ac15bf6d635 695 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 696
johnAlexander 6:8ac15bf6d635 697 if (limit_check_id >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS) {
johnAlexander 6:8ac15bf6d635 698 status = VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 699 *p_limit_check_enable = 0;
johnAlexander 6:8ac15bf6d635 700 } else {
johnAlexander 6:8ac15bf6d635 701 VL53L0X_GETARRAYPARAMETERFIELD(dev, LimitChecksEnable,
johnAlexander 6:8ac15bf6d635 702 limit_check_id, temp8);
johnAlexander 6:8ac15bf6d635 703 *p_limit_check_enable = temp8;
johnAlexander 6:8ac15bf6d635 704 }
johnAlexander 6:8ac15bf6d635 705
johnAlexander 6:8ac15bf6d635 706 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 707 return status;
johnAlexander 6:8ac15bf6d635 708 }
johnAlexander 6:8ac15bf6d635 709
johnAlexander 6:8ac15bf6d635 710 VL53L0X_Error VL53L0X::VL53L0X_get_wrap_around_check_enable(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 711 uint8_t *p_wrap_around_check_enable)
johnAlexander 6:8ac15bf6d635 712 {
johnAlexander 6:8ac15bf6d635 713 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 714 uint8_t data;
johnAlexander 6:8ac15bf6d635 715
johnAlexander 6:8ac15bf6d635 716 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 717
johnAlexander 6:8ac15bf6d635 718 status = VL53L0X_read_byte(dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, &data);
johnAlexander 6:8ac15bf6d635 719 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 720 PALDevDataSet(dev, SequenceConfig, data);
johnAlexander 6:8ac15bf6d635 721 if (data & (0x01 << 7)) {
johnAlexander 6:8ac15bf6d635 722 *p_wrap_around_check_enable = 0x01;
johnAlexander 6:8ac15bf6d635 723 } else {
johnAlexander 6:8ac15bf6d635 724 *p_wrap_around_check_enable = 0x00;
johnAlexander 6:8ac15bf6d635 725 }
johnAlexander 6:8ac15bf6d635 726 }
johnAlexander 6:8ac15bf6d635 727 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 728 VL53L0X_SETPARAMETERFIELD(dev, WrapAroundCheckEnable,
johnAlexander 6:8ac15bf6d635 729 *p_wrap_around_check_enable);
johnAlexander 6:8ac15bf6d635 730 }
johnAlexander 6:8ac15bf6d635 731
johnAlexander 6:8ac15bf6d635 732 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 733 return status;
johnAlexander 6:8ac15bf6d635 734 }
johnAlexander 6:8ac15bf6d635 735
johnAlexander 6:8ac15bf6d635 736 VL53L0X_Error VL53L0X::sequence_step_enabled(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 737 VL53L0X_SequenceStepId sequence_step_id, uint8_t sequence_config,
johnAlexander 6:8ac15bf6d635 738 uint8_t *p_sequence_step_enabled)
johnAlexander 6:8ac15bf6d635 739 {
johnAlexander 6:8ac15bf6d635 740 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 741 *p_sequence_step_enabled = 0;
johnAlexander 6:8ac15bf6d635 742 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 743
johnAlexander 6:8ac15bf6d635 744 switch (sequence_step_id) {
johnAlexander 6:8ac15bf6d635 745 case VL53L0X_SEQUENCESTEP_TCC:
johnAlexander 6:8ac15bf6d635 746 *p_sequence_step_enabled = (sequence_config & 0x10) >> 4;
johnAlexander 6:8ac15bf6d635 747 break;
johnAlexander 6:8ac15bf6d635 748 case VL53L0X_SEQUENCESTEP_DSS:
johnAlexander 6:8ac15bf6d635 749 *p_sequence_step_enabled = (sequence_config & 0x08) >> 3;
johnAlexander 6:8ac15bf6d635 750 break;
johnAlexander 6:8ac15bf6d635 751 case VL53L0X_SEQUENCESTEP_MSRC:
johnAlexander 6:8ac15bf6d635 752 *p_sequence_step_enabled = (sequence_config & 0x04) >> 2;
johnAlexander 6:8ac15bf6d635 753 break;
johnAlexander 6:8ac15bf6d635 754 case VL53L0X_SEQUENCESTEP_PRE_RANGE:
johnAlexander 6:8ac15bf6d635 755 *p_sequence_step_enabled = (sequence_config & 0x40) >> 6;
johnAlexander 6:8ac15bf6d635 756 break;
johnAlexander 6:8ac15bf6d635 757 case VL53L0X_SEQUENCESTEP_FINAL_RANGE:
johnAlexander 6:8ac15bf6d635 758 *p_sequence_step_enabled = (sequence_config & 0x80) >> 7;
johnAlexander 6:8ac15bf6d635 759 break;
johnAlexander 6:8ac15bf6d635 760 default:
johnAlexander 6:8ac15bf6d635 761 Status = VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 762 }
johnAlexander 6:8ac15bf6d635 763
johnAlexander 6:8ac15bf6d635 764 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 765 return Status;
johnAlexander 6:8ac15bf6d635 766 }
johnAlexander 6:8ac15bf6d635 767
johnAlexander 6:8ac15bf6d635 768 VL53L0X_Error VL53L0X::VL53L0X_get_sequence_step_enables(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 769 VL53L0X_SchedulerSequenceSteps_t *p_scheduler_sequence_steps)
johnAlexander 6:8ac15bf6d635 770 {
johnAlexander 6:8ac15bf6d635 771 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 772 uint8_t sequence_config = 0;
johnAlexander 6:8ac15bf6d635 773 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 774
johnAlexander 6:8ac15bf6d635 775 status = VL53L0X_read_byte(dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG,
johnAlexander 6:8ac15bf6d635 776 &sequence_config);
johnAlexander 6:8ac15bf6d635 777
johnAlexander 6:8ac15bf6d635 778 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 779 status = sequence_step_enabled(dev,
johnAlexander 6:8ac15bf6d635 780 VL53L0X_SEQUENCESTEP_TCC, sequence_config,
johnAlexander 6:8ac15bf6d635 781 &p_scheduler_sequence_steps->TccOn);
johnAlexander 6:8ac15bf6d635 782 }
johnAlexander 6:8ac15bf6d635 783 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 784 status = sequence_step_enabled(dev,
johnAlexander 6:8ac15bf6d635 785 VL53L0X_SEQUENCESTEP_DSS, sequence_config,
johnAlexander 6:8ac15bf6d635 786 &p_scheduler_sequence_steps->DssOn);
johnAlexander 6:8ac15bf6d635 787 }
johnAlexander 6:8ac15bf6d635 788 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 789 status = sequence_step_enabled(dev,
johnAlexander 6:8ac15bf6d635 790 VL53L0X_SEQUENCESTEP_MSRC, sequence_config,
johnAlexander 6:8ac15bf6d635 791 &p_scheduler_sequence_steps->MsrcOn);
johnAlexander 6:8ac15bf6d635 792 }
johnAlexander 6:8ac15bf6d635 793 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 794 status = sequence_step_enabled(dev,
johnAlexander 6:8ac15bf6d635 795 VL53L0X_SEQUENCESTEP_PRE_RANGE, sequence_config,
johnAlexander 6:8ac15bf6d635 796 &p_scheduler_sequence_steps->PreRangeOn);
johnAlexander 6:8ac15bf6d635 797 }
johnAlexander 6:8ac15bf6d635 798 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 799 status = sequence_step_enabled(dev,
johnAlexander 6:8ac15bf6d635 800 VL53L0X_SEQUENCESTEP_FINAL_RANGE, sequence_config,
johnAlexander 6:8ac15bf6d635 801 &p_scheduler_sequence_steps->FinalRangeOn);
johnAlexander 6:8ac15bf6d635 802 }
johnAlexander 6:8ac15bf6d635 803
johnAlexander 6:8ac15bf6d635 804 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 805 return status;
johnAlexander 6:8ac15bf6d635 806 }
johnAlexander 6:8ac15bf6d635 807
johnAlexander 6:8ac15bf6d635 808 uint8_t VL53L0X::VL53L0X_decode_vcsel_period(uint8_t vcsel_period_reg)
johnAlexander 6:8ac15bf6d635 809 {
johnAlexander 6:8ac15bf6d635 810 /*!
johnAlexander 6:8ac15bf6d635 811 * Converts the encoded VCSEL period register value into the real
johnAlexander 6:8ac15bf6d635 812 * period in PLL clocks
johnAlexander 6:8ac15bf6d635 813 */
johnAlexander 6:8ac15bf6d635 814
johnAlexander 6:8ac15bf6d635 815 uint8_t vcsel_period_pclks = 0;
johnAlexander 6:8ac15bf6d635 816
johnAlexander 6:8ac15bf6d635 817 vcsel_period_pclks = (vcsel_period_reg + 1) << 1;
johnAlexander 6:8ac15bf6d635 818
johnAlexander 6:8ac15bf6d635 819 return vcsel_period_pclks;
johnAlexander 6:8ac15bf6d635 820 }
johnAlexander 6:8ac15bf6d635 821
johnAlexander 6:8ac15bf6d635 822 uint8_t VL53L0X::lv53l0x_encode_vcsel_period(uint8_t vcsel_period_pclks)
johnAlexander 6:8ac15bf6d635 823 {
johnAlexander 6:8ac15bf6d635 824 /*!
johnAlexander 6:8ac15bf6d635 825 * Converts the encoded VCSEL period register value into the real period
johnAlexander 6:8ac15bf6d635 826 * in PLL clocks
johnAlexander 6:8ac15bf6d635 827 */
johnAlexander 6:8ac15bf6d635 828
johnAlexander 6:8ac15bf6d635 829 uint8_t vcsel_period_reg = 0;
johnAlexander 6:8ac15bf6d635 830
johnAlexander 6:8ac15bf6d635 831 vcsel_period_reg = (vcsel_period_pclks >> 1) - 1;
johnAlexander 6:8ac15bf6d635 832
johnAlexander 6:8ac15bf6d635 833 return vcsel_period_reg;
johnAlexander 6:8ac15bf6d635 834 }
johnAlexander 6:8ac15bf6d635 835
johnAlexander 6:8ac15bf6d635 836
johnAlexander 6:8ac15bf6d635 837 VL53L0X_Error VL53L0X::wrapped_VL53L0X_set_vcsel_pulse_period(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 838 VL53L0X_VcselPeriod vcsel_period_type, uint8_t vcsel_pulse_period_pclk)
johnAlexander 6:8ac15bf6d635 839 {
johnAlexander 6:8ac15bf6d635 840 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 841 uint8_t vcsel_period_reg;
johnAlexander 6:8ac15bf6d635 842 uint8_t min_pre_vcsel_period_pclk = 12;
johnAlexander 6:8ac15bf6d635 843 uint8_t max_pre_vcsel_period_pclk = 18;
johnAlexander 6:8ac15bf6d635 844 uint8_t min_final_vcsel_period_pclk = 8;
johnAlexander 6:8ac15bf6d635 845 uint8_t max_final_vcsel_period_pclk = 14;
johnAlexander 6:8ac15bf6d635 846 uint32_t measurement_timing_budget_micro_seconds;
johnAlexander 6:8ac15bf6d635 847 uint32_t final_range_timeout_micro_seconds;
johnAlexander 6:8ac15bf6d635 848 uint32_t pre_range_timeout_micro_seconds;
johnAlexander 6:8ac15bf6d635 849 uint32_t msrc_timeout_micro_seconds;
johnAlexander 6:8ac15bf6d635 850 uint8_t phase_cal_int = 0;
johnAlexander 6:8ac15bf6d635 851
johnAlexander 6:8ac15bf6d635 852 /* Check if valid clock period requested */
johnAlexander 6:8ac15bf6d635 853
johnAlexander 6:8ac15bf6d635 854 if ((vcsel_pulse_period_pclk % 2) != 0) {
johnAlexander 6:8ac15bf6d635 855 /* Value must be an even number */
johnAlexander 6:8ac15bf6d635 856 status = VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 857 } else if (vcsel_period_type == VL53L0X_VCSEL_PERIOD_PRE_RANGE &&
johnAlexander 6:8ac15bf6d635 858 (vcsel_pulse_period_pclk < min_pre_vcsel_period_pclk ||
johnAlexander 6:8ac15bf6d635 859 vcsel_pulse_period_pclk > max_pre_vcsel_period_pclk)) {
johnAlexander 6:8ac15bf6d635 860 status = VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 861 } else if (vcsel_period_type == VL53L0X_VCSEL_PERIOD_FINAL_RANGE &&
johnAlexander 6:8ac15bf6d635 862 (vcsel_pulse_period_pclk < min_final_vcsel_period_pclk ||
johnAlexander 6:8ac15bf6d635 863 vcsel_pulse_period_pclk > max_final_vcsel_period_pclk)) {
johnAlexander 6:8ac15bf6d635 864
johnAlexander 6:8ac15bf6d635 865 status = VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 866 }
johnAlexander 6:8ac15bf6d635 867
johnAlexander 6:8ac15bf6d635 868 /* Apply specific settings for the requested clock period */
johnAlexander 6:8ac15bf6d635 869
johnAlexander 6:8ac15bf6d635 870 if (status != VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 871 return status;
johnAlexander 6:8ac15bf6d635 872 }
johnAlexander 6:8ac15bf6d635 873
johnAlexander 6:8ac15bf6d635 874
johnAlexander 6:8ac15bf6d635 875 if (vcsel_period_type == VL53L0X_VCSEL_PERIOD_PRE_RANGE) {
johnAlexander 6:8ac15bf6d635 876
johnAlexander 6:8ac15bf6d635 877 /* Set phase check limits */
johnAlexander 6:8ac15bf6d635 878 if (vcsel_pulse_period_pclk == 12) {
johnAlexander 6:8ac15bf6d635 879
johnAlexander 6:8ac15bf6d635 880 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 881 VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH,
johnAlexander 6:8ac15bf6d635 882 0x18);
johnAlexander 6:8ac15bf6d635 883 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 884 VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW,
johnAlexander 6:8ac15bf6d635 885 0x08);
johnAlexander 6:8ac15bf6d635 886 } else if (vcsel_pulse_period_pclk == 14) {
johnAlexander 6:8ac15bf6d635 887
johnAlexander 6:8ac15bf6d635 888 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 889 VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH,
johnAlexander 6:8ac15bf6d635 890 0x30);
johnAlexander 6:8ac15bf6d635 891 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 892 VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW,
johnAlexander 6:8ac15bf6d635 893 0x08);
johnAlexander 6:8ac15bf6d635 894 } else if (vcsel_pulse_period_pclk == 16) {
johnAlexander 6:8ac15bf6d635 895
johnAlexander 6:8ac15bf6d635 896 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 897 VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH,
johnAlexander 6:8ac15bf6d635 898 0x40);
johnAlexander 6:8ac15bf6d635 899 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 900 VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW,
johnAlexander 6:8ac15bf6d635 901 0x08);
johnAlexander 6:8ac15bf6d635 902 } else if (vcsel_pulse_period_pclk == 18) {
johnAlexander 6:8ac15bf6d635 903
johnAlexander 6:8ac15bf6d635 904 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 905 VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_HIGH,
johnAlexander 6:8ac15bf6d635 906 0x50);
johnAlexander 6:8ac15bf6d635 907 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 908 VL53L0X_REG_PRE_RANGE_CONFIG_VALID_PHASE_LOW,
johnAlexander 6:8ac15bf6d635 909 0x08);
johnAlexander 6:8ac15bf6d635 910 }
johnAlexander 6:8ac15bf6d635 911 } else if (vcsel_period_type == VL53L0X_VCSEL_PERIOD_FINAL_RANGE) {
johnAlexander 6:8ac15bf6d635 912
johnAlexander 6:8ac15bf6d635 913 if (vcsel_pulse_period_pclk == 8) {
johnAlexander 6:8ac15bf6d635 914
johnAlexander 6:8ac15bf6d635 915 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 916 VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH,
johnAlexander 6:8ac15bf6d635 917 0x10);
johnAlexander 6:8ac15bf6d635 918 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 919 VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW,
johnAlexander 6:8ac15bf6d635 920 0x08);
johnAlexander 6:8ac15bf6d635 921
johnAlexander 6:8ac15bf6d635 922 status |= VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 923 VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH, 0x02);
johnAlexander 6:8ac15bf6d635 924 status |= VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 925 VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x0C);
johnAlexander 6:8ac15bf6d635 926
johnAlexander 6:8ac15bf6d635 927 status |= VL53L0X_write_byte(dev, 0xff, 0x01);
johnAlexander 6:8ac15bf6d635 928 status |= VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 929 VL53L0X_REG_ALGO_PHASECAL_LIM,
johnAlexander 6:8ac15bf6d635 930 0x30);
johnAlexander 6:8ac15bf6d635 931 status |= VL53L0X_write_byte(dev, 0xff, 0x00);
johnAlexander 6:8ac15bf6d635 932 } else if (vcsel_pulse_period_pclk == 10) {
johnAlexander 6:8ac15bf6d635 933
johnAlexander 6:8ac15bf6d635 934 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 935 VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH,
johnAlexander 6:8ac15bf6d635 936 0x28);
johnAlexander 6:8ac15bf6d635 937 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 938 VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW,
johnAlexander 6:8ac15bf6d635 939 0x08);
johnAlexander 6:8ac15bf6d635 940
johnAlexander 6:8ac15bf6d635 941 status |= VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 942 VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH, 0x03);
johnAlexander 6:8ac15bf6d635 943 status |= VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 944 VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x09);
johnAlexander 6:8ac15bf6d635 945
johnAlexander 6:8ac15bf6d635 946 status |= VL53L0X_write_byte(dev, 0xff, 0x01);
johnAlexander 6:8ac15bf6d635 947 status |= VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 948 VL53L0X_REG_ALGO_PHASECAL_LIM,
johnAlexander 6:8ac15bf6d635 949 0x20);
johnAlexander 6:8ac15bf6d635 950 status |= VL53L0X_write_byte(dev, 0xff, 0x00);
johnAlexander 6:8ac15bf6d635 951 } else if (vcsel_pulse_period_pclk == 12) {
johnAlexander 6:8ac15bf6d635 952
johnAlexander 6:8ac15bf6d635 953 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 954 VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH,
johnAlexander 6:8ac15bf6d635 955 0x38);
johnAlexander 6:8ac15bf6d635 956 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 957 VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW,
johnAlexander 6:8ac15bf6d635 958 0x08);
johnAlexander 6:8ac15bf6d635 959
johnAlexander 6:8ac15bf6d635 960 status |= VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 961 VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH, 0x03);
johnAlexander 6:8ac15bf6d635 962 status |= VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 963 VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x08);
johnAlexander 6:8ac15bf6d635 964
johnAlexander 6:8ac15bf6d635 965 status |= VL53L0X_write_byte(dev, 0xff, 0x01);
johnAlexander 6:8ac15bf6d635 966 status |= VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 967 VL53L0X_REG_ALGO_PHASECAL_LIM,
johnAlexander 6:8ac15bf6d635 968 0x20);
johnAlexander 6:8ac15bf6d635 969 status |= VL53L0X_write_byte(dev, 0xff, 0x00);
johnAlexander 6:8ac15bf6d635 970 } else if (vcsel_pulse_period_pclk == 14) {
johnAlexander 6:8ac15bf6d635 971
johnAlexander 6:8ac15bf6d635 972 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 973 VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_HIGH,
johnAlexander 6:8ac15bf6d635 974 0x048);
johnAlexander 6:8ac15bf6d635 975 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 976 VL53L0X_REG_FINAL_RANGE_CONFIG_VALID_PHASE_LOW,
johnAlexander 6:8ac15bf6d635 977 0x08);
johnAlexander 6:8ac15bf6d635 978
johnAlexander 6:8ac15bf6d635 979 status |= VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 980 VL53L0X_REG_GLOBAL_CONFIG_VCSEL_WIDTH, 0x03);
johnAlexander 6:8ac15bf6d635 981 status |= VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 982 VL53L0X_REG_ALGO_PHASECAL_CONFIG_TIMEOUT, 0x07);
johnAlexander 6:8ac15bf6d635 983
johnAlexander 6:8ac15bf6d635 984 status |= VL53L0X_write_byte(dev, 0xff, 0x01);
johnAlexander 6:8ac15bf6d635 985 status |= VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 986 VL53L0X_REG_ALGO_PHASECAL_LIM,
johnAlexander 6:8ac15bf6d635 987 0x20);
johnAlexander 6:8ac15bf6d635 988 status |= VL53L0X_write_byte(dev, 0xff, 0x00);
johnAlexander 6:8ac15bf6d635 989 }
johnAlexander 6:8ac15bf6d635 990 }
johnAlexander 6:8ac15bf6d635 991
johnAlexander 6:8ac15bf6d635 992
johnAlexander 6:8ac15bf6d635 993 /* Re-calculate and apply timeouts, in macro periods */
johnAlexander 6:8ac15bf6d635 994
johnAlexander 6:8ac15bf6d635 995 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 996 vcsel_period_reg = lv53l0x_encode_vcsel_period((uint8_t)
johnAlexander 6:8ac15bf6d635 997 vcsel_pulse_period_pclk);
johnAlexander 6:8ac15bf6d635 998
johnAlexander 6:8ac15bf6d635 999 /* When the VCSEL period for the pre or final range is changed,
johnAlexander 6:8ac15bf6d635 1000 * the corresponding timeout must be read from the device using
johnAlexander 6:8ac15bf6d635 1001 * the current VCSEL period, then the new VCSEL period can be
johnAlexander 6:8ac15bf6d635 1002 * applied. The timeout then must be written back to the device
johnAlexander 6:8ac15bf6d635 1003 * using the new VCSEL period.
johnAlexander 6:8ac15bf6d635 1004 *
johnAlexander 6:8ac15bf6d635 1005 * For the MSRC timeout, the same applies - this timeout being
johnAlexander 6:8ac15bf6d635 1006 * dependant on the pre-range vcsel period.
johnAlexander 6:8ac15bf6d635 1007 */
johnAlexander 6:8ac15bf6d635 1008 switch (vcsel_period_type) {
johnAlexander 6:8ac15bf6d635 1009 case VL53L0X_VCSEL_PERIOD_PRE_RANGE:
johnAlexander 6:8ac15bf6d635 1010 status = get_sequence_step_timeout(dev,
johnAlexander 6:8ac15bf6d635 1011 VL53L0X_SEQUENCESTEP_PRE_RANGE,
johnAlexander 6:8ac15bf6d635 1012 &pre_range_timeout_micro_seconds);
johnAlexander 6:8ac15bf6d635 1013
johnAlexander 6:8ac15bf6d635 1014 if (status == VL53L0X_ERROR_NONE)
johnAlexander 6:8ac15bf6d635 1015 status = get_sequence_step_timeout(dev,
johnAlexander 6:8ac15bf6d635 1016 VL53L0X_SEQUENCESTEP_MSRC,
johnAlexander 6:8ac15bf6d635 1017 &msrc_timeout_micro_seconds);
johnAlexander 6:8ac15bf6d635 1018
johnAlexander 6:8ac15bf6d635 1019 if (status == VL53L0X_ERROR_NONE)
johnAlexander 6:8ac15bf6d635 1020 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 1021 VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD,
johnAlexander 6:8ac15bf6d635 1022 vcsel_period_reg);
johnAlexander 6:8ac15bf6d635 1023
johnAlexander 6:8ac15bf6d635 1024
johnAlexander 6:8ac15bf6d635 1025 if (status == VL53L0X_ERROR_NONE)
johnAlexander 6:8ac15bf6d635 1026 status = set_sequence_step_timeout(dev,
johnAlexander 6:8ac15bf6d635 1027 VL53L0X_SEQUENCESTEP_PRE_RANGE,
johnAlexander 6:8ac15bf6d635 1028 pre_range_timeout_micro_seconds);
johnAlexander 6:8ac15bf6d635 1029
johnAlexander 6:8ac15bf6d635 1030
johnAlexander 6:8ac15bf6d635 1031 if (status == VL53L0X_ERROR_NONE)
johnAlexander 6:8ac15bf6d635 1032 status = set_sequence_step_timeout(dev,
johnAlexander 6:8ac15bf6d635 1033 VL53L0X_SEQUENCESTEP_MSRC,
johnAlexander 6:8ac15bf6d635 1034 msrc_timeout_micro_seconds);
johnAlexander 6:8ac15bf6d635 1035
johnAlexander 6:8ac15bf6d635 1036 VL53L0X_SETDEVICESPECIFICPARAMETER(
johnAlexander 6:8ac15bf6d635 1037 dev,
johnAlexander 6:8ac15bf6d635 1038 PreRangeVcselPulsePeriod,
johnAlexander 6:8ac15bf6d635 1039 vcsel_pulse_period_pclk);
johnAlexander 6:8ac15bf6d635 1040 break;
johnAlexander 6:8ac15bf6d635 1041 case VL53L0X_VCSEL_PERIOD_FINAL_RANGE:
johnAlexander 6:8ac15bf6d635 1042 status = get_sequence_step_timeout(dev,
johnAlexander 6:8ac15bf6d635 1043 VL53L0X_SEQUENCESTEP_FINAL_RANGE,
johnAlexander 6:8ac15bf6d635 1044 &final_range_timeout_micro_seconds);
johnAlexander 6:8ac15bf6d635 1045
johnAlexander 6:8ac15bf6d635 1046 if (status == VL53L0X_ERROR_NONE)
johnAlexander 6:8ac15bf6d635 1047 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 1048 VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD,
johnAlexander 6:8ac15bf6d635 1049 vcsel_period_reg);
johnAlexander 6:8ac15bf6d635 1050
johnAlexander 6:8ac15bf6d635 1051
johnAlexander 6:8ac15bf6d635 1052 if (status == VL53L0X_ERROR_NONE)
johnAlexander 6:8ac15bf6d635 1053 status = set_sequence_step_timeout(dev,
johnAlexander 6:8ac15bf6d635 1054 VL53L0X_SEQUENCESTEP_FINAL_RANGE,
johnAlexander 6:8ac15bf6d635 1055 final_range_timeout_micro_seconds);
johnAlexander 6:8ac15bf6d635 1056
johnAlexander 6:8ac15bf6d635 1057 VL53L0X_SETDEVICESPECIFICPARAMETER(
johnAlexander 6:8ac15bf6d635 1058 dev,
johnAlexander 6:8ac15bf6d635 1059 FinalRangeVcselPulsePeriod,
johnAlexander 6:8ac15bf6d635 1060 vcsel_pulse_period_pclk);
johnAlexander 6:8ac15bf6d635 1061 break;
johnAlexander 6:8ac15bf6d635 1062 default:
johnAlexander 6:8ac15bf6d635 1063 status = VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 1064 }
johnAlexander 6:8ac15bf6d635 1065 }
johnAlexander 6:8ac15bf6d635 1066
johnAlexander 6:8ac15bf6d635 1067 /* Finally, the timing budget must be re-applied */
johnAlexander 6:8ac15bf6d635 1068 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1069 VL53L0X_GETPARAMETERFIELD(dev,
johnAlexander 6:8ac15bf6d635 1070 MeasurementTimingBudgetMicroSeconds,
johnAlexander 6:8ac15bf6d635 1071 measurement_timing_budget_micro_seconds);
johnAlexander 6:8ac15bf6d635 1072
johnAlexander 6:8ac15bf6d635 1073 status = VL53L0X_set_measurement_timing_budget_micro_seconds(dev,
johnAlexander 6:8ac15bf6d635 1074 measurement_timing_budget_micro_seconds);
johnAlexander 6:8ac15bf6d635 1075 }
johnAlexander 6:8ac15bf6d635 1076
johnAlexander 6:8ac15bf6d635 1077 /* Perform the phase calibration. This is needed after changing on
johnAlexander 6:8ac15bf6d635 1078 * vcsel period.
johnAlexander 6:8ac15bf6d635 1079 * get_data_enable = 0, restore_config = 1 */
johnAlexander 6:8ac15bf6d635 1080 if (status == VL53L0X_ERROR_NONE)
johnAlexander 6:8ac15bf6d635 1081 status = VL53L0X_perform_phase_calibration(
johnAlexander 6:8ac15bf6d635 1082 dev, &phase_cal_int, 0, 1);
johnAlexander 6:8ac15bf6d635 1083
johnAlexander 6:8ac15bf6d635 1084 return status;
johnAlexander 6:8ac15bf6d635 1085 }
johnAlexander 6:8ac15bf6d635 1086
johnAlexander 6:8ac15bf6d635 1087 VL53L0X_Error VL53L0X::VL53L0X_set_vcsel_pulse_period(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 1088 VL53L0X_VcselPeriod vcsel_period_type, uint8_t vcsel_pulse_period)
johnAlexander 6:8ac15bf6d635 1089 {
johnAlexander 6:8ac15bf6d635 1090 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 1091 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 1092
johnAlexander 6:8ac15bf6d635 1093 status = wrapped_VL53L0X_set_vcsel_pulse_period(dev, vcsel_period_type,
johnAlexander 6:8ac15bf6d635 1094 vcsel_pulse_period);
johnAlexander 6:8ac15bf6d635 1095
johnAlexander 6:8ac15bf6d635 1096 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 1097 return status;
johnAlexander 6:8ac15bf6d635 1098 }
johnAlexander 6:8ac15bf6d635 1099
johnAlexander 6:8ac15bf6d635 1100 VL53L0X_Error VL53L0X::wrapped_VL53L0X_get_vcsel_pulse_period(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 1101 VL53L0X_VcselPeriod vcsel_period_type, uint8_t *p_vcsel_pulse_period_pclk)
johnAlexander 6:8ac15bf6d635 1102 {
johnAlexander 6:8ac15bf6d635 1103 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 1104 uint8_t vcsel_period_reg;
johnAlexander 6:8ac15bf6d635 1105
johnAlexander 6:8ac15bf6d635 1106 switch (vcsel_period_type) {
johnAlexander 6:8ac15bf6d635 1107 case VL53L0X_VCSEL_PERIOD_PRE_RANGE:
johnAlexander 6:8ac15bf6d635 1108 status = VL53L0X_read_byte(dev,
johnAlexander 6:8ac15bf6d635 1109 VL53L0X_REG_PRE_RANGE_CONFIG_VCSEL_PERIOD,
johnAlexander 6:8ac15bf6d635 1110 &vcsel_period_reg);
johnAlexander 6:8ac15bf6d635 1111 break;
johnAlexander 6:8ac15bf6d635 1112 case VL53L0X_VCSEL_PERIOD_FINAL_RANGE:
johnAlexander 6:8ac15bf6d635 1113 status = VL53L0X_read_byte(dev,
johnAlexander 6:8ac15bf6d635 1114 VL53L0X_REG_FINAL_RANGE_CONFIG_VCSEL_PERIOD,
johnAlexander 6:8ac15bf6d635 1115 &vcsel_period_reg);
johnAlexander 6:8ac15bf6d635 1116 break;
johnAlexander 6:8ac15bf6d635 1117 default:
johnAlexander 6:8ac15bf6d635 1118 status = VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 1119 }
johnAlexander 6:8ac15bf6d635 1120
johnAlexander 6:8ac15bf6d635 1121 if (status == VL53L0X_ERROR_NONE)
johnAlexander 6:8ac15bf6d635 1122 *p_vcsel_pulse_period_pclk =
johnAlexander 6:8ac15bf6d635 1123 VL53L0X_decode_vcsel_period(vcsel_period_reg);
johnAlexander 6:8ac15bf6d635 1124
johnAlexander 6:8ac15bf6d635 1125 return status;
johnAlexander 6:8ac15bf6d635 1126 }
johnAlexander 6:8ac15bf6d635 1127
johnAlexander 6:8ac15bf6d635 1128 VL53L0X_Error VL53L0X::VL53L0X_get_vcsel_pulse_period(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 1129 VL53L0X_VcselPeriod vcsel_period_type, uint8_t *p_vcsel_pulse_period_pclk)
johnAlexander 6:8ac15bf6d635 1130 {
johnAlexander 6:8ac15bf6d635 1131 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 1132 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 1133
johnAlexander 6:8ac15bf6d635 1134 status = wrapped_VL53L0X_get_vcsel_pulse_period(dev, vcsel_period_type,
johnAlexander 6:8ac15bf6d635 1135 p_vcsel_pulse_period_pclk);
johnAlexander 6:8ac15bf6d635 1136
johnAlexander 6:8ac15bf6d635 1137 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 1138 return status;
johnAlexander 6:8ac15bf6d635 1139 }
johnAlexander 6:8ac15bf6d635 1140
johnAlexander 6:8ac15bf6d635 1141 uint32_t VL53L0X::VL53L0X_decode_timeout(uint16_t encoded_timeout)
johnAlexander 6:8ac15bf6d635 1142 {
johnAlexander 6:8ac15bf6d635 1143 /*!
johnAlexander 6:8ac15bf6d635 1144 * Decode 16-bit timeout register value - format (LSByte * 2^MSByte) + 1
johnAlexander 6:8ac15bf6d635 1145 */
johnAlexander 6:8ac15bf6d635 1146
johnAlexander 6:8ac15bf6d635 1147 uint32_t timeout_macro_clks = 0;
johnAlexander 6:8ac15bf6d635 1148
johnAlexander 6:8ac15bf6d635 1149 timeout_macro_clks = ((uint32_t)(encoded_timeout & 0x00FF)
johnAlexander 6:8ac15bf6d635 1150 << (uint32_t)((encoded_timeout & 0xFF00) >> 8)) + 1;
johnAlexander 6:8ac15bf6d635 1151
johnAlexander 6:8ac15bf6d635 1152 return timeout_macro_clks;
johnAlexander 6:8ac15bf6d635 1153 }
johnAlexander 6:8ac15bf6d635 1154
johnAlexander 6:8ac15bf6d635 1155 uint32_t VL53L0X::VL53L0X_calc_macro_period_ps(VL53L0X_DEV dev, uint8_t vcsel_period_pclks)
johnAlexander 6:8ac15bf6d635 1156 {
johnAlexander 6:8ac15bf6d635 1157 uint64_t pll_period_ps;
johnAlexander 6:8ac15bf6d635 1158 uint32_t macro_period_vclks;
johnAlexander 6:8ac15bf6d635 1159 uint32_t macro_period_ps;
johnAlexander 6:8ac15bf6d635 1160
johnAlexander 6:8ac15bf6d635 1161 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 1162
johnAlexander 6:8ac15bf6d635 1163 /* The above calculation will produce rounding errors,
johnAlexander 6:8ac15bf6d635 1164 therefore set fixed value
johnAlexander 6:8ac15bf6d635 1165 */
johnAlexander 6:8ac15bf6d635 1166 pll_period_ps = 1655;
johnAlexander 6:8ac15bf6d635 1167
johnAlexander 6:8ac15bf6d635 1168 macro_period_vclks = 2304;
johnAlexander 6:8ac15bf6d635 1169 macro_period_ps = (uint32_t)(macro_period_vclks
johnAlexander 6:8ac15bf6d635 1170 * vcsel_period_pclks * pll_period_ps);
johnAlexander 6:8ac15bf6d635 1171
johnAlexander 6:8ac15bf6d635 1172 LOG_FUNCTION_END("");
johnAlexander 6:8ac15bf6d635 1173 return macro_period_ps;
johnAlexander 6:8ac15bf6d635 1174 }
johnAlexander 6:8ac15bf6d635 1175
johnAlexander 6:8ac15bf6d635 1176 /* To convert register value into us */
johnAlexander 6:8ac15bf6d635 1177 uint32_t VL53L0X::VL53L0X_calc_timeout_us(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 1178 uint16_t timeout_period_mclks,
johnAlexander 6:8ac15bf6d635 1179 uint8_t vcsel_period_pclks)
johnAlexander 6:8ac15bf6d635 1180 {
johnAlexander 6:8ac15bf6d635 1181 uint32_t macro_period_ps;
johnAlexander 6:8ac15bf6d635 1182 uint32_t macro_period_ns;
johnAlexander 6:8ac15bf6d635 1183 uint32_t actual_timeout_period_us = 0;
johnAlexander 6:8ac15bf6d635 1184
johnAlexander 6:8ac15bf6d635 1185 macro_period_ps = VL53L0X_calc_macro_period_ps(dev, vcsel_period_pclks);
johnAlexander 6:8ac15bf6d635 1186 macro_period_ns = (macro_period_ps + 500) / 1000;
johnAlexander 6:8ac15bf6d635 1187
johnAlexander 6:8ac15bf6d635 1188 actual_timeout_period_us =
johnAlexander 6:8ac15bf6d635 1189 ((timeout_period_mclks * macro_period_ns) + 500) / 1000;
johnAlexander 6:8ac15bf6d635 1190
johnAlexander 6:8ac15bf6d635 1191 return actual_timeout_period_us;
johnAlexander 6:8ac15bf6d635 1192 }
johnAlexander 6:8ac15bf6d635 1193
johnAlexander 6:8ac15bf6d635 1194 VL53L0X_Error VL53L0X::get_sequence_step_timeout(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 1195 VL53L0X_SequenceStepId sequence_step_id,
johnAlexander 6:8ac15bf6d635 1196 uint32_t *p_time_out_micro_secs)
johnAlexander 6:8ac15bf6d635 1197 {
johnAlexander 6:8ac15bf6d635 1198 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 1199 uint8_t current_vcsel_pulse_period_p_clk;
johnAlexander 6:8ac15bf6d635 1200 uint8_t encoded_time_out_byte = 0;
johnAlexander 6:8ac15bf6d635 1201 uint32_t timeout_micro_seconds = 0;
johnAlexander 6:8ac15bf6d635 1202 uint16_t pre_range_encoded_time_out = 0;
johnAlexander 6:8ac15bf6d635 1203 uint16_t msrc_time_out_m_clks;
johnAlexander 6:8ac15bf6d635 1204 uint16_t pre_range_time_out_m_clks;
johnAlexander 6:8ac15bf6d635 1205 uint16_t final_range_time_out_m_clks = 0;
johnAlexander 6:8ac15bf6d635 1206 uint16_t final_range_encoded_time_out;
johnAlexander 6:8ac15bf6d635 1207 VL53L0X_SchedulerSequenceSteps_t scheduler_sequence_steps;
johnAlexander 6:8ac15bf6d635 1208
johnAlexander 6:8ac15bf6d635 1209 if ((sequence_step_id == VL53L0X_SEQUENCESTEP_TCC) ||
johnAlexander 6:8ac15bf6d635 1210 (sequence_step_id == VL53L0X_SEQUENCESTEP_DSS) ||
johnAlexander 6:8ac15bf6d635 1211 (sequence_step_id == VL53L0X_SEQUENCESTEP_MSRC)) {
johnAlexander 6:8ac15bf6d635 1212
johnAlexander 6:8ac15bf6d635 1213 status = VL53L0X_get_vcsel_pulse_period(dev,
johnAlexander 6:8ac15bf6d635 1214 VL53L0X_VCSEL_PERIOD_PRE_RANGE,
johnAlexander 6:8ac15bf6d635 1215 &current_vcsel_pulse_period_p_clk);
johnAlexander 6:8ac15bf6d635 1216 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1217 status = VL53L0X_read_byte(dev,
johnAlexander 6:8ac15bf6d635 1218 VL53L0X_REG_MSRC_CONFIG_TIMEOUT_MACROP,
johnAlexander 6:8ac15bf6d635 1219 &encoded_time_out_byte);
johnAlexander 6:8ac15bf6d635 1220 }
johnAlexander 6:8ac15bf6d635 1221 msrc_time_out_m_clks = VL53L0X_decode_timeout(encoded_time_out_byte);
johnAlexander 6:8ac15bf6d635 1222
johnAlexander 6:8ac15bf6d635 1223 timeout_micro_seconds = VL53L0X_calc_timeout_us(dev,
johnAlexander 6:8ac15bf6d635 1224 msrc_time_out_m_clks,
johnAlexander 6:8ac15bf6d635 1225 current_vcsel_pulse_period_p_clk);
johnAlexander 6:8ac15bf6d635 1226 } else if (sequence_step_id == VL53L0X_SEQUENCESTEP_PRE_RANGE) {
johnAlexander 6:8ac15bf6d635 1227 /* Retrieve PRE-RANGE VCSEL Period */
johnAlexander 6:8ac15bf6d635 1228 status = VL53L0X_get_vcsel_pulse_period(dev,
johnAlexander 6:8ac15bf6d635 1229 VL53L0X_VCSEL_PERIOD_PRE_RANGE,
johnAlexander 6:8ac15bf6d635 1230 &current_vcsel_pulse_period_p_clk);
johnAlexander 6:8ac15bf6d635 1231
johnAlexander 6:8ac15bf6d635 1232 /* Retrieve PRE-RANGE Timeout in Macro periods (MCLKS) */
johnAlexander 6:8ac15bf6d635 1233 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1234
johnAlexander 6:8ac15bf6d635 1235 /* Retrieve PRE-RANGE VCSEL Period */
johnAlexander 6:8ac15bf6d635 1236 status = VL53L0X_get_vcsel_pulse_period(dev,
johnAlexander 6:8ac15bf6d635 1237 VL53L0X_VCSEL_PERIOD_PRE_RANGE,
johnAlexander 6:8ac15bf6d635 1238 &current_vcsel_pulse_period_p_clk);
johnAlexander 6:8ac15bf6d635 1239
johnAlexander 6:8ac15bf6d635 1240 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1241 status = VL53L0X_read_word(dev,
johnAlexander 6:8ac15bf6d635 1242 VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI,
johnAlexander 6:8ac15bf6d635 1243 &pre_range_encoded_time_out);
johnAlexander 6:8ac15bf6d635 1244 }
johnAlexander 6:8ac15bf6d635 1245
johnAlexander 6:8ac15bf6d635 1246 pre_range_time_out_m_clks = VL53L0X_decode_timeout(
johnAlexander 6:8ac15bf6d635 1247 pre_range_encoded_time_out);
johnAlexander 6:8ac15bf6d635 1248
johnAlexander 6:8ac15bf6d635 1249 timeout_micro_seconds = VL53L0X_calc_timeout_us(dev,
johnAlexander 6:8ac15bf6d635 1250 pre_range_time_out_m_clks,
johnAlexander 6:8ac15bf6d635 1251 current_vcsel_pulse_period_p_clk);
johnAlexander 6:8ac15bf6d635 1252 }
johnAlexander 6:8ac15bf6d635 1253 } else if (sequence_step_id == VL53L0X_SEQUENCESTEP_FINAL_RANGE) {
johnAlexander 6:8ac15bf6d635 1254
johnAlexander 6:8ac15bf6d635 1255 VL53L0X_get_sequence_step_enables(dev, &scheduler_sequence_steps);
johnAlexander 6:8ac15bf6d635 1256 pre_range_time_out_m_clks = 0;
johnAlexander 6:8ac15bf6d635 1257
johnAlexander 6:8ac15bf6d635 1258 if (scheduler_sequence_steps.PreRangeOn) {
johnAlexander 6:8ac15bf6d635 1259 /* Retrieve PRE-RANGE VCSEL Period */
johnAlexander 6:8ac15bf6d635 1260 status = VL53L0X_get_vcsel_pulse_period(dev,
johnAlexander 6:8ac15bf6d635 1261 VL53L0X_VCSEL_PERIOD_PRE_RANGE,
johnAlexander 6:8ac15bf6d635 1262 &current_vcsel_pulse_period_p_clk);
johnAlexander 6:8ac15bf6d635 1263
johnAlexander 6:8ac15bf6d635 1264 /* Retrieve PRE-RANGE Timeout in Macro periods
johnAlexander 6:8ac15bf6d635 1265 * (MCLKS) */
johnAlexander 6:8ac15bf6d635 1266 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1267 status = VL53L0X_read_word(dev,
johnAlexander 6:8ac15bf6d635 1268 VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI,
johnAlexander 6:8ac15bf6d635 1269 &pre_range_encoded_time_out);
johnAlexander 6:8ac15bf6d635 1270 pre_range_time_out_m_clks = VL53L0X_decode_timeout(
johnAlexander 6:8ac15bf6d635 1271 pre_range_encoded_time_out);
johnAlexander 6:8ac15bf6d635 1272 }
johnAlexander 6:8ac15bf6d635 1273 }
johnAlexander 6:8ac15bf6d635 1274
johnAlexander 6:8ac15bf6d635 1275 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1276 /* Retrieve FINAL-RANGE VCSEL Period */
johnAlexander 6:8ac15bf6d635 1277 status = VL53L0X_get_vcsel_pulse_period(dev,
johnAlexander 6:8ac15bf6d635 1278 VL53L0X_VCSEL_PERIOD_FINAL_RANGE,
johnAlexander 6:8ac15bf6d635 1279 &current_vcsel_pulse_period_p_clk);
johnAlexander 6:8ac15bf6d635 1280 }
johnAlexander 6:8ac15bf6d635 1281
johnAlexander 6:8ac15bf6d635 1282 /* Retrieve FINAL-RANGE Timeout in Macro periods (MCLKS) */
johnAlexander 6:8ac15bf6d635 1283 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1284 status = VL53L0X_read_word(dev,
johnAlexander 6:8ac15bf6d635 1285 VL53L0X_REG_FINAL_RANGE_CONFIG_TIMEOUT_MACROP_HI,
johnAlexander 6:8ac15bf6d635 1286 &final_range_encoded_time_out);
johnAlexander 6:8ac15bf6d635 1287 final_range_time_out_m_clks = VL53L0X_decode_timeout(
johnAlexander 6:8ac15bf6d635 1288 final_range_encoded_time_out);
johnAlexander 6:8ac15bf6d635 1289 }
johnAlexander 6:8ac15bf6d635 1290
johnAlexander 6:8ac15bf6d635 1291 final_range_time_out_m_clks -= pre_range_time_out_m_clks;
johnAlexander 6:8ac15bf6d635 1292 timeout_micro_seconds = VL53L0X_calc_timeout_us(dev,
johnAlexander 6:8ac15bf6d635 1293 final_range_time_out_m_clks,
johnAlexander 6:8ac15bf6d635 1294 current_vcsel_pulse_period_p_clk);
johnAlexander 6:8ac15bf6d635 1295 }
johnAlexander 6:8ac15bf6d635 1296
johnAlexander 6:8ac15bf6d635 1297 *p_time_out_micro_secs = timeout_micro_seconds;
johnAlexander 6:8ac15bf6d635 1298
johnAlexander 6:8ac15bf6d635 1299 return status;
johnAlexander 6:8ac15bf6d635 1300 }
johnAlexander 6:8ac15bf6d635 1301
johnAlexander 6:8ac15bf6d635 1302 VL53L0X_Error VL53L0X::wrapped_VL53L0X_get_measurement_timing_budget_micro_seconds(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 1303 uint32_t *p_measurement_timing_budget_micro_seconds)
johnAlexander 6:8ac15bf6d635 1304 {
johnAlexander 6:8ac15bf6d635 1305 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 1306 VL53L0X_SchedulerSequenceSteps_t scheduler_sequence_steps;
johnAlexander 6:8ac15bf6d635 1307 uint32_t final_range_timeout_micro_seconds;
johnAlexander 6:8ac15bf6d635 1308 uint32_t msrc_dcc_tcc_timeout_micro_seconds = 2000;
johnAlexander 6:8ac15bf6d635 1309 uint32_t start_overhead_micro_seconds = 1910;
johnAlexander 6:8ac15bf6d635 1310 uint32_t end_overhead_micro_seconds = 960;
johnAlexander 6:8ac15bf6d635 1311 uint32_t msrc_overhead_micro_seconds = 660;
johnAlexander 6:8ac15bf6d635 1312 uint32_t tcc_overhead_micro_seconds = 590;
johnAlexander 6:8ac15bf6d635 1313 uint32_t dss_overhead_micro_seconds = 690;
johnAlexander 6:8ac15bf6d635 1314 uint32_t pre_range_overhead_micro_seconds = 660;
johnAlexander 6:8ac15bf6d635 1315 uint32_t final_range_overhead_micro_seconds = 550;
johnAlexander 6:8ac15bf6d635 1316 uint32_t pre_range_timeout_micro_seconds = 0;
johnAlexander 6:8ac15bf6d635 1317
johnAlexander 6:8ac15bf6d635 1318 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 1319
johnAlexander 6:8ac15bf6d635 1320 /* Start and end overhead times always present */
johnAlexander 6:8ac15bf6d635 1321 *p_measurement_timing_budget_micro_seconds
johnAlexander 6:8ac15bf6d635 1322 = start_overhead_micro_seconds + end_overhead_micro_seconds;
johnAlexander 6:8ac15bf6d635 1323
johnAlexander 6:8ac15bf6d635 1324 status = VL53L0X_get_sequence_step_enables(dev, &scheduler_sequence_steps);
johnAlexander 6:8ac15bf6d635 1325
johnAlexander 6:8ac15bf6d635 1326 if (status != VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1327 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 1328 return status;
johnAlexander 6:8ac15bf6d635 1329 }
johnAlexander 6:8ac15bf6d635 1330
johnAlexander 6:8ac15bf6d635 1331
johnAlexander 6:8ac15bf6d635 1332 if (scheduler_sequence_steps.TccOn ||
johnAlexander 6:8ac15bf6d635 1333 scheduler_sequence_steps.MsrcOn ||
johnAlexander 6:8ac15bf6d635 1334 scheduler_sequence_steps.DssOn) {
johnAlexander 6:8ac15bf6d635 1335
johnAlexander 6:8ac15bf6d635 1336 status = get_sequence_step_timeout(dev,
johnAlexander 6:8ac15bf6d635 1337 VL53L0X_SEQUENCESTEP_MSRC,
johnAlexander 6:8ac15bf6d635 1338 &msrc_dcc_tcc_timeout_micro_seconds);
johnAlexander 6:8ac15bf6d635 1339
johnAlexander 6:8ac15bf6d635 1340 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1341 if (scheduler_sequence_steps.TccOn) {
johnAlexander 6:8ac15bf6d635 1342 *p_measurement_timing_budget_micro_seconds +=
johnAlexander 6:8ac15bf6d635 1343 msrc_dcc_tcc_timeout_micro_seconds +
johnAlexander 6:8ac15bf6d635 1344 tcc_overhead_micro_seconds;
johnAlexander 6:8ac15bf6d635 1345 }
johnAlexander 6:8ac15bf6d635 1346
johnAlexander 6:8ac15bf6d635 1347 if (scheduler_sequence_steps.DssOn) {
johnAlexander 6:8ac15bf6d635 1348 *p_measurement_timing_budget_micro_seconds +=
johnAlexander 6:8ac15bf6d635 1349 2 * (msrc_dcc_tcc_timeout_micro_seconds +
johnAlexander 6:8ac15bf6d635 1350 dss_overhead_micro_seconds);
johnAlexander 6:8ac15bf6d635 1351 } else if (scheduler_sequence_steps.MsrcOn) {
johnAlexander 6:8ac15bf6d635 1352 *p_measurement_timing_budget_micro_seconds +=
johnAlexander 6:8ac15bf6d635 1353 msrc_dcc_tcc_timeout_micro_seconds +
johnAlexander 6:8ac15bf6d635 1354 msrc_overhead_micro_seconds;
johnAlexander 6:8ac15bf6d635 1355 }
johnAlexander 6:8ac15bf6d635 1356 }
johnAlexander 6:8ac15bf6d635 1357 }
johnAlexander 6:8ac15bf6d635 1358
johnAlexander 6:8ac15bf6d635 1359 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1360 if (scheduler_sequence_steps.PreRangeOn) {
johnAlexander 6:8ac15bf6d635 1361 status = get_sequence_step_timeout(dev,
johnAlexander 6:8ac15bf6d635 1362 VL53L0X_SEQUENCESTEP_PRE_RANGE,
johnAlexander 6:8ac15bf6d635 1363 &pre_range_timeout_micro_seconds);
johnAlexander 6:8ac15bf6d635 1364 *p_measurement_timing_budget_micro_seconds +=
johnAlexander 6:8ac15bf6d635 1365 pre_range_timeout_micro_seconds +
johnAlexander 6:8ac15bf6d635 1366 pre_range_overhead_micro_seconds;
johnAlexander 6:8ac15bf6d635 1367 }
johnAlexander 6:8ac15bf6d635 1368 }
johnAlexander 6:8ac15bf6d635 1369
johnAlexander 6:8ac15bf6d635 1370 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1371 if (scheduler_sequence_steps.FinalRangeOn) {
johnAlexander 6:8ac15bf6d635 1372 status = get_sequence_step_timeout(dev,
johnAlexander 6:8ac15bf6d635 1373 VL53L0X_SEQUENCESTEP_FINAL_RANGE,
johnAlexander 6:8ac15bf6d635 1374 &final_range_timeout_micro_seconds);
johnAlexander 6:8ac15bf6d635 1375 *p_measurement_timing_budget_micro_seconds +=
johnAlexander 6:8ac15bf6d635 1376 (final_range_timeout_micro_seconds +
johnAlexander 6:8ac15bf6d635 1377 final_range_overhead_micro_seconds);
johnAlexander 6:8ac15bf6d635 1378 }
johnAlexander 6:8ac15bf6d635 1379 }
johnAlexander 6:8ac15bf6d635 1380
johnAlexander 6:8ac15bf6d635 1381 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1382 VL53L0X_SETPARAMETERFIELD(dev,
johnAlexander 6:8ac15bf6d635 1383 MeasurementTimingBudgetMicroSeconds,
johnAlexander 6:8ac15bf6d635 1384 *p_measurement_timing_budget_micro_seconds);
johnAlexander 6:8ac15bf6d635 1385 }
johnAlexander 6:8ac15bf6d635 1386
johnAlexander 6:8ac15bf6d635 1387 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 1388 return status;
johnAlexander 6:8ac15bf6d635 1389 }
johnAlexander 6:8ac15bf6d635 1390
johnAlexander 6:8ac15bf6d635 1391 VL53L0X_Error VL53L0X::VL53L0X_get_measurement_timing_budget_micro_seconds(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 1392 uint32_t *p_measurement_timing_budget_micro_seconds)
johnAlexander 6:8ac15bf6d635 1393 {
johnAlexander 6:8ac15bf6d635 1394 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 1395 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 1396
johnAlexander 6:8ac15bf6d635 1397 status = wrapped_VL53L0X_get_measurement_timing_budget_micro_seconds(dev,
johnAlexander 6:8ac15bf6d635 1398 p_measurement_timing_budget_micro_seconds);
johnAlexander 6:8ac15bf6d635 1399
johnAlexander 6:8ac15bf6d635 1400 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 1401 return status;
johnAlexander 6:8ac15bf6d635 1402 }
johnAlexander 6:8ac15bf6d635 1403
johnAlexander 6:8ac15bf6d635 1404 VL53L0X_Error VL53L0X::VL53L0X_get_device_parameters(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 1405 VL53L0X_DeviceParameters_t *p_device_parameters)
johnAlexander 6:8ac15bf6d635 1406 {
johnAlexander 6:8ac15bf6d635 1407 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 1408 int i;
johnAlexander 6:8ac15bf6d635 1409
johnAlexander 6:8ac15bf6d635 1410 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 1411
johnAlexander 6:8ac15bf6d635 1412 status = VL53L0X_get_device_mode(dev, &(p_device_parameters->DeviceMode));
johnAlexander 6:8ac15bf6d635 1413
johnAlexander 6:8ac15bf6d635 1414 if (status == VL53L0X_ERROR_NONE)
johnAlexander 6:8ac15bf6d635 1415 status = VL53L0X_get_inter_measurement_period_milli_seconds(dev,
johnAlexander 6:8ac15bf6d635 1416 &(p_device_parameters->InterMeasurementPeriodMilliSeconds));
johnAlexander 6:8ac15bf6d635 1417
johnAlexander 6:8ac15bf6d635 1418
johnAlexander 6:8ac15bf6d635 1419 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1420 p_device_parameters->XTalkCompensationEnable = 0;
johnAlexander 6:8ac15bf6d635 1421 }
johnAlexander 6:8ac15bf6d635 1422
johnAlexander 6:8ac15bf6d635 1423 if (status == VL53L0X_ERROR_NONE)
johnAlexander 6:8ac15bf6d635 1424 status = VL53L0X_get_x_talk_compensation_rate_mega_cps(dev,
johnAlexander 6:8ac15bf6d635 1425 &(p_device_parameters->XTalkCompensationRateMegaCps));
johnAlexander 6:8ac15bf6d635 1426
johnAlexander 6:8ac15bf6d635 1427
johnAlexander 6:8ac15bf6d635 1428 if (status == VL53L0X_ERROR_NONE)
johnAlexander 6:8ac15bf6d635 1429 status = VL53L0X_get_offset_calibration_data_micro_meter(dev,
johnAlexander 6:8ac15bf6d635 1430 &(p_device_parameters->RangeOffsetMicroMeters));
johnAlexander 6:8ac15bf6d635 1431
johnAlexander 6:8ac15bf6d635 1432
johnAlexander 6:8ac15bf6d635 1433 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1434 for (i = 0; i < VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; i++) {
johnAlexander 6:8ac15bf6d635 1435 /* get first the values, then the enables.
johnAlexander 6:8ac15bf6d635 1436 * VL53L0X_GetLimitCheckValue will modify the enable
johnAlexander 6:8ac15bf6d635 1437 * flags
johnAlexander 6:8ac15bf6d635 1438 */
johnAlexander 6:8ac15bf6d635 1439 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1440 status |= VL53L0X_get_limit_check_value(dev, i,
johnAlexander 6:8ac15bf6d635 1441 &(p_device_parameters->LimitChecksValue[i]));
johnAlexander 6:8ac15bf6d635 1442 } else {
johnAlexander 6:8ac15bf6d635 1443 break;
johnAlexander 6:8ac15bf6d635 1444 }
johnAlexander 6:8ac15bf6d635 1445 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1446 status |= VL53L0X_get_limit_check_enable(dev, i,
johnAlexander 6:8ac15bf6d635 1447 &(p_device_parameters->LimitChecksEnable[i]));
johnAlexander 6:8ac15bf6d635 1448 } else {
johnAlexander 6:8ac15bf6d635 1449 break;
johnAlexander 6:8ac15bf6d635 1450 }
johnAlexander 6:8ac15bf6d635 1451 }
johnAlexander 6:8ac15bf6d635 1452 }
johnAlexander 6:8ac15bf6d635 1453
johnAlexander 6:8ac15bf6d635 1454 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1455 status = VL53L0X_get_wrap_around_check_enable(dev,
johnAlexander 6:8ac15bf6d635 1456 &(p_device_parameters->WrapAroundCheckEnable));
johnAlexander 6:8ac15bf6d635 1457 }
johnAlexander 6:8ac15bf6d635 1458
johnAlexander 6:8ac15bf6d635 1459 /* Need to be done at the end as it uses VCSELPulsePeriod */
johnAlexander 6:8ac15bf6d635 1460 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1461 status = VL53L0X_get_measurement_timing_budget_micro_seconds(dev,
johnAlexander 6:8ac15bf6d635 1462 &(p_device_parameters->MeasurementTimingBudgetMicroSeconds));
johnAlexander 6:8ac15bf6d635 1463 }
johnAlexander 6:8ac15bf6d635 1464
johnAlexander 6:8ac15bf6d635 1465 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 1466 return status;
johnAlexander 6:8ac15bf6d635 1467 }
johnAlexander 6:8ac15bf6d635 1468
johnAlexander 6:8ac15bf6d635 1469 VL53L0X_Error VL53L0X::VL53L0X_set_limit_check_value(VL53L0X_DEV dev, uint16_t limit_check_id,
johnAlexander 6:8ac15bf6d635 1470 FixPoint1616_t limit_check_value)
johnAlexander 6:8ac15bf6d635 1471 {
johnAlexander 6:8ac15bf6d635 1472 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 1473 uint8_t temp8;
johnAlexander 6:8ac15bf6d635 1474
johnAlexander 6:8ac15bf6d635 1475 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 1476
johnAlexander 6:8ac15bf6d635 1477 VL53L0X_GETARRAYPARAMETERFIELD(dev, LimitChecksEnable, limit_check_id,
johnAlexander 6:8ac15bf6d635 1478 temp8);
johnAlexander 6:8ac15bf6d635 1479
johnAlexander 6:8ac15bf6d635 1480 if (temp8 == 0) { /* disabled write only internal value */
johnAlexander 6:8ac15bf6d635 1481 VL53L0X_SETARRAYPARAMETERFIELD(dev, LimitChecksValue,
johnAlexander 6:8ac15bf6d635 1482 limit_check_id, limit_check_value);
johnAlexander 6:8ac15bf6d635 1483 } else {
johnAlexander 6:8ac15bf6d635 1484
johnAlexander 6:8ac15bf6d635 1485 switch (limit_check_id) {
johnAlexander 6:8ac15bf6d635 1486
johnAlexander 6:8ac15bf6d635 1487 case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE:
johnAlexander 6:8ac15bf6d635 1488 /* internal computation: */
johnAlexander 6:8ac15bf6d635 1489 VL53L0X_SETARRAYPARAMETERFIELD(dev, LimitChecksValue,
johnAlexander 6:8ac15bf6d635 1490 VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,
johnAlexander 6:8ac15bf6d635 1491 limit_check_value);
johnAlexander 6:8ac15bf6d635 1492 break;
johnAlexander 6:8ac15bf6d635 1493
johnAlexander 6:8ac15bf6d635 1494 case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE:
johnAlexander 6:8ac15bf6d635 1495
johnAlexander 6:8ac15bf6d635 1496 status = VL53L0X_write_word(dev,
johnAlexander 6:8ac15bf6d635 1497 VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT,
johnAlexander 6:8ac15bf6d635 1498 VL53L0X_FIXPOINT1616TOFIXPOINT97(
johnAlexander 6:8ac15bf6d635 1499 limit_check_value));
johnAlexander 6:8ac15bf6d635 1500
johnAlexander 6:8ac15bf6d635 1501 break;
johnAlexander 6:8ac15bf6d635 1502
johnAlexander 6:8ac15bf6d635 1503 case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP:
johnAlexander 6:8ac15bf6d635 1504
johnAlexander 6:8ac15bf6d635 1505 /* internal computation: */
johnAlexander 6:8ac15bf6d635 1506 VL53L0X_SETARRAYPARAMETERFIELD(dev, LimitChecksValue,
johnAlexander 6:8ac15bf6d635 1507 VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP,
johnAlexander 6:8ac15bf6d635 1508 limit_check_value);
johnAlexander 6:8ac15bf6d635 1509
johnAlexander 6:8ac15bf6d635 1510 break;
johnAlexander 6:8ac15bf6d635 1511
johnAlexander 6:8ac15bf6d635 1512 case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD:
johnAlexander 6:8ac15bf6d635 1513
johnAlexander 6:8ac15bf6d635 1514 /* internal computation: */
johnAlexander 6:8ac15bf6d635 1515 VL53L0X_SETARRAYPARAMETERFIELD(dev, LimitChecksValue,
johnAlexander 6:8ac15bf6d635 1516 VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD,
johnAlexander 6:8ac15bf6d635 1517 limit_check_value);
johnAlexander 6:8ac15bf6d635 1518
johnAlexander 6:8ac15bf6d635 1519 break;
johnAlexander 6:8ac15bf6d635 1520
johnAlexander 6:8ac15bf6d635 1521 case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC:
johnAlexander 6:8ac15bf6d635 1522 case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE:
johnAlexander 6:8ac15bf6d635 1523
johnAlexander 6:8ac15bf6d635 1524 status = VL53L0X_write_word(dev,
johnAlexander 6:8ac15bf6d635 1525 VL53L0X_REG_PRE_RANGE_MIN_COUNT_RATE_RTN_LIMIT,
johnAlexander 6:8ac15bf6d635 1526 VL53L0X_FIXPOINT1616TOFIXPOINT97(
johnAlexander 6:8ac15bf6d635 1527 limit_check_value));
johnAlexander 6:8ac15bf6d635 1528
johnAlexander 6:8ac15bf6d635 1529 break;
johnAlexander 6:8ac15bf6d635 1530
johnAlexander 6:8ac15bf6d635 1531 default:
johnAlexander 6:8ac15bf6d635 1532 status = VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 1533
johnAlexander 6:8ac15bf6d635 1534 }
johnAlexander 6:8ac15bf6d635 1535
johnAlexander 6:8ac15bf6d635 1536 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1537 VL53L0X_SETARRAYPARAMETERFIELD(dev, LimitChecksValue,
johnAlexander 6:8ac15bf6d635 1538 limit_check_id, limit_check_value);
johnAlexander 6:8ac15bf6d635 1539 }
johnAlexander 6:8ac15bf6d635 1540 }
johnAlexander 6:8ac15bf6d635 1541
johnAlexander 6:8ac15bf6d635 1542 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 1543 return status;
johnAlexander 6:8ac15bf6d635 1544 }
johnAlexander 6:8ac15bf6d635 1545
johnAlexander 6:8ac15bf6d635 1546 VL53L0X_Error VL53L0X::VL53L0X_data_init(VL53L0X_DEV dev)
johnAlexander 6:8ac15bf6d635 1547 {
johnAlexander 6:8ac15bf6d635 1548 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 1549 VL53L0X_DeviceParameters_t CurrentParameters;
johnAlexander 6:8ac15bf6d635 1550 int i;
johnAlexander 6:8ac15bf6d635 1551 uint8_t StopVariable;
johnAlexander 6:8ac15bf6d635 1552
johnAlexander 6:8ac15bf6d635 1553 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 1554
johnAlexander 6:8ac15bf6d635 1555 /* by default the I2C is running at 1V8 if you want to change it you
johnAlexander 6:8ac15bf6d635 1556 * need to include this define at compilation level. */
johnAlexander 6:8ac15bf6d635 1557 #ifdef USE_I2C_2V8
johnAlexander 6:8ac15bf6d635 1558 Status = VL53L0X_UpdateByte(Dev,
johnAlexander 6:8ac15bf6d635 1559 VL53L0X_REG_VHV_CONFIG_PAD_SCL_SDA__EXTSUP_HV,
johnAlexander 6:8ac15bf6d635 1560 0xFE,
johnAlexander 6:8ac15bf6d635 1561 0x01);
johnAlexander 6:8ac15bf6d635 1562 #endif
johnAlexander 6:8ac15bf6d635 1563
johnAlexander 6:8ac15bf6d635 1564 /* Set I2C standard mode */
johnAlexander 6:8ac15bf6d635 1565 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1566 status = VL53L0X_write_byte(dev, 0x88, 0x00);
johnAlexander 6:8ac15bf6d635 1567 }
johnAlexander 6:8ac15bf6d635 1568
johnAlexander 6:8ac15bf6d635 1569 VL53L0X_SETDEVICESPECIFICPARAMETER(dev, ReadDataFromDeviceDone, 0);
johnAlexander 6:8ac15bf6d635 1570
johnAlexander 6:8ac15bf6d635 1571 #ifdef USE_IQC_STATION
johnAlexander 6:8ac15bf6d635 1572 if (Status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1573 Status = VL53L0X_apply_offset_adjustment(Dev);
johnAlexander 6:8ac15bf6d635 1574 }
johnAlexander 6:8ac15bf6d635 1575 #endif
johnAlexander 6:8ac15bf6d635 1576
johnAlexander 6:8ac15bf6d635 1577 /* Default value is 1000 for Linearity Corrective Gain */
johnAlexander 6:8ac15bf6d635 1578 PALDevDataSet(dev, LinearityCorrectiveGain, 1000);
johnAlexander 6:8ac15bf6d635 1579
johnAlexander 6:8ac15bf6d635 1580 /* Dmax default Parameter */
johnAlexander 6:8ac15bf6d635 1581 PALDevDataSet(dev, DmaxCalRangeMilliMeter, 400);
johnAlexander 6:8ac15bf6d635 1582 PALDevDataSet(dev, DmaxCalSignalRateRtnMegaCps,
johnAlexander 6:8ac15bf6d635 1583 (FixPoint1616_t)((0x00016B85))); /* 1.42 No Cover Glass*/
johnAlexander 6:8ac15bf6d635 1584
johnAlexander 6:8ac15bf6d635 1585 /* Set Default static parameters
johnAlexander 6:8ac15bf6d635 1586 *set first temporary values 9.44MHz * 65536 = 618660 */
johnAlexander 6:8ac15bf6d635 1587 VL53L0X_SETDEVICESPECIFICPARAMETER(dev, OscFrequencyMHz, 618660);
johnAlexander 6:8ac15bf6d635 1588
johnAlexander 6:8ac15bf6d635 1589 /* Set Default XTalkCompensationRateMegaCps to 0 */
johnAlexander 6:8ac15bf6d635 1590 VL53L0X_SETPARAMETERFIELD(dev, XTalkCompensationRateMegaCps, 0);
johnAlexander 6:8ac15bf6d635 1591
johnAlexander 6:8ac15bf6d635 1592 /* Get default parameters */
johnAlexander 6:8ac15bf6d635 1593 status = VL53L0X_get_device_parameters(dev, &CurrentParameters);
johnAlexander 6:8ac15bf6d635 1594 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1595 /* initialize PAL values */
johnAlexander 6:8ac15bf6d635 1596 CurrentParameters.DeviceMode = VL53L0X_DEVICEMODE_SINGLE_RANGING;
johnAlexander 6:8ac15bf6d635 1597 CurrentParameters.HistogramMode = VL53L0X_HISTOGRAMMODE_DISABLED;
johnAlexander 6:8ac15bf6d635 1598 PALDevDataSet(dev, CurrentParameters, CurrentParameters);
johnAlexander 6:8ac15bf6d635 1599 }
johnAlexander 6:8ac15bf6d635 1600
johnAlexander 6:8ac15bf6d635 1601 /* Sigma estimator variable */
johnAlexander 6:8ac15bf6d635 1602 PALDevDataSet(dev, SigmaEstRefArray, 100);
johnAlexander 6:8ac15bf6d635 1603 PALDevDataSet(dev, SigmaEstEffPulseWidth, 900);
johnAlexander 6:8ac15bf6d635 1604 PALDevDataSet(dev, SigmaEstEffAmbWidth, 500);
johnAlexander 6:8ac15bf6d635 1605 PALDevDataSet(dev, targetRefRate, 0x0A00); /* 20 MCPS in 9:7 format */
johnAlexander 6:8ac15bf6d635 1606
johnAlexander 6:8ac15bf6d635 1607 /* Use internal default settings */
johnAlexander 6:8ac15bf6d635 1608 PALDevDataSet(dev, UseInternalTuningSettings, 1);
johnAlexander 6:8ac15bf6d635 1609
johnAlexander 6:8ac15bf6d635 1610 status |= VL53L0X_write_byte(dev, 0x80, 0x01);
johnAlexander 6:8ac15bf6d635 1611 status |= VL53L0X_write_byte(dev, 0xFF, 0x01);
johnAlexander 6:8ac15bf6d635 1612 status |= VL53L0X_write_byte(dev, 0x00, 0x00);
johnAlexander 6:8ac15bf6d635 1613 status |= VL53L0X_read_byte(dev, 0x91, &StopVariable);
johnAlexander 6:8ac15bf6d635 1614 PALDevDataSet(dev, StopVariable, StopVariable);
johnAlexander 6:8ac15bf6d635 1615 status |= VL53L0X_write_byte(dev, 0x00, 0x01);
johnAlexander 6:8ac15bf6d635 1616 status |= VL53L0X_write_byte(dev, 0xFF, 0x00);
johnAlexander 6:8ac15bf6d635 1617 status |= VL53L0X_write_byte(dev, 0x80, 0x00);
johnAlexander 6:8ac15bf6d635 1618
johnAlexander 6:8ac15bf6d635 1619 /* Enable all check */
johnAlexander 6:8ac15bf6d635 1620 for (i = 0; i < VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS; i++) {
johnAlexander 6:8ac15bf6d635 1621 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1622 status |= VL53L0X_set_limit_check_enable(dev, i, 1);
johnAlexander 6:8ac15bf6d635 1623 } else {
johnAlexander 6:8ac15bf6d635 1624 break;
johnAlexander 6:8ac15bf6d635 1625 }
johnAlexander 6:8ac15bf6d635 1626
johnAlexander 6:8ac15bf6d635 1627 }
johnAlexander 6:8ac15bf6d635 1628
johnAlexander 6:8ac15bf6d635 1629 /* Disable the following checks */
johnAlexander 6:8ac15bf6d635 1630 if (status == VL53L0X_ERROR_NONE)
johnAlexander 6:8ac15bf6d635 1631 status = VL53L0X_set_limit_check_enable(dev,
johnAlexander 6:8ac15bf6d635 1632 VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, 0);
johnAlexander 6:8ac15bf6d635 1633
johnAlexander 6:8ac15bf6d635 1634 if (status == VL53L0X_ERROR_NONE)
johnAlexander 6:8ac15bf6d635 1635 status = VL53L0X_set_limit_check_enable(dev,
johnAlexander 6:8ac15bf6d635 1636 VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD, 0);
johnAlexander 6:8ac15bf6d635 1637
johnAlexander 6:8ac15bf6d635 1638 if (status == VL53L0X_ERROR_NONE)
johnAlexander 6:8ac15bf6d635 1639 status = VL53L0X_set_limit_check_enable(dev,
johnAlexander 6:8ac15bf6d635 1640 VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC, 0);
johnAlexander 6:8ac15bf6d635 1641
johnAlexander 6:8ac15bf6d635 1642 if (status == VL53L0X_ERROR_NONE)
johnAlexander 6:8ac15bf6d635 1643 status = VL53L0X_set_limit_check_enable(dev,
johnAlexander 6:8ac15bf6d635 1644 VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE, 0);
johnAlexander 6:8ac15bf6d635 1645
johnAlexander 6:8ac15bf6d635 1646 /* Limit default values */
johnAlexander 6:8ac15bf6d635 1647 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1648 status = VL53L0X_set_limit_check_value(dev,
johnAlexander 6:8ac15bf6d635 1649 VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,
johnAlexander 6:8ac15bf6d635 1650 (FixPoint1616_t)(18 * 65536));
johnAlexander 6:8ac15bf6d635 1651 }
johnAlexander 6:8ac15bf6d635 1652 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1653 status = VL53L0X_set_limit_check_value(dev,
johnAlexander 6:8ac15bf6d635 1654 VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,
johnAlexander 6:8ac15bf6d635 1655 (FixPoint1616_t)(25 * 65536 / 100));
johnAlexander 6:8ac15bf6d635 1656 /* 0.25 * 65536 */
johnAlexander 6:8ac15bf6d635 1657 }
johnAlexander 6:8ac15bf6d635 1658
johnAlexander 6:8ac15bf6d635 1659 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1660 status = VL53L0X_set_limit_check_value(dev,
johnAlexander 6:8ac15bf6d635 1661 VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP,
johnAlexander 6:8ac15bf6d635 1662 (FixPoint1616_t)(35 * 65536));
johnAlexander 6:8ac15bf6d635 1663 }
johnAlexander 6:8ac15bf6d635 1664
johnAlexander 6:8ac15bf6d635 1665 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1666 status = VL53L0X_set_limit_check_value(dev,
johnAlexander 6:8ac15bf6d635 1667 VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD,
johnAlexander 6:8ac15bf6d635 1668 (FixPoint1616_t)(0 * 65536));
johnAlexander 6:8ac15bf6d635 1669 }
johnAlexander 6:8ac15bf6d635 1670
johnAlexander 6:8ac15bf6d635 1671 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1672
johnAlexander 6:8ac15bf6d635 1673 PALDevDataSet(dev, SequenceConfig, 0xFF);
johnAlexander 6:8ac15bf6d635 1674 status = VL53L0X_write_byte(dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG,
johnAlexander 6:8ac15bf6d635 1675 0xFF);
johnAlexander 6:8ac15bf6d635 1676
johnAlexander 6:8ac15bf6d635 1677 /* Set PAL state to tell that we are waiting for call to
johnAlexander 6:8ac15bf6d635 1678 * VL53L0X_StaticInit */
johnAlexander 6:8ac15bf6d635 1679 PALDevDataSet(dev, PalState, VL53L0X_STATE_WAIT_STATICINIT);
johnAlexander 6:8ac15bf6d635 1680 }
johnAlexander 6:8ac15bf6d635 1681
johnAlexander 6:8ac15bf6d635 1682 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1683 VL53L0X_SETDEVICESPECIFICPARAMETER(dev, RefSpadsInitialised, 0);
johnAlexander 6:8ac15bf6d635 1684 }
johnAlexander 6:8ac15bf6d635 1685
johnAlexander 6:8ac15bf6d635 1686
johnAlexander 6:8ac15bf6d635 1687 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 1688 return status;
johnAlexander 6:8ac15bf6d635 1689 }
johnAlexander 6:8ac15bf6d635 1690
johnAlexander 6:8ac15bf6d635 1691 VL53L0X_Error VL53L0X::VL53L0X_check_part_used(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 1692 uint8_t *revision,
johnAlexander 6:8ac15bf6d635 1693 VL53L0X_DeviceInfo_t *p_VL53L0X_device_info)
johnAlexander 6:8ac15bf6d635 1694 {
johnAlexander 6:8ac15bf6d635 1695 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 1696 uint8_t module_id_int;
johnAlexander 6:8ac15bf6d635 1697 char *product_id_tmp;
johnAlexander 6:8ac15bf6d635 1698
johnAlexander 6:8ac15bf6d635 1699 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 1700
johnAlexander 6:8ac15bf6d635 1701 status = VL53L0X_get_info_from_device(dev, 2);
johnAlexander 6:8ac15bf6d635 1702
johnAlexander 6:8ac15bf6d635 1703 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1704 module_id_int = VL53L0X_GETDEVICESPECIFICPARAMETER(dev, ModuleId);
johnAlexander 6:8ac15bf6d635 1705
johnAlexander 6:8ac15bf6d635 1706 if (module_id_int == 0) {
johnAlexander 6:8ac15bf6d635 1707 *revision = 0;
johnAlexander 6:8ac15bf6d635 1708 VL53L0X_COPYSTRING(p_VL53L0X_device_info->ProductId, "");
johnAlexander 6:8ac15bf6d635 1709 } else {
johnAlexander 6:8ac15bf6d635 1710 *revision = VL53L0X_GETDEVICESPECIFICPARAMETER(dev, Revision);
johnAlexander 6:8ac15bf6d635 1711 product_id_tmp = VL53L0X_GETDEVICESPECIFICPARAMETER(dev,
johnAlexander 6:8ac15bf6d635 1712 ProductId);
johnAlexander 6:8ac15bf6d635 1713 VL53L0X_COPYSTRING(p_VL53L0X_device_info->ProductId, product_id_tmp);
johnAlexander 6:8ac15bf6d635 1714 }
johnAlexander 6:8ac15bf6d635 1715 }
johnAlexander 6:8ac15bf6d635 1716
johnAlexander 6:8ac15bf6d635 1717 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 1718 return status;
johnAlexander 6:8ac15bf6d635 1719 }
johnAlexander 6:8ac15bf6d635 1720
johnAlexander 6:8ac15bf6d635 1721 VL53L0X_Error VL53L0X::wrapped_VL53L0X_get_device_info(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 1722 VL53L0X_DeviceInfo_t *p_VL53L0X_device_info)
johnAlexander 6:8ac15bf6d635 1723 {
johnAlexander 6:8ac15bf6d635 1724 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 1725 uint8_t revision_id;
johnAlexander 6:8ac15bf6d635 1726 uint8_t revision;
johnAlexander 6:8ac15bf6d635 1727
johnAlexander 6:8ac15bf6d635 1728 status = VL53L0X_check_part_used(dev, &revision, p_VL53L0X_device_info);
johnAlexander 6:8ac15bf6d635 1729
johnAlexander 6:8ac15bf6d635 1730 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1731 if (revision == 0) {
johnAlexander 6:8ac15bf6d635 1732 VL53L0X_COPYSTRING(p_VL53L0X_device_info->Name,
johnAlexander 6:8ac15bf6d635 1733 VL53L0X_STRING_DEVICE_INFO_NAME_TS0);
johnAlexander 6:8ac15bf6d635 1734 } else if ((revision <= 34) && (revision != 32)) {
johnAlexander 6:8ac15bf6d635 1735 VL53L0X_COPYSTRING(p_VL53L0X_device_info->Name,
johnAlexander 6:8ac15bf6d635 1736 VL53L0X_STRING_DEVICE_INFO_NAME_TS1);
johnAlexander 6:8ac15bf6d635 1737 } else if (revision < 39) {
johnAlexander 6:8ac15bf6d635 1738 VL53L0X_COPYSTRING(p_VL53L0X_device_info->Name,
johnAlexander 6:8ac15bf6d635 1739 VL53L0X_STRING_DEVICE_INFO_NAME_TS2);
johnAlexander 6:8ac15bf6d635 1740 } else {
johnAlexander 6:8ac15bf6d635 1741 VL53L0X_COPYSTRING(p_VL53L0X_device_info->Name,
johnAlexander 6:8ac15bf6d635 1742 VL53L0X_STRING_DEVICE_INFO_NAME_ES1);
johnAlexander 6:8ac15bf6d635 1743 }
johnAlexander 6:8ac15bf6d635 1744
johnAlexander 6:8ac15bf6d635 1745 VL53L0X_COPYSTRING(p_VL53L0X_device_info->Type,
johnAlexander 6:8ac15bf6d635 1746 VL53L0X_STRING_DEVICE_INFO_TYPE);
johnAlexander 6:8ac15bf6d635 1747
johnAlexander 6:8ac15bf6d635 1748 }
johnAlexander 6:8ac15bf6d635 1749
johnAlexander 6:8ac15bf6d635 1750 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1751 status = VL53L0X_read_byte(dev, VL53L0X_REG_IDENTIFICATION_MODEL_ID,
johnAlexander 6:8ac15bf6d635 1752 &p_VL53L0X_device_info->ProductType);
johnAlexander 6:8ac15bf6d635 1753 }
johnAlexander 6:8ac15bf6d635 1754
johnAlexander 6:8ac15bf6d635 1755 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1756 status = VL53L0X_read_byte(dev,
johnAlexander 6:8ac15bf6d635 1757 VL53L0X_REG_IDENTIFICATION_REVISION_ID,
johnAlexander 6:8ac15bf6d635 1758 &revision_id);
johnAlexander 6:8ac15bf6d635 1759 p_VL53L0X_device_info->ProductRevisionMajor = 1;
johnAlexander 6:8ac15bf6d635 1760 p_VL53L0X_device_info->ProductRevisionMinor =
johnAlexander 6:8ac15bf6d635 1761 (revision_id & 0xF0) >> 4;
johnAlexander 6:8ac15bf6d635 1762 }
johnAlexander 6:8ac15bf6d635 1763
johnAlexander 6:8ac15bf6d635 1764 return status;
johnAlexander 6:8ac15bf6d635 1765 }
johnAlexander 6:8ac15bf6d635 1766
johnAlexander 6:8ac15bf6d635 1767 VL53L0X_Error VL53L0X::VL53L0X_get_device_info(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 1768 VL53L0X_DeviceInfo_t *p_VL53L0X_device_info)
johnAlexander 6:8ac15bf6d635 1769 {
johnAlexander 6:8ac15bf6d635 1770 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 1771 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 1772
johnAlexander 6:8ac15bf6d635 1773 status = wrapped_VL53L0X_get_device_info(dev, p_VL53L0X_device_info);
johnAlexander 6:8ac15bf6d635 1774
johnAlexander 6:8ac15bf6d635 1775 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 1776 return status;
johnAlexander 6:8ac15bf6d635 1777 }
johnAlexander 6:8ac15bf6d635 1778
johnAlexander 6:8ac15bf6d635 1779 VL53L0X_Error VL53L0X::VL53L0X_get_interrupt_mask_status(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 1780 uint32_t *p_interrupt_mask_status)
johnAlexander 6:8ac15bf6d635 1781 {
johnAlexander 6:8ac15bf6d635 1782 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 1783 uint8_t byte;
johnAlexander 6:8ac15bf6d635 1784 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 1785
johnAlexander 6:8ac15bf6d635 1786 status = VL53L0X_read_byte(dev, VL53L0X_REG_RESULT_INTERRUPT_STATUS, &byte);
johnAlexander 6:8ac15bf6d635 1787 *p_interrupt_mask_status = byte & 0x07;
johnAlexander 6:8ac15bf6d635 1788
johnAlexander 6:8ac15bf6d635 1789 if (byte & 0x18) {
johnAlexander 6:8ac15bf6d635 1790 status = VL53L0X_ERROR_RANGE_ERROR;
johnAlexander 6:8ac15bf6d635 1791 }
johnAlexander 6:8ac15bf6d635 1792
johnAlexander 6:8ac15bf6d635 1793 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 1794 return status;
johnAlexander 6:8ac15bf6d635 1795 }
johnAlexander 6:8ac15bf6d635 1796
johnAlexander 6:8ac15bf6d635 1797 VL53L0X_Error VL53L0X::VL53L0X_get_measurement_data_ready(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 1798 uint8_t *p_measurement_data_ready)
johnAlexander 6:8ac15bf6d635 1799 {
johnAlexander 6:8ac15bf6d635 1800 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 1801 uint8_t sys_range_status_register;
johnAlexander 6:8ac15bf6d635 1802 uint8_t interrupt_config;
johnAlexander 6:8ac15bf6d635 1803 uint32_t interrupt_mask;
johnAlexander 6:8ac15bf6d635 1804 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 1805
johnAlexander 6:8ac15bf6d635 1806 interrupt_config = VL53L0X_GETDEVICESPECIFICPARAMETER(dev,
johnAlexander 6:8ac15bf6d635 1807 Pin0GpioFunctionality);
johnAlexander 6:8ac15bf6d635 1808
johnAlexander 6:8ac15bf6d635 1809 if (interrupt_config ==
johnAlexander 6:8ac15bf6d635 1810 VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY) {
johnAlexander 6:8ac15bf6d635 1811 status = VL53L0X_get_interrupt_mask_status(dev, &interrupt_mask);
johnAlexander 6:8ac15bf6d635 1812 if (interrupt_mask ==
johnAlexander 6:8ac15bf6d635 1813 VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY) {
johnAlexander 6:8ac15bf6d635 1814 *p_measurement_data_ready = 1;
johnAlexander 6:8ac15bf6d635 1815 } else {
johnAlexander 6:8ac15bf6d635 1816 *p_measurement_data_ready = 0;
johnAlexander 6:8ac15bf6d635 1817 }
johnAlexander 6:8ac15bf6d635 1818 } else {
johnAlexander 6:8ac15bf6d635 1819 status = VL53L0X_read_byte(dev, VL53L0X_REG_RESULT_RANGE_STATUS,
johnAlexander 6:8ac15bf6d635 1820 &sys_range_status_register);
johnAlexander 6:8ac15bf6d635 1821 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1822 if (sys_range_status_register & 0x01) {
johnAlexander 6:8ac15bf6d635 1823 *p_measurement_data_ready = 1;
johnAlexander 6:8ac15bf6d635 1824 } else {
johnAlexander 6:8ac15bf6d635 1825 *p_measurement_data_ready = 0;
johnAlexander 6:8ac15bf6d635 1826 }
johnAlexander 6:8ac15bf6d635 1827 }
johnAlexander 6:8ac15bf6d635 1828 }
johnAlexander 6:8ac15bf6d635 1829
johnAlexander 6:8ac15bf6d635 1830 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 1831 return status;
johnAlexander 6:8ac15bf6d635 1832 }
johnAlexander 6:8ac15bf6d635 1833
johnAlexander 6:8ac15bf6d635 1834 VL53L0X_Error VL53L0X::VL53L0X_polling_delay(VL53L0X_DEV dev)
johnAlexander 6:8ac15bf6d635 1835 {
johnAlexander 6:8ac15bf6d635 1836 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 1837
johnAlexander 6:8ac15bf6d635 1838 // do nothing
johnAlexander 6:8ac15bf6d635 1839 VL53L0X_OsDelay();
johnAlexander 6:8ac15bf6d635 1840 return status;
johnAlexander 6:8ac15bf6d635 1841 }
johnAlexander 6:8ac15bf6d635 1842
johnAlexander 6:8ac15bf6d635 1843 VL53L0X_Error VL53L0X::VL53L0X_measurement_poll_for_completion(VL53L0X_DEV dev)
johnAlexander 6:8ac15bf6d635 1844 {
johnAlexander 6:8ac15bf6d635 1845 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 1846 uint8_t new_data_ready = 0;
johnAlexander 6:8ac15bf6d635 1847 uint32_t loop_nb;
johnAlexander 6:8ac15bf6d635 1848
johnAlexander 6:8ac15bf6d635 1849 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 1850
johnAlexander 6:8ac15bf6d635 1851 loop_nb = 0;
johnAlexander 6:8ac15bf6d635 1852 do {
johnAlexander 6:8ac15bf6d635 1853 status = VL53L0X_get_measurement_data_ready(dev, &new_data_ready);
evgeniik 7:a4452bd2b83b 1854 wait(0.01);
johnAlexander 6:8ac15bf6d635 1855 if (status != 0) {
johnAlexander 6:8ac15bf6d635 1856 break; /* the error is set */
johnAlexander 6:8ac15bf6d635 1857 }
johnAlexander 6:8ac15bf6d635 1858
johnAlexander 6:8ac15bf6d635 1859 if (new_data_ready == 1) {
johnAlexander 6:8ac15bf6d635 1860 break; /* done note that status == 0 */
johnAlexander 6:8ac15bf6d635 1861 }
johnAlexander 6:8ac15bf6d635 1862
johnAlexander 6:8ac15bf6d635 1863 loop_nb++;
johnAlexander 6:8ac15bf6d635 1864 if (loop_nb >= VL53L0X_DEFAULT_MAX_LOOP) {
johnAlexander 6:8ac15bf6d635 1865 status = VL53L0X_ERROR_TIME_OUT;
johnAlexander 6:8ac15bf6d635 1866 break;
johnAlexander 6:8ac15bf6d635 1867 }
johnAlexander 6:8ac15bf6d635 1868
johnAlexander 6:8ac15bf6d635 1869 VL53L0X_polling_delay(dev);
johnAlexander 6:8ac15bf6d635 1870 } while (1);
johnAlexander 6:8ac15bf6d635 1871
johnAlexander 6:8ac15bf6d635 1872 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 1873
johnAlexander 6:8ac15bf6d635 1874 return status;
johnAlexander 6:8ac15bf6d635 1875 }
johnAlexander 6:8ac15bf6d635 1876
johnAlexander 6:8ac15bf6d635 1877 /* Group PAL Interrupt Functions */
johnAlexander 6:8ac15bf6d635 1878 VL53L0X_Error VL53L0X::VL53L0X_clear_interrupt_mask(VL53L0X_DEV dev, uint32_t interrupt_mask)
johnAlexander 6:8ac15bf6d635 1879 {
johnAlexander 6:8ac15bf6d635 1880 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 1881 uint8_t loop_count;
johnAlexander 6:8ac15bf6d635 1882 uint8_t byte;
johnAlexander 6:8ac15bf6d635 1883 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 1884
johnAlexander 6:8ac15bf6d635 1885 /* clear bit 0 range interrupt, bit 1 error interrupt */
johnAlexander 6:8ac15bf6d635 1886 loop_count = 0;
johnAlexander 6:8ac15bf6d635 1887 do {
johnAlexander 6:8ac15bf6d635 1888 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 1889 VL53L0X_REG_SYSTEM_INTERRUPT_CLEAR, 0x01);
johnAlexander 6:8ac15bf6d635 1890 status |= VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 1891 VL53L0X_REG_SYSTEM_INTERRUPT_CLEAR, 0x00);
johnAlexander 6:8ac15bf6d635 1892 status |= VL53L0X_read_byte(dev,
johnAlexander 6:8ac15bf6d635 1893 VL53L0X_REG_RESULT_INTERRUPT_STATUS, &byte);
johnAlexander 6:8ac15bf6d635 1894 loop_count++;
johnAlexander 6:8ac15bf6d635 1895 } while (((byte & 0x07) != 0x00)
johnAlexander 6:8ac15bf6d635 1896 && (loop_count < 3)
johnAlexander 6:8ac15bf6d635 1897 && (status == VL53L0X_ERROR_NONE));
johnAlexander 6:8ac15bf6d635 1898
johnAlexander 6:8ac15bf6d635 1899
johnAlexander 6:8ac15bf6d635 1900 if (loop_count >= 3) {
johnAlexander 6:8ac15bf6d635 1901 status = VL53L0X_ERROR_INTERRUPT_NOT_CLEARED;
johnAlexander 6:8ac15bf6d635 1902 }
johnAlexander 6:8ac15bf6d635 1903
johnAlexander 6:8ac15bf6d635 1904 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 1905 return status;
johnAlexander 6:8ac15bf6d635 1906 }
johnAlexander 6:8ac15bf6d635 1907
johnAlexander 6:8ac15bf6d635 1908 VL53L0X_Error VL53L0X::VL53L0X_perform_single_ref_calibration(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 1909 uint8_t vhv_init_byte)
johnAlexander 6:8ac15bf6d635 1910 {
johnAlexander 6:8ac15bf6d635 1911 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 1912
johnAlexander 6:8ac15bf6d635 1913 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1914 status = VL53L0X_write_byte(dev, VL53L0X_REG_SYSRANGE_START,
johnAlexander 6:8ac15bf6d635 1915 VL53L0X_REG_SYSRANGE_MODE_START_STOP |
johnAlexander 6:8ac15bf6d635 1916 vhv_init_byte);
johnAlexander 6:8ac15bf6d635 1917 }
johnAlexander 6:8ac15bf6d635 1918
johnAlexander 6:8ac15bf6d635 1919 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1920 status = VL53L0X_measurement_poll_for_completion(dev);
johnAlexander 6:8ac15bf6d635 1921 }
johnAlexander 6:8ac15bf6d635 1922
johnAlexander 6:8ac15bf6d635 1923 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1924 status = VL53L0X_clear_interrupt_mask(dev, 0);
johnAlexander 6:8ac15bf6d635 1925 }
johnAlexander 6:8ac15bf6d635 1926
johnAlexander 6:8ac15bf6d635 1927 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1928 status = VL53L0X_write_byte(dev, VL53L0X_REG_SYSRANGE_START, 0x00);
johnAlexander 6:8ac15bf6d635 1929 }
johnAlexander 6:8ac15bf6d635 1930
johnAlexander 6:8ac15bf6d635 1931 return status;
johnAlexander 6:8ac15bf6d635 1932 }
johnAlexander 6:8ac15bf6d635 1933
johnAlexander 6:8ac15bf6d635 1934 VL53L0X_Error VL53L0X::VL53L0X_ref_calibration_io(VL53L0X_DEV dev, uint8_t read_not_write,
johnAlexander 6:8ac15bf6d635 1935 uint8_t vhv_settings, uint8_t phase_cal,
johnAlexander 6:8ac15bf6d635 1936 uint8_t *p_vhv_settings, uint8_t *p_phase_cal,
johnAlexander 6:8ac15bf6d635 1937 const uint8_t vhv_enable, const uint8_t phase_enable)
johnAlexander 6:8ac15bf6d635 1938 {
johnAlexander 6:8ac15bf6d635 1939 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 1940 uint8_t phase_calint = 0;
johnAlexander 6:8ac15bf6d635 1941
johnAlexander 6:8ac15bf6d635 1942 /* Read VHV from device */
johnAlexander 6:8ac15bf6d635 1943 status |= VL53L0X_write_byte(dev, 0xFF, 0x01);
johnAlexander 6:8ac15bf6d635 1944 status |= VL53L0X_write_byte(dev, 0x00, 0x00);
johnAlexander 6:8ac15bf6d635 1945 status |= VL53L0X_write_byte(dev, 0xFF, 0x00);
johnAlexander 6:8ac15bf6d635 1946
johnAlexander 6:8ac15bf6d635 1947 if (read_not_write) {
johnAlexander 6:8ac15bf6d635 1948 if (vhv_enable) {
johnAlexander 6:8ac15bf6d635 1949 status |= VL53L0X_read_byte(dev, 0xCB, p_vhv_settings);
johnAlexander 6:8ac15bf6d635 1950 }
johnAlexander 6:8ac15bf6d635 1951 if (phase_enable) {
johnAlexander 6:8ac15bf6d635 1952 status |= VL53L0X_read_byte(dev, 0xEE, &phase_calint);
johnAlexander 6:8ac15bf6d635 1953 }
johnAlexander 6:8ac15bf6d635 1954 } else {
johnAlexander 6:8ac15bf6d635 1955 if (vhv_enable) {
johnAlexander 6:8ac15bf6d635 1956 status |= VL53L0X_write_byte(dev, 0xCB, vhv_settings);
johnAlexander 6:8ac15bf6d635 1957 }
johnAlexander 6:8ac15bf6d635 1958 if (phase_enable) {
johnAlexander 6:8ac15bf6d635 1959 status |= VL53L0X_update_byte(dev, 0xEE, 0x80, phase_cal);
johnAlexander 6:8ac15bf6d635 1960 }
johnAlexander 6:8ac15bf6d635 1961 }
johnAlexander 6:8ac15bf6d635 1962
johnAlexander 6:8ac15bf6d635 1963 status |= VL53L0X_write_byte(dev, 0xFF, 0x01);
johnAlexander 6:8ac15bf6d635 1964 status |= VL53L0X_write_byte(dev, 0x00, 0x01);
johnAlexander 6:8ac15bf6d635 1965 status |= VL53L0X_write_byte(dev, 0xFF, 0x00);
johnAlexander 6:8ac15bf6d635 1966
johnAlexander 6:8ac15bf6d635 1967 *p_phase_cal = (uint8_t)(phase_calint & 0xEF);
johnAlexander 6:8ac15bf6d635 1968
johnAlexander 6:8ac15bf6d635 1969 return status;
johnAlexander 6:8ac15bf6d635 1970 }
johnAlexander 6:8ac15bf6d635 1971
johnAlexander 6:8ac15bf6d635 1972 VL53L0X_Error VL53L0X::VL53L0X_perform_vhv_calibration(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 1973 uint8_t *p_vhv_settings, const uint8_t get_data_enable,
johnAlexander 6:8ac15bf6d635 1974 const uint8_t restore_config)
johnAlexander 6:8ac15bf6d635 1975 {
johnAlexander 6:8ac15bf6d635 1976 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 1977 uint8_t sequence_config = 0;
johnAlexander 6:8ac15bf6d635 1978 uint8_t vhv_settings = 0;
johnAlexander 6:8ac15bf6d635 1979 uint8_t phase_cal = 0;
johnAlexander 6:8ac15bf6d635 1980 uint8_t phase_cal_int = 0;
johnAlexander 6:8ac15bf6d635 1981
johnAlexander 6:8ac15bf6d635 1982 /* store the value of the sequence config,
johnAlexander 6:8ac15bf6d635 1983 * this will be reset before the end of the function
johnAlexander 6:8ac15bf6d635 1984 */
johnAlexander 6:8ac15bf6d635 1985
johnAlexander 6:8ac15bf6d635 1986 if (restore_config) {
johnAlexander 6:8ac15bf6d635 1987 sequence_config = PALDevDataGet(dev, SequenceConfig);
johnAlexander 6:8ac15bf6d635 1988 }
johnAlexander 6:8ac15bf6d635 1989
johnAlexander 6:8ac15bf6d635 1990 /* Run VHV */
johnAlexander 6:8ac15bf6d635 1991 status = VL53L0X_write_byte(dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, 0x01);
johnAlexander 6:8ac15bf6d635 1992
johnAlexander 6:8ac15bf6d635 1993 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 1994 status = VL53L0X_perform_single_ref_calibration(dev, 0x40);
johnAlexander 6:8ac15bf6d635 1995 }
johnAlexander 6:8ac15bf6d635 1996
johnAlexander 6:8ac15bf6d635 1997 /* Read VHV from device */
johnAlexander 6:8ac15bf6d635 1998 if ((status == VL53L0X_ERROR_NONE) && (get_data_enable == 1)) {
johnAlexander 6:8ac15bf6d635 1999 status = VL53L0X_ref_calibration_io(dev, 1,
johnAlexander 6:8ac15bf6d635 2000 vhv_settings, phase_cal, /* Not used here */
johnAlexander 6:8ac15bf6d635 2001 p_vhv_settings, &phase_cal_int,
johnAlexander 6:8ac15bf6d635 2002 1, 0);
johnAlexander 6:8ac15bf6d635 2003 } else {
johnAlexander 6:8ac15bf6d635 2004 *p_vhv_settings = 0;
johnAlexander 6:8ac15bf6d635 2005 }
johnAlexander 6:8ac15bf6d635 2006
johnAlexander 6:8ac15bf6d635 2007
johnAlexander 6:8ac15bf6d635 2008 if ((status == VL53L0X_ERROR_NONE) && restore_config) {
johnAlexander 6:8ac15bf6d635 2009 /* restore the previous Sequence Config */
johnAlexander 6:8ac15bf6d635 2010 status = VL53L0X_write_byte(dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG,
johnAlexander 6:8ac15bf6d635 2011 sequence_config);
johnAlexander 6:8ac15bf6d635 2012 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 2013 PALDevDataSet(dev, SequenceConfig, sequence_config);
johnAlexander 6:8ac15bf6d635 2014 }
johnAlexander 6:8ac15bf6d635 2015
johnAlexander 6:8ac15bf6d635 2016 }
johnAlexander 6:8ac15bf6d635 2017
johnAlexander 6:8ac15bf6d635 2018 return status;
johnAlexander 6:8ac15bf6d635 2019 }
johnAlexander 6:8ac15bf6d635 2020
johnAlexander 6:8ac15bf6d635 2021 VL53L0X_Error VL53L0X::VL53L0X_perform_phase_calibration(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 2022 uint8_t *p_phase_cal, const uint8_t get_data_enable,
johnAlexander 6:8ac15bf6d635 2023 const uint8_t restore_config)
johnAlexander 6:8ac15bf6d635 2024 {
johnAlexander 6:8ac15bf6d635 2025 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 2026 uint8_t sequence_config = 0;
johnAlexander 6:8ac15bf6d635 2027 uint8_t vhv_settings = 0;
johnAlexander 6:8ac15bf6d635 2028 uint8_t phase_cal = 0;
johnAlexander 6:8ac15bf6d635 2029 uint8_t vhv_settingsint;
johnAlexander 6:8ac15bf6d635 2030
johnAlexander 6:8ac15bf6d635 2031 /* store the value of the sequence config,
johnAlexander 6:8ac15bf6d635 2032 * this will be reset before the end of the function
johnAlexander 6:8ac15bf6d635 2033 */
johnAlexander 6:8ac15bf6d635 2034
johnAlexander 6:8ac15bf6d635 2035 if (restore_config) {
johnAlexander 6:8ac15bf6d635 2036 sequence_config = PALDevDataGet(dev, SequenceConfig);
johnAlexander 6:8ac15bf6d635 2037 }
johnAlexander 6:8ac15bf6d635 2038
johnAlexander 6:8ac15bf6d635 2039 /* Run PhaseCal */
johnAlexander 6:8ac15bf6d635 2040 status = VL53L0X_write_byte(dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, 0x02);
johnAlexander 6:8ac15bf6d635 2041
johnAlexander 6:8ac15bf6d635 2042 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 2043 status = VL53L0X_perform_single_ref_calibration(dev, 0x0);
johnAlexander 6:8ac15bf6d635 2044 }
johnAlexander 6:8ac15bf6d635 2045
johnAlexander 6:8ac15bf6d635 2046 /* Read PhaseCal from device */
johnAlexander 6:8ac15bf6d635 2047 if ((status == VL53L0X_ERROR_NONE) && (get_data_enable == 1)) {
johnAlexander 6:8ac15bf6d635 2048 status = VL53L0X_ref_calibration_io(dev, 1,
johnAlexander 6:8ac15bf6d635 2049 vhv_settings, phase_cal, /* Not used here */
johnAlexander 6:8ac15bf6d635 2050 &vhv_settingsint, p_phase_cal,
johnAlexander 6:8ac15bf6d635 2051 0, 1);
johnAlexander 6:8ac15bf6d635 2052 } else {
johnAlexander 6:8ac15bf6d635 2053 *p_phase_cal = 0;
johnAlexander 6:8ac15bf6d635 2054 }
johnAlexander 6:8ac15bf6d635 2055
johnAlexander 6:8ac15bf6d635 2056
johnAlexander 6:8ac15bf6d635 2057 if ((status == VL53L0X_ERROR_NONE) && restore_config) {
johnAlexander 6:8ac15bf6d635 2058 /* restore the previous Sequence Config */
johnAlexander 6:8ac15bf6d635 2059 status = VL53L0X_write_byte(dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG,
johnAlexander 6:8ac15bf6d635 2060 sequence_config);
johnAlexander 6:8ac15bf6d635 2061 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 2062 PALDevDataSet(dev, SequenceConfig, sequence_config);
johnAlexander 6:8ac15bf6d635 2063 }
johnAlexander 6:8ac15bf6d635 2064
johnAlexander 6:8ac15bf6d635 2065 }
johnAlexander 6:8ac15bf6d635 2066
johnAlexander 6:8ac15bf6d635 2067 return status;
johnAlexander 6:8ac15bf6d635 2068 }
johnAlexander 6:8ac15bf6d635 2069
johnAlexander 6:8ac15bf6d635 2070 VL53L0X_Error VL53L0X::VL53L0X_perform_ref_calibration(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 2071 uint8_t *p_vhv_settings, uint8_t *p_phase_cal, uint8_t get_data_enable)
johnAlexander 6:8ac15bf6d635 2072 {
johnAlexander 6:8ac15bf6d635 2073 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 2074 uint8_t sequence_config = 0;
johnAlexander 6:8ac15bf6d635 2075
johnAlexander 6:8ac15bf6d635 2076 /* store the value of the sequence config,
johnAlexander 6:8ac15bf6d635 2077 * this will be reset before the end of the function
johnAlexander 6:8ac15bf6d635 2078 */
johnAlexander 6:8ac15bf6d635 2079
johnAlexander 6:8ac15bf6d635 2080 sequence_config = PALDevDataGet(dev, SequenceConfig);
johnAlexander 6:8ac15bf6d635 2081
johnAlexander 6:8ac15bf6d635 2082 /* In the following function we don't save the config to optimize
johnAlexander 6:8ac15bf6d635 2083 * writes on device. Config is saved and restored only once. */
johnAlexander 6:8ac15bf6d635 2084 status = VL53L0X_perform_vhv_calibration(
johnAlexander 6:8ac15bf6d635 2085 dev, p_vhv_settings, get_data_enable, 0);
johnAlexander 6:8ac15bf6d635 2086
johnAlexander 6:8ac15bf6d635 2087 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 2088 status = VL53L0X_perform_phase_calibration(
johnAlexander 6:8ac15bf6d635 2089 dev, p_phase_cal, get_data_enable, 0);
johnAlexander 6:8ac15bf6d635 2090 }
johnAlexander 6:8ac15bf6d635 2091
johnAlexander 6:8ac15bf6d635 2092
johnAlexander 6:8ac15bf6d635 2093 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 2094 /* restore the previous Sequence Config */
johnAlexander 6:8ac15bf6d635 2095 status = VL53L0X_write_byte(dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG,
johnAlexander 6:8ac15bf6d635 2096 sequence_config);
johnAlexander 6:8ac15bf6d635 2097 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 2098 PALDevDataSet(dev, SequenceConfig, sequence_config);
johnAlexander 6:8ac15bf6d635 2099 }
johnAlexander 6:8ac15bf6d635 2100
johnAlexander 6:8ac15bf6d635 2101 }
johnAlexander 6:8ac15bf6d635 2102
johnAlexander 6:8ac15bf6d635 2103 return status;
johnAlexander 6:8ac15bf6d635 2104 }
johnAlexander 6:8ac15bf6d635 2105
johnAlexander 6:8ac15bf6d635 2106 void VL53L0X::get_next_good_spad(uint8_t good_spad_array[], uint32_t size,
johnAlexander 6:8ac15bf6d635 2107 uint32_t curr, int32_t *p_next)
johnAlexander 6:8ac15bf6d635 2108 {
johnAlexander 6:8ac15bf6d635 2109 uint32_t start_index;
johnAlexander 6:8ac15bf6d635 2110 uint32_t fine_offset;
johnAlexander 6:8ac15bf6d635 2111 uint32_t c_spads_per_byte = 8;
johnAlexander 6:8ac15bf6d635 2112 uint32_t coarse_index;
johnAlexander 6:8ac15bf6d635 2113 uint32_t fine_index;
johnAlexander 6:8ac15bf6d635 2114 uint8_t data_byte;
johnAlexander 6:8ac15bf6d635 2115 uint8_t success = 0;
johnAlexander 6:8ac15bf6d635 2116
johnAlexander 6:8ac15bf6d635 2117 /*
johnAlexander 6:8ac15bf6d635 2118 * Starting with the current good spad, loop through the array to find
johnAlexander 6:8ac15bf6d635 2119 * the next. i.e. the next bit set in the sequence.
johnAlexander 6:8ac15bf6d635 2120 *
johnAlexander 6:8ac15bf6d635 2121 * The coarse index is the byte index of the array and the fine index is
johnAlexander 6:8ac15bf6d635 2122 * the index of the bit within each byte.
johnAlexander 6:8ac15bf6d635 2123 */
johnAlexander 6:8ac15bf6d635 2124
johnAlexander 6:8ac15bf6d635 2125 *p_next = -1;
johnAlexander 6:8ac15bf6d635 2126
johnAlexander 6:8ac15bf6d635 2127 start_index = curr / c_spads_per_byte;
johnAlexander 6:8ac15bf6d635 2128 fine_offset = curr % c_spads_per_byte;
johnAlexander 6:8ac15bf6d635 2129
johnAlexander 6:8ac15bf6d635 2130 for (coarse_index = start_index; ((coarse_index < size) && !success);
johnAlexander 6:8ac15bf6d635 2131 coarse_index++) {
johnAlexander 6:8ac15bf6d635 2132 fine_index = 0;
johnAlexander 6:8ac15bf6d635 2133 data_byte = good_spad_array[coarse_index];
johnAlexander 6:8ac15bf6d635 2134
johnAlexander 6:8ac15bf6d635 2135 if (coarse_index == start_index) {
johnAlexander 6:8ac15bf6d635 2136 /* locate the bit position of the provided current
johnAlexander 6:8ac15bf6d635 2137 * spad bit before iterating */
johnAlexander 6:8ac15bf6d635 2138 data_byte >>= fine_offset;
johnAlexander 6:8ac15bf6d635 2139 fine_index = fine_offset;
johnAlexander 6:8ac15bf6d635 2140 }
johnAlexander 6:8ac15bf6d635 2141
johnAlexander 6:8ac15bf6d635 2142 while (fine_index < c_spads_per_byte) {
johnAlexander 6:8ac15bf6d635 2143 if ((data_byte & 0x1) == 1) {
johnAlexander 6:8ac15bf6d635 2144 success = 1;
johnAlexander 6:8ac15bf6d635 2145 *p_next = coarse_index * c_spads_per_byte + fine_index;
johnAlexander 6:8ac15bf6d635 2146 break;
johnAlexander 6:8ac15bf6d635 2147 }
johnAlexander 6:8ac15bf6d635 2148 data_byte >>= 1;
johnAlexander 6:8ac15bf6d635 2149 fine_index++;
johnAlexander 6:8ac15bf6d635 2150 }
johnAlexander 6:8ac15bf6d635 2151 }
johnAlexander 6:8ac15bf6d635 2152 }
johnAlexander 6:8ac15bf6d635 2153
johnAlexander 6:8ac15bf6d635 2154 uint8_t VL53L0X::is_aperture(uint32_t spad_index)
johnAlexander 6:8ac15bf6d635 2155 {
johnAlexander 6:8ac15bf6d635 2156 /*
johnAlexander 6:8ac15bf6d635 2157 * This function reports if a given spad index is an aperture SPAD by
johnAlexander 6:8ac15bf6d635 2158 * deriving the quadrant.
johnAlexander 6:8ac15bf6d635 2159 */
johnAlexander 6:8ac15bf6d635 2160 uint32_t quadrant;
johnAlexander 6:8ac15bf6d635 2161 uint8_t is_aperture = 1;
johnAlexander 6:8ac15bf6d635 2162 quadrant = spad_index >> 6;
johnAlexander 6:8ac15bf6d635 2163 if (refArrayQuadrants[quadrant] == REF_ARRAY_SPAD_0) {
johnAlexander 6:8ac15bf6d635 2164 is_aperture = 0;
johnAlexander 6:8ac15bf6d635 2165 }
johnAlexander 6:8ac15bf6d635 2166
johnAlexander 6:8ac15bf6d635 2167 return is_aperture;
johnAlexander 6:8ac15bf6d635 2168 }
johnAlexander 6:8ac15bf6d635 2169
johnAlexander 6:8ac15bf6d635 2170 VL53L0X_Error VL53L0X::enable_spad_bit(uint8_t spad_array[], uint32_t size,
johnAlexander 6:8ac15bf6d635 2171 uint32_t spad_index)
johnAlexander 6:8ac15bf6d635 2172 {
johnAlexander 6:8ac15bf6d635 2173 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 2174 uint32_t c_spads_per_byte = 8;
johnAlexander 6:8ac15bf6d635 2175 uint32_t coarse_index;
johnAlexander 6:8ac15bf6d635 2176 uint32_t fine_index;
johnAlexander 6:8ac15bf6d635 2177
johnAlexander 6:8ac15bf6d635 2178 coarse_index = spad_index / c_spads_per_byte;
johnAlexander 6:8ac15bf6d635 2179 fine_index = spad_index % c_spads_per_byte;
johnAlexander 6:8ac15bf6d635 2180 if (coarse_index >= size) {
johnAlexander 6:8ac15bf6d635 2181 status = VL53L0X_ERROR_REF_SPAD_INIT;
johnAlexander 6:8ac15bf6d635 2182 } else {
johnAlexander 6:8ac15bf6d635 2183 spad_array[coarse_index] |= (1 << fine_index);
johnAlexander 6:8ac15bf6d635 2184 }
johnAlexander 6:8ac15bf6d635 2185
johnAlexander 6:8ac15bf6d635 2186 return status;
johnAlexander 6:8ac15bf6d635 2187 }
johnAlexander 6:8ac15bf6d635 2188
johnAlexander 6:8ac15bf6d635 2189 VL53L0X_Error VL53L0X::set_ref_spad_map(VL53L0X_DEV dev, uint8_t *p_ref_spad_array)
johnAlexander 6:8ac15bf6d635 2190 {
johnAlexander 6:8ac15bf6d635 2191 VL53L0X_Error status = VL53L0X_write_multi(dev,
johnAlexander 6:8ac15bf6d635 2192 VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_0,
johnAlexander 6:8ac15bf6d635 2193 p_ref_spad_array, 6);
johnAlexander 6:8ac15bf6d635 2194
johnAlexander 6:8ac15bf6d635 2195 return status;
johnAlexander 6:8ac15bf6d635 2196 }
johnAlexander 6:8ac15bf6d635 2197
johnAlexander 6:8ac15bf6d635 2198 VL53L0X_Error VL53L0X::get_ref_spad_map(VL53L0X_DEV dev, uint8_t *p_ref_spad_array)
johnAlexander 6:8ac15bf6d635 2199 {
johnAlexander 6:8ac15bf6d635 2200 VL53L0X_Error status = VL53L0X_read_multi(dev,
johnAlexander 6:8ac15bf6d635 2201 VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_0,
johnAlexander 6:8ac15bf6d635 2202 p_ref_spad_array,
johnAlexander 6:8ac15bf6d635 2203 6);
johnAlexander 6:8ac15bf6d635 2204 // VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 2205 // uint8_t count=0;
johnAlexander 6:8ac15bf6d635 2206
johnAlexander 6:8ac15bf6d635 2207 // for (count = 0; count < 6; count++)
johnAlexander 6:8ac15bf6d635 2208 // status = VL53L0X_RdByte(Dev, (VL53L0X_REG_GLOBAL_CONFIG_SPAD_ENABLES_REF_0 + count), &refSpadArray[count]);
johnAlexander 6:8ac15bf6d635 2209 return status;
johnAlexander 6:8ac15bf6d635 2210 }
johnAlexander 6:8ac15bf6d635 2211
johnAlexander 6:8ac15bf6d635 2212 VL53L0X_Error VL53L0X::enable_ref_spads(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 2213 uint8_t aperture_spads,
johnAlexander 6:8ac15bf6d635 2214 uint8_t good_spad_array[],
johnAlexander 6:8ac15bf6d635 2215 uint8_t spad_array[],
johnAlexander 6:8ac15bf6d635 2216 uint32_t size,
johnAlexander 6:8ac15bf6d635 2217 uint32_t start,
johnAlexander 6:8ac15bf6d635 2218 uint32_t offset,
johnAlexander 6:8ac15bf6d635 2219 uint32_t spad_count,
johnAlexander 6:8ac15bf6d635 2220 uint32_t *p_last_spad)
johnAlexander 6:8ac15bf6d635 2221 {
johnAlexander 6:8ac15bf6d635 2222 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 2223 uint32_t index;
johnAlexander 6:8ac15bf6d635 2224 uint32_t i;
johnAlexander 6:8ac15bf6d635 2225 int32_t next_good_spad = offset;
johnAlexander 6:8ac15bf6d635 2226 uint32_t current_spad;
johnAlexander 6:8ac15bf6d635 2227 uint8_t check_spad_array[6];
johnAlexander 6:8ac15bf6d635 2228
johnAlexander 6:8ac15bf6d635 2229 /*
johnAlexander 6:8ac15bf6d635 2230 * This function takes in a spad array which may or may not have SPADS
johnAlexander 6:8ac15bf6d635 2231 * already enabled and appends from a given offset a requested number
johnAlexander 6:8ac15bf6d635 2232 * of new SPAD enables. The 'good spad map' is applied to
johnAlexander 6:8ac15bf6d635 2233 * determine the next SPADs to enable.
johnAlexander 6:8ac15bf6d635 2234 *
johnAlexander 6:8ac15bf6d635 2235 * This function applies to only aperture or only non-aperture spads.
johnAlexander 6:8ac15bf6d635 2236 * Checks are performed to ensure this.
johnAlexander 6:8ac15bf6d635 2237 */
johnAlexander 6:8ac15bf6d635 2238
johnAlexander 6:8ac15bf6d635 2239 current_spad = offset;
johnAlexander 6:8ac15bf6d635 2240 for (index = 0; index < spad_count; index++) {
johnAlexander 6:8ac15bf6d635 2241 get_next_good_spad(good_spad_array, size, current_spad,
johnAlexander 6:8ac15bf6d635 2242 &next_good_spad);
johnAlexander 6:8ac15bf6d635 2243
johnAlexander 6:8ac15bf6d635 2244 if (next_good_spad == -1) {
johnAlexander 6:8ac15bf6d635 2245 status = VL53L0X_ERROR_REF_SPAD_INIT;
johnAlexander 6:8ac15bf6d635 2246 break;
johnAlexander 6:8ac15bf6d635 2247 }
johnAlexander 6:8ac15bf6d635 2248
johnAlexander 6:8ac15bf6d635 2249 /* Confirm that the next good SPAD is non-aperture */
johnAlexander 6:8ac15bf6d635 2250 if (is_aperture(start + next_good_spad) != aperture_spads) {
johnAlexander 6:8ac15bf6d635 2251 /* if we can't get the required number of good aperture
johnAlexander 6:8ac15bf6d635 2252 * spads from the current quadrant then this is an error
johnAlexander 6:8ac15bf6d635 2253 */
johnAlexander 6:8ac15bf6d635 2254 status = VL53L0X_ERROR_REF_SPAD_INIT;
johnAlexander 6:8ac15bf6d635 2255 break;
johnAlexander 6:8ac15bf6d635 2256 }
johnAlexander 6:8ac15bf6d635 2257 current_spad = (uint32_t)next_good_spad;
johnAlexander 6:8ac15bf6d635 2258 enable_spad_bit(spad_array, size, current_spad);
johnAlexander 6:8ac15bf6d635 2259 current_spad++;
johnAlexander 6:8ac15bf6d635 2260 }
johnAlexander 6:8ac15bf6d635 2261 *p_last_spad = current_spad;
johnAlexander 6:8ac15bf6d635 2262
johnAlexander 6:8ac15bf6d635 2263 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 2264 status = set_ref_spad_map(dev, spad_array);
johnAlexander 6:8ac15bf6d635 2265 }
johnAlexander 6:8ac15bf6d635 2266
johnAlexander 6:8ac15bf6d635 2267
johnAlexander 6:8ac15bf6d635 2268 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 2269 status = get_ref_spad_map(dev, check_spad_array);
johnAlexander 6:8ac15bf6d635 2270
johnAlexander 6:8ac15bf6d635 2271 i = 0;
johnAlexander 6:8ac15bf6d635 2272
johnAlexander 6:8ac15bf6d635 2273 /* Compare spad maps. If not equal report error. */
johnAlexander 6:8ac15bf6d635 2274 while (i < size) {
johnAlexander 6:8ac15bf6d635 2275 if (spad_array[i] != check_spad_array[i]) {
johnAlexander 6:8ac15bf6d635 2276 status = VL53L0X_ERROR_REF_SPAD_INIT;
johnAlexander 6:8ac15bf6d635 2277 break;
johnAlexander 6:8ac15bf6d635 2278 }
johnAlexander 6:8ac15bf6d635 2279 i++;
johnAlexander 6:8ac15bf6d635 2280 }
johnAlexander 6:8ac15bf6d635 2281 }
johnAlexander 6:8ac15bf6d635 2282 return status;
johnAlexander 6:8ac15bf6d635 2283 }
johnAlexander 6:8ac15bf6d635 2284
johnAlexander 6:8ac15bf6d635 2285 VL53L0X_Error VL53L0X::VL53L0X_set_device_mode(VL53L0X_DEV dev, VL53L0X_DeviceModes device_mode)
johnAlexander 6:8ac15bf6d635 2286 {
johnAlexander 6:8ac15bf6d635 2287 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 2288
johnAlexander 6:8ac15bf6d635 2289 LOG_FUNCTION_START("%d", (int)DeviceMode);
johnAlexander 6:8ac15bf6d635 2290
johnAlexander 6:8ac15bf6d635 2291 switch (device_mode) {
johnAlexander 6:8ac15bf6d635 2292 case VL53L0X_DEVICEMODE_SINGLE_RANGING:
johnAlexander 6:8ac15bf6d635 2293 case VL53L0X_DEVICEMODE_CONTINUOUS_RANGING:
johnAlexander 6:8ac15bf6d635 2294 case VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING:
johnAlexander 6:8ac15bf6d635 2295 case VL53L0X_DEVICEMODE_GPIO_DRIVE:
johnAlexander 6:8ac15bf6d635 2296 case VL53L0X_DEVICEMODE_GPIO_OSC:
johnAlexander 6:8ac15bf6d635 2297 /* Supported modes */
johnAlexander 6:8ac15bf6d635 2298 VL53L0X_SETPARAMETERFIELD(dev, DeviceMode, device_mode);
johnAlexander 6:8ac15bf6d635 2299 break;
johnAlexander 6:8ac15bf6d635 2300 default:
johnAlexander 6:8ac15bf6d635 2301 /* Unsupported mode */
johnAlexander 6:8ac15bf6d635 2302 status = VL53L0X_ERROR_MODE_NOT_SUPPORTED;
johnAlexander 6:8ac15bf6d635 2303 }
johnAlexander 6:8ac15bf6d635 2304
johnAlexander 6:8ac15bf6d635 2305 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 2306 return status;
johnAlexander 6:8ac15bf6d635 2307 }
johnAlexander 6:8ac15bf6d635 2308
johnAlexander 6:8ac15bf6d635 2309 VL53L0X_Error VL53L0X::VL53L0X_set_interrupt_thresholds(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 2310 VL53L0X_DeviceModes device_mode, FixPoint1616_t threshold_low,
johnAlexander 6:8ac15bf6d635 2311 FixPoint1616_t threshold_high)
johnAlexander 6:8ac15bf6d635 2312 {
johnAlexander 6:8ac15bf6d635 2313 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 2314 uint16_t threshold16;
johnAlexander 6:8ac15bf6d635 2315 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 2316
johnAlexander 6:8ac15bf6d635 2317 /* no dependency on DeviceMode for Ewok */
johnAlexander 6:8ac15bf6d635 2318 /* Need to divide by 2 because the FW will apply a x2 */
johnAlexander 6:8ac15bf6d635 2319 threshold16 = (uint16_t)((threshold_low >> 17) & 0x00fff);
johnAlexander 6:8ac15bf6d635 2320 status = VL53L0X_write_word(dev, VL53L0X_REG_SYSTEM_THRESH_LOW, threshold16);
johnAlexander 6:8ac15bf6d635 2321
johnAlexander 6:8ac15bf6d635 2322 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 2323 /* Need to divide by 2 because the FW will apply a x2 */
johnAlexander 6:8ac15bf6d635 2324 threshold16 = (uint16_t)((threshold_high >> 17) & 0x00fff);
johnAlexander 6:8ac15bf6d635 2325 status = VL53L0X_write_word(dev, VL53L0X_REG_SYSTEM_THRESH_HIGH,
johnAlexander 6:8ac15bf6d635 2326 threshold16);
johnAlexander 6:8ac15bf6d635 2327 }
johnAlexander 6:8ac15bf6d635 2328
johnAlexander 6:8ac15bf6d635 2329 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 2330 return status;
johnAlexander 6:8ac15bf6d635 2331 }
johnAlexander 6:8ac15bf6d635 2332
johnAlexander 6:8ac15bf6d635 2333 VL53L0X_Error VL53L0X::VL53L0X_get_interrupt_thresholds(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 2334 VL53L0X_DeviceModes device_mode, FixPoint1616_t *p_threshold_low,
johnAlexander 6:8ac15bf6d635 2335 FixPoint1616_t *p_threshold_high)
johnAlexander 6:8ac15bf6d635 2336 {
johnAlexander 6:8ac15bf6d635 2337 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 2338 uint16_t threshold16;
johnAlexander 6:8ac15bf6d635 2339 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 2340
johnAlexander 6:8ac15bf6d635 2341 /* no dependency on DeviceMode for Ewok */
johnAlexander 6:8ac15bf6d635 2342
johnAlexander 6:8ac15bf6d635 2343 status = VL53L0X_read_word(dev, VL53L0X_REG_SYSTEM_THRESH_LOW, &threshold16);
johnAlexander 6:8ac15bf6d635 2344 /* Need to multiply by 2 because the FW will apply a x2 */
johnAlexander 6:8ac15bf6d635 2345 *p_threshold_low = (FixPoint1616_t)((0x00fff & threshold16) << 17);
johnAlexander 6:8ac15bf6d635 2346
johnAlexander 6:8ac15bf6d635 2347 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 2348 status = VL53L0X_read_word(dev, VL53L0X_REG_SYSTEM_THRESH_HIGH,
johnAlexander 6:8ac15bf6d635 2349 &threshold16);
johnAlexander 6:8ac15bf6d635 2350 /* Need to multiply by 2 because the FW will apply a x2 */
johnAlexander 6:8ac15bf6d635 2351 *p_threshold_high =
johnAlexander 6:8ac15bf6d635 2352 (FixPoint1616_t)((0x00fff & threshold16) << 17);
johnAlexander 6:8ac15bf6d635 2353 }
johnAlexander 6:8ac15bf6d635 2354
johnAlexander 6:8ac15bf6d635 2355 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 2356 return status;
johnAlexander 6:8ac15bf6d635 2357 }
johnAlexander 6:8ac15bf6d635 2358
johnAlexander 6:8ac15bf6d635 2359 VL53L0X_Error VL53L0X::VL53L0X_load_tuning_settings(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 2360 uint8_t *p_tuning_setting_buffer)
johnAlexander 6:8ac15bf6d635 2361 {
johnAlexander 6:8ac15bf6d635 2362 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 2363 int i;
johnAlexander 6:8ac15bf6d635 2364 int index;
johnAlexander 6:8ac15bf6d635 2365 uint8_t msb;
johnAlexander 6:8ac15bf6d635 2366 uint8_t lsb;
johnAlexander 6:8ac15bf6d635 2367 uint8_t select_param;
johnAlexander 6:8ac15bf6d635 2368 uint8_t number_of_writes;
johnAlexander 6:8ac15bf6d635 2369 uint8_t address;
johnAlexander 6:8ac15bf6d635 2370 uint8_t local_buffer[4]; /* max */
johnAlexander 6:8ac15bf6d635 2371 uint16_t temp16;
johnAlexander 6:8ac15bf6d635 2372
johnAlexander 6:8ac15bf6d635 2373 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 2374
johnAlexander 6:8ac15bf6d635 2375 index = 0;
johnAlexander 6:8ac15bf6d635 2376
johnAlexander 6:8ac15bf6d635 2377 while ((*(p_tuning_setting_buffer + index) != 0) &&
johnAlexander 6:8ac15bf6d635 2378 (status == VL53L0X_ERROR_NONE)) {
johnAlexander 6:8ac15bf6d635 2379 number_of_writes = *(p_tuning_setting_buffer + index);
johnAlexander 6:8ac15bf6d635 2380 index++;
johnAlexander 6:8ac15bf6d635 2381 if (number_of_writes == 0xFF) {
johnAlexander 6:8ac15bf6d635 2382 /* internal parameters */
johnAlexander 6:8ac15bf6d635 2383 select_param = *(p_tuning_setting_buffer + index);
johnAlexander 6:8ac15bf6d635 2384 index++;
johnAlexander 6:8ac15bf6d635 2385 switch (select_param) {
johnAlexander 6:8ac15bf6d635 2386 case 0: /* uint16_t SigmaEstRefArray -> 2 bytes */
johnAlexander 6:8ac15bf6d635 2387 msb = *(p_tuning_setting_buffer + index);
johnAlexander 6:8ac15bf6d635 2388 index++;
johnAlexander 6:8ac15bf6d635 2389 lsb = *(p_tuning_setting_buffer + index);
johnAlexander 6:8ac15bf6d635 2390 index++;
johnAlexander 6:8ac15bf6d635 2391 temp16 = VL53L0X_MAKEUINT16(lsb, msb);
johnAlexander 6:8ac15bf6d635 2392 PALDevDataSet(dev, SigmaEstRefArray, temp16);
johnAlexander 6:8ac15bf6d635 2393 break;
johnAlexander 6:8ac15bf6d635 2394 case 1: /* uint16_t SigmaEstEffPulseWidth -> 2 bytes */
johnAlexander 6:8ac15bf6d635 2395 msb = *(p_tuning_setting_buffer + index);
johnAlexander 6:8ac15bf6d635 2396 index++;
johnAlexander 6:8ac15bf6d635 2397 lsb = *(p_tuning_setting_buffer + index);
johnAlexander 6:8ac15bf6d635 2398 index++;
johnAlexander 6:8ac15bf6d635 2399 temp16 = VL53L0X_MAKEUINT16(lsb, msb);
johnAlexander 6:8ac15bf6d635 2400 PALDevDataSet(dev, SigmaEstEffPulseWidth,
johnAlexander 6:8ac15bf6d635 2401 temp16);
johnAlexander 6:8ac15bf6d635 2402 break;
johnAlexander 6:8ac15bf6d635 2403 case 2: /* uint16_t SigmaEstEffAmbWidth -> 2 bytes */
johnAlexander 6:8ac15bf6d635 2404 msb = *(p_tuning_setting_buffer + index);
johnAlexander 6:8ac15bf6d635 2405 index++;
johnAlexander 6:8ac15bf6d635 2406 lsb = *(p_tuning_setting_buffer + index);
johnAlexander 6:8ac15bf6d635 2407 index++;
johnAlexander 6:8ac15bf6d635 2408 temp16 = VL53L0X_MAKEUINT16(lsb, msb);
johnAlexander 6:8ac15bf6d635 2409 PALDevDataSet(dev, SigmaEstEffAmbWidth, temp16);
johnAlexander 6:8ac15bf6d635 2410 break;
johnAlexander 6:8ac15bf6d635 2411 case 3: /* uint16_t targetRefRate -> 2 bytes */
johnAlexander 6:8ac15bf6d635 2412 msb = *(p_tuning_setting_buffer + index);
johnAlexander 6:8ac15bf6d635 2413 index++;
johnAlexander 6:8ac15bf6d635 2414 lsb = *(p_tuning_setting_buffer + index);
johnAlexander 6:8ac15bf6d635 2415 index++;
johnAlexander 6:8ac15bf6d635 2416 temp16 = VL53L0X_MAKEUINT16(lsb, msb);
johnAlexander 6:8ac15bf6d635 2417 PALDevDataSet(dev, targetRefRate, temp16);
johnAlexander 6:8ac15bf6d635 2418 break;
johnAlexander 6:8ac15bf6d635 2419 default: /* invalid parameter */
johnAlexander 6:8ac15bf6d635 2420 status = VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 2421 }
johnAlexander 6:8ac15bf6d635 2422
johnAlexander 6:8ac15bf6d635 2423 } else if (number_of_writes <= 4) {
johnAlexander 6:8ac15bf6d635 2424 address = *(p_tuning_setting_buffer + index);
johnAlexander 6:8ac15bf6d635 2425 index++;
johnAlexander 6:8ac15bf6d635 2426
johnAlexander 6:8ac15bf6d635 2427 for (i = 0; i < number_of_writes; i++) {
johnAlexander 6:8ac15bf6d635 2428 local_buffer[i] = *(p_tuning_setting_buffer +
johnAlexander 6:8ac15bf6d635 2429 index);
johnAlexander 6:8ac15bf6d635 2430 index++;
johnAlexander 6:8ac15bf6d635 2431 }
johnAlexander 6:8ac15bf6d635 2432
johnAlexander 6:8ac15bf6d635 2433 status = VL53L0X_write_multi(dev, address, local_buffer,
johnAlexander 6:8ac15bf6d635 2434 number_of_writes);
johnAlexander 6:8ac15bf6d635 2435
johnAlexander 6:8ac15bf6d635 2436 } else {
johnAlexander 6:8ac15bf6d635 2437 status = VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 2438 }
johnAlexander 6:8ac15bf6d635 2439 }
johnAlexander 6:8ac15bf6d635 2440
johnAlexander 6:8ac15bf6d635 2441 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 2442 return status;
johnAlexander 6:8ac15bf6d635 2443 }
johnAlexander 6:8ac15bf6d635 2444
johnAlexander 6:8ac15bf6d635 2445 VL53L0X_Error VL53L0X::VL53L0X_check_and_load_interrupt_settings(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 2446 uint8_t start_not_stopflag)
johnAlexander 6:8ac15bf6d635 2447 {
johnAlexander 6:8ac15bf6d635 2448 uint8_t interrupt_config;
johnAlexander 6:8ac15bf6d635 2449 FixPoint1616_t threshold_low;
johnAlexander 6:8ac15bf6d635 2450 FixPoint1616_t threshold_high;
johnAlexander 6:8ac15bf6d635 2451 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 2452
johnAlexander 6:8ac15bf6d635 2453 interrupt_config = VL53L0X_GETDEVICESPECIFICPARAMETER(dev,
johnAlexander 6:8ac15bf6d635 2454 Pin0GpioFunctionality);
johnAlexander 6:8ac15bf6d635 2455
johnAlexander 6:8ac15bf6d635 2456 if ((interrupt_config ==
johnAlexander 6:8ac15bf6d635 2457 VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW) ||
johnAlexander 6:8ac15bf6d635 2458 (interrupt_config ==
johnAlexander 6:8ac15bf6d635 2459 VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH) ||
johnAlexander 6:8ac15bf6d635 2460 (interrupt_config ==
johnAlexander 6:8ac15bf6d635 2461 VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT)) {
johnAlexander 6:8ac15bf6d635 2462
johnAlexander 6:8ac15bf6d635 2463 status = VL53L0X_get_interrupt_thresholds(dev,
johnAlexander 6:8ac15bf6d635 2464 VL53L0X_DEVICEMODE_CONTINUOUS_RANGING,
johnAlexander 6:8ac15bf6d635 2465 &threshold_low, &threshold_high);
johnAlexander 6:8ac15bf6d635 2466
johnAlexander 6:8ac15bf6d635 2467 if (((threshold_low > 255 * 65536) ||
johnAlexander 6:8ac15bf6d635 2468 (threshold_high > 255 * 65536)) &&
johnAlexander 6:8ac15bf6d635 2469 (status == VL53L0X_ERROR_NONE)) {
johnAlexander 6:8ac15bf6d635 2470
johnAlexander 6:8ac15bf6d635 2471 if (start_not_stopflag != 0) {
johnAlexander 6:8ac15bf6d635 2472 status = VL53L0X_load_tuning_settings(dev,
johnAlexander 6:8ac15bf6d635 2473 InterruptThresholdSettings);
johnAlexander 6:8ac15bf6d635 2474 } else {
johnAlexander 6:8ac15bf6d635 2475 status |= VL53L0X_write_byte(dev, 0xFF, 0x04);
johnAlexander 6:8ac15bf6d635 2476 status |= VL53L0X_write_byte(dev, 0x70, 0x00);
johnAlexander 6:8ac15bf6d635 2477 status |= VL53L0X_write_byte(dev, 0xFF, 0x00);
johnAlexander 6:8ac15bf6d635 2478 status |= VL53L0X_write_byte(dev, 0x80, 0x00);
johnAlexander 6:8ac15bf6d635 2479 }
johnAlexander 6:8ac15bf6d635 2480
johnAlexander 6:8ac15bf6d635 2481 }
johnAlexander 6:8ac15bf6d635 2482
johnAlexander 6:8ac15bf6d635 2483
johnAlexander 6:8ac15bf6d635 2484 }
johnAlexander 6:8ac15bf6d635 2485
johnAlexander 6:8ac15bf6d635 2486 return status;
johnAlexander 6:8ac15bf6d635 2487
johnAlexander 6:8ac15bf6d635 2488 }
johnAlexander 6:8ac15bf6d635 2489
johnAlexander 6:8ac15bf6d635 2490 VL53L0X_Error VL53L0X::VL53L0X_start_measurement(VL53L0X_DEV dev)
johnAlexander 6:8ac15bf6d635 2491 {
johnAlexander 6:8ac15bf6d635 2492 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 2493 VL53L0X_DeviceModes device_mode;
johnAlexander 6:8ac15bf6d635 2494 uint8_t byte;
johnAlexander 6:8ac15bf6d635 2495 uint8_t start_stop_byte = VL53L0X_REG_SYSRANGE_MODE_START_STOP;
johnAlexander 6:8ac15bf6d635 2496 uint32_t loop_nb;
johnAlexander 6:8ac15bf6d635 2497 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 2498
johnAlexander 6:8ac15bf6d635 2499 /* Get Current DeviceMode */
johnAlexander 6:8ac15bf6d635 2500 VL53L0X_get_device_mode(dev, &device_mode);
johnAlexander 6:8ac15bf6d635 2501
johnAlexander 6:8ac15bf6d635 2502 status = VL53L0X_write_byte(dev, 0x80, 0x01);
johnAlexander 6:8ac15bf6d635 2503 status = VL53L0X_write_byte(dev, 0xFF, 0x01);
johnAlexander 6:8ac15bf6d635 2504 status = VL53L0X_write_byte(dev, 0x00, 0x00);
johnAlexander 6:8ac15bf6d635 2505 status = VL53L0X_write_byte(dev, 0x91, PALDevDataGet(dev, StopVariable));
johnAlexander 6:8ac15bf6d635 2506 status = VL53L0X_write_byte(dev, 0x00, 0x01);
johnAlexander 6:8ac15bf6d635 2507 status = VL53L0X_write_byte(dev, 0xFF, 0x00);
johnAlexander 6:8ac15bf6d635 2508 status = VL53L0X_write_byte(dev, 0x80, 0x00);
johnAlexander 6:8ac15bf6d635 2509
johnAlexander 6:8ac15bf6d635 2510 switch (device_mode) {
johnAlexander 6:8ac15bf6d635 2511 case VL53L0X_DEVICEMODE_SINGLE_RANGING:
johnAlexander 6:8ac15bf6d635 2512 status = VL53L0X_write_byte(dev, VL53L0X_REG_SYSRANGE_START, 0x01);
johnAlexander 6:8ac15bf6d635 2513
johnAlexander 6:8ac15bf6d635 2514 byte = start_stop_byte;
johnAlexander 6:8ac15bf6d635 2515 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 2516 /* Wait until start bit has been cleared */
johnAlexander 6:8ac15bf6d635 2517 loop_nb = 0;
johnAlexander 6:8ac15bf6d635 2518 do {
johnAlexander 6:8ac15bf6d635 2519 if (loop_nb > 0)
johnAlexander 6:8ac15bf6d635 2520 status = VL53L0X_read_byte(dev,
johnAlexander 6:8ac15bf6d635 2521 VL53L0X_REG_SYSRANGE_START, &byte);
johnAlexander 6:8ac15bf6d635 2522 loop_nb = loop_nb + 1;
johnAlexander 6:8ac15bf6d635 2523 } while (((byte & start_stop_byte) == start_stop_byte)
johnAlexander 6:8ac15bf6d635 2524 && (status == VL53L0X_ERROR_NONE)
johnAlexander 6:8ac15bf6d635 2525 && (loop_nb < VL53L0X_DEFAULT_MAX_LOOP));
johnAlexander 6:8ac15bf6d635 2526
johnAlexander 6:8ac15bf6d635 2527 if (loop_nb >= VL53L0X_DEFAULT_MAX_LOOP) {
johnAlexander 6:8ac15bf6d635 2528 status = VL53L0X_ERROR_TIME_OUT;
johnAlexander 6:8ac15bf6d635 2529 }
johnAlexander 6:8ac15bf6d635 2530
johnAlexander 6:8ac15bf6d635 2531 }
johnAlexander 6:8ac15bf6d635 2532
johnAlexander 6:8ac15bf6d635 2533 break;
johnAlexander 6:8ac15bf6d635 2534 case VL53L0X_DEVICEMODE_CONTINUOUS_RANGING:
johnAlexander 6:8ac15bf6d635 2535 /* Back-to-back mode */
johnAlexander 6:8ac15bf6d635 2536
johnAlexander 6:8ac15bf6d635 2537 /* Check if need to apply interrupt settings */
johnAlexander 6:8ac15bf6d635 2538 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 2539 status = VL53L0X_check_and_load_interrupt_settings(dev, 1);
johnAlexander 6:8ac15bf6d635 2540 }
johnAlexander 6:8ac15bf6d635 2541
johnAlexander 6:8ac15bf6d635 2542 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 2543 VL53L0X_REG_SYSRANGE_START,
johnAlexander 6:8ac15bf6d635 2544 VL53L0X_REG_SYSRANGE_MODE_BACKTOBACK);
johnAlexander 6:8ac15bf6d635 2545 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 2546 /* Set PAL State to Running */
johnAlexander 6:8ac15bf6d635 2547 PALDevDataSet(dev, PalState, VL53L0X_STATE_RUNNING);
johnAlexander 6:8ac15bf6d635 2548 }
johnAlexander 6:8ac15bf6d635 2549 break;
johnAlexander 6:8ac15bf6d635 2550 case VL53L0X_DEVICEMODE_CONTINUOUS_TIMED_RANGING:
johnAlexander 6:8ac15bf6d635 2551 /* Continuous mode */
johnAlexander 6:8ac15bf6d635 2552 /* Check if need to apply interrupt settings */
johnAlexander 6:8ac15bf6d635 2553 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 2554 status = VL53L0X_check_and_load_interrupt_settings(dev, 1);
johnAlexander 6:8ac15bf6d635 2555 }
johnAlexander 6:8ac15bf6d635 2556
johnAlexander 6:8ac15bf6d635 2557 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 2558 VL53L0X_REG_SYSRANGE_START,
johnAlexander 6:8ac15bf6d635 2559 VL53L0X_REG_SYSRANGE_MODE_TIMED);
johnAlexander 6:8ac15bf6d635 2560
johnAlexander 6:8ac15bf6d635 2561 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 2562 /* Set PAL State to Running */
johnAlexander 6:8ac15bf6d635 2563 PALDevDataSet(dev, PalState, VL53L0X_STATE_RUNNING);
johnAlexander 6:8ac15bf6d635 2564 }
johnAlexander 6:8ac15bf6d635 2565 break;
johnAlexander 6:8ac15bf6d635 2566 default:
johnAlexander 6:8ac15bf6d635 2567 /* Selected mode not supported */
johnAlexander 6:8ac15bf6d635 2568 status = VL53L0X_ERROR_MODE_NOT_SUPPORTED;
johnAlexander 6:8ac15bf6d635 2569 }
johnAlexander 6:8ac15bf6d635 2570
johnAlexander 6:8ac15bf6d635 2571
johnAlexander 6:8ac15bf6d635 2572 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 2573 return status;
johnAlexander 6:8ac15bf6d635 2574 }
johnAlexander 6:8ac15bf6d635 2575
johnAlexander 6:8ac15bf6d635 2576 /* Group PAL Measurement Functions */
johnAlexander 6:8ac15bf6d635 2577 VL53L0X_Error VL53L0X::VL53L0X_perform_single_measurement(VL53L0X_DEV dev)
johnAlexander 6:8ac15bf6d635 2578 {
johnAlexander 6:8ac15bf6d635 2579 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 2580 VL53L0X_DeviceModes device_mode;
johnAlexander 6:8ac15bf6d635 2581
johnAlexander 6:8ac15bf6d635 2582 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 2583
johnAlexander 6:8ac15bf6d635 2584 /* Get Current DeviceMode */
evgeniik 7:a4452bd2b83b 2585 status = VL53L0X_get_device_mode(dev, &device_mode); // +
evgeniik 7:a4452bd2b83b 2586
evgeniik 7:a4452bd2b83b 2587
johnAlexander 6:8ac15bf6d635 2588 /* Start immediately to run a single ranging measurement in case of
johnAlexander 6:8ac15bf6d635 2589 * single ranging or single histogram */
johnAlexander 6:8ac15bf6d635 2590 if (status == VL53L0X_ERROR_NONE
johnAlexander 6:8ac15bf6d635 2591 && device_mode == VL53L0X_DEVICEMODE_SINGLE_RANGING) {
johnAlexander 6:8ac15bf6d635 2592 status = VL53L0X_start_measurement(dev);
johnAlexander 6:8ac15bf6d635 2593 }
johnAlexander 6:8ac15bf6d635 2594
evgeniik 7:a4452bd2b83b 2595 /*if (status == VL53L0X_ERROR_NONE) {
evgeniik 7:a4452bd2b83b 2596 status = VL53L0X_measurement_poll_for_completion(dev); // prend bcp de temps
evgeniik 7:a4452bd2b83b 2597 }*/
evgeniik 7:a4452bd2b83b 2598
evgeniik 7:a4452bd2b83b 2599
johnAlexander 6:8ac15bf6d635 2600 /* Change PAL State in case of single ranging or single histogram */
evgeniik 7:a4452bd2b83b 2601 /*if (status == VL53L0X_ERROR_NONE
johnAlexander 6:8ac15bf6d635 2602 && device_mode == VL53L0X_DEVICEMODE_SINGLE_RANGING) {
johnAlexander 6:8ac15bf6d635 2603 PALDevDataSet(dev, PalState, VL53L0X_STATE_IDLE);
evgeniik 7:a4452bd2b83b 2604 }*/
johnAlexander 6:8ac15bf6d635 2605
johnAlexander 6:8ac15bf6d635 2606
johnAlexander 6:8ac15bf6d635 2607 LOG_FUNCTION_END(status);
evgeniik 7:a4452bd2b83b 2608
johnAlexander 6:8ac15bf6d635 2609 return status;
johnAlexander 6:8ac15bf6d635 2610 }
johnAlexander 6:8ac15bf6d635 2611
johnAlexander 6:8ac15bf6d635 2612 VL53L0X_Error VL53L0X::VL53L0X_get_x_talk_compensation_enable(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 2613 uint8_t *p_x_talk_compensation_enable)
johnAlexander 6:8ac15bf6d635 2614 {
johnAlexander 6:8ac15bf6d635 2615 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 2616 uint8_t temp8;
johnAlexander 6:8ac15bf6d635 2617 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 2618
johnAlexander 6:8ac15bf6d635 2619 VL53L0X_GETPARAMETERFIELD(dev, XTalkCompensationEnable, temp8);
johnAlexander 6:8ac15bf6d635 2620 *p_x_talk_compensation_enable = temp8;
johnAlexander 6:8ac15bf6d635 2621
johnAlexander 6:8ac15bf6d635 2622 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 2623 return status;
johnAlexander 6:8ac15bf6d635 2624 }
johnAlexander 6:8ac15bf6d635 2625
johnAlexander 6:8ac15bf6d635 2626 VL53L0X_Error VL53L0X::VL53L0X_get_total_xtalk_rate(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 2627 VL53L0X_RangingMeasurementData_t *p_ranging_measurement_data,
johnAlexander 6:8ac15bf6d635 2628 FixPoint1616_t *p_total_xtalk_rate_mcps)
johnAlexander 6:8ac15bf6d635 2629 {
johnAlexander 6:8ac15bf6d635 2630 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 2631
johnAlexander 6:8ac15bf6d635 2632 uint8_t xtalk_comp_enable;
johnAlexander 6:8ac15bf6d635 2633 FixPoint1616_t total_xtalk_mega_cps;
johnAlexander 6:8ac15bf6d635 2634 FixPoint1616_t xtalk_per_spad_mega_cps;
johnAlexander 6:8ac15bf6d635 2635
johnAlexander 6:8ac15bf6d635 2636 *p_total_xtalk_rate_mcps = 0;
johnAlexander 6:8ac15bf6d635 2637
johnAlexander 6:8ac15bf6d635 2638 status = VL53L0X_get_x_talk_compensation_enable(dev, &xtalk_comp_enable);
johnAlexander 6:8ac15bf6d635 2639 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 2640
johnAlexander 6:8ac15bf6d635 2641 if (xtalk_comp_enable) {
johnAlexander 6:8ac15bf6d635 2642
johnAlexander 6:8ac15bf6d635 2643 VL53L0X_GETPARAMETERFIELD(
johnAlexander 6:8ac15bf6d635 2644 dev,
johnAlexander 6:8ac15bf6d635 2645 XTalkCompensationRateMegaCps,
johnAlexander 6:8ac15bf6d635 2646 xtalk_per_spad_mega_cps);
johnAlexander 6:8ac15bf6d635 2647
johnAlexander 6:8ac15bf6d635 2648 /* FixPoint1616 * FixPoint 8:8 = FixPoint0824 */
johnAlexander 6:8ac15bf6d635 2649 total_xtalk_mega_cps =
johnAlexander 6:8ac15bf6d635 2650 p_ranging_measurement_data->EffectiveSpadRtnCount *
johnAlexander 6:8ac15bf6d635 2651 xtalk_per_spad_mega_cps;
johnAlexander 6:8ac15bf6d635 2652
johnAlexander 6:8ac15bf6d635 2653 /* FixPoint0824 >> 8 = FixPoint1616 */
johnAlexander 6:8ac15bf6d635 2654 *p_total_xtalk_rate_mcps =
johnAlexander 6:8ac15bf6d635 2655 (total_xtalk_mega_cps + 0x80) >> 8;
johnAlexander 6:8ac15bf6d635 2656 }
johnAlexander 6:8ac15bf6d635 2657 }
johnAlexander 6:8ac15bf6d635 2658
johnAlexander 6:8ac15bf6d635 2659 return status;
johnAlexander 6:8ac15bf6d635 2660 }
johnAlexander 6:8ac15bf6d635 2661
johnAlexander 6:8ac15bf6d635 2662 VL53L0X_Error VL53L0X::VL53L0X_get_total_signal_rate(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 2663 VL53L0X_RangingMeasurementData_t *p_ranging_measurement_data,
johnAlexander 6:8ac15bf6d635 2664 FixPoint1616_t *p_total_signal_rate_mcps)
johnAlexander 6:8ac15bf6d635 2665 {
johnAlexander 6:8ac15bf6d635 2666 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 2667 FixPoint1616_t total_xtalk_mega_cps;
johnAlexander 6:8ac15bf6d635 2668
johnAlexander 6:8ac15bf6d635 2669 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 2670
johnAlexander 6:8ac15bf6d635 2671 *p_total_signal_rate_mcps =
johnAlexander 6:8ac15bf6d635 2672 p_ranging_measurement_data->SignalRateRtnMegaCps;
johnAlexander 6:8ac15bf6d635 2673
johnAlexander 6:8ac15bf6d635 2674 status = VL53L0X_get_total_xtalk_rate(
johnAlexander 6:8ac15bf6d635 2675 dev, p_ranging_measurement_data, &total_xtalk_mega_cps);
johnAlexander 6:8ac15bf6d635 2676
johnAlexander 6:8ac15bf6d635 2677 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 2678 *p_total_signal_rate_mcps += total_xtalk_mega_cps;
johnAlexander 6:8ac15bf6d635 2679 }
johnAlexander 6:8ac15bf6d635 2680
johnAlexander 6:8ac15bf6d635 2681 return status;
johnAlexander 6:8ac15bf6d635 2682 }
johnAlexander 6:8ac15bf6d635 2683
johnAlexander 6:8ac15bf6d635 2684 /* To convert ms into register value */
johnAlexander 6:8ac15bf6d635 2685 uint32_t VL53L0X::VL53L0X_calc_timeout_mclks(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 2686 uint32_t timeout_period_us,
johnAlexander 6:8ac15bf6d635 2687 uint8_t vcsel_period_pclks)
johnAlexander 6:8ac15bf6d635 2688 {
johnAlexander 6:8ac15bf6d635 2689 uint32_t macro_period_ps;
johnAlexander 6:8ac15bf6d635 2690 uint32_t macro_period_ns;
johnAlexander 6:8ac15bf6d635 2691 uint32_t timeout_period_mclks = 0;
johnAlexander 6:8ac15bf6d635 2692
johnAlexander 6:8ac15bf6d635 2693 macro_period_ps = VL53L0X_calc_macro_period_ps(dev, vcsel_period_pclks);
johnAlexander 6:8ac15bf6d635 2694 macro_period_ns = (macro_period_ps + 500) / 1000;
johnAlexander 6:8ac15bf6d635 2695
johnAlexander 6:8ac15bf6d635 2696 timeout_period_mclks =
johnAlexander 6:8ac15bf6d635 2697 (uint32_t)(((timeout_period_us * 1000)
johnAlexander 6:8ac15bf6d635 2698 + (macro_period_ns / 2)) / macro_period_ns);
johnAlexander 6:8ac15bf6d635 2699
johnAlexander 6:8ac15bf6d635 2700 return timeout_period_mclks;
johnAlexander 6:8ac15bf6d635 2701 }
johnAlexander 6:8ac15bf6d635 2702
johnAlexander 6:8ac15bf6d635 2703 uint32_t VL53L0X::VL53L0X_isqrt(uint32_t num)
johnAlexander 6:8ac15bf6d635 2704 {
johnAlexander 6:8ac15bf6d635 2705 /*
johnAlexander 6:8ac15bf6d635 2706 * Implements an integer square root
johnAlexander 6:8ac15bf6d635 2707 *
johnAlexander 6:8ac15bf6d635 2708 * From: http://en.wikipedia.org/wiki/Methods_of_computing_square_roots
johnAlexander 6:8ac15bf6d635 2709 */
johnAlexander 6:8ac15bf6d635 2710
johnAlexander 6:8ac15bf6d635 2711 uint32_t res = 0;
johnAlexander 6:8ac15bf6d635 2712 uint32_t bit = 1 << 30;
johnAlexander 6:8ac15bf6d635 2713 /* The second-to-top bit is set:
johnAlexander 6:8ac15bf6d635 2714 * 1 << 14 for 16-bits, 1 << 30 for 32 bits */
johnAlexander 6:8ac15bf6d635 2715
johnAlexander 6:8ac15bf6d635 2716 /* "bit" starts at the highest power of four <= the argument. */
johnAlexander 6:8ac15bf6d635 2717 while (bit > num) {
johnAlexander 6:8ac15bf6d635 2718 bit >>= 2;
johnAlexander 6:8ac15bf6d635 2719 }
johnAlexander 6:8ac15bf6d635 2720
johnAlexander 6:8ac15bf6d635 2721
johnAlexander 6:8ac15bf6d635 2722 while (bit != 0) {
johnAlexander 6:8ac15bf6d635 2723 if (num >= res + bit) {
johnAlexander 6:8ac15bf6d635 2724 num -= res + bit;
johnAlexander 6:8ac15bf6d635 2725 res = (res >> 1) + bit;
johnAlexander 6:8ac15bf6d635 2726 } else {
johnAlexander 6:8ac15bf6d635 2727 res >>= 1;
johnAlexander 6:8ac15bf6d635 2728 }
johnAlexander 6:8ac15bf6d635 2729
johnAlexander 6:8ac15bf6d635 2730 bit >>= 2;
johnAlexander 6:8ac15bf6d635 2731 }
johnAlexander 6:8ac15bf6d635 2732
johnAlexander 6:8ac15bf6d635 2733 return res;
johnAlexander 6:8ac15bf6d635 2734 }
johnAlexander 6:8ac15bf6d635 2735
johnAlexander 6:8ac15bf6d635 2736 VL53L0X_Error VL53L0X::VL53L0X_calc_dmax(
johnAlexander 6:8ac15bf6d635 2737 VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 2738 FixPoint1616_t total_signal_rate_mcps,
johnAlexander 6:8ac15bf6d635 2739 FixPoint1616_t total_corr_signal_rate_mcps,
johnAlexander 6:8ac15bf6d635 2740 FixPoint1616_t pw_mult,
johnAlexander 6:8ac15bf6d635 2741 uint32_t sigma_estimate_p1,
johnAlexander 6:8ac15bf6d635 2742 FixPoint1616_t sigma_estimate_p2,
johnAlexander 6:8ac15bf6d635 2743 uint32_t peak_vcsel_duration_us,
johnAlexander 6:8ac15bf6d635 2744 uint32_t *pd_max_mm)
johnAlexander 6:8ac15bf6d635 2745 {
johnAlexander 6:8ac15bf6d635 2746 const uint32_t c_sigma_limit = 18;
johnAlexander 6:8ac15bf6d635 2747 const FixPoint1616_t c_signal_limit = 0x4000; /* 0.25 */
johnAlexander 6:8ac15bf6d635 2748 const FixPoint1616_t c_sigma_est_ref = 0x00000042; /* 0.001 */
johnAlexander 6:8ac15bf6d635 2749 const uint32_t c_amb_eff_width_sigma_est_ns = 6;
johnAlexander 6:8ac15bf6d635 2750 const uint32_t c_amb_eff_width_d_max_ns = 7;
johnAlexander 6:8ac15bf6d635 2751 uint32_t dmax_cal_range_mm;
johnAlexander 6:8ac15bf6d635 2752 FixPoint1616_t dmax_cal_signal_rate_rtn_mcps;
johnAlexander 6:8ac15bf6d635 2753 FixPoint1616_t min_signal_needed;
johnAlexander 6:8ac15bf6d635 2754 FixPoint1616_t min_signal_needed_p1;
johnAlexander 6:8ac15bf6d635 2755 FixPoint1616_t min_signal_needed_p2;
johnAlexander 6:8ac15bf6d635 2756 FixPoint1616_t min_signal_needed_p3;
johnAlexander 6:8ac15bf6d635 2757 FixPoint1616_t min_signal_needed_p4;
johnAlexander 6:8ac15bf6d635 2758 FixPoint1616_t sigma_limit_tmp;
johnAlexander 6:8ac15bf6d635 2759 FixPoint1616_t sigma_est_sq_tmp;
johnAlexander 6:8ac15bf6d635 2760 FixPoint1616_t signal_limit_tmp;
johnAlexander 6:8ac15bf6d635 2761 FixPoint1616_t signal_at0_mm;
johnAlexander 6:8ac15bf6d635 2762 FixPoint1616_t dmax_dark;
johnAlexander 6:8ac15bf6d635 2763 FixPoint1616_t dmax_ambient;
johnAlexander 6:8ac15bf6d635 2764 FixPoint1616_t dmax_dark_tmp;
johnAlexander 6:8ac15bf6d635 2765 FixPoint1616_t sigma_est_p2_tmp;
johnAlexander 6:8ac15bf6d635 2766 uint32_t signal_rate_temp_mcps;
johnAlexander 6:8ac15bf6d635 2767
johnAlexander 6:8ac15bf6d635 2768 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 2769
johnAlexander 6:8ac15bf6d635 2770 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 2771
johnAlexander 6:8ac15bf6d635 2772 dmax_cal_range_mm =
johnAlexander 6:8ac15bf6d635 2773 PALDevDataGet(dev, DmaxCalRangeMilliMeter);
johnAlexander 6:8ac15bf6d635 2774
johnAlexander 6:8ac15bf6d635 2775 dmax_cal_signal_rate_rtn_mcps =
johnAlexander 6:8ac15bf6d635 2776 PALDevDataGet(dev, DmaxCalSignalRateRtnMegaCps);
johnAlexander 6:8ac15bf6d635 2777
johnAlexander 6:8ac15bf6d635 2778 /* uint32 * FixPoint1616 = FixPoint1616 */
johnAlexander 6:8ac15bf6d635 2779 signal_at0_mm = dmax_cal_range_mm * dmax_cal_signal_rate_rtn_mcps;
johnAlexander 6:8ac15bf6d635 2780
johnAlexander 6:8ac15bf6d635 2781 /* FixPoint1616 >> 8 = FixPoint2408 */
johnAlexander 6:8ac15bf6d635 2782 signal_at0_mm = (signal_at0_mm + 0x80) >> 8;
johnAlexander 6:8ac15bf6d635 2783 signal_at0_mm *= dmax_cal_range_mm;
johnAlexander 6:8ac15bf6d635 2784
johnAlexander 6:8ac15bf6d635 2785 min_signal_needed_p1 = 0;
johnAlexander 6:8ac15bf6d635 2786 if (total_corr_signal_rate_mcps > 0) {
johnAlexander 6:8ac15bf6d635 2787
johnAlexander 6:8ac15bf6d635 2788 /* Shift by 10 bits to increase resolution prior to the
johnAlexander 6:8ac15bf6d635 2789 * division */
johnAlexander 6:8ac15bf6d635 2790 signal_rate_temp_mcps = total_signal_rate_mcps << 10;
johnAlexander 6:8ac15bf6d635 2791
johnAlexander 6:8ac15bf6d635 2792 /* Add rounding value prior to division */
johnAlexander 6:8ac15bf6d635 2793 min_signal_needed_p1 = signal_rate_temp_mcps +
johnAlexander 6:8ac15bf6d635 2794 (total_corr_signal_rate_mcps / 2);
johnAlexander 6:8ac15bf6d635 2795
johnAlexander 6:8ac15bf6d635 2796 /* FixPoint0626/FixPoint1616 = FixPoint2210 */
johnAlexander 6:8ac15bf6d635 2797 min_signal_needed_p1 /= total_corr_signal_rate_mcps;
johnAlexander 6:8ac15bf6d635 2798
johnAlexander 6:8ac15bf6d635 2799 /* Apply a factored version of the speed of light.
johnAlexander 6:8ac15bf6d635 2800 Correction to be applied at the end */
johnAlexander 6:8ac15bf6d635 2801 min_signal_needed_p1 *= 3;
johnAlexander 6:8ac15bf6d635 2802
johnAlexander 6:8ac15bf6d635 2803 /* FixPoint2210 * FixPoint2210 = FixPoint1220 */
johnAlexander 6:8ac15bf6d635 2804 min_signal_needed_p1 *= min_signal_needed_p1;
johnAlexander 6:8ac15bf6d635 2805
johnAlexander 6:8ac15bf6d635 2806 /* FixPoint1220 >> 16 = FixPoint2804 */
johnAlexander 6:8ac15bf6d635 2807 min_signal_needed_p1 = (min_signal_needed_p1 + 0x8000) >> 16;
johnAlexander 6:8ac15bf6d635 2808 }
johnAlexander 6:8ac15bf6d635 2809
johnAlexander 6:8ac15bf6d635 2810 min_signal_needed_p2 = pw_mult * sigma_estimate_p1;
johnAlexander 6:8ac15bf6d635 2811
johnAlexander 6:8ac15bf6d635 2812 /* FixPoint1616 >> 16 = uint32 */
johnAlexander 6:8ac15bf6d635 2813 min_signal_needed_p2 = (min_signal_needed_p2 + 0x8000) >> 16;
johnAlexander 6:8ac15bf6d635 2814
johnAlexander 6:8ac15bf6d635 2815 /* uint32 * uint32 = uint32 */
johnAlexander 6:8ac15bf6d635 2816 min_signal_needed_p2 *= min_signal_needed_p2;
johnAlexander 6:8ac15bf6d635 2817
johnAlexander 6:8ac15bf6d635 2818 /* Check sigmaEstimateP2
johnAlexander 6:8ac15bf6d635 2819 * If this value is too high there is not enough signal rate
johnAlexander 6:8ac15bf6d635 2820 * to calculate dmax value so set a suitable value to ensure
johnAlexander 6:8ac15bf6d635 2821 * a very small dmax.
johnAlexander 6:8ac15bf6d635 2822 */
johnAlexander 6:8ac15bf6d635 2823 sigma_est_p2_tmp = (sigma_estimate_p2 + 0x8000) >> 16;
johnAlexander 6:8ac15bf6d635 2824 sigma_est_p2_tmp = (sigma_est_p2_tmp + c_amb_eff_width_sigma_est_ns / 2) /
johnAlexander 6:8ac15bf6d635 2825 c_amb_eff_width_sigma_est_ns;
johnAlexander 6:8ac15bf6d635 2826 sigma_est_p2_tmp *= c_amb_eff_width_d_max_ns;
johnAlexander 6:8ac15bf6d635 2827
johnAlexander 6:8ac15bf6d635 2828 if (sigma_est_p2_tmp > 0xffff) {
johnAlexander 6:8ac15bf6d635 2829 min_signal_needed_p3 = 0xfff00000;
johnAlexander 6:8ac15bf6d635 2830 } else {
johnAlexander 6:8ac15bf6d635 2831
johnAlexander 6:8ac15bf6d635 2832 /* DMAX uses a different ambient width from sigma, so apply
johnAlexander 6:8ac15bf6d635 2833 * correction.
johnAlexander 6:8ac15bf6d635 2834 * Perform division before multiplication to prevent overflow.
johnAlexander 6:8ac15bf6d635 2835 */
johnAlexander 6:8ac15bf6d635 2836 sigma_estimate_p2 = (sigma_estimate_p2 + c_amb_eff_width_sigma_est_ns / 2) /
johnAlexander 6:8ac15bf6d635 2837 c_amb_eff_width_sigma_est_ns;
johnAlexander 6:8ac15bf6d635 2838 sigma_estimate_p2 *= c_amb_eff_width_d_max_ns;
johnAlexander 6:8ac15bf6d635 2839
johnAlexander 6:8ac15bf6d635 2840 /* FixPoint1616 >> 16 = uint32 */
johnAlexander 6:8ac15bf6d635 2841 min_signal_needed_p3 = (sigma_estimate_p2 + 0x8000) >> 16;
johnAlexander 6:8ac15bf6d635 2842
johnAlexander 6:8ac15bf6d635 2843 min_signal_needed_p3 *= min_signal_needed_p3;
johnAlexander 6:8ac15bf6d635 2844
johnAlexander 6:8ac15bf6d635 2845 }
johnAlexander 6:8ac15bf6d635 2846
johnAlexander 6:8ac15bf6d635 2847 /* FixPoint1814 / uint32 = FixPoint1814 */
johnAlexander 6:8ac15bf6d635 2848 sigma_limit_tmp = ((c_sigma_limit << 14) + 500) / 1000;
johnAlexander 6:8ac15bf6d635 2849
johnAlexander 6:8ac15bf6d635 2850 /* FixPoint1814 * FixPoint1814 = FixPoint3628 := FixPoint0428 */
johnAlexander 6:8ac15bf6d635 2851 sigma_limit_tmp *= sigma_limit_tmp;
johnAlexander 6:8ac15bf6d635 2852
johnAlexander 6:8ac15bf6d635 2853 /* FixPoint1616 * FixPoint1616 = FixPoint3232 */
johnAlexander 6:8ac15bf6d635 2854 sigma_est_sq_tmp = c_sigma_est_ref * c_sigma_est_ref;
johnAlexander 6:8ac15bf6d635 2855
johnAlexander 6:8ac15bf6d635 2856 /* FixPoint3232 >> 4 = FixPoint0428 */
johnAlexander 6:8ac15bf6d635 2857 sigma_est_sq_tmp = (sigma_est_sq_tmp + 0x08) >> 4;
johnAlexander 6:8ac15bf6d635 2858
johnAlexander 6:8ac15bf6d635 2859 /* FixPoint0428 - FixPoint0428 = FixPoint0428 */
johnAlexander 6:8ac15bf6d635 2860 sigma_limit_tmp -= sigma_est_sq_tmp;
johnAlexander 6:8ac15bf6d635 2861
johnAlexander 6:8ac15bf6d635 2862 /* uint32_t * FixPoint0428 = FixPoint0428 */
johnAlexander 6:8ac15bf6d635 2863 min_signal_needed_p4 = 4 * 12 * sigma_limit_tmp;
johnAlexander 6:8ac15bf6d635 2864
johnAlexander 6:8ac15bf6d635 2865 /* FixPoint0428 >> 14 = FixPoint1814 */
johnAlexander 6:8ac15bf6d635 2866 min_signal_needed_p4 = (min_signal_needed_p4 + 0x2000) >> 14;
johnAlexander 6:8ac15bf6d635 2867
johnAlexander 6:8ac15bf6d635 2868 /* uint32 + uint32 = uint32 */
johnAlexander 6:8ac15bf6d635 2869 min_signal_needed = (min_signal_needed_p2 + min_signal_needed_p3);
johnAlexander 6:8ac15bf6d635 2870
johnAlexander 6:8ac15bf6d635 2871 /* uint32 / uint32 = uint32 */
johnAlexander 6:8ac15bf6d635 2872 min_signal_needed += (peak_vcsel_duration_us / 2);
johnAlexander 6:8ac15bf6d635 2873 min_signal_needed /= peak_vcsel_duration_us;
johnAlexander 6:8ac15bf6d635 2874
johnAlexander 6:8ac15bf6d635 2875 /* uint32 << 14 = FixPoint1814 */
johnAlexander 6:8ac15bf6d635 2876 min_signal_needed <<= 14;
johnAlexander 6:8ac15bf6d635 2877
johnAlexander 6:8ac15bf6d635 2878 /* FixPoint1814 / FixPoint1814 = uint32 */
johnAlexander 6:8ac15bf6d635 2879 min_signal_needed += (min_signal_needed_p4 / 2);
johnAlexander 6:8ac15bf6d635 2880 min_signal_needed /= min_signal_needed_p4;
johnAlexander 6:8ac15bf6d635 2881
johnAlexander 6:8ac15bf6d635 2882 /* FixPoint3200 * FixPoint2804 := FixPoint2804*/
johnAlexander 6:8ac15bf6d635 2883 min_signal_needed *= min_signal_needed_p1;
johnAlexander 6:8ac15bf6d635 2884
johnAlexander 6:8ac15bf6d635 2885 /* Apply correction by dividing by 1000000.
johnAlexander 6:8ac15bf6d635 2886 * This assumes 10E16 on the numerator of the equation
johnAlexander 6:8ac15bf6d635 2887 * and 10E-22 on the denominator.
johnAlexander 6:8ac15bf6d635 2888 * We do this because 32bit fix point calculation can't
johnAlexander 6:8ac15bf6d635 2889 * handle the larger and smaller elements of this equation,
johnAlexander 6:8ac15bf6d635 2890 * i.e. speed of light and pulse widths.
johnAlexander 6:8ac15bf6d635 2891 */
johnAlexander 6:8ac15bf6d635 2892 min_signal_needed = (min_signal_needed + 500) / 1000;
johnAlexander 6:8ac15bf6d635 2893 min_signal_needed <<= 4;
johnAlexander 6:8ac15bf6d635 2894
johnAlexander 6:8ac15bf6d635 2895 min_signal_needed = (min_signal_needed + 500) / 1000;
johnAlexander 6:8ac15bf6d635 2896
johnAlexander 6:8ac15bf6d635 2897 /* FixPoint1616 >> 8 = FixPoint2408 */
johnAlexander 6:8ac15bf6d635 2898 signal_limit_tmp = (c_signal_limit + 0x80) >> 8;
johnAlexander 6:8ac15bf6d635 2899
johnAlexander 6:8ac15bf6d635 2900 /* FixPoint2408/FixPoint2408 = uint32 */
johnAlexander 6:8ac15bf6d635 2901 if (signal_limit_tmp != 0) {
johnAlexander 6:8ac15bf6d635 2902 dmax_dark_tmp = (signal_at0_mm + (signal_limit_tmp / 2))
johnAlexander 6:8ac15bf6d635 2903 / signal_limit_tmp;
johnAlexander 6:8ac15bf6d635 2904 } else {
johnAlexander 6:8ac15bf6d635 2905 dmax_dark_tmp = 0;
johnAlexander 6:8ac15bf6d635 2906 }
johnAlexander 6:8ac15bf6d635 2907
johnAlexander 6:8ac15bf6d635 2908 dmax_dark = VL53L0X_isqrt(dmax_dark_tmp);
johnAlexander 6:8ac15bf6d635 2909
johnAlexander 6:8ac15bf6d635 2910 /* FixPoint2408/FixPoint2408 = uint32 */
johnAlexander 6:8ac15bf6d635 2911 if (min_signal_needed != 0) {
johnAlexander 6:8ac15bf6d635 2912 dmax_ambient = (signal_at0_mm + min_signal_needed / 2)
johnAlexander 6:8ac15bf6d635 2913 / min_signal_needed;
johnAlexander 6:8ac15bf6d635 2914 } else {
johnAlexander 6:8ac15bf6d635 2915 dmax_ambient = 0;
johnAlexander 6:8ac15bf6d635 2916 }
johnAlexander 6:8ac15bf6d635 2917
johnAlexander 6:8ac15bf6d635 2918 dmax_ambient = VL53L0X_isqrt(dmax_ambient);
johnAlexander 6:8ac15bf6d635 2919
johnAlexander 6:8ac15bf6d635 2920 *pd_max_mm = dmax_dark;
johnAlexander 6:8ac15bf6d635 2921 if (dmax_dark > dmax_ambient) {
johnAlexander 6:8ac15bf6d635 2922 *pd_max_mm = dmax_ambient;
johnAlexander 6:8ac15bf6d635 2923 }
johnAlexander 6:8ac15bf6d635 2924
johnAlexander 6:8ac15bf6d635 2925 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 2926
johnAlexander 6:8ac15bf6d635 2927 return status;
johnAlexander 6:8ac15bf6d635 2928 }
johnAlexander 6:8ac15bf6d635 2929
johnAlexander 6:8ac15bf6d635 2930 VL53L0X_Error VL53L0X::VL53L0X_calc_sigma_estimate(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 2931 VL53L0X_RangingMeasurementData_t *p_ranging_measurement_data,
johnAlexander 6:8ac15bf6d635 2932 FixPoint1616_t *p_sigma_estimate,
johnAlexander 6:8ac15bf6d635 2933 uint32_t *p_dmax_mm)
johnAlexander 6:8ac15bf6d635 2934 {
johnAlexander 6:8ac15bf6d635 2935 /* Expressed in 100ths of a ns, i.e. centi-ns */
johnAlexander 6:8ac15bf6d635 2936 const uint32_t c_pulse_effective_width_centi_ns = 800;
johnAlexander 6:8ac15bf6d635 2937 /* Expressed in 100ths of a ns, i.e. centi-ns */
johnAlexander 6:8ac15bf6d635 2938 const uint32_t c_ambient_effective_width_centi_ns = 600;
johnAlexander 6:8ac15bf6d635 2939 const FixPoint1616_t c_dflt_final_range_integration_time_milli_secs = 0x00190000; /* 25ms */
johnAlexander 6:8ac15bf6d635 2940 const uint32_t c_vcsel_pulse_width_ps = 4700; /* pico secs */
johnAlexander 6:8ac15bf6d635 2941 const FixPoint1616_t c_sigma_est_max = 0x028F87AE;
johnAlexander 6:8ac15bf6d635 2942 const FixPoint1616_t c_sigma_est_rtn_max = 0xF000;
johnAlexander 6:8ac15bf6d635 2943 const FixPoint1616_t c_amb_to_signal_ratio_max = 0xF0000000 /
johnAlexander 6:8ac15bf6d635 2944 c_ambient_effective_width_centi_ns;
johnAlexander 6:8ac15bf6d635 2945 /* Time Of Flight per mm (6.6 pico secs) */
johnAlexander 6:8ac15bf6d635 2946 const FixPoint1616_t c_tof_per_mm_ps = 0x0006999A;
johnAlexander 6:8ac15bf6d635 2947 const uint32_t c_16bit_rounding_param = 0x00008000;
johnAlexander 6:8ac15bf6d635 2948 const FixPoint1616_t c_max_x_talk_kcps = 0x00320000;
johnAlexander 6:8ac15bf6d635 2949 const uint32_t c_pll_period_ps = 1655;
johnAlexander 6:8ac15bf6d635 2950
johnAlexander 6:8ac15bf6d635 2951 uint32_t vcsel_total_events_rtn;
johnAlexander 6:8ac15bf6d635 2952 uint32_t final_range_timeout_micro_secs;
johnAlexander 6:8ac15bf6d635 2953 uint32_t pre_range_timeout_micro_secs;
johnAlexander 6:8ac15bf6d635 2954 uint32_t final_range_integration_time_milli_secs;
johnAlexander 6:8ac15bf6d635 2955 FixPoint1616_t sigma_estimate_p1;
johnAlexander 6:8ac15bf6d635 2956 FixPoint1616_t sigma_estimate_p2;
johnAlexander 6:8ac15bf6d635 2957 FixPoint1616_t sigma_estimate_p3;
johnAlexander 6:8ac15bf6d635 2958 FixPoint1616_t delta_t_ps;
johnAlexander 6:8ac15bf6d635 2959 FixPoint1616_t pw_mult;
johnAlexander 6:8ac15bf6d635 2960 FixPoint1616_t sigma_est_rtn;
johnAlexander 6:8ac15bf6d635 2961 FixPoint1616_t sigma_estimate;
johnAlexander 6:8ac15bf6d635 2962 FixPoint1616_t x_talk_correction;
johnAlexander 6:8ac15bf6d635 2963 FixPoint1616_t ambient_rate_kcps;
johnAlexander 6:8ac15bf6d635 2964 FixPoint1616_t peak_signal_rate_kcps;
johnAlexander 6:8ac15bf6d635 2965 FixPoint1616_t x_talk_comp_rate_mcps;
johnAlexander 6:8ac15bf6d635 2966 uint32_t x_talk_comp_rate_kcps;
johnAlexander 6:8ac15bf6d635 2967 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 2968 FixPoint1616_t diff1_mcps;
johnAlexander 6:8ac15bf6d635 2969 FixPoint1616_t diff2_mcps;
johnAlexander 6:8ac15bf6d635 2970 FixPoint1616_t sqr1;
johnAlexander 6:8ac15bf6d635 2971 FixPoint1616_t sqr2;
johnAlexander 6:8ac15bf6d635 2972 FixPoint1616_t sqr_sum;
johnAlexander 6:8ac15bf6d635 2973 FixPoint1616_t sqrt_result_centi_ns;
johnAlexander 6:8ac15bf6d635 2974 FixPoint1616_t sqrt_result;
johnAlexander 6:8ac15bf6d635 2975 FixPoint1616_t total_signal_rate_mcps;
johnAlexander 6:8ac15bf6d635 2976 FixPoint1616_t corrected_signal_rate_mcps;
johnAlexander 6:8ac15bf6d635 2977 FixPoint1616_t sigma_est_ref;
johnAlexander 6:8ac15bf6d635 2978 uint32_t vcsel_width;
johnAlexander 6:8ac15bf6d635 2979 uint32_t final_range_macro_pclks;
johnAlexander 6:8ac15bf6d635 2980 uint32_t pre_range_macro_pclks;
johnAlexander 6:8ac15bf6d635 2981 uint32_t peak_vcsel_duration_us;
johnAlexander 6:8ac15bf6d635 2982 uint8_t final_range_vcsel_pclks;
johnAlexander 6:8ac15bf6d635 2983 uint8_t pre_range_vcsel_pclks;
johnAlexander 6:8ac15bf6d635 2984 /*! \addtogroup calc_sigma_estimate
johnAlexander 6:8ac15bf6d635 2985 * @{
johnAlexander 6:8ac15bf6d635 2986 *
johnAlexander 6:8ac15bf6d635 2987 * Estimates the range sigma
johnAlexander 6:8ac15bf6d635 2988 */
johnAlexander 6:8ac15bf6d635 2989
johnAlexander 6:8ac15bf6d635 2990 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 2991
johnAlexander 6:8ac15bf6d635 2992 VL53L0X_GETPARAMETERFIELD(dev, XTalkCompensationRateMegaCps,
johnAlexander 6:8ac15bf6d635 2993 x_talk_comp_rate_mcps);
johnAlexander 6:8ac15bf6d635 2994
johnAlexander 6:8ac15bf6d635 2995 /*
johnAlexander 6:8ac15bf6d635 2996 * We work in kcps rather than mcps as this helps keep within the
johnAlexander 6:8ac15bf6d635 2997 * confines of the 32 Fix1616 type.
johnAlexander 6:8ac15bf6d635 2998 */
johnAlexander 6:8ac15bf6d635 2999
johnAlexander 6:8ac15bf6d635 3000 ambient_rate_kcps =
johnAlexander 6:8ac15bf6d635 3001 (p_ranging_measurement_data->AmbientRateRtnMegaCps * 1000) >> 16;
johnAlexander 6:8ac15bf6d635 3002
johnAlexander 6:8ac15bf6d635 3003 corrected_signal_rate_mcps =
johnAlexander 6:8ac15bf6d635 3004 p_ranging_measurement_data->SignalRateRtnMegaCps;
johnAlexander 6:8ac15bf6d635 3005
johnAlexander 6:8ac15bf6d635 3006
johnAlexander 6:8ac15bf6d635 3007 status = VL53L0X_get_total_signal_rate(
johnAlexander 6:8ac15bf6d635 3008 dev, p_ranging_measurement_data, &total_signal_rate_mcps);
johnAlexander 6:8ac15bf6d635 3009 status = VL53L0X_get_total_xtalk_rate(
johnAlexander 6:8ac15bf6d635 3010 dev, p_ranging_measurement_data, &x_talk_comp_rate_mcps);
johnAlexander 6:8ac15bf6d635 3011
johnAlexander 6:8ac15bf6d635 3012
johnAlexander 6:8ac15bf6d635 3013 /* Signal rate measurement provided by device is the
johnAlexander 6:8ac15bf6d635 3014 * peak signal rate, not average.
johnAlexander 6:8ac15bf6d635 3015 */
johnAlexander 6:8ac15bf6d635 3016 peak_signal_rate_kcps = (total_signal_rate_mcps * 1000);
johnAlexander 6:8ac15bf6d635 3017 peak_signal_rate_kcps = (peak_signal_rate_kcps + 0x8000) >> 16;
johnAlexander 6:8ac15bf6d635 3018
johnAlexander 6:8ac15bf6d635 3019 x_talk_comp_rate_kcps = x_talk_comp_rate_mcps * 1000;
johnAlexander 6:8ac15bf6d635 3020
johnAlexander 6:8ac15bf6d635 3021 if (x_talk_comp_rate_kcps > c_max_x_talk_kcps) {
johnAlexander 6:8ac15bf6d635 3022 x_talk_comp_rate_kcps = c_max_x_talk_kcps;
johnAlexander 6:8ac15bf6d635 3023 }
johnAlexander 6:8ac15bf6d635 3024
johnAlexander 6:8ac15bf6d635 3025 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3026
johnAlexander 6:8ac15bf6d635 3027 /* Calculate final range macro periods */
johnAlexander 6:8ac15bf6d635 3028 final_range_timeout_micro_secs = VL53L0X_GETDEVICESPECIFICPARAMETER(
johnAlexander 6:8ac15bf6d635 3029 dev, FinalRangeTimeoutMicroSecs);
johnAlexander 6:8ac15bf6d635 3030
johnAlexander 6:8ac15bf6d635 3031 final_range_vcsel_pclks = VL53L0X_GETDEVICESPECIFICPARAMETER(
johnAlexander 6:8ac15bf6d635 3032 dev, FinalRangeVcselPulsePeriod);
johnAlexander 6:8ac15bf6d635 3033
johnAlexander 6:8ac15bf6d635 3034 final_range_macro_pclks = VL53L0X_calc_timeout_mclks(
johnAlexander 6:8ac15bf6d635 3035 dev, final_range_timeout_micro_secs, final_range_vcsel_pclks);
johnAlexander 6:8ac15bf6d635 3036
johnAlexander 6:8ac15bf6d635 3037 /* Calculate pre-range macro periods */
johnAlexander 6:8ac15bf6d635 3038 pre_range_timeout_micro_secs = VL53L0X_GETDEVICESPECIFICPARAMETER(
johnAlexander 6:8ac15bf6d635 3039 dev, PreRangeTimeoutMicroSecs);
johnAlexander 6:8ac15bf6d635 3040
johnAlexander 6:8ac15bf6d635 3041 pre_range_vcsel_pclks = VL53L0X_GETDEVICESPECIFICPARAMETER(
johnAlexander 6:8ac15bf6d635 3042 dev, PreRangeVcselPulsePeriod);
johnAlexander 6:8ac15bf6d635 3043
johnAlexander 6:8ac15bf6d635 3044 pre_range_macro_pclks = VL53L0X_calc_timeout_mclks(
johnAlexander 6:8ac15bf6d635 3045 dev, pre_range_timeout_micro_secs, pre_range_vcsel_pclks);
johnAlexander 6:8ac15bf6d635 3046
johnAlexander 6:8ac15bf6d635 3047 vcsel_width = 3;
johnAlexander 6:8ac15bf6d635 3048 if (final_range_vcsel_pclks == 8) {
johnAlexander 6:8ac15bf6d635 3049 vcsel_width = 2;
johnAlexander 6:8ac15bf6d635 3050 }
johnAlexander 6:8ac15bf6d635 3051
johnAlexander 6:8ac15bf6d635 3052
johnAlexander 6:8ac15bf6d635 3053 peak_vcsel_duration_us = vcsel_width * 2048 *
johnAlexander 6:8ac15bf6d635 3054 (pre_range_macro_pclks + final_range_macro_pclks);
johnAlexander 6:8ac15bf6d635 3055 peak_vcsel_duration_us = (peak_vcsel_duration_us + 500) / 1000;
johnAlexander 6:8ac15bf6d635 3056 peak_vcsel_duration_us *= c_pll_period_ps;
johnAlexander 6:8ac15bf6d635 3057 peak_vcsel_duration_us = (peak_vcsel_duration_us + 500) / 1000;
johnAlexander 6:8ac15bf6d635 3058
johnAlexander 6:8ac15bf6d635 3059 /* Fix1616 >> 8 = Fix2408 */
johnAlexander 6:8ac15bf6d635 3060 total_signal_rate_mcps = (total_signal_rate_mcps + 0x80) >> 8;
johnAlexander 6:8ac15bf6d635 3061
johnAlexander 6:8ac15bf6d635 3062 /* Fix2408 * uint32 = Fix2408 */
johnAlexander 6:8ac15bf6d635 3063 vcsel_total_events_rtn = total_signal_rate_mcps *
johnAlexander 6:8ac15bf6d635 3064 peak_vcsel_duration_us;
johnAlexander 6:8ac15bf6d635 3065
johnAlexander 6:8ac15bf6d635 3066 /* Fix2408 >> 8 = uint32 */
johnAlexander 6:8ac15bf6d635 3067 vcsel_total_events_rtn = (vcsel_total_events_rtn + 0x80) >> 8;
johnAlexander 6:8ac15bf6d635 3068
johnAlexander 6:8ac15bf6d635 3069 /* Fix2408 << 8 = Fix1616 = */
johnAlexander 6:8ac15bf6d635 3070 total_signal_rate_mcps <<= 8;
johnAlexander 6:8ac15bf6d635 3071 }
johnAlexander 6:8ac15bf6d635 3072
johnAlexander 6:8ac15bf6d635 3073 if (status != VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3074 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 3075 return status;
johnAlexander 6:8ac15bf6d635 3076 }
johnAlexander 6:8ac15bf6d635 3077
johnAlexander 6:8ac15bf6d635 3078 if (peak_signal_rate_kcps == 0) {
johnAlexander 6:8ac15bf6d635 3079 *p_sigma_estimate = c_sigma_est_max;
johnAlexander 6:8ac15bf6d635 3080 PALDevDataSet(dev, SigmaEstimate, c_sigma_est_max);
johnAlexander 6:8ac15bf6d635 3081 *p_dmax_mm = 0;
johnAlexander 6:8ac15bf6d635 3082 } else {
johnAlexander 6:8ac15bf6d635 3083 if (vcsel_total_events_rtn < 1) {
johnAlexander 6:8ac15bf6d635 3084 vcsel_total_events_rtn = 1;
johnAlexander 6:8ac15bf6d635 3085 }
johnAlexander 6:8ac15bf6d635 3086
johnAlexander 6:8ac15bf6d635 3087 sigma_estimate_p1 = c_pulse_effective_width_centi_ns;
johnAlexander 6:8ac15bf6d635 3088
johnAlexander 6:8ac15bf6d635 3089 /* ((FixPoint1616 << 16)* uint32)/uint32 = FixPoint1616 */
johnAlexander 6:8ac15bf6d635 3090 sigma_estimate_p2 = (ambient_rate_kcps << 16) / peak_signal_rate_kcps;
johnAlexander 6:8ac15bf6d635 3091 if (sigma_estimate_p2 > c_amb_to_signal_ratio_max) {
johnAlexander 6:8ac15bf6d635 3092 /* Clip to prevent overflow. Will ensure safe
johnAlexander 6:8ac15bf6d635 3093 * max result. */
johnAlexander 6:8ac15bf6d635 3094 sigma_estimate_p2 = c_amb_to_signal_ratio_max;
johnAlexander 6:8ac15bf6d635 3095 }
johnAlexander 6:8ac15bf6d635 3096 sigma_estimate_p2 *= c_ambient_effective_width_centi_ns;
johnAlexander 6:8ac15bf6d635 3097
johnAlexander 6:8ac15bf6d635 3098 sigma_estimate_p3 = 2 * VL53L0X_isqrt(vcsel_total_events_rtn * 12);
johnAlexander 6:8ac15bf6d635 3099
johnAlexander 6:8ac15bf6d635 3100 /* uint32 * FixPoint1616 = FixPoint1616 */
johnAlexander 6:8ac15bf6d635 3101 delta_t_ps = p_ranging_measurement_data->RangeMilliMeter *
johnAlexander 6:8ac15bf6d635 3102 c_tof_per_mm_ps;
johnAlexander 6:8ac15bf6d635 3103
johnAlexander 6:8ac15bf6d635 3104 /*
johnAlexander 6:8ac15bf6d635 3105 * vcselRate - xtalkCompRate
johnAlexander 6:8ac15bf6d635 3106 * (uint32 << 16) - FixPoint1616 = FixPoint1616.
johnAlexander 6:8ac15bf6d635 3107 * Divide result by 1000 to convert to mcps.
johnAlexander 6:8ac15bf6d635 3108 * 500 is added to ensure rounding when integer division
johnAlexander 6:8ac15bf6d635 3109 * truncates.
johnAlexander 6:8ac15bf6d635 3110 */
johnAlexander 6:8ac15bf6d635 3111 diff1_mcps = (((peak_signal_rate_kcps << 16) -
johnAlexander 6:8ac15bf6d635 3112 2 * x_talk_comp_rate_kcps) + 500) / 1000;
johnAlexander 6:8ac15bf6d635 3113
johnAlexander 6:8ac15bf6d635 3114 /* vcselRate + xtalkCompRate */
johnAlexander 6:8ac15bf6d635 3115 diff2_mcps = ((peak_signal_rate_kcps << 16) + 500) / 1000;
johnAlexander 6:8ac15bf6d635 3116
johnAlexander 6:8ac15bf6d635 3117 /* Shift by 8 bits to increase resolution prior to the
johnAlexander 6:8ac15bf6d635 3118 * division */
johnAlexander 6:8ac15bf6d635 3119 diff1_mcps <<= 8;
johnAlexander 6:8ac15bf6d635 3120
johnAlexander 6:8ac15bf6d635 3121 /* FixPoint0824/FixPoint1616 = FixPoint2408 */
johnAlexander 6:8ac15bf6d635 3122 // xTalkCorrection = abs(diff1_mcps/diff2_mcps);
johnAlexander 6:8ac15bf6d635 3123 // abs is causing compiler overloading isue in C++, but unsigned types. So, redundant call anyway!
johnAlexander 6:8ac15bf6d635 3124 x_talk_correction = diff1_mcps / diff2_mcps;
johnAlexander 6:8ac15bf6d635 3125
johnAlexander 6:8ac15bf6d635 3126 /* FixPoint2408 << 8 = FixPoint1616 */
johnAlexander 6:8ac15bf6d635 3127 x_talk_correction <<= 8;
johnAlexander 6:8ac15bf6d635 3128
johnAlexander 6:8ac15bf6d635 3129 if (p_ranging_measurement_data->RangeStatus != 0) {
johnAlexander 6:8ac15bf6d635 3130 pw_mult = 1 << 16;
johnAlexander 6:8ac15bf6d635 3131 } else {
johnAlexander 6:8ac15bf6d635 3132 /* FixPoint1616/uint32 = FixPoint1616 */
johnAlexander 6:8ac15bf6d635 3133 pw_mult = delta_t_ps / c_vcsel_pulse_width_ps; /* smaller than 1.0f */
johnAlexander 6:8ac15bf6d635 3134
johnAlexander 6:8ac15bf6d635 3135 /*
johnAlexander 6:8ac15bf6d635 3136 * FixPoint1616 * FixPoint1616 = FixPoint3232, however both
johnAlexander 6:8ac15bf6d635 3137 * values are small enough such that32 bits will not be
johnAlexander 6:8ac15bf6d635 3138 * exceeded.
johnAlexander 6:8ac15bf6d635 3139 */
johnAlexander 6:8ac15bf6d635 3140 pw_mult *= ((1 << 16) - x_talk_correction);
johnAlexander 6:8ac15bf6d635 3141
johnAlexander 6:8ac15bf6d635 3142 /* (FixPoint3232 >> 16) = FixPoint1616 */
johnAlexander 6:8ac15bf6d635 3143 pw_mult = (pw_mult + c_16bit_rounding_param) >> 16;
johnAlexander 6:8ac15bf6d635 3144
johnAlexander 6:8ac15bf6d635 3145 /* FixPoint1616 + FixPoint1616 = FixPoint1616 */
johnAlexander 6:8ac15bf6d635 3146 pw_mult += (1 << 16);
johnAlexander 6:8ac15bf6d635 3147
johnAlexander 6:8ac15bf6d635 3148 /*
johnAlexander 6:8ac15bf6d635 3149 * At this point the value will be 1.xx, therefore if we square
johnAlexander 6:8ac15bf6d635 3150 * the value this will exceed 32 bits. To address this perform
johnAlexander 6:8ac15bf6d635 3151 * a single shift to the right before the multiplication.
johnAlexander 6:8ac15bf6d635 3152 */
johnAlexander 6:8ac15bf6d635 3153 pw_mult >>= 1;
johnAlexander 6:8ac15bf6d635 3154 /* FixPoint1715 * FixPoint1715 = FixPoint3430 */
johnAlexander 6:8ac15bf6d635 3155 pw_mult = pw_mult * pw_mult;
johnAlexander 6:8ac15bf6d635 3156
johnAlexander 6:8ac15bf6d635 3157 /* (FixPoint3430 >> 14) = Fix1616 */
johnAlexander 6:8ac15bf6d635 3158 pw_mult >>= 14;
johnAlexander 6:8ac15bf6d635 3159 }
johnAlexander 6:8ac15bf6d635 3160
johnAlexander 6:8ac15bf6d635 3161 /* FixPoint1616 * uint32 = FixPoint1616 */
johnAlexander 6:8ac15bf6d635 3162 sqr1 = pw_mult * sigma_estimate_p1;
johnAlexander 6:8ac15bf6d635 3163
johnAlexander 6:8ac15bf6d635 3164 /* (FixPoint1616 >> 16) = FixPoint3200 */
johnAlexander 6:8ac15bf6d635 3165 sqr1 = (sqr1 + 0x8000) >> 16;
johnAlexander 6:8ac15bf6d635 3166
johnAlexander 6:8ac15bf6d635 3167 /* FixPoint3200 * FixPoint3200 = FixPoint6400 */
johnAlexander 6:8ac15bf6d635 3168 sqr1 *= sqr1;
johnAlexander 6:8ac15bf6d635 3169
johnAlexander 6:8ac15bf6d635 3170 sqr2 = sigma_estimate_p2;
johnAlexander 6:8ac15bf6d635 3171
johnAlexander 6:8ac15bf6d635 3172 /* (FixPoint1616 >> 16) = FixPoint3200 */
johnAlexander 6:8ac15bf6d635 3173 sqr2 = (sqr2 + 0x8000) >> 16;
johnAlexander 6:8ac15bf6d635 3174
johnAlexander 6:8ac15bf6d635 3175 /* FixPoint3200 * FixPoint3200 = FixPoint6400 */
johnAlexander 6:8ac15bf6d635 3176 sqr2 *= sqr2;
johnAlexander 6:8ac15bf6d635 3177
johnAlexander 6:8ac15bf6d635 3178 /* FixPoint64000 + FixPoint6400 = FixPoint6400 */
johnAlexander 6:8ac15bf6d635 3179 sqr_sum = sqr1 + sqr2;
johnAlexander 6:8ac15bf6d635 3180
johnAlexander 6:8ac15bf6d635 3181 /* SQRT(FixPoin6400) = FixPoint3200 */
johnAlexander 6:8ac15bf6d635 3182 sqrt_result_centi_ns = VL53L0X_isqrt(sqr_sum);
johnAlexander 6:8ac15bf6d635 3183
johnAlexander 6:8ac15bf6d635 3184 /* (FixPoint3200 << 16) = FixPoint1616 */
johnAlexander 6:8ac15bf6d635 3185 sqrt_result_centi_ns <<= 16;
johnAlexander 6:8ac15bf6d635 3186
johnAlexander 6:8ac15bf6d635 3187 /*
johnAlexander 6:8ac15bf6d635 3188 * Note that the Speed Of Light is expressed in um per 1E-10
johnAlexander 6:8ac15bf6d635 3189 * seconds (2997) Therefore to get mm/ns we have to divide by
johnAlexander 6:8ac15bf6d635 3190 * 10000
johnAlexander 6:8ac15bf6d635 3191 */
johnAlexander 6:8ac15bf6d635 3192 sigma_est_rtn = (((sqrt_result_centi_ns + 50) / 100) /
johnAlexander 6:8ac15bf6d635 3193 sigma_estimate_p3);
johnAlexander 6:8ac15bf6d635 3194 sigma_est_rtn *= VL53L0X_SPEED_OF_LIGHT_IN_AIR;
johnAlexander 6:8ac15bf6d635 3195
johnAlexander 6:8ac15bf6d635 3196 /* Add 5000 before dividing by 10000 to ensure rounding. */
johnAlexander 6:8ac15bf6d635 3197 sigma_est_rtn += 5000;
johnAlexander 6:8ac15bf6d635 3198 sigma_est_rtn /= 10000;
johnAlexander 6:8ac15bf6d635 3199
johnAlexander 6:8ac15bf6d635 3200 if (sigma_est_rtn > c_sigma_est_rtn_max) {
johnAlexander 6:8ac15bf6d635 3201 /* Clip to prevent overflow. Will ensure safe
johnAlexander 6:8ac15bf6d635 3202 * max result. */
johnAlexander 6:8ac15bf6d635 3203 sigma_est_rtn = c_sigma_est_rtn_max;
johnAlexander 6:8ac15bf6d635 3204 }
johnAlexander 6:8ac15bf6d635 3205 final_range_integration_time_milli_secs =
johnAlexander 6:8ac15bf6d635 3206 (final_range_timeout_micro_secs + pre_range_timeout_micro_secs + 500) / 1000;
johnAlexander 6:8ac15bf6d635 3207
johnAlexander 6:8ac15bf6d635 3208 /* sigmaEstRef = 1mm * 25ms/final range integration time (inc pre-range)
johnAlexander 6:8ac15bf6d635 3209 * sqrt(FixPoint1616/int) = FixPoint2408)
johnAlexander 6:8ac15bf6d635 3210 */
johnAlexander 6:8ac15bf6d635 3211 sigma_est_ref =
johnAlexander 6:8ac15bf6d635 3212 VL53L0X_isqrt((c_dflt_final_range_integration_time_milli_secs +
johnAlexander 6:8ac15bf6d635 3213 final_range_integration_time_milli_secs / 2) /
johnAlexander 6:8ac15bf6d635 3214 final_range_integration_time_milli_secs);
johnAlexander 6:8ac15bf6d635 3215
johnAlexander 6:8ac15bf6d635 3216 /* FixPoint2408 << 8 = FixPoint1616 */
johnAlexander 6:8ac15bf6d635 3217 sigma_est_ref <<= 8;
johnAlexander 6:8ac15bf6d635 3218 sigma_est_ref = (sigma_est_ref + 500) / 1000;
johnAlexander 6:8ac15bf6d635 3219
johnAlexander 6:8ac15bf6d635 3220 /* FixPoint1616 * FixPoint1616 = FixPoint3232 */
johnAlexander 6:8ac15bf6d635 3221 sqr1 = sigma_est_rtn * sigma_est_rtn;
johnAlexander 6:8ac15bf6d635 3222 /* FixPoint1616 * FixPoint1616 = FixPoint3232 */
johnAlexander 6:8ac15bf6d635 3223 sqr2 = sigma_est_ref * sigma_est_ref;
johnAlexander 6:8ac15bf6d635 3224
johnAlexander 6:8ac15bf6d635 3225 /* sqrt(FixPoint3232) = FixPoint1616 */
johnAlexander 6:8ac15bf6d635 3226 sqrt_result = VL53L0X_isqrt((sqr1 + sqr2));
johnAlexander 6:8ac15bf6d635 3227 /*
johnAlexander 6:8ac15bf6d635 3228 * Note that the Shift by 4 bits increases resolution prior to
johnAlexander 6:8ac15bf6d635 3229 * the sqrt, therefore the result must be shifted by 2 bits to
johnAlexander 6:8ac15bf6d635 3230 * the right to revert back to the FixPoint1616 format.
johnAlexander 6:8ac15bf6d635 3231 */
johnAlexander 6:8ac15bf6d635 3232
johnAlexander 6:8ac15bf6d635 3233 sigma_estimate = 1000 * sqrt_result;
johnAlexander 6:8ac15bf6d635 3234
johnAlexander 6:8ac15bf6d635 3235 if ((peak_signal_rate_kcps < 1) || (vcsel_total_events_rtn < 1) ||
johnAlexander 6:8ac15bf6d635 3236 (sigma_estimate > c_sigma_est_max)) {
johnAlexander 6:8ac15bf6d635 3237 sigma_estimate = c_sigma_est_max;
johnAlexander 6:8ac15bf6d635 3238 }
johnAlexander 6:8ac15bf6d635 3239
johnAlexander 6:8ac15bf6d635 3240 *p_sigma_estimate = (uint32_t)(sigma_estimate);
johnAlexander 6:8ac15bf6d635 3241 PALDevDataSet(dev, SigmaEstimate, *p_sigma_estimate);
johnAlexander 6:8ac15bf6d635 3242 status = VL53L0X_calc_dmax(
johnAlexander 6:8ac15bf6d635 3243 dev,
johnAlexander 6:8ac15bf6d635 3244 total_signal_rate_mcps,
johnAlexander 6:8ac15bf6d635 3245 corrected_signal_rate_mcps,
johnAlexander 6:8ac15bf6d635 3246 pw_mult,
johnAlexander 6:8ac15bf6d635 3247 sigma_estimate_p1,
johnAlexander 6:8ac15bf6d635 3248 sigma_estimate_p2,
johnAlexander 6:8ac15bf6d635 3249 peak_vcsel_duration_us,
johnAlexander 6:8ac15bf6d635 3250 p_dmax_mm);
johnAlexander 6:8ac15bf6d635 3251 }
johnAlexander 6:8ac15bf6d635 3252
johnAlexander 6:8ac15bf6d635 3253 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 3254 return status;
johnAlexander 6:8ac15bf6d635 3255 }
johnAlexander 6:8ac15bf6d635 3256
johnAlexander 6:8ac15bf6d635 3257 VL53L0X_Error VL53L0X::VL53L0X_get_pal_range_status(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 3258 uint8_t device_range_status,
johnAlexander 6:8ac15bf6d635 3259 FixPoint1616_t signal_rate,
johnAlexander 6:8ac15bf6d635 3260 uint16_t effective_spad_rtn_count,
johnAlexander 6:8ac15bf6d635 3261 VL53L0X_RangingMeasurementData_t *p_ranging_measurement_data,
johnAlexander 6:8ac15bf6d635 3262 uint8_t *p_pal_range_status)
johnAlexander 6:8ac15bf6d635 3263 {
johnAlexander 6:8ac15bf6d635 3264 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 3265 uint8_t none_flag;
johnAlexander 6:8ac15bf6d635 3266 uint8_t sigma_limitflag = 0;
johnAlexander 6:8ac15bf6d635 3267 uint8_t signal_ref_clipflag = 0;
johnAlexander 6:8ac15bf6d635 3268 uint8_t range_ignore_thresholdflag = 0;
johnAlexander 6:8ac15bf6d635 3269 uint8_t sigma_limit_check_enable = 0;
johnAlexander 6:8ac15bf6d635 3270 uint8_t signal_rate_final_range_limit_check_enable = 0;
johnAlexander 6:8ac15bf6d635 3271 uint8_t signal_ref_clip_limit_check_enable = 0;
johnAlexander 6:8ac15bf6d635 3272 uint8_t range_ignore_threshold_limit_check_enable = 0;
johnAlexander 6:8ac15bf6d635 3273 FixPoint1616_t sigma_estimate;
johnAlexander 6:8ac15bf6d635 3274 FixPoint1616_t sigma_limit_value;
johnAlexander 6:8ac15bf6d635 3275 FixPoint1616_t signal_ref_clip_value;
johnAlexander 6:8ac15bf6d635 3276 FixPoint1616_t range_ignore_threshold_value;
johnAlexander 6:8ac15bf6d635 3277 FixPoint1616_t signal_rate_per_spad;
johnAlexander 6:8ac15bf6d635 3278 uint8_t device_range_status_internal = 0;
johnAlexander 6:8ac15bf6d635 3279 uint16_t tmp_word = 0;
johnAlexander 6:8ac15bf6d635 3280 uint8_t temp8;
johnAlexander 6:8ac15bf6d635 3281 uint32_t dmax_mm = 0;
johnAlexander 6:8ac15bf6d635 3282 FixPoint1616_t last_signal_ref_mcps;
johnAlexander 6:8ac15bf6d635 3283
johnAlexander 6:8ac15bf6d635 3284 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 3285
johnAlexander 6:8ac15bf6d635 3286
johnAlexander 6:8ac15bf6d635 3287 /*
johnAlexander 6:8ac15bf6d635 3288 * VL53L0X has a good ranging when the value of the
johnAlexander 6:8ac15bf6d635 3289 * DeviceRangeStatus = 11. This function will replace the value 0 with
johnAlexander 6:8ac15bf6d635 3290 * the value 11 in the DeviceRangeStatus.
johnAlexander 6:8ac15bf6d635 3291 * In addition, the SigmaEstimator is not included in the VL53L0X
johnAlexander 6:8ac15bf6d635 3292 * DeviceRangeStatus, this will be added in the PalRangeStatus.
johnAlexander 6:8ac15bf6d635 3293 */
johnAlexander 6:8ac15bf6d635 3294
johnAlexander 6:8ac15bf6d635 3295 device_range_status_internal = ((device_range_status & 0x78) >> 3);
johnAlexander 6:8ac15bf6d635 3296
johnAlexander 6:8ac15bf6d635 3297 if (device_range_status_internal == 0 ||
johnAlexander 6:8ac15bf6d635 3298 device_range_status_internal == 5 ||
johnAlexander 6:8ac15bf6d635 3299 device_range_status_internal == 7 ||
johnAlexander 6:8ac15bf6d635 3300 device_range_status_internal == 12 ||
johnAlexander 6:8ac15bf6d635 3301 device_range_status_internal == 13 ||
johnAlexander 6:8ac15bf6d635 3302 device_range_status_internal == 14 ||
johnAlexander 6:8ac15bf6d635 3303 device_range_status_internal == 15
johnAlexander 6:8ac15bf6d635 3304 ) {
johnAlexander 6:8ac15bf6d635 3305 none_flag = 1;
johnAlexander 6:8ac15bf6d635 3306 } else {
johnAlexander 6:8ac15bf6d635 3307 none_flag = 0;
johnAlexander 6:8ac15bf6d635 3308 }
johnAlexander 6:8ac15bf6d635 3309
johnAlexander 6:8ac15bf6d635 3310 /*
johnAlexander 6:8ac15bf6d635 3311 * Check if Sigma limit is enabled, if yes then do comparison with limit
johnAlexander 6:8ac15bf6d635 3312 * value and put the result back into pPalRangeStatus.
johnAlexander 6:8ac15bf6d635 3313 */
johnAlexander 6:8ac15bf6d635 3314 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3315 status = VL53L0X_get_limit_check_enable(dev,
johnAlexander 6:8ac15bf6d635 3316 VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,
johnAlexander 6:8ac15bf6d635 3317 &sigma_limit_check_enable);
johnAlexander 6:8ac15bf6d635 3318 }
johnAlexander 6:8ac15bf6d635 3319
johnAlexander 6:8ac15bf6d635 3320 if ((sigma_limit_check_enable != 0) && (status == VL53L0X_ERROR_NONE)) {
johnAlexander 6:8ac15bf6d635 3321 /*
johnAlexander 6:8ac15bf6d635 3322 * compute the Sigma and check with limit
johnAlexander 6:8ac15bf6d635 3323 */
johnAlexander 6:8ac15bf6d635 3324 status = VL53L0X_calc_sigma_estimate(
johnAlexander 6:8ac15bf6d635 3325 dev,
johnAlexander 6:8ac15bf6d635 3326 p_ranging_measurement_data,
johnAlexander 6:8ac15bf6d635 3327 &sigma_estimate,
johnAlexander 6:8ac15bf6d635 3328 &dmax_mm);
johnAlexander 6:8ac15bf6d635 3329 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3330 p_ranging_measurement_data->RangeDMaxMilliMeter = dmax_mm;
johnAlexander 6:8ac15bf6d635 3331 }
johnAlexander 6:8ac15bf6d635 3332
johnAlexander 6:8ac15bf6d635 3333 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3334 status = VL53L0X_get_limit_check_value(dev,
johnAlexander 6:8ac15bf6d635 3335 VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,
johnAlexander 6:8ac15bf6d635 3336 &sigma_limit_value);
johnAlexander 6:8ac15bf6d635 3337
johnAlexander 6:8ac15bf6d635 3338 if ((sigma_limit_value > 0) &&
johnAlexander 6:8ac15bf6d635 3339 (sigma_estimate > sigma_limit_value)) {
johnAlexander 6:8ac15bf6d635 3340 /* Limit Fail */
johnAlexander 6:8ac15bf6d635 3341 sigma_limitflag = 1;
johnAlexander 6:8ac15bf6d635 3342 }
johnAlexander 6:8ac15bf6d635 3343 }
johnAlexander 6:8ac15bf6d635 3344 }
johnAlexander 6:8ac15bf6d635 3345
johnAlexander 6:8ac15bf6d635 3346 /*
johnAlexander 6:8ac15bf6d635 3347 * Check if Signal ref clip limit is enabled, if yes then do comparison
johnAlexander 6:8ac15bf6d635 3348 * with limit value and put the result back into pPalRangeStatus.
johnAlexander 6:8ac15bf6d635 3349 */
johnAlexander 6:8ac15bf6d635 3350 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3351 status = VL53L0X_get_limit_check_enable(dev,
johnAlexander 6:8ac15bf6d635 3352 VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP,
johnAlexander 6:8ac15bf6d635 3353 &signal_ref_clip_limit_check_enable);
johnAlexander 6:8ac15bf6d635 3354 }
johnAlexander 6:8ac15bf6d635 3355
johnAlexander 6:8ac15bf6d635 3356 if ((signal_ref_clip_limit_check_enable != 0) &&
johnAlexander 6:8ac15bf6d635 3357 (status == VL53L0X_ERROR_NONE)) {
johnAlexander 6:8ac15bf6d635 3358
johnAlexander 6:8ac15bf6d635 3359 status = VL53L0X_get_limit_check_value(dev,
johnAlexander 6:8ac15bf6d635 3360 VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP,
johnAlexander 6:8ac15bf6d635 3361 &signal_ref_clip_value);
johnAlexander 6:8ac15bf6d635 3362
johnAlexander 6:8ac15bf6d635 3363 /* Read LastSignalRefMcps from device */
johnAlexander 6:8ac15bf6d635 3364 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3365 status = VL53L0X_write_byte(dev, 0xFF, 0x01);
johnAlexander 6:8ac15bf6d635 3366 }
johnAlexander 6:8ac15bf6d635 3367
johnAlexander 6:8ac15bf6d635 3368 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3369 status = VL53L0X_read_word(dev,
johnAlexander 6:8ac15bf6d635 3370 VL53L0X_REG_RESULT_PEAK_SIGNAL_RATE_REF,
johnAlexander 6:8ac15bf6d635 3371 &tmp_word);
johnAlexander 6:8ac15bf6d635 3372 }
johnAlexander 6:8ac15bf6d635 3373
johnAlexander 6:8ac15bf6d635 3374 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3375 status = VL53L0X_write_byte(dev, 0xFF, 0x00);
johnAlexander 6:8ac15bf6d635 3376 }
johnAlexander 6:8ac15bf6d635 3377
johnAlexander 6:8ac15bf6d635 3378 last_signal_ref_mcps = VL53L0X_FIXPOINT97TOFIXPOINT1616(tmp_word);
johnAlexander 6:8ac15bf6d635 3379 PALDevDataSet(dev, LastSignalRefMcps, last_signal_ref_mcps);
johnAlexander 6:8ac15bf6d635 3380
johnAlexander 6:8ac15bf6d635 3381 if ((signal_ref_clip_value > 0) &&
johnAlexander 6:8ac15bf6d635 3382 (last_signal_ref_mcps > signal_ref_clip_value)) {
johnAlexander 6:8ac15bf6d635 3383 /* Limit Fail */
johnAlexander 6:8ac15bf6d635 3384 signal_ref_clipflag = 1;
johnAlexander 6:8ac15bf6d635 3385 }
johnAlexander 6:8ac15bf6d635 3386 }
johnAlexander 6:8ac15bf6d635 3387
johnAlexander 6:8ac15bf6d635 3388 /*
johnAlexander 6:8ac15bf6d635 3389 * Check if Signal ref clip limit is enabled, if yes then do comparison
johnAlexander 6:8ac15bf6d635 3390 * with limit value and put the result back into pPalRangeStatus.
johnAlexander 6:8ac15bf6d635 3391 * EffectiveSpadRtnCount has a format 8.8
johnAlexander 6:8ac15bf6d635 3392 * If (Return signal rate < (1.5 x Xtalk x number of Spads)) : FAIL
johnAlexander 6:8ac15bf6d635 3393 */
johnAlexander 6:8ac15bf6d635 3394 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3395 status = VL53L0X_get_limit_check_enable(dev,
johnAlexander 6:8ac15bf6d635 3396 VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD,
johnAlexander 6:8ac15bf6d635 3397 &range_ignore_threshold_limit_check_enable);
johnAlexander 6:8ac15bf6d635 3398 }
johnAlexander 6:8ac15bf6d635 3399
johnAlexander 6:8ac15bf6d635 3400 if ((range_ignore_threshold_limit_check_enable != 0) &&
johnAlexander 6:8ac15bf6d635 3401 (status == VL53L0X_ERROR_NONE)) {
johnAlexander 6:8ac15bf6d635 3402
johnAlexander 6:8ac15bf6d635 3403 /* Compute the signal rate per spad */
johnAlexander 6:8ac15bf6d635 3404 if (effective_spad_rtn_count == 0) {
johnAlexander 6:8ac15bf6d635 3405 signal_rate_per_spad = 0;
johnAlexander 6:8ac15bf6d635 3406 } else {
johnAlexander 6:8ac15bf6d635 3407 signal_rate_per_spad = (FixPoint1616_t)((256 * signal_rate)
johnAlexander 6:8ac15bf6d635 3408 / effective_spad_rtn_count);
johnAlexander 6:8ac15bf6d635 3409 }
johnAlexander 6:8ac15bf6d635 3410
johnAlexander 6:8ac15bf6d635 3411 status = VL53L0X_get_limit_check_value(dev,
johnAlexander 6:8ac15bf6d635 3412 VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD,
johnAlexander 6:8ac15bf6d635 3413 &range_ignore_threshold_value);
johnAlexander 6:8ac15bf6d635 3414
johnAlexander 6:8ac15bf6d635 3415 if ((range_ignore_threshold_value > 0) &&
johnAlexander 6:8ac15bf6d635 3416 (signal_rate_per_spad < range_ignore_threshold_value)) {
johnAlexander 6:8ac15bf6d635 3417 /* Limit Fail add 2^6 to range status */
johnAlexander 6:8ac15bf6d635 3418 range_ignore_thresholdflag = 1;
johnAlexander 6:8ac15bf6d635 3419 }
johnAlexander 6:8ac15bf6d635 3420 }
johnAlexander 6:8ac15bf6d635 3421
johnAlexander 6:8ac15bf6d635 3422 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3423 if (none_flag == 1) {
johnAlexander 6:8ac15bf6d635 3424 *p_pal_range_status = 255; /* NONE */
johnAlexander 6:8ac15bf6d635 3425 } else if (device_range_status_internal == 1 ||
johnAlexander 6:8ac15bf6d635 3426 device_range_status_internal == 2 ||
johnAlexander 6:8ac15bf6d635 3427 device_range_status_internal == 3) {
johnAlexander 6:8ac15bf6d635 3428 *p_pal_range_status = 5; /* HW fail */
johnAlexander 6:8ac15bf6d635 3429 } else if (device_range_status_internal == 6 ||
johnAlexander 6:8ac15bf6d635 3430 device_range_status_internal == 9) {
johnAlexander 6:8ac15bf6d635 3431 *p_pal_range_status = 4; /* Phase fail */
johnAlexander 6:8ac15bf6d635 3432 } else if (device_range_status_internal == 8 ||
johnAlexander 6:8ac15bf6d635 3433 device_range_status_internal == 10 ||
johnAlexander 6:8ac15bf6d635 3434 signal_ref_clipflag == 1) {
johnAlexander 6:8ac15bf6d635 3435 *p_pal_range_status = 3; /* Min range */
johnAlexander 6:8ac15bf6d635 3436 } else if (device_range_status_internal == 4 ||
johnAlexander 6:8ac15bf6d635 3437 range_ignore_thresholdflag == 1) {
johnAlexander 6:8ac15bf6d635 3438 *p_pal_range_status = 2; /* Signal Fail */
johnAlexander 6:8ac15bf6d635 3439 } else if (sigma_limitflag == 1) {
johnAlexander 6:8ac15bf6d635 3440 *p_pal_range_status = 1; /* Sigma Fail */
johnAlexander 6:8ac15bf6d635 3441 } else {
johnAlexander 6:8ac15bf6d635 3442 *p_pal_range_status = 0; /* Range Valid */
johnAlexander 6:8ac15bf6d635 3443 }
johnAlexander 6:8ac15bf6d635 3444 }
johnAlexander 6:8ac15bf6d635 3445
johnAlexander 6:8ac15bf6d635 3446 /* DMAX only relevant during range error */
johnAlexander 6:8ac15bf6d635 3447 if (*p_pal_range_status == 0) {
johnAlexander 6:8ac15bf6d635 3448 p_ranging_measurement_data->RangeDMaxMilliMeter = 0;
johnAlexander 6:8ac15bf6d635 3449 }
johnAlexander 6:8ac15bf6d635 3450
johnAlexander 6:8ac15bf6d635 3451 /* fill the Limit Check Status */
johnAlexander 6:8ac15bf6d635 3452
johnAlexander 6:8ac15bf6d635 3453 status = VL53L0X_get_limit_check_enable(dev,
johnAlexander 6:8ac15bf6d635 3454 VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,
johnAlexander 6:8ac15bf6d635 3455 &signal_rate_final_range_limit_check_enable);
johnAlexander 6:8ac15bf6d635 3456
johnAlexander 6:8ac15bf6d635 3457 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3458 if ((sigma_limit_check_enable == 0) || (sigma_limitflag == 1)) {
johnAlexander 6:8ac15bf6d635 3459 temp8 = 1;
johnAlexander 6:8ac15bf6d635 3460 } else {
johnAlexander 6:8ac15bf6d635 3461 temp8 = 0;
johnAlexander 6:8ac15bf6d635 3462 }
johnAlexander 6:8ac15bf6d635 3463 VL53L0X_SETARRAYPARAMETERFIELD(dev, LimitChecksStatus,
johnAlexander 6:8ac15bf6d635 3464 VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, temp8);
johnAlexander 6:8ac15bf6d635 3465
johnAlexander 6:8ac15bf6d635 3466 if ((device_range_status_internal == 4) ||
johnAlexander 6:8ac15bf6d635 3467 (signal_rate_final_range_limit_check_enable == 0)) {
johnAlexander 6:8ac15bf6d635 3468 temp8 = 1;
johnAlexander 6:8ac15bf6d635 3469 } else {
johnAlexander 6:8ac15bf6d635 3470 temp8 = 0;
johnAlexander 6:8ac15bf6d635 3471 }
johnAlexander 6:8ac15bf6d635 3472 VL53L0X_SETARRAYPARAMETERFIELD(dev, LimitChecksStatus,
johnAlexander 6:8ac15bf6d635 3473 VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE,
johnAlexander 6:8ac15bf6d635 3474 temp8);
johnAlexander 6:8ac15bf6d635 3475
johnAlexander 6:8ac15bf6d635 3476 if ((signal_ref_clip_limit_check_enable == 0) ||
johnAlexander 6:8ac15bf6d635 3477 (signal_ref_clipflag == 1)) {
johnAlexander 6:8ac15bf6d635 3478 temp8 = 1;
johnAlexander 6:8ac15bf6d635 3479 } else {
johnAlexander 6:8ac15bf6d635 3480 temp8 = 0;
johnAlexander 6:8ac15bf6d635 3481 }
johnAlexander 6:8ac15bf6d635 3482
johnAlexander 6:8ac15bf6d635 3483 VL53L0X_SETARRAYPARAMETERFIELD(dev, LimitChecksStatus,
johnAlexander 6:8ac15bf6d635 3484 VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP, temp8);
johnAlexander 6:8ac15bf6d635 3485
johnAlexander 6:8ac15bf6d635 3486 if ((range_ignore_threshold_limit_check_enable == 0) ||
johnAlexander 6:8ac15bf6d635 3487 (range_ignore_thresholdflag == 1)) {
johnAlexander 6:8ac15bf6d635 3488 temp8 = 1;
johnAlexander 6:8ac15bf6d635 3489 } else {
johnAlexander 6:8ac15bf6d635 3490 temp8 = 0;
johnAlexander 6:8ac15bf6d635 3491 }
johnAlexander 6:8ac15bf6d635 3492
johnAlexander 6:8ac15bf6d635 3493 VL53L0X_SETARRAYPARAMETERFIELD(dev, LimitChecksStatus,
johnAlexander 6:8ac15bf6d635 3494 VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD,
johnAlexander 6:8ac15bf6d635 3495 temp8);
johnAlexander 6:8ac15bf6d635 3496 }
johnAlexander 6:8ac15bf6d635 3497
johnAlexander 6:8ac15bf6d635 3498 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 3499 return status;
johnAlexander 6:8ac15bf6d635 3500
johnAlexander 6:8ac15bf6d635 3501 }
johnAlexander 6:8ac15bf6d635 3502
johnAlexander 6:8ac15bf6d635 3503 VL53L0X_Error VL53L0X::VL53L0X_get_ranging_measurement_data(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 3504 VL53L0X_RangingMeasurementData_t *p_ranging_measurement_data)
johnAlexander 6:8ac15bf6d635 3505 {
johnAlexander 6:8ac15bf6d635 3506 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 3507 uint8_t device_range_status;
johnAlexander 6:8ac15bf6d635 3508 uint8_t range_fractional_enable;
johnAlexander 6:8ac15bf6d635 3509 uint8_t pal_range_status;
johnAlexander 6:8ac15bf6d635 3510 uint8_t x_talk_compensation_enable;
johnAlexander 6:8ac15bf6d635 3511 uint16_t ambient_rate;
johnAlexander 6:8ac15bf6d635 3512 FixPoint1616_t signal_rate;
johnAlexander 6:8ac15bf6d635 3513 uint16_t x_talk_compensation_rate_mega_cps;
johnAlexander 6:8ac15bf6d635 3514 uint16_t effective_spad_rtn_count;
johnAlexander 6:8ac15bf6d635 3515 uint16_t tmpuint16;
johnAlexander 6:8ac15bf6d635 3516 uint16_t xtalk_range_milli_meter;
johnAlexander 6:8ac15bf6d635 3517 uint16_t linearity_corrective_gain;
johnAlexander 6:8ac15bf6d635 3518 uint8_t localBuffer[12];
johnAlexander 6:8ac15bf6d635 3519 VL53L0X_RangingMeasurementData_t last_range_data_buffer;
johnAlexander 6:8ac15bf6d635 3520
johnAlexander 6:8ac15bf6d635 3521 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 3522
johnAlexander 6:8ac15bf6d635 3523 /*
johnAlexander 6:8ac15bf6d635 3524 * use multi read even if some registers are not useful, result will
johnAlexander 6:8ac15bf6d635 3525 * be more efficient
johnAlexander 6:8ac15bf6d635 3526 * start reading at 0x14 dec20
johnAlexander 6:8ac15bf6d635 3527 * end reading at 0x21 dec33 total 14 bytes to read
johnAlexander 6:8ac15bf6d635 3528 */
johnAlexander 6:8ac15bf6d635 3529 status = VL53L0X_read_multi(dev, 0x14, localBuffer, 12);
johnAlexander 6:8ac15bf6d635 3530
johnAlexander 6:8ac15bf6d635 3531 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3532
johnAlexander 6:8ac15bf6d635 3533 p_ranging_measurement_data->ZoneId = 0; /* Only one zone */
johnAlexander 6:8ac15bf6d635 3534 p_ranging_measurement_data->TimeStamp = 0; /* Not Implemented */
johnAlexander 6:8ac15bf6d635 3535
johnAlexander 6:8ac15bf6d635 3536 tmpuint16 = VL53L0X_MAKEUINT16(localBuffer[11], localBuffer[10]);
johnAlexander 6:8ac15bf6d635 3537 /* cut1.1 if SYSTEM__RANGE_CONFIG if 1 range is 2bits fractional
johnAlexander 6:8ac15bf6d635 3538 *(format 11.2) else no fractional
johnAlexander 6:8ac15bf6d635 3539 */
johnAlexander 6:8ac15bf6d635 3540
johnAlexander 6:8ac15bf6d635 3541 p_ranging_measurement_data->MeasurementTimeUsec = 0;
johnAlexander 6:8ac15bf6d635 3542
johnAlexander 6:8ac15bf6d635 3543 signal_rate = VL53L0X_FIXPOINT97TOFIXPOINT1616(
johnAlexander 6:8ac15bf6d635 3544 VL53L0X_MAKEUINT16(localBuffer[7], localBuffer[6]));
johnAlexander 6:8ac15bf6d635 3545 /* peak_signal_count_rate_rtn_mcps */
johnAlexander 6:8ac15bf6d635 3546 p_ranging_measurement_data->SignalRateRtnMegaCps = signal_rate;
johnAlexander 6:8ac15bf6d635 3547
johnAlexander 6:8ac15bf6d635 3548 ambient_rate = VL53L0X_MAKEUINT16(localBuffer[9], localBuffer[8]);
johnAlexander 6:8ac15bf6d635 3549 p_ranging_measurement_data->AmbientRateRtnMegaCps =
johnAlexander 6:8ac15bf6d635 3550 VL53L0X_FIXPOINT97TOFIXPOINT1616(ambient_rate);
johnAlexander 6:8ac15bf6d635 3551
johnAlexander 6:8ac15bf6d635 3552 effective_spad_rtn_count = VL53L0X_MAKEUINT16(localBuffer[3],
johnAlexander 6:8ac15bf6d635 3553 localBuffer[2]);
johnAlexander 6:8ac15bf6d635 3554 /* EffectiveSpadRtnCount is 8.8 format */
johnAlexander 6:8ac15bf6d635 3555 p_ranging_measurement_data->EffectiveSpadRtnCount =
johnAlexander 6:8ac15bf6d635 3556 effective_spad_rtn_count;
johnAlexander 6:8ac15bf6d635 3557
johnAlexander 6:8ac15bf6d635 3558 device_range_status = localBuffer[0];
johnAlexander 6:8ac15bf6d635 3559
johnAlexander 6:8ac15bf6d635 3560 /* Get Linearity Corrective Gain */
johnAlexander 6:8ac15bf6d635 3561 linearity_corrective_gain = PALDevDataGet(dev,
johnAlexander 6:8ac15bf6d635 3562 LinearityCorrectiveGain);
johnAlexander 6:8ac15bf6d635 3563
johnAlexander 6:8ac15bf6d635 3564 /* Get ranging configuration */
johnAlexander 6:8ac15bf6d635 3565 range_fractional_enable = PALDevDataGet(dev,
johnAlexander 6:8ac15bf6d635 3566 RangeFractionalEnable);
johnAlexander 6:8ac15bf6d635 3567
johnAlexander 6:8ac15bf6d635 3568 if (linearity_corrective_gain != 1000) {
johnAlexander 6:8ac15bf6d635 3569
johnAlexander 6:8ac15bf6d635 3570 tmpuint16 = (uint16_t)((linearity_corrective_gain
johnAlexander 6:8ac15bf6d635 3571 * tmpuint16 + 500) / 1000);
johnAlexander 6:8ac15bf6d635 3572
johnAlexander 6:8ac15bf6d635 3573 /* Implement Xtalk */
johnAlexander 6:8ac15bf6d635 3574 VL53L0X_GETPARAMETERFIELD(dev,
johnAlexander 6:8ac15bf6d635 3575 XTalkCompensationRateMegaCps,
johnAlexander 6:8ac15bf6d635 3576 x_talk_compensation_rate_mega_cps);
johnAlexander 6:8ac15bf6d635 3577 VL53L0X_GETPARAMETERFIELD(dev, XTalkCompensationEnable,
johnAlexander 6:8ac15bf6d635 3578 x_talk_compensation_enable);
johnAlexander 6:8ac15bf6d635 3579
johnAlexander 6:8ac15bf6d635 3580 if (x_talk_compensation_enable) {
johnAlexander 6:8ac15bf6d635 3581
johnAlexander 6:8ac15bf6d635 3582 if ((signal_rate
johnAlexander 6:8ac15bf6d635 3583 - ((x_talk_compensation_rate_mega_cps
johnAlexander 6:8ac15bf6d635 3584 * effective_spad_rtn_count) >> 8))
johnAlexander 6:8ac15bf6d635 3585 <= 0) {
johnAlexander 6:8ac15bf6d635 3586 if (range_fractional_enable) {
johnAlexander 6:8ac15bf6d635 3587 xtalk_range_milli_meter = 8888;
johnAlexander 6:8ac15bf6d635 3588 } else {
johnAlexander 6:8ac15bf6d635 3589 xtalk_range_milli_meter = 8888 << 2;
johnAlexander 6:8ac15bf6d635 3590 }
johnAlexander 6:8ac15bf6d635 3591 } else {
johnAlexander 6:8ac15bf6d635 3592 xtalk_range_milli_meter =
johnAlexander 6:8ac15bf6d635 3593 (tmpuint16 * signal_rate)
johnAlexander 6:8ac15bf6d635 3594 / (signal_rate
johnAlexander 6:8ac15bf6d635 3595 - ((x_talk_compensation_rate_mega_cps
johnAlexander 6:8ac15bf6d635 3596 * effective_spad_rtn_count)
johnAlexander 6:8ac15bf6d635 3597 >> 8));
johnAlexander 6:8ac15bf6d635 3598 }
johnAlexander 6:8ac15bf6d635 3599
johnAlexander 6:8ac15bf6d635 3600 tmpuint16 = xtalk_range_milli_meter;
johnAlexander 6:8ac15bf6d635 3601 }
johnAlexander 6:8ac15bf6d635 3602
johnAlexander 6:8ac15bf6d635 3603 }
johnAlexander 6:8ac15bf6d635 3604
johnAlexander 6:8ac15bf6d635 3605 if (range_fractional_enable) {
johnAlexander 6:8ac15bf6d635 3606 p_ranging_measurement_data->RangeMilliMeter =
johnAlexander 6:8ac15bf6d635 3607 (uint16_t)((tmpuint16) >> 2);
johnAlexander 6:8ac15bf6d635 3608 p_ranging_measurement_data->RangeFractionalPart =
johnAlexander 6:8ac15bf6d635 3609 (uint8_t)((tmpuint16 & 0x03) << 6);
johnAlexander 6:8ac15bf6d635 3610 } else {
johnAlexander 6:8ac15bf6d635 3611 p_ranging_measurement_data->RangeMilliMeter = tmpuint16;
johnAlexander 6:8ac15bf6d635 3612 p_ranging_measurement_data->RangeFractionalPart = 0;
johnAlexander 6:8ac15bf6d635 3613 }
johnAlexander 6:8ac15bf6d635 3614
johnAlexander 6:8ac15bf6d635 3615 /*
johnAlexander 6:8ac15bf6d635 3616 * For a standard definition of RangeStatus, this should
johnAlexander 6:8ac15bf6d635 3617 * return 0 in case of good result after a ranging
johnAlexander 6:8ac15bf6d635 3618 * The range status depends on the device so call a device
johnAlexander 6:8ac15bf6d635 3619 * specific function to obtain the right Status.
johnAlexander 6:8ac15bf6d635 3620 */
johnAlexander 6:8ac15bf6d635 3621 status |= VL53L0X_get_pal_range_status(dev, device_range_status,
johnAlexander 6:8ac15bf6d635 3622 signal_rate, effective_spad_rtn_count,
johnAlexander 6:8ac15bf6d635 3623 p_ranging_measurement_data, &pal_range_status);
johnAlexander 6:8ac15bf6d635 3624
johnAlexander 6:8ac15bf6d635 3625 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3626 p_ranging_measurement_data->RangeStatus = pal_range_status;
johnAlexander 6:8ac15bf6d635 3627 }
johnAlexander 6:8ac15bf6d635 3628
johnAlexander 6:8ac15bf6d635 3629 }
johnAlexander 6:8ac15bf6d635 3630
johnAlexander 6:8ac15bf6d635 3631 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3632 /* Copy last read data into Dev buffer */
johnAlexander 6:8ac15bf6d635 3633 last_range_data_buffer = PALDevDataGet(dev, LastRangeMeasure);
johnAlexander 6:8ac15bf6d635 3634
johnAlexander 6:8ac15bf6d635 3635 last_range_data_buffer.RangeMilliMeter =
johnAlexander 6:8ac15bf6d635 3636 p_ranging_measurement_data->RangeMilliMeter;
johnAlexander 6:8ac15bf6d635 3637 last_range_data_buffer.RangeFractionalPart =
johnAlexander 6:8ac15bf6d635 3638 p_ranging_measurement_data->RangeFractionalPart;
johnAlexander 6:8ac15bf6d635 3639 last_range_data_buffer.RangeDMaxMilliMeter =
johnAlexander 6:8ac15bf6d635 3640 p_ranging_measurement_data->RangeDMaxMilliMeter;
johnAlexander 6:8ac15bf6d635 3641 last_range_data_buffer.MeasurementTimeUsec =
johnAlexander 6:8ac15bf6d635 3642 p_ranging_measurement_data->MeasurementTimeUsec;
johnAlexander 6:8ac15bf6d635 3643 last_range_data_buffer.SignalRateRtnMegaCps =
johnAlexander 6:8ac15bf6d635 3644 p_ranging_measurement_data->SignalRateRtnMegaCps;
johnAlexander 6:8ac15bf6d635 3645 last_range_data_buffer.AmbientRateRtnMegaCps =
johnAlexander 6:8ac15bf6d635 3646 p_ranging_measurement_data->AmbientRateRtnMegaCps;
johnAlexander 6:8ac15bf6d635 3647 last_range_data_buffer.EffectiveSpadRtnCount =
johnAlexander 6:8ac15bf6d635 3648 p_ranging_measurement_data->EffectiveSpadRtnCount;
johnAlexander 6:8ac15bf6d635 3649 last_range_data_buffer.RangeStatus =
johnAlexander 6:8ac15bf6d635 3650 p_ranging_measurement_data->RangeStatus;
johnAlexander 6:8ac15bf6d635 3651
johnAlexander 6:8ac15bf6d635 3652 PALDevDataSet(dev, LastRangeMeasure, last_range_data_buffer);
johnAlexander 6:8ac15bf6d635 3653 }
johnAlexander 6:8ac15bf6d635 3654
johnAlexander 6:8ac15bf6d635 3655 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 3656 return status;
johnAlexander 6:8ac15bf6d635 3657 }
johnAlexander 6:8ac15bf6d635 3658
johnAlexander 6:8ac15bf6d635 3659 VL53L0X_Error VL53L0X::VL53L0X_perform_single_ranging_measurement(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 3660 VL53L0X_RangingMeasurementData_t *p_ranging_measurement_data)
evgeniik 7:a4452bd2b83b 3661 {
johnAlexander 6:8ac15bf6d635 3662 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 3663
johnAlexander 6:8ac15bf6d635 3664 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 3665
johnAlexander 6:8ac15bf6d635 3666 /* This function will do a complete single ranging
johnAlexander 6:8ac15bf6d635 3667 * Here we fix the mode! */
evgeniik 7:a4452bd2b83b 3668
johnAlexander 6:8ac15bf6d635 3669 status = VL53L0X_set_device_mode(dev, VL53L0X_DEVICEMODE_SINGLE_RANGING);
evgeniik 7:a4452bd2b83b 3670
johnAlexander 6:8ac15bf6d635 3671 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3672 status = VL53L0X_perform_single_measurement(dev);
johnAlexander 6:8ac15bf6d635 3673 }
evgeniik 7:a4452bd2b83b 3674
johnAlexander 6:8ac15bf6d635 3675 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3676 status = VL53L0X_get_ranging_measurement_data(dev,
johnAlexander 6:8ac15bf6d635 3677 p_ranging_measurement_data);
johnAlexander 6:8ac15bf6d635 3678 }
johnAlexander 6:8ac15bf6d635 3679
evgeniik 7:a4452bd2b83b 3680 /*if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3681 status = VL53L0X_clear_interrupt_mask(dev, 0);
evgeniik 7:a4452bd2b83b 3682 }*/
johnAlexander 6:8ac15bf6d635 3683
johnAlexander 6:8ac15bf6d635 3684 LOG_FUNCTION_END(status);
evgeniik 7:a4452bd2b83b 3685
johnAlexander 6:8ac15bf6d635 3686 return status;
johnAlexander 6:8ac15bf6d635 3687 }
johnAlexander 6:8ac15bf6d635 3688
johnAlexander 6:8ac15bf6d635 3689 VL53L0X_Error VL53L0X::perform_ref_signal_measurement(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 3690 uint16_t *p_ref_signal_rate)
johnAlexander 6:8ac15bf6d635 3691 {
johnAlexander 6:8ac15bf6d635 3692 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 3693 VL53L0X_RangingMeasurementData_t ranging_measurement_data;
johnAlexander 6:8ac15bf6d635 3694
johnAlexander 6:8ac15bf6d635 3695 uint8_t sequence_config = 0;
johnAlexander 6:8ac15bf6d635 3696
johnAlexander 6:8ac15bf6d635 3697 /* store the value of the sequence config,
johnAlexander 6:8ac15bf6d635 3698 * this will be reset before the end of the function
johnAlexander 6:8ac15bf6d635 3699 */
johnAlexander 6:8ac15bf6d635 3700
johnAlexander 6:8ac15bf6d635 3701 sequence_config = PALDevDataGet(dev, SequenceConfig);
johnAlexander 6:8ac15bf6d635 3702
johnAlexander 6:8ac15bf6d635 3703 /*
johnAlexander 6:8ac15bf6d635 3704 * This function performs a reference signal rate measurement.
johnAlexander 6:8ac15bf6d635 3705 */
johnAlexander 6:8ac15bf6d635 3706 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3707 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 3708 VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, 0xC0);
johnAlexander 6:8ac15bf6d635 3709 }
johnAlexander 6:8ac15bf6d635 3710
johnAlexander 6:8ac15bf6d635 3711 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3712 status = VL53L0X_perform_single_ranging_measurement(dev,
johnAlexander 6:8ac15bf6d635 3713 &ranging_measurement_data);
johnAlexander 6:8ac15bf6d635 3714 }
johnAlexander 6:8ac15bf6d635 3715
johnAlexander 6:8ac15bf6d635 3716 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3717 status = VL53L0X_write_byte(dev, 0xFF, 0x01);
johnAlexander 6:8ac15bf6d635 3718 }
johnAlexander 6:8ac15bf6d635 3719
johnAlexander 6:8ac15bf6d635 3720 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3721 status = VL53L0X_read_word(dev,
johnAlexander 6:8ac15bf6d635 3722 VL53L0X_REG_RESULT_PEAK_SIGNAL_RATE_REF,
johnAlexander 6:8ac15bf6d635 3723 p_ref_signal_rate);
johnAlexander 6:8ac15bf6d635 3724 }
johnAlexander 6:8ac15bf6d635 3725
johnAlexander 6:8ac15bf6d635 3726 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3727 status = VL53L0X_write_byte(dev, 0xFF, 0x00);
johnAlexander 6:8ac15bf6d635 3728 }
johnAlexander 6:8ac15bf6d635 3729
johnAlexander 6:8ac15bf6d635 3730 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3731 /* restore the previous Sequence Config */
johnAlexander 6:8ac15bf6d635 3732 status = VL53L0X_write_byte(dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG,
johnAlexander 6:8ac15bf6d635 3733 sequence_config);
johnAlexander 6:8ac15bf6d635 3734 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3735 PALDevDataSet(dev, SequenceConfig, sequence_config);
johnAlexander 6:8ac15bf6d635 3736 }
johnAlexander 6:8ac15bf6d635 3737 }
johnAlexander 6:8ac15bf6d635 3738
johnAlexander 6:8ac15bf6d635 3739 return status;
johnAlexander 6:8ac15bf6d635 3740 }
johnAlexander 6:8ac15bf6d635 3741
johnAlexander 6:8ac15bf6d635 3742 VL53L0X_Error VL53L0X::wrapped_VL53L0X_perform_ref_spad_management(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 3743 uint32_t *ref_spad_count,
johnAlexander 6:8ac15bf6d635 3744 uint8_t *is_aperture_spads)
johnAlexander 6:8ac15bf6d635 3745 {
johnAlexander 6:8ac15bf6d635 3746 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 3747 uint8_t last_spad_array[6];
johnAlexander 6:8ac15bf6d635 3748 uint8_t start_select = 0xB4;
johnAlexander 6:8ac15bf6d635 3749 uint32_t minimum_spad_count = 3;
johnAlexander 6:8ac15bf6d635 3750 uint32_t max_spad_count = 44;
johnAlexander 6:8ac15bf6d635 3751 uint32_t current_spad_index = 0;
johnAlexander 6:8ac15bf6d635 3752 uint32_t last_spad_index = 0;
johnAlexander 6:8ac15bf6d635 3753 int32_t next_good_spad = 0;
johnAlexander 6:8ac15bf6d635 3754 uint16_t target_ref_rate = 0x0A00; /* 20 MCPS in 9:7 format */
johnAlexander 6:8ac15bf6d635 3755 uint16_t peak_signal_rate_ref;
johnAlexander 6:8ac15bf6d635 3756 uint32_t need_apt_spads = 0;
johnAlexander 6:8ac15bf6d635 3757 uint32_t index = 0;
johnAlexander 6:8ac15bf6d635 3758 uint32_t spad_array_size = 6;
johnAlexander 6:8ac15bf6d635 3759 uint32_t signal_rate_diff = 0;
johnAlexander 6:8ac15bf6d635 3760 uint32_t last_signal_rate_diff = 0;
johnAlexander 6:8ac15bf6d635 3761 uint8_t complete = 0;
johnAlexander 6:8ac15bf6d635 3762 uint8_t vhv_settings = 0;
johnAlexander 6:8ac15bf6d635 3763 uint8_t phase_cal = 0;
johnAlexander 6:8ac15bf6d635 3764 uint32_t ref_spad_count_int = 0;
johnAlexander 6:8ac15bf6d635 3765 uint8_t is_aperture_spads_int = 0;
johnAlexander 6:8ac15bf6d635 3766
johnAlexander 6:8ac15bf6d635 3767 /*
johnAlexander 6:8ac15bf6d635 3768 * The reference SPAD initialization procedure determines the minimum
johnAlexander 6:8ac15bf6d635 3769 * amount of reference spads to be enables to achieve a target reference
johnAlexander 6:8ac15bf6d635 3770 * signal rate and should be performed once during initialization.
johnAlexander 6:8ac15bf6d635 3771 *
johnAlexander 6:8ac15bf6d635 3772 * Either aperture or non-aperture spads are applied but never both.
johnAlexander 6:8ac15bf6d635 3773 * Firstly non-aperture spads are set, begining with 5 spads, and
johnAlexander 6:8ac15bf6d635 3774 * increased one spad at a time until the closest measurement to the
johnAlexander 6:8ac15bf6d635 3775 * target rate is achieved.
johnAlexander 6:8ac15bf6d635 3776 *
johnAlexander 6:8ac15bf6d635 3777 * If the target rate is exceeded when 5 non-aperture spads are enabled,
johnAlexander 6:8ac15bf6d635 3778 * initialization is performed instead with aperture spads.
johnAlexander 6:8ac15bf6d635 3779 *
johnAlexander 6:8ac15bf6d635 3780 * When setting spads, a 'Good Spad Map' is applied.
johnAlexander 6:8ac15bf6d635 3781 *
johnAlexander 6:8ac15bf6d635 3782 * This procedure operates within a SPAD window of interest of a maximum
johnAlexander 6:8ac15bf6d635 3783 * 44 spads.
johnAlexander 6:8ac15bf6d635 3784 * The start point is currently fixed to 180, which lies towards the end
johnAlexander 6:8ac15bf6d635 3785 * of the non-aperture quadrant and runs in to the adjacent aperture
johnAlexander 6:8ac15bf6d635 3786 * quadrant.
johnAlexander 6:8ac15bf6d635 3787 */
johnAlexander 6:8ac15bf6d635 3788 target_ref_rate = PALDevDataGet(dev, targetRefRate);
johnAlexander 6:8ac15bf6d635 3789
johnAlexander 6:8ac15bf6d635 3790 /*
johnAlexander 6:8ac15bf6d635 3791 * Initialize Spad arrays.
johnAlexander 6:8ac15bf6d635 3792 * Currently the good spad map is initialised to 'All good'.
johnAlexander 6:8ac15bf6d635 3793 * This is a short term implementation. The good spad map will be
johnAlexander 6:8ac15bf6d635 3794 * provided as an input.
johnAlexander 6:8ac15bf6d635 3795 * Note that there are 6 bytes. Only the first 44 bits will be used to
johnAlexander 6:8ac15bf6d635 3796 * represent spads.
johnAlexander 6:8ac15bf6d635 3797 */
johnAlexander 6:8ac15bf6d635 3798 for (index = 0; index < spad_array_size; index++) {
johnAlexander 6:8ac15bf6d635 3799 dev->Data.SpadData.RefSpadEnables[index] = 0;
johnAlexander 6:8ac15bf6d635 3800 }
johnAlexander 6:8ac15bf6d635 3801
johnAlexander 6:8ac15bf6d635 3802
johnAlexander 6:8ac15bf6d635 3803 status = VL53L0X_write_byte(dev, 0xFF, 0x01);
johnAlexander 6:8ac15bf6d635 3804
johnAlexander 6:8ac15bf6d635 3805 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3806 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 3807 VL53L0X_REG_DYNAMIC_SPAD_REF_EN_START_OFFSET, 0x00);
johnAlexander 6:8ac15bf6d635 3808 }
johnAlexander 6:8ac15bf6d635 3809
johnAlexander 6:8ac15bf6d635 3810 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3811 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 3812 VL53L0X_REG_DYNAMIC_SPAD_NUM_REQUESTED_REF_SPAD, 0x2C);
johnAlexander 6:8ac15bf6d635 3813 }
johnAlexander 6:8ac15bf6d635 3814
johnAlexander 6:8ac15bf6d635 3815 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3816 status = VL53L0X_write_byte(dev, 0xFF, 0x00);
johnAlexander 6:8ac15bf6d635 3817 }
johnAlexander 6:8ac15bf6d635 3818
johnAlexander 6:8ac15bf6d635 3819 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3820 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 3821 VL53L0X_REG_GLOBAL_CONFIG_REF_EN_START_SELECT,
johnAlexander 6:8ac15bf6d635 3822 start_select);
johnAlexander 6:8ac15bf6d635 3823 }
johnAlexander 6:8ac15bf6d635 3824
johnAlexander 6:8ac15bf6d635 3825 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3826 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 3827 VL53L0X_REG_POWER_MANAGEMENT_GO1_POWER_FORCE, 0);
johnAlexander 6:8ac15bf6d635 3828 }
johnAlexander 6:8ac15bf6d635 3829
johnAlexander 6:8ac15bf6d635 3830 /* Perform ref calibration */
johnAlexander 6:8ac15bf6d635 3831 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3832 status = VL53L0X_perform_ref_calibration(dev, &vhv_settings,
johnAlexander 6:8ac15bf6d635 3833 &phase_cal, 0);
johnAlexander 6:8ac15bf6d635 3834 }
johnAlexander 6:8ac15bf6d635 3835
johnAlexander 6:8ac15bf6d635 3836 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3837 /* Enable Minimum NON-APERTURE Spads */
johnAlexander 6:8ac15bf6d635 3838 current_spad_index = 0;
johnAlexander 6:8ac15bf6d635 3839 last_spad_index = current_spad_index;
johnAlexander 6:8ac15bf6d635 3840 need_apt_spads = 0;
johnAlexander 6:8ac15bf6d635 3841 status = enable_ref_spads(dev,
johnAlexander 6:8ac15bf6d635 3842 need_apt_spads,
johnAlexander 6:8ac15bf6d635 3843 dev->Data.SpadData.RefGoodSpadMap,
johnAlexander 6:8ac15bf6d635 3844 dev->Data.SpadData.RefSpadEnables,
johnAlexander 6:8ac15bf6d635 3845 spad_array_size,
johnAlexander 6:8ac15bf6d635 3846 start_select,
johnAlexander 6:8ac15bf6d635 3847 current_spad_index,
johnAlexander 6:8ac15bf6d635 3848 minimum_spad_count,
johnAlexander 6:8ac15bf6d635 3849 &last_spad_index);
johnAlexander 6:8ac15bf6d635 3850 }
johnAlexander 6:8ac15bf6d635 3851
johnAlexander 6:8ac15bf6d635 3852 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3853 current_spad_index = last_spad_index;
johnAlexander 6:8ac15bf6d635 3854
johnAlexander 6:8ac15bf6d635 3855 status = perform_ref_signal_measurement(dev,
johnAlexander 6:8ac15bf6d635 3856 &peak_signal_rate_ref);
johnAlexander 6:8ac15bf6d635 3857 if ((status == VL53L0X_ERROR_NONE) &&
johnAlexander 6:8ac15bf6d635 3858 (peak_signal_rate_ref > target_ref_rate)) {
johnAlexander 6:8ac15bf6d635 3859 /* Signal rate measurement too high,
johnAlexander 6:8ac15bf6d635 3860 * switch to APERTURE SPADs */
johnAlexander 6:8ac15bf6d635 3861
johnAlexander 6:8ac15bf6d635 3862 for (index = 0; index < spad_array_size; index++) {
johnAlexander 6:8ac15bf6d635 3863 dev->Data.SpadData.RefSpadEnables[index] = 0;
johnAlexander 6:8ac15bf6d635 3864 }
johnAlexander 6:8ac15bf6d635 3865
johnAlexander 6:8ac15bf6d635 3866
johnAlexander 6:8ac15bf6d635 3867 /* Increment to the first APERTURE spad */
johnAlexander 6:8ac15bf6d635 3868 while ((is_aperture(start_select + current_spad_index)
johnAlexander 6:8ac15bf6d635 3869 == 0) && (current_spad_index < max_spad_count)) {
johnAlexander 6:8ac15bf6d635 3870 current_spad_index++;
johnAlexander 6:8ac15bf6d635 3871 }
johnAlexander 6:8ac15bf6d635 3872
johnAlexander 6:8ac15bf6d635 3873 need_apt_spads = 1;
johnAlexander 6:8ac15bf6d635 3874
johnAlexander 6:8ac15bf6d635 3875 status = enable_ref_spads(dev,
johnAlexander 6:8ac15bf6d635 3876 need_apt_spads,
johnAlexander 6:8ac15bf6d635 3877 dev->Data.SpadData.RefGoodSpadMap,
johnAlexander 6:8ac15bf6d635 3878 dev->Data.SpadData.RefSpadEnables,
johnAlexander 6:8ac15bf6d635 3879 spad_array_size,
johnAlexander 6:8ac15bf6d635 3880 start_select,
johnAlexander 6:8ac15bf6d635 3881 current_spad_index,
johnAlexander 6:8ac15bf6d635 3882 minimum_spad_count,
johnAlexander 6:8ac15bf6d635 3883 &last_spad_index);
johnAlexander 6:8ac15bf6d635 3884
johnAlexander 6:8ac15bf6d635 3885 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3886 current_spad_index = last_spad_index;
johnAlexander 6:8ac15bf6d635 3887 status = perform_ref_signal_measurement(dev,
johnAlexander 6:8ac15bf6d635 3888 &peak_signal_rate_ref);
johnAlexander 6:8ac15bf6d635 3889
johnAlexander 6:8ac15bf6d635 3890 if ((status == VL53L0X_ERROR_NONE) &&
johnAlexander 6:8ac15bf6d635 3891 (peak_signal_rate_ref > target_ref_rate)) {
johnAlexander 6:8ac15bf6d635 3892 /* Signal rate still too high after
johnAlexander 6:8ac15bf6d635 3893 * setting the minimum number of
johnAlexander 6:8ac15bf6d635 3894 * APERTURE spads. Can do no more
johnAlexander 6:8ac15bf6d635 3895 * therefore set the min number of
johnAlexander 6:8ac15bf6d635 3896 * aperture spads as the result.
johnAlexander 6:8ac15bf6d635 3897 */
johnAlexander 6:8ac15bf6d635 3898 is_aperture_spads_int = 1;
johnAlexander 6:8ac15bf6d635 3899 ref_spad_count_int = minimum_spad_count;
johnAlexander 6:8ac15bf6d635 3900 }
johnAlexander 6:8ac15bf6d635 3901 }
johnAlexander 6:8ac15bf6d635 3902 } else {
johnAlexander 6:8ac15bf6d635 3903 need_apt_spads = 0;
johnAlexander 6:8ac15bf6d635 3904 }
johnAlexander 6:8ac15bf6d635 3905 }
johnAlexander 6:8ac15bf6d635 3906
johnAlexander 6:8ac15bf6d635 3907 if ((status == VL53L0X_ERROR_NONE) &&
johnAlexander 6:8ac15bf6d635 3908 (peak_signal_rate_ref < target_ref_rate)) {
johnAlexander 6:8ac15bf6d635 3909 /* At this point, the minimum number of either aperture
johnAlexander 6:8ac15bf6d635 3910 * or non-aperture spads have been set. Proceed to add
johnAlexander 6:8ac15bf6d635 3911 * spads and perform measurements until the target
johnAlexander 6:8ac15bf6d635 3912 * reference is reached.
johnAlexander 6:8ac15bf6d635 3913 */
johnAlexander 6:8ac15bf6d635 3914 is_aperture_spads_int = need_apt_spads;
johnAlexander 6:8ac15bf6d635 3915 ref_spad_count_int = minimum_spad_count;
johnAlexander 6:8ac15bf6d635 3916
johnAlexander 6:8ac15bf6d635 3917 memcpy(last_spad_array, dev->Data.SpadData.RefSpadEnables,
johnAlexander 6:8ac15bf6d635 3918 spad_array_size);
johnAlexander 6:8ac15bf6d635 3919 last_signal_rate_diff = abs(peak_signal_rate_ref -
johnAlexander 6:8ac15bf6d635 3920 target_ref_rate);
johnAlexander 6:8ac15bf6d635 3921 complete = 0;
johnAlexander 6:8ac15bf6d635 3922
johnAlexander 6:8ac15bf6d635 3923 while (!complete) {
johnAlexander 6:8ac15bf6d635 3924 get_next_good_spad(
johnAlexander 6:8ac15bf6d635 3925 dev->Data.SpadData.RefGoodSpadMap,
johnAlexander 6:8ac15bf6d635 3926 spad_array_size, current_spad_index,
johnAlexander 6:8ac15bf6d635 3927 &next_good_spad);
johnAlexander 6:8ac15bf6d635 3928
johnAlexander 6:8ac15bf6d635 3929 if (next_good_spad == -1) {
johnAlexander 6:8ac15bf6d635 3930 status = VL53L0X_ERROR_REF_SPAD_INIT;
johnAlexander 6:8ac15bf6d635 3931 break;
johnAlexander 6:8ac15bf6d635 3932 }
johnAlexander 6:8ac15bf6d635 3933
johnAlexander 6:8ac15bf6d635 3934 /* Cannot combine Aperture and Non-Aperture spads, so
johnAlexander 6:8ac15bf6d635 3935 * ensure the current spad is of the correct type.
johnAlexander 6:8ac15bf6d635 3936 */
johnAlexander 6:8ac15bf6d635 3937 if (is_aperture((uint32_t)start_select + next_good_spad) !=
johnAlexander 6:8ac15bf6d635 3938 need_apt_spads) {
johnAlexander 6:8ac15bf6d635 3939 /* At this point we have enabled the maximum
johnAlexander 6:8ac15bf6d635 3940 * number of Aperture spads.
johnAlexander 6:8ac15bf6d635 3941 */
johnAlexander 6:8ac15bf6d635 3942 complete = 1;
johnAlexander 6:8ac15bf6d635 3943 break;
johnAlexander 6:8ac15bf6d635 3944 }
johnAlexander 6:8ac15bf6d635 3945
johnAlexander 6:8ac15bf6d635 3946 (ref_spad_count_int)++;
johnAlexander 6:8ac15bf6d635 3947
johnAlexander 6:8ac15bf6d635 3948 current_spad_index = next_good_spad;
johnAlexander 6:8ac15bf6d635 3949 status = enable_spad_bit(
johnAlexander 6:8ac15bf6d635 3950 dev->Data.SpadData.RefSpadEnables,
johnAlexander 6:8ac15bf6d635 3951 spad_array_size, current_spad_index);
johnAlexander 6:8ac15bf6d635 3952
johnAlexander 6:8ac15bf6d635 3953 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3954 current_spad_index++;
johnAlexander 6:8ac15bf6d635 3955 /* Proceed to apply the additional spad and
johnAlexander 6:8ac15bf6d635 3956 * perform measurement. */
johnAlexander 6:8ac15bf6d635 3957 status = set_ref_spad_map(dev,
johnAlexander 6:8ac15bf6d635 3958 dev->Data.SpadData.RefSpadEnables);
johnAlexander 6:8ac15bf6d635 3959 }
johnAlexander 6:8ac15bf6d635 3960
johnAlexander 6:8ac15bf6d635 3961 if (status != VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3962 break;
johnAlexander 6:8ac15bf6d635 3963 }
johnAlexander 6:8ac15bf6d635 3964
johnAlexander 6:8ac15bf6d635 3965 status = perform_ref_signal_measurement(dev,
johnAlexander 6:8ac15bf6d635 3966 &peak_signal_rate_ref);
johnAlexander 6:8ac15bf6d635 3967
johnAlexander 6:8ac15bf6d635 3968 if (status != VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 3969 break;
johnAlexander 6:8ac15bf6d635 3970 }
johnAlexander 6:8ac15bf6d635 3971
johnAlexander 6:8ac15bf6d635 3972 signal_rate_diff = abs(peak_signal_rate_ref - target_ref_rate);
johnAlexander 6:8ac15bf6d635 3973
johnAlexander 6:8ac15bf6d635 3974 if (peak_signal_rate_ref > target_ref_rate) {
johnAlexander 6:8ac15bf6d635 3975 /* Select the spad map that provides the
johnAlexander 6:8ac15bf6d635 3976 * measurement closest to the target rate,
johnAlexander 6:8ac15bf6d635 3977 * either above or below it.
johnAlexander 6:8ac15bf6d635 3978 */
johnAlexander 6:8ac15bf6d635 3979 if (signal_rate_diff > last_signal_rate_diff) {
johnAlexander 6:8ac15bf6d635 3980 /* Previous spad map produced a closer
johnAlexander 6:8ac15bf6d635 3981 * measurement, so choose this. */
johnAlexander 6:8ac15bf6d635 3982 status = set_ref_spad_map(dev,
johnAlexander 6:8ac15bf6d635 3983 last_spad_array);
johnAlexander 6:8ac15bf6d635 3984 memcpy(
johnAlexander 6:8ac15bf6d635 3985 dev->Data.SpadData.RefSpadEnables,
johnAlexander 6:8ac15bf6d635 3986 last_spad_array, spad_array_size);
johnAlexander 6:8ac15bf6d635 3987
johnAlexander 6:8ac15bf6d635 3988 (ref_spad_count_int)--;
johnAlexander 6:8ac15bf6d635 3989 }
johnAlexander 6:8ac15bf6d635 3990 complete = 1;
johnAlexander 6:8ac15bf6d635 3991 } else {
johnAlexander 6:8ac15bf6d635 3992 /* Continue to add spads */
johnAlexander 6:8ac15bf6d635 3993 last_signal_rate_diff = signal_rate_diff;
johnAlexander 6:8ac15bf6d635 3994 memcpy(last_spad_array,
johnAlexander 6:8ac15bf6d635 3995 dev->Data.SpadData.RefSpadEnables,
johnAlexander 6:8ac15bf6d635 3996 spad_array_size);
johnAlexander 6:8ac15bf6d635 3997 }
johnAlexander 6:8ac15bf6d635 3998
johnAlexander 6:8ac15bf6d635 3999 } /* while */
johnAlexander 6:8ac15bf6d635 4000 }
johnAlexander 6:8ac15bf6d635 4001
johnAlexander 6:8ac15bf6d635 4002 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4003 *ref_spad_count = ref_spad_count_int;
johnAlexander 6:8ac15bf6d635 4004 *is_aperture_spads = is_aperture_spads_int;
johnAlexander 6:8ac15bf6d635 4005
johnAlexander 6:8ac15bf6d635 4006 VL53L0X_SETDEVICESPECIFICPARAMETER(dev, RefSpadsInitialised, 1);
johnAlexander 6:8ac15bf6d635 4007 VL53L0X_SETDEVICESPECIFICPARAMETER(dev,
johnAlexander 6:8ac15bf6d635 4008 ReferenceSpadCount, (uint8_t)(*ref_spad_count));
johnAlexander 6:8ac15bf6d635 4009 VL53L0X_SETDEVICESPECIFICPARAMETER(dev,
johnAlexander 6:8ac15bf6d635 4010 ReferenceSpadType, *is_aperture_spads);
johnAlexander 6:8ac15bf6d635 4011 }
johnAlexander 6:8ac15bf6d635 4012
johnAlexander 6:8ac15bf6d635 4013 return status;
johnAlexander 6:8ac15bf6d635 4014 }
johnAlexander 6:8ac15bf6d635 4015
johnAlexander 6:8ac15bf6d635 4016 VL53L0X_Error VL53L0X::VL53L0X_set_reference_spads(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 4017 uint32_t count, uint8_t is_aperture_spads)
johnAlexander 6:8ac15bf6d635 4018 {
johnAlexander 6:8ac15bf6d635 4019 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 4020 uint32_t current_spad_index = 0;
johnAlexander 6:8ac15bf6d635 4021 uint8_t start_select = 0xB4;
johnAlexander 6:8ac15bf6d635 4022 uint32_t spad_array_size = 6;
johnAlexander 6:8ac15bf6d635 4023 uint32_t max_spad_count = 44;
johnAlexander 6:8ac15bf6d635 4024 uint32_t last_spad_index;
johnAlexander 6:8ac15bf6d635 4025 uint32_t index;
johnAlexander 6:8ac15bf6d635 4026
johnAlexander 6:8ac15bf6d635 4027 /*
johnAlexander 6:8ac15bf6d635 4028 * This function applies a requested number of reference spads, either
johnAlexander 6:8ac15bf6d635 4029 * aperture or
johnAlexander 6:8ac15bf6d635 4030 * non-aperture, as requested.
johnAlexander 6:8ac15bf6d635 4031 * The good spad map will be applied.
johnAlexander 6:8ac15bf6d635 4032 */
johnAlexander 6:8ac15bf6d635 4033
johnAlexander 6:8ac15bf6d635 4034 status = VL53L0X_write_byte(dev, 0xFF, 0x01);
johnAlexander 6:8ac15bf6d635 4035
johnAlexander 6:8ac15bf6d635 4036 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4037 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 4038 VL53L0X_REG_DYNAMIC_SPAD_REF_EN_START_OFFSET, 0x00);
johnAlexander 6:8ac15bf6d635 4039 }
johnAlexander 6:8ac15bf6d635 4040
johnAlexander 6:8ac15bf6d635 4041 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4042 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 4043 VL53L0X_REG_DYNAMIC_SPAD_NUM_REQUESTED_REF_SPAD, 0x2C);
johnAlexander 6:8ac15bf6d635 4044 }
johnAlexander 6:8ac15bf6d635 4045
johnAlexander 6:8ac15bf6d635 4046 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4047 status = VL53L0X_write_byte(dev, 0xFF, 0x00);
johnAlexander 6:8ac15bf6d635 4048 }
johnAlexander 6:8ac15bf6d635 4049
johnAlexander 6:8ac15bf6d635 4050 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4051 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 4052 VL53L0X_REG_GLOBAL_CONFIG_REF_EN_START_SELECT,
johnAlexander 6:8ac15bf6d635 4053 start_select);
johnAlexander 6:8ac15bf6d635 4054 }
johnAlexander 6:8ac15bf6d635 4055
johnAlexander 6:8ac15bf6d635 4056 for (index = 0; index < spad_array_size; index++) {
johnAlexander 6:8ac15bf6d635 4057 dev->Data.SpadData.RefSpadEnables[index] = 0;
johnAlexander 6:8ac15bf6d635 4058 }
johnAlexander 6:8ac15bf6d635 4059
johnAlexander 6:8ac15bf6d635 4060 if (is_aperture_spads) {
johnAlexander 6:8ac15bf6d635 4061 /* Increment to the first APERTURE spad */
johnAlexander 6:8ac15bf6d635 4062 while ((is_aperture(start_select + current_spad_index) == 0) &&
johnAlexander 6:8ac15bf6d635 4063 (current_spad_index < max_spad_count)) {
johnAlexander 6:8ac15bf6d635 4064 current_spad_index++;
johnAlexander 6:8ac15bf6d635 4065 }
johnAlexander 6:8ac15bf6d635 4066 }
johnAlexander 6:8ac15bf6d635 4067 status = enable_ref_spads(dev,
johnAlexander 6:8ac15bf6d635 4068 is_aperture_spads,
johnAlexander 6:8ac15bf6d635 4069 dev->Data.SpadData.RefGoodSpadMap,
johnAlexander 6:8ac15bf6d635 4070 dev->Data.SpadData.RefSpadEnables,
johnAlexander 6:8ac15bf6d635 4071 spad_array_size,
johnAlexander 6:8ac15bf6d635 4072 start_select,
johnAlexander 6:8ac15bf6d635 4073 current_spad_index,
johnAlexander 6:8ac15bf6d635 4074 count,
johnAlexander 6:8ac15bf6d635 4075 &last_spad_index);
johnAlexander 6:8ac15bf6d635 4076
johnAlexander 6:8ac15bf6d635 4077 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4078 VL53L0X_SETDEVICESPECIFICPARAMETER(dev, RefSpadsInitialised, 1);
johnAlexander 6:8ac15bf6d635 4079 VL53L0X_SETDEVICESPECIFICPARAMETER(dev,
johnAlexander 6:8ac15bf6d635 4080 ReferenceSpadCount, (uint8_t)(count));
johnAlexander 6:8ac15bf6d635 4081 VL53L0X_SETDEVICESPECIFICPARAMETER(dev,
johnAlexander 6:8ac15bf6d635 4082 ReferenceSpadType, is_aperture_spads);
johnAlexander 6:8ac15bf6d635 4083 }
johnAlexander 6:8ac15bf6d635 4084
johnAlexander 6:8ac15bf6d635 4085 return status;
johnAlexander 6:8ac15bf6d635 4086 }
johnAlexander 6:8ac15bf6d635 4087
johnAlexander 6:8ac15bf6d635 4088 VL53L0X_Error VL53L0X::VL53L0X_wait_device_booted(VL53L0X_DEV dev)
johnAlexander 6:8ac15bf6d635 4089 {
johnAlexander 6:8ac15bf6d635 4090 VL53L0X_Error status = VL53L0X_ERROR_NOT_IMPLEMENTED;
johnAlexander 6:8ac15bf6d635 4091 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 4092
johnAlexander 6:8ac15bf6d635 4093 /* not implemented on VL53L0X */
johnAlexander 6:8ac15bf6d635 4094
johnAlexander 6:8ac15bf6d635 4095 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 4096 return status;
johnAlexander 6:8ac15bf6d635 4097 }
johnAlexander 6:8ac15bf6d635 4098
johnAlexander 6:8ac15bf6d635 4099 VL53L0X_Error VL53L0X::VL53L0X_perform_ref_calibration(VL53L0X_DEV dev, uint8_t *p_vhv_settings,
johnAlexander 6:8ac15bf6d635 4100 uint8_t *p_phase_cal)
johnAlexander 6:8ac15bf6d635 4101 {
johnAlexander 6:8ac15bf6d635 4102 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 4103 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 4104
johnAlexander 6:8ac15bf6d635 4105 status = VL53L0X_perform_ref_calibration(dev, p_vhv_settings,
johnAlexander 6:8ac15bf6d635 4106 p_phase_cal, 1);
johnAlexander 6:8ac15bf6d635 4107
johnAlexander 6:8ac15bf6d635 4108 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 4109 return status;
johnAlexander 6:8ac15bf6d635 4110 }
johnAlexander 6:8ac15bf6d635 4111
johnAlexander 6:8ac15bf6d635 4112 VL53L0X_Error VL53L0X::VL53L0X_perform_ref_spad_management(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 4113 uint32_t *ref_spad_count, uint8_t *is_aperture_spads)
johnAlexander 6:8ac15bf6d635 4114 {
johnAlexander 6:8ac15bf6d635 4115 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 4116 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 4117
johnAlexander 6:8ac15bf6d635 4118 status = wrapped_VL53L0X_perform_ref_spad_management(dev, ref_spad_count,
johnAlexander 6:8ac15bf6d635 4119 is_aperture_spads);
johnAlexander 6:8ac15bf6d635 4120
johnAlexander 6:8ac15bf6d635 4121 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 4122
johnAlexander 6:8ac15bf6d635 4123 return status;
johnAlexander 6:8ac15bf6d635 4124 }
johnAlexander 6:8ac15bf6d635 4125
johnAlexander 6:8ac15bf6d635 4126 /* Group PAL Init Functions */
johnAlexander 6:8ac15bf6d635 4127 VL53L0X_Error VL53L0X::VL53L0X_set_device_address(VL53L0X_DEV dev, uint8_t device_address)
johnAlexander 6:8ac15bf6d635 4128 {
johnAlexander 6:8ac15bf6d635 4129 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 4130 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 4131
johnAlexander 6:8ac15bf6d635 4132 status = VL53L0X_write_byte(dev, VL53L0X_REG_I2C_SLAVE_DEVICE_ADDRESS,
johnAlexander 6:8ac15bf6d635 4133 device_address / 2);
johnAlexander 6:8ac15bf6d635 4134
johnAlexander 6:8ac15bf6d635 4135 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 4136 return status;
johnAlexander 6:8ac15bf6d635 4137 }
johnAlexander 6:8ac15bf6d635 4138
johnAlexander 6:8ac15bf6d635 4139 VL53L0X_Error VL53L0X::VL53L0X_set_gpio_config(VL53L0X_DEV dev, uint8_t pin,
johnAlexander 6:8ac15bf6d635 4140 VL53L0X_DeviceModes device_mode, VL53L0X_GpioFunctionality functionality,
johnAlexander 6:8ac15bf6d635 4141 VL53L0X_InterruptPolarity polarity)
johnAlexander 6:8ac15bf6d635 4142 {
johnAlexander 6:8ac15bf6d635 4143 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 4144 uint8_t data;
johnAlexander 6:8ac15bf6d635 4145
johnAlexander 6:8ac15bf6d635 4146 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 4147
johnAlexander 6:8ac15bf6d635 4148 if (pin != 0) {
johnAlexander 6:8ac15bf6d635 4149 status = VL53L0X_ERROR_GPIO_NOT_EXISTING;
johnAlexander 6:8ac15bf6d635 4150 } else if (device_mode == VL53L0X_DEVICEMODE_GPIO_DRIVE) {
johnAlexander 6:8ac15bf6d635 4151 if (polarity == VL53L0X_INTERRUPTPOLARITY_LOW) {
johnAlexander 6:8ac15bf6d635 4152 data = 0x10;
johnAlexander 6:8ac15bf6d635 4153 } else {
johnAlexander 6:8ac15bf6d635 4154 data = 1;
johnAlexander 6:8ac15bf6d635 4155 }
johnAlexander 6:8ac15bf6d635 4156
johnAlexander 6:8ac15bf6d635 4157 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 4158 VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH, data);
johnAlexander 6:8ac15bf6d635 4159
johnAlexander 6:8ac15bf6d635 4160 } else {
johnAlexander 6:8ac15bf6d635 4161 if (device_mode == VL53L0X_DEVICEMODE_GPIO_OSC) {
johnAlexander 6:8ac15bf6d635 4162
johnAlexander 6:8ac15bf6d635 4163 status |= VL53L0X_write_byte(dev, 0xff, 0x01);
johnAlexander 6:8ac15bf6d635 4164 status |= VL53L0X_write_byte(dev, 0x00, 0x00);
johnAlexander 6:8ac15bf6d635 4165
johnAlexander 6:8ac15bf6d635 4166 status |= VL53L0X_write_byte(dev, 0xff, 0x00);
johnAlexander 6:8ac15bf6d635 4167 status |= VL53L0X_write_byte(dev, 0x80, 0x01);
johnAlexander 6:8ac15bf6d635 4168 status |= VL53L0X_write_byte(dev, 0x85, 0x02);
johnAlexander 6:8ac15bf6d635 4169
johnAlexander 6:8ac15bf6d635 4170 status |= VL53L0X_write_byte(dev, 0xff, 0x04);
johnAlexander 6:8ac15bf6d635 4171 status |= VL53L0X_write_byte(dev, 0xcd, 0x00);
johnAlexander 6:8ac15bf6d635 4172 status |= VL53L0X_write_byte(dev, 0xcc, 0x11);
johnAlexander 6:8ac15bf6d635 4173
johnAlexander 6:8ac15bf6d635 4174 status |= VL53L0X_write_byte(dev, 0xff, 0x07);
johnAlexander 6:8ac15bf6d635 4175 status |= VL53L0X_write_byte(dev, 0xbe, 0x00);
johnAlexander 6:8ac15bf6d635 4176
johnAlexander 6:8ac15bf6d635 4177 status |= VL53L0X_write_byte(dev, 0xff, 0x06);
johnAlexander 6:8ac15bf6d635 4178 status |= VL53L0X_write_byte(dev, 0xcc, 0x09);
johnAlexander 6:8ac15bf6d635 4179
johnAlexander 6:8ac15bf6d635 4180 status |= VL53L0X_write_byte(dev, 0xff, 0x00);
johnAlexander 6:8ac15bf6d635 4181 status |= VL53L0X_write_byte(dev, 0xff, 0x01);
johnAlexander 6:8ac15bf6d635 4182 status |= VL53L0X_write_byte(dev, 0x00, 0x00);
johnAlexander 6:8ac15bf6d635 4183
johnAlexander 6:8ac15bf6d635 4184 } else {
johnAlexander 6:8ac15bf6d635 4185
johnAlexander 6:8ac15bf6d635 4186 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4187 switch (functionality) {
johnAlexander 6:8ac15bf6d635 4188 case VL53L0X_GPIOFUNCTIONALITY_OFF:
johnAlexander 6:8ac15bf6d635 4189 data = 0x00;
johnAlexander 6:8ac15bf6d635 4190 break;
johnAlexander 6:8ac15bf6d635 4191 case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_LOW:
johnAlexander 6:8ac15bf6d635 4192 data = 0x01;
johnAlexander 6:8ac15bf6d635 4193 break;
johnAlexander 6:8ac15bf6d635 4194 case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_HIGH:
johnAlexander 6:8ac15bf6d635 4195 data = 0x02;
johnAlexander 6:8ac15bf6d635 4196 break;
johnAlexander 6:8ac15bf6d635 4197 case VL53L0X_GPIOFUNCTIONALITY_THRESHOLD_CROSSED_OUT:
johnAlexander 6:8ac15bf6d635 4198 data = 0x03;
johnAlexander 6:8ac15bf6d635 4199 break;
johnAlexander 6:8ac15bf6d635 4200 case VL53L0X_GPIOFUNCTIONALITY_NEW_MEASURE_READY:
johnAlexander 6:8ac15bf6d635 4201 data = 0x04;
johnAlexander 6:8ac15bf6d635 4202 break;
johnAlexander 6:8ac15bf6d635 4203 default:
johnAlexander 6:8ac15bf6d635 4204 status =
johnAlexander 6:8ac15bf6d635 4205 VL53L0X_ERROR_GPIO_FUNCTIONALITY_NOT_SUPPORTED;
johnAlexander 6:8ac15bf6d635 4206 }
johnAlexander 6:8ac15bf6d635 4207 }
johnAlexander 6:8ac15bf6d635 4208
johnAlexander 6:8ac15bf6d635 4209 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4210 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 4211 VL53L0X_REG_SYSTEM_INTERRUPT_CONFIG_GPIO, data);
johnAlexander 6:8ac15bf6d635 4212 }
johnAlexander 6:8ac15bf6d635 4213
johnAlexander 6:8ac15bf6d635 4214 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4215 if (polarity == VL53L0X_INTERRUPTPOLARITY_LOW) {
johnAlexander 6:8ac15bf6d635 4216 data = 0;
johnAlexander 6:8ac15bf6d635 4217 } else {
johnAlexander 6:8ac15bf6d635 4218 data = (uint8_t)(1 << 4);
johnAlexander 6:8ac15bf6d635 4219 }
johnAlexander 6:8ac15bf6d635 4220 status = VL53L0X_update_byte(dev,
johnAlexander 6:8ac15bf6d635 4221 VL53L0X_REG_GPIO_HV_MUX_ACTIVE_HIGH, 0xEF, data);
johnAlexander 6:8ac15bf6d635 4222 }
johnAlexander 6:8ac15bf6d635 4223
johnAlexander 6:8ac15bf6d635 4224 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4225 VL53L0X_SETDEVICESPECIFICPARAMETER(dev,
johnAlexander 6:8ac15bf6d635 4226 Pin0GpioFunctionality, functionality);
johnAlexander 6:8ac15bf6d635 4227 }
johnAlexander 6:8ac15bf6d635 4228
johnAlexander 6:8ac15bf6d635 4229 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4230 status = VL53L0X_clear_interrupt_mask(dev, 0);
johnAlexander 6:8ac15bf6d635 4231 }
johnAlexander 6:8ac15bf6d635 4232 }
johnAlexander 6:8ac15bf6d635 4233 }
johnAlexander 6:8ac15bf6d635 4234 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 4235 return status;
johnAlexander 6:8ac15bf6d635 4236 }
johnAlexander 6:8ac15bf6d635 4237
johnAlexander 6:8ac15bf6d635 4238 VL53L0X_Error VL53L0X::VL53L0X_get_fraction_enable(VL53L0X_DEV dev, uint8_t *p_enabled)
johnAlexander 6:8ac15bf6d635 4239 {
johnAlexander 6:8ac15bf6d635 4240 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 4241 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 4242
johnAlexander 6:8ac15bf6d635 4243 status = VL53L0X_read_byte(dev, VL53L0X_REG_SYSTEM_RANGE_CONFIG, p_enabled);
johnAlexander 6:8ac15bf6d635 4244
johnAlexander 6:8ac15bf6d635 4245 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4246 *p_enabled = (*p_enabled & 1);
johnAlexander 6:8ac15bf6d635 4247 }
johnAlexander 6:8ac15bf6d635 4248
johnAlexander 6:8ac15bf6d635 4249 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 4250 return status;
johnAlexander 6:8ac15bf6d635 4251 }
johnAlexander 6:8ac15bf6d635 4252
johnAlexander 6:8ac15bf6d635 4253 uint16_t VL53L0X::VL53L0X_encode_timeout(uint32_t timeout_macro_clks)
johnAlexander 6:8ac15bf6d635 4254 {
johnAlexander 6:8ac15bf6d635 4255 /*!
johnAlexander 6:8ac15bf6d635 4256 * Encode timeout in macro periods in (LSByte * 2^MSByte) + 1 format
johnAlexander 6:8ac15bf6d635 4257 */
johnAlexander 6:8ac15bf6d635 4258
johnAlexander 6:8ac15bf6d635 4259 uint16_t encoded_timeout = 0;
johnAlexander 6:8ac15bf6d635 4260 uint32_t ls_byte = 0;
johnAlexander 6:8ac15bf6d635 4261 uint16_t ms_byte = 0;
johnAlexander 6:8ac15bf6d635 4262
johnAlexander 6:8ac15bf6d635 4263 if (timeout_macro_clks > 0) {
johnAlexander 6:8ac15bf6d635 4264 ls_byte = timeout_macro_clks - 1;
johnAlexander 6:8ac15bf6d635 4265
johnAlexander 6:8ac15bf6d635 4266 while ((ls_byte & 0xFFFFFF00) > 0) {
johnAlexander 6:8ac15bf6d635 4267 ls_byte = ls_byte >> 1;
johnAlexander 6:8ac15bf6d635 4268 ms_byte++;
johnAlexander 6:8ac15bf6d635 4269 }
johnAlexander 6:8ac15bf6d635 4270
johnAlexander 6:8ac15bf6d635 4271 encoded_timeout = (ms_byte << 8)
johnAlexander 6:8ac15bf6d635 4272 + (uint16_t)(ls_byte & 0x000000FF);
johnAlexander 6:8ac15bf6d635 4273 }
johnAlexander 6:8ac15bf6d635 4274
johnAlexander 6:8ac15bf6d635 4275 return encoded_timeout;
johnAlexander 6:8ac15bf6d635 4276
johnAlexander 6:8ac15bf6d635 4277 }
johnAlexander 6:8ac15bf6d635 4278
johnAlexander 6:8ac15bf6d635 4279 VL53L0X_Error VL53L0X::set_sequence_step_timeout(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 4280 VL53L0X_SequenceStepId sequence_step_id,
johnAlexander 6:8ac15bf6d635 4281 uint32_t timeout_micro_secs)
johnAlexander 6:8ac15bf6d635 4282 {
johnAlexander 6:8ac15bf6d635 4283 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 4284 uint8_t current_vcsel_pulse_period_p_clk;
johnAlexander 6:8ac15bf6d635 4285 uint8_t msrc_encoded_time_out;
johnAlexander 6:8ac15bf6d635 4286 uint16_t pre_range_encoded_time_out;
johnAlexander 6:8ac15bf6d635 4287 uint16_t pre_range_time_out_m_clks;
johnAlexander 6:8ac15bf6d635 4288 uint16_t msrc_range_time_out_m_clks;
johnAlexander 6:8ac15bf6d635 4289 uint32_t final_range_time_out_m_clks;
johnAlexander 6:8ac15bf6d635 4290 uint16_t final_range_encoded_time_out;
johnAlexander 6:8ac15bf6d635 4291 VL53L0X_SchedulerSequenceSteps_t scheduler_sequence_steps;
johnAlexander 6:8ac15bf6d635 4292
johnAlexander 6:8ac15bf6d635 4293 if ((sequence_step_id == VL53L0X_SEQUENCESTEP_TCC) ||
johnAlexander 6:8ac15bf6d635 4294 (sequence_step_id == VL53L0X_SEQUENCESTEP_DSS) ||
johnAlexander 6:8ac15bf6d635 4295 (sequence_step_id == VL53L0X_SEQUENCESTEP_MSRC)) {
johnAlexander 6:8ac15bf6d635 4296
johnAlexander 6:8ac15bf6d635 4297 status = VL53L0X_get_vcsel_pulse_period(dev,
johnAlexander 6:8ac15bf6d635 4298 VL53L0X_VCSEL_PERIOD_PRE_RANGE,
johnAlexander 6:8ac15bf6d635 4299 &current_vcsel_pulse_period_p_clk);
johnAlexander 6:8ac15bf6d635 4300
johnAlexander 6:8ac15bf6d635 4301 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4302 msrc_range_time_out_m_clks = VL53L0X_calc_timeout_mclks(dev,
johnAlexander 6:8ac15bf6d635 4303 timeout_micro_secs,
johnAlexander 6:8ac15bf6d635 4304 (uint8_t)current_vcsel_pulse_period_p_clk);
johnAlexander 6:8ac15bf6d635 4305
johnAlexander 6:8ac15bf6d635 4306 if (msrc_range_time_out_m_clks > 256) {
johnAlexander 6:8ac15bf6d635 4307 msrc_encoded_time_out = 255;
johnAlexander 6:8ac15bf6d635 4308 } else {
johnAlexander 6:8ac15bf6d635 4309 msrc_encoded_time_out =
johnAlexander 6:8ac15bf6d635 4310 (uint8_t)msrc_range_time_out_m_clks - 1;
johnAlexander 6:8ac15bf6d635 4311 }
johnAlexander 6:8ac15bf6d635 4312
johnAlexander 6:8ac15bf6d635 4313 VL53L0X_SETDEVICESPECIFICPARAMETER(dev,
johnAlexander 6:8ac15bf6d635 4314 LastEncodedTimeout,
johnAlexander 6:8ac15bf6d635 4315 msrc_encoded_time_out);
johnAlexander 6:8ac15bf6d635 4316 }
johnAlexander 6:8ac15bf6d635 4317
johnAlexander 6:8ac15bf6d635 4318 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4319 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 4320 VL53L0X_REG_MSRC_CONFIG_TIMEOUT_MACROP,
johnAlexander 6:8ac15bf6d635 4321 msrc_encoded_time_out);
johnAlexander 6:8ac15bf6d635 4322 }
johnAlexander 6:8ac15bf6d635 4323 } else {
johnAlexander 6:8ac15bf6d635 4324
johnAlexander 6:8ac15bf6d635 4325 if (sequence_step_id == VL53L0X_SEQUENCESTEP_PRE_RANGE) {
johnAlexander 6:8ac15bf6d635 4326
johnAlexander 6:8ac15bf6d635 4327 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4328 status = VL53L0X_get_vcsel_pulse_period(dev,
johnAlexander 6:8ac15bf6d635 4329 VL53L0X_VCSEL_PERIOD_PRE_RANGE,
johnAlexander 6:8ac15bf6d635 4330 &current_vcsel_pulse_period_p_clk);
johnAlexander 6:8ac15bf6d635 4331 pre_range_time_out_m_clks =
johnAlexander 6:8ac15bf6d635 4332 VL53L0X_calc_timeout_mclks(dev,
johnAlexander 6:8ac15bf6d635 4333 timeout_micro_secs,
johnAlexander 6:8ac15bf6d635 4334 (uint8_t)current_vcsel_pulse_period_p_clk);
johnAlexander 6:8ac15bf6d635 4335 pre_range_encoded_time_out = VL53L0X_encode_timeout(
johnAlexander 6:8ac15bf6d635 4336 pre_range_time_out_m_clks);
johnAlexander 6:8ac15bf6d635 4337
johnAlexander 6:8ac15bf6d635 4338 VL53L0X_SETDEVICESPECIFICPARAMETER(dev,
johnAlexander 6:8ac15bf6d635 4339 LastEncodedTimeout,
johnAlexander 6:8ac15bf6d635 4340 pre_range_encoded_time_out);
johnAlexander 6:8ac15bf6d635 4341 }
johnAlexander 6:8ac15bf6d635 4342
johnAlexander 6:8ac15bf6d635 4343 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4344 status = VL53L0X_write_word(dev,
johnAlexander 6:8ac15bf6d635 4345 VL53L0X_REG_PRE_RANGE_CONFIG_TIMEOUT_MACROP_HI,
johnAlexander 6:8ac15bf6d635 4346 pre_range_encoded_time_out);
johnAlexander 6:8ac15bf6d635 4347 }
johnAlexander 6:8ac15bf6d635 4348
johnAlexander 6:8ac15bf6d635 4349 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4350 VL53L0X_SETDEVICESPECIFICPARAMETER(
johnAlexander 6:8ac15bf6d635 4351 dev,
johnAlexander 6:8ac15bf6d635 4352 PreRangeTimeoutMicroSecs,
johnAlexander 6:8ac15bf6d635 4353 timeout_micro_secs);
johnAlexander 6:8ac15bf6d635 4354 }
johnAlexander 6:8ac15bf6d635 4355 } else if (sequence_step_id == VL53L0X_SEQUENCESTEP_FINAL_RANGE) {
johnAlexander 6:8ac15bf6d635 4356
johnAlexander 6:8ac15bf6d635 4357 /* For the final range timeout, the pre-range timeout
johnAlexander 6:8ac15bf6d635 4358 * must be added. To do this both final and pre-range
johnAlexander 6:8ac15bf6d635 4359 * timeouts must be expressed in macro periods MClks
johnAlexander 6:8ac15bf6d635 4360 * because they have different vcsel periods.
johnAlexander 6:8ac15bf6d635 4361 */
johnAlexander 6:8ac15bf6d635 4362
johnAlexander 6:8ac15bf6d635 4363 VL53L0X_get_sequence_step_enables(dev,
johnAlexander 6:8ac15bf6d635 4364 &scheduler_sequence_steps);
johnAlexander 6:8ac15bf6d635 4365 pre_range_time_out_m_clks = 0;
johnAlexander 6:8ac15bf6d635 4366 if (scheduler_sequence_steps.PreRangeOn) {
johnAlexander 6:8ac15bf6d635 4367
johnAlexander 6:8ac15bf6d635 4368 /* Retrieve PRE-RANGE VCSEL Period */
johnAlexander 6:8ac15bf6d635 4369 status = VL53L0X_get_vcsel_pulse_period(dev,
johnAlexander 6:8ac15bf6d635 4370 VL53L0X_VCSEL_PERIOD_PRE_RANGE,
johnAlexander 6:8ac15bf6d635 4371 &current_vcsel_pulse_period_p_clk);
johnAlexander 6:8ac15bf6d635 4372
johnAlexander 6:8ac15bf6d635 4373 /* Retrieve PRE-RANGE Timeout in Macro periods
johnAlexander 6:8ac15bf6d635 4374 * (MCLKS) */
johnAlexander 6:8ac15bf6d635 4375 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4376 status = VL53L0X_read_word(dev, 0x51,
johnAlexander 6:8ac15bf6d635 4377 &pre_range_encoded_time_out);
johnAlexander 6:8ac15bf6d635 4378 pre_range_time_out_m_clks =
johnAlexander 6:8ac15bf6d635 4379 VL53L0X_decode_timeout(
johnAlexander 6:8ac15bf6d635 4380 pre_range_encoded_time_out);
johnAlexander 6:8ac15bf6d635 4381 }
johnAlexander 6:8ac15bf6d635 4382 }
johnAlexander 6:8ac15bf6d635 4383
johnAlexander 6:8ac15bf6d635 4384 /* Calculate FINAL RANGE Timeout in Macro Periods
johnAlexander 6:8ac15bf6d635 4385 * (MCLKS) and add PRE-RANGE value
johnAlexander 6:8ac15bf6d635 4386 */
johnAlexander 6:8ac15bf6d635 4387 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4388 status = VL53L0X_get_vcsel_pulse_period(dev,
johnAlexander 6:8ac15bf6d635 4389 VL53L0X_VCSEL_PERIOD_FINAL_RANGE,
johnAlexander 6:8ac15bf6d635 4390 &current_vcsel_pulse_period_p_clk);
johnAlexander 6:8ac15bf6d635 4391 }
johnAlexander 6:8ac15bf6d635 4392 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4393 final_range_time_out_m_clks =
johnAlexander 6:8ac15bf6d635 4394 VL53L0X_calc_timeout_mclks(dev,
johnAlexander 6:8ac15bf6d635 4395 timeout_micro_secs,
johnAlexander 6:8ac15bf6d635 4396 (uint8_t) current_vcsel_pulse_period_p_clk);
johnAlexander 6:8ac15bf6d635 4397
johnAlexander 6:8ac15bf6d635 4398 final_range_time_out_m_clks += pre_range_time_out_m_clks;
johnAlexander 6:8ac15bf6d635 4399
johnAlexander 6:8ac15bf6d635 4400 final_range_encoded_time_out =
johnAlexander 6:8ac15bf6d635 4401 VL53L0X_encode_timeout(final_range_time_out_m_clks);
johnAlexander 6:8ac15bf6d635 4402
johnAlexander 6:8ac15bf6d635 4403 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4404 status = VL53L0X_write_word(dev, 0x71,
johnAlexander 6:8ac15bf6d635 4405 final_range_encoded_time_out);
johnAlexander 6:8ac15bf6d635 4406 }
johnAlexander 6:8ac15bf6d635 4407
johnAlexander 6:8ac15bf6d635 4408 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4409 VL53L0X_SETDEVICESPECIFICPARAMETER(
johnAlexander 6:8ac15bf6d635 4410 dev,
johnAlexander 6:8ac15bf6d635 4411 FinalRangeTimeoutMicroSecs,
johnAlexander 6:8ac15bf6d635 4412 timeout_micro_secs);
johnAlexander 6:8ac15bf6d635 4413 }
johnAlexander 6:8ac15bf6d635 4414 }
johnAlexander 6:8ac15bf6d635 4415 } else {
johnAlexander 6:8ac15bf6d635 4416 status = VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 4417 }
johnAlexander 6:8ac15bf6d635 4418
johnAlexander 6:8ac15bf6d635 4419 }
johnAlexander 6:8ac15bf6d635 4420 return status;
johnAlexander 6:8ac15bf6d635 4421 }
johnAlexander 6:8ac15bf6d635 4422
johnAlexander 6:8ac15bf6d635 4423 VL53L0X_Error VL53L0X::wrapped_VL53L0X_set_measurement_timing_budget_micro_seconds(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 4424 uint32_t measurement_timing_budget_micro_seconds)
johnAlexander 6:8ac15bf6d635 4425 {
johnAlexander 6:8ac15bf6d635 4426 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 4427 uint32_t final_range_timing_budget_micro_seconds;
johnAlexander 6:8ac15bf6d635 4428 VL53L0X_SchedulerSequenceSteps_t scheduler_sequence_steps;
johnAlexander 6:8ac15bf6d635 4429 uint32_t msrc_dcc_tcc_timeout_micro_seconds = 2000;
johnAlexander 6:8ac15bf6d635 4430 uint32_t start_overhead_micro_seconds = 1910;
johnAlexander 6:8ac15bf6d635 4431 uint32_t end_overhead_micro_seconds = 960;
johnAlexander 6:8ac15bf6d635 4432 uint32_t msrc_overhead_micro_seconds = 660;
johnAlexander 6:8ac15bf6d635 4433 uint32_t tcc_overhead_micro_seconds = 590;
johnAlexander 6:8ac15bf6d635 4434 uint32_t dss_overhead_micro_seconds = 690;
johnAlexander 6:8ac15bf6d635 4435 uint32_t pre_range_overhead_micro_seconds = 660;
johnAlexander 6:8ac15bf6d635 4436 uint32_t final_range_overhead_micro_seconds = 550;
johnAlexander 6:8ac15bf6d635 4437 uint32_t pre_range_timeout_micro_seconds = 0;
johnAlexander 6:8ac15bf6d635 4438 uint32_t c_min_timing_budget_micro_seconds = 20000;
johnAlexander 6:8ac15bf6d635 4439 uint32_t sub_timeout = 0;
johnAlexander 6:8ac15bf6d635 4440
johnAlexander 6:8ac15bf6d635 4441 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 4442
johnAlexander 6:8ac15bf6d635 4443 if (measurement_timing_budget_micro_seconds
johnAlexander 6:8ac15bf6d635 4444 < c_min_timing_budget_micro_seconds) {
johnAlexander 6:8ac15bf6d635 4445 status = VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 4446 return status;
johnAlexander 6:8ac15bf6d635 4447 }
johnAlexander 6:8ac15bf6d635 4448
johnAlexander 6:8ac15bf6d635 4449 final_range_timing_budget_micro_seconds =
johnAlexander 6:8ac15bf6d635 4450 measurement_timing_budget_micro_seconds -
johnAlexander 6:8ac15bf6d635 4451 (start_overhead_micro_seconds + end_overhead_micro_seconds);
johnAlexander 6:8ac15bf6d635 4452
johnAlexander 6:8ac15bf6d635 4453 status = VL53L0X_get_sequence_step_enables(dev, &scheduler_sequence_steps);
johnAlexander 6:8ac15bf6d635 4454
johnAlexander 6:8ac15bf6d635 4455 if (status == VL53L0X_ERROR_NONE &&
johnAlexander 6:8ac15bf6d635 4456 (scheduler_sequence_steps.TccOn ||
johnAlexander 6:8ac15bf6d635 4457 scheduler_sequence_steps.MsrcOn ||
johnAlexander 6:8ac15bf6d635 4458 scheduler_sequence_steps.DssOn)) {
johnAlexander 6:8ac15bf6d635 4459
johnAlexander 6:8ac15bf6d635 4460 /* TCC, MSRC and DSS all share the same timeout */
johnAlexander 6:8ac15bf6d635 4461 status = get_sequence_step_timeout(dev,
johnAlexander 6:8ac15bf6d635 4462 VL53L0X_SEQUENCESTEP_MSRC,
johnAlexander 6:8ac15bf6d635 4463 &msrc_dcc_tcc_timeout_micro_seconds);
johnAlexander 6:8ac15bf6d635 4464
johnAlexander 6:8ac15bf6d635 4465 /* Subtract the TCC, MSRC and DSS timeouts if they are
johnAlexander 6:8ac15bf6d635 4466 * enabled. */
johnAlexander 6:8ac15bf6d635 4467
johnAlexander 6:8ac15bf6d635 4468 if (status != VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4469 return status;
johnAlexander 6:8ac15bf6d635 4470 }
johnAlexander 6:8ac15bf6d635 4471
johnAlexander 6:8ac15bf6d635 4472 /* TCC */
johnAlexander 6:8ac15bf6d635 4473 if (scheduler_sequence_steps.TccOn) {
johnAlexander 6:8ac15bf6d635 4474
johnAlexander 6:8ac15bf6d635 4475 sub_timeout = msrc_dcc_tcc_timeout_micro_seconds
johnAlexander 6:8ac15bf6d635 4476 + tcc_overhead_micro_seconds;
johnAlexander 6:8ac15bf6d635 4477
johnAlexander 6:8ac15bf6d635 4478 if (sub_timeout <
johnAlexander 6:8ac15bf6d635 4479 final_range_timing_budget_micro_seconds) {
johnAlexander 6:8ac15bf6d635 4480 final_range_timing_budget_micro_seconds -=
johnAlexander 6:8ac15bf6d635 4481 sub_timeout;
johnAlexander 6:8ac15bf6d635 4482 } else {
johnAlexander 6:8ac15bf6d635 4483 /* Requested timeout too big. */
johnAlexander 6:8ac15bf6d635 4484 status = VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 4485 }
johnAlexander 6:8ac15bf6d635 4486 }
johnAlexander 6:8ac15bf6d635 4487
johnAlexander 6:8ac15bf6d635 4488 if (status != VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4489 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 4490 return status;
johnAlexander 6:8ac15bf6d635 4491 }
johnAlexander 6:8ac15bf6d635 4492
johnAlexander 6:8ac15bf6d635 4493 /* DSS */
johnAlexander 6:8ac15bf6d635 4494 if (scheduler_sequence_steps.DssOn) {
johnAlexander 6:8ac15bf6d635 4495
johnAlexander 6:8ac15bf6d635 4496 sub_timeout = 2 * (msrc_dcc_tcc_timeout_micro_seconds +
johnAlexander 6:8ac15bf6d635 4497 dss_overhead_micro_seconds);
johnAlexander 6:8ac15bf6d635 4498
johnAlexander 6:8ac15bf6d635 4499 if (sub_timeout < final_range_timing_budget_micro_seconds) {
johnAlexander 6:8ac15bf6d635 4500 final_range_timing_budget_micro_seconds
johnAlexander 6:8ac15bf6d635 4501 -= sub_timeout;
johnAlexander 6:8ac15bf6d635 4502 } else {
johnAlexander 6:8ac15bf6d635 4503 /* Requested timeout too big. */
johnAlexander 6:8ac15bf6d635 4504 status = VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 4505 }
johnAlexander 6:8ac15bf6d635 4506 } else if (scheduler_sequence_steps.MsrcOn) {
johnAlexander 6:8ac15bf6d635 4507 /* MSRC */
johnAlexander 6:8ac15bf6d635 4508 sub_timeout = msrc_dcc_tcc_timeout_micro_seconds +
johnAlexander 6:8ac15bf6d635 4509 msrc_overhead_micro_seconds;
johnAlexander 6:8ac15bf6d635 4510
johnAlexander 6:8ac15bf6d635 4511 if (sub_timeout < final_range_timing_budget_micro_seconds) {
johnAlexander 6:8ac15bf6d635 4512 final_range_timing_budget_micro_seconds
johnAlexander 6:8ac15bf6d635 4513 -= sub_timeout;
johnAlexander 6:8ac15bf6d635 4514 } else {
johnAlexander 6:8ac15bf6d635 4515 /* Requested timeout too big. */
johnAlexander 6:8ac15bf6d635 4516 status = VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 4517 }
johnAlexander 6:8ac15bf6d635 4518 }
johnAlexander 6:8ac15bf6d635 4519
johnAlexander 6:8ac15bf6d635 4520 }
johnAlexander 6:8ac15bf6d635 4521
johnAlexander 6:8ac15bf6d635 4522 if (status != VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4523 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 4524 return status;
johnAlexander 6:8ac15bf6d635 4525 }
johnAlexander 6:8ac15bf6d635 4526
johnAlexander 6:8ac15bf6d635 4527 if (scheduler_sequence_steps.PreRangeOn) {
johnAlexander 6:8ac15bf6d635 4528
johnAlexander 6:8ac15bf6d635 4529 /* Subtract the Pre-range timeout if enabled. */
johnAlexander 6:8ac15bf6d635 4530
johnAlexander 6:8ac15bf6d635 4531 status = get_sequence_step_timeout(dev,
johnAlexander 6:8ac15bf6d635 4532 VL53L0X_SEQUENCESTEP_PRE_RANGE,
johnAlexander 6:8ac15bf6d635 4533 &pre_range_timeout_micro_seconds);
johnAlexander 6:8ac15bf6d635 4534
johnAlexander 6:8ac15bf6d635 4535 sub_timeout = pre_range_timeout_micro_seconds +
johnAlexander 6:8ac15bf6d635 4536 pre_range_overhead_micro_seconds;
johnAlexander 6:8ac15bf6d635 4537
johnAlexander 6:8ac15bf6d635 4538 if (sub_timeout < final_range_timing_budget_micro_seconds) {
johnAlexander 6:8ac15bf6d635 4539 final_range_timing_budget_micro_seconds -= sub_timeout;
johnAlexander 6:8ac15bf6d635 4540 } else {
johnAlexander 6:8ac15bf6d635 4541 /* Requested timeout too big. */
johnAlexander 6:8ac15bf6d635 4542 status = VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 4543 }
johnAlexander 6:8ac15bf6d635 4544 }
johnAlexander 6:8ac15bf6d635 4545
johnAlexander 6:8ac15bf6d635 4546
johnAlexander 6:8ac15bf6d635 4547 if (status == VL53L0X_ERROR_NONE &&
johnAlexander 6:8ac15bf6d635 4548 scheduler_sequence_steps.FinalRangeOn) {
johnAlexander 6:8ac15bf6d635 4549
johnAlexander 6:8ac15bf6d635 4550 final_range_timing_budget_micro_seconds -=
johnAlexander 6:8ac15bf6d635 4551 final_range_overhead_micro_seconds;
johnAlexander 6:8ac15bf6d635 4552
johnAlexander 6:8ac15bf6d635 4553 /* Final Range Timeout
johnAlexander 6:8ac15bf6d635 4554 * Note that the final range timeout is determined by the timing
johnAlexander 6:8ac15bf6d635 4555 * budget and the sum of all other timeouts within the sequence.
johnAlexander 6:8ac15bf6d635 4556 * If there is no room for the final range timeout, then an error
johnAlexander 6:8ac15bf6d635 4557 * will be set. Otherwise the remaining time will be applied to
johnAlexander 6:8ac15bf6d635 4558 * the final range.
johnAlexander 6:8ac15bf6d635 4559 */
johnAlexander 6:8ac15bf6d635 4560 status = set_sequence_step_timeout(dev,
johnAlexander 6:8ac15bf6d635 4561 VL53L0X_SEQUENCESTEP_FINAL_RANGE,
johnAlexander 6:8ac15bf6d635 4562 final_range_timing_budget_micro_seconds);
johnAlexander 6:8ac15bf6d635 4563
johnAlexander 6:8ac15bf6d635 4564 VL53L0X_SETPARAMETERFIELD(dev,
johnAlexander 6:8ac15bf6d635 4565 MeasurementTimingBudgetMicroSeconds,
johnAlexander 6:8ac15bf6d635 4566 measurement_timing_budget_micro_seconds);
johnAlexander 6:8ac15bf6d635 4567 }
johnAlexander 6:8ac15bf6d635 4568
johnAlexander 6:8ac15bf6d635 4569 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 4570
johnAlexander 6:8ac15bf6d635 4571 return status;
johnAlexander 6:8ac15bf6d635 4572 }
johnAlexander 6:8ac15bf6d635 4573
johnAlexander 6:8ac15bf6d635 4574 VL53L0X_Error VL53L0X::VL53L0X_set_measurement_timing_budget_micro_seconds(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 4575 uint32_t measurement_timing_budget_micro_seconds)
johnAlexander 6:8ac15bf6d635 4576 {
johnAlexander 6:8ac15bf6d635 4577 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 4578 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 4579
johnAlexander 6:8ac15bf6d635 4580 status = wrapped_VL53L0X_set_measurement_timing_budget_micro_seconds(dev,
johnAlexander 6:8ac15bf6d635 4581 measurement_timing_budget_micro_seconds);
johnAlexander 6:8ac15bf6d635 4582
johnAlexander 6:8ac15bf6d635 4583 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 4584
johnAlexander 6:8ac15bf6d635 4585 return status;
johnAlexander 6:8ac15bf6d635 4586 }
johnAlexander 6:8ac15bf6d635 4587
johnAlexander 6:8ac15bf6d635 4588 VL53L0X_Error VL53L0X::VL53L0X_set_sequence_step_enable(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 4589 VL53L0X_SequenceStepId sequence_step_id, uint8_t sequence_step_enabled)
johnAlexander 6:8ac15bf6d635 4590 {
johnAlexander 6:8ac15bf6d635 4591 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 4592 uint8_t sequence_config = 0;
johnAlexander 6:8ac15bf6d635 4593 uint8_t sequence_config_new = 0;
johnAlexander 6:8ac15bf6d635 4594 uint32_t measurement_timing_budget_micro_seconds;
johnAlexander 6:8ac15bf6d635 4595 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 4596
johnAlexander 6:8ac15bf6d635 4597 status = VL53L0X_read_byte(dev, VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG,
johnAlexander 6:8ac15bf6d635 4598 &sequence_config);
johnAlexander 6:8ac15bf6d635 4599
johnAlexander 6:8ac15bf6d635 4600 sequence_config_new = sequence_config;
johnAlexander 6:8ac15bf6d635 4601
johnAlexander 6:8ac15bf6d635 4602 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4603 if (sequence_step_enabled == 1) {
johnAlexander 6:8ac15bf6d635 4604
johnAlexander 6:8ac15bf6d635 4605 /* Enable requested sequence step
johnAlexander 6:8ac15bf6d635 4606 */
johnAlexander 6:8ac15bf6d635 4607 switch (sequence_step_id) {
johnAlexander 6:8ac15bf6d635 4608 case VL53L0X_SEQUENCESTEP_TCC:
johnAlexander 6:8ac15bf6d635 4609 sequence_config_new |= 0x10;
johnAlexander 6:8ac15bf6d635 4610 break;
johnAlexander 6:8ac15bf6d635 4611 case VL53L0X_SEQUENCESTEP_DSS:
johnAlexander 6:8ac15bf6d635 4612 sequence_config_new |= 0x28;
johnAlexander 6:8ac15bf6d635 4613 break;
johnAlexander 6:8ac15bf6d635 4614 case VL53L0X_SEQUENCESTEP_MSRC:
johnAlexander 6:8ac15bf6d635 4615 sequence_config_new |= 0x04;
johnAlexander 6:8ac15bf6d635 4616 break;
johnAlexander 6:8ac15bf6d635 4617 case VL53L0X_SEQUENCESTEP_PRE_RANGE:
johnAlexander 6:8ac15bf6d635 4618 sequence_config_new |= 0x40;
johnAlexander 6:8ac15bf6d635 4619 break;
johnAlexander 6:8ac15bf6d635 4620 case VL53L0X_SEQUENCESTEP_FINAL_RANGE:
johnAlexander 6:8ac15bf6d635 4621 sequence_config_new |= 0x80;
johnAlexander 6:8ac15bf6d635 4622 break;
johnAlexander 6:8ac15bf6d635 4623 default:
johnAlexander 6:8ac15bf6d635 4624 status = VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 4625 }
johnAlexander 6:8ac15bf6d635 4626 } else {
johnAlexander 6:8ac15bf6d635 4627 /* Disable requested sequence step
johnAlexander 6:8ac15bf6d635 4628 */
johnAlexander 6:8ac15bf6d635 4629 switch (sequence_step_id) {
johnAlexander 6:8ac15bf6d635 4630 case VL53L0X_SEQUENCESTEP_TCC:
johnAlexander 6:8ac15bf6d635 4631 sequence_config_new &= 0xef;
johnAlexander 6:8ac15bf6d635 4632 break;
johnAlexander 6:8ac15bf6d635 4633 case VL53L0X_SEQUENCESTEP_DSS:
johnAlexander 6:8ac15bf6d635 4634 sequence_config_new &= 0xd7;
johnAlexander 6:8ac15bf6d635 4635 break;
johnAlexander 6:8ac15bf6d635 4636 case VL53L0X_SEQUENCESTEP_MSRC:
johnAlexander 6:8ac15bf6d635 4637 sequence_config_new &= 0xfb;
johnAlexander 6:8ac15bf6d635 4638 break;
johnAlexander 6:8ac15bf6d635 4639 case VL53L0X_SEQUENCESTEP_PRE_RANGE:
johnAlexander 6:8ac15bf6d635 4640 sequence_config_new &= 0xbf;
johnAlexander 6:8ac15bf6d635 4641 break;
johnAlexander 6:8ac15bf6d635 4642 case VL53L0X_SEQUENCESTEP_FINAL_RANGE:
johnAlexander 6:8ac15bf6d635 4643 sequence_config_new &= 0x7f;
johnAlexander 6:8ac15bf6d635 4644 break;
johnAlexander 6:8ac15bf6d635 4645 default:
johnAlexander 6:8ac15bf6d635 4646 status = VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 4647 }
johnAlexander 6:8ac15bf6d635 4648 }
johnAlexander 6:8ac15bf6d635 4649 }
johnAlexander 6:8ac15bf6d635 4650
johnAlexander 6:8ac15bf6d635 4651 if (sequence_config_new != sequence_config) {
johnAlexander 6:8ac15bf6d635 4652 /* Apply New Setting */
johnAlexander 6:8ac15bf6d635 4653 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4654 status = VL53L0X_write_byte(dev,
johnAlexander 6:8ac15bf6d635 4655 VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, sequence_config_new);
johnAlexander 6:8ac15bf6d635 4656 }
johnAlexander 6:8ac15bf6d635 4657 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4658 PALDevDataSet(dev, SequenceConfig, sequence_config_new);
johnAlexander 6:8ac15bf6d635 4659 }
johnAlexander 6:8ac15bf6d635 4660
johnAlexander 6:8ac15bf6d635 4661
johnAlexander 6:8ac15bf6d635 4662 /* Recalculate timing budget */
johnAlexander 6:8ac15bf6d635 4663 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4664 VL53L0X_GETPARAMETERFIELD(dev,
johnAlexander 6:8ac15bf6d635 4665 MeasurementTimingBudgetMicroSeconds,
johnAlexander 6:8ac15bf6d635 4666 measurement_timing_budget_micro_seconds);
johnAlexander 6:8ac15bf6d635 4667
johnAlexander 6:8ac15bf6d635 4668 VL53L0X_set_measurement_timing_budget_micro_seconds(dev,
johnAlexander 6:8ac15bf6d635 4669 measurement_timing_budget_micro_seconds);
johnAlexander 6:8ac15bf6d635 4670 }
johnAlexander 6:8ac15bf6d635 4671 }
johnAlexander 6:8ac15bf6d635 4672
johnAlexander 6:8ac15bf6d635 4673 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 4674
johnAlexander 6:8ac15bf6d635 4675 return status;
johnAlexander 6:8ac15bf6d635 4676 }
johnAlexander 6:8ac15bf6d635 4677
johnAlexander 6:8ac15bf6d635 4678 VL53L0X_Error VL53L0X::VL53L0X_set_limit_check_enable(VL53L0X_DEV dev, uint16_t limit_check_id,
johnAlexander 6:8ac15bf6d635 4679 uint8_t limit_check_enable)
johnAlexander 6:8ac15bf6d635 4680 {
johnAlexander 6:8ac15bf6d635 4681 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 4682 FixPoint1616_t temp_fix1616 = 0;
johnAlexander 6:8ac15bf6d635 4683 uint8_t limit_check_enable_int = 0;
johnAlexander 6:8ac15bf6d635 4684 uint8_t limit_check_disable = 0;
johnAlexander 6:8ac15bf6d635 4685 uint8_t temp8;
johnAlexander 6:8ac15bf6d635 4686
johnAlexander 6:8ac15bf6d635 4687 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 4688
johnAlexander 6:8ac15bf6d635 4689 if (limit_check_id >= VL53L0X_CHECKENABLE_NUMBER_OF_CHECKS) {
johnAlexander 6:8ac15bf6d635 4690 status = VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 4691 } else {
johnAlexander 6:8ac15bf6d635 4692 if (limit_check_enable == 0) {
johnAlexander 6:8ac15bf6d635 4693 temp_fix1616 = 0;
johnAlexander 6:8ac15bf6d635 4694 limit_check_enable_int = 0;
johnAlexander 6:8ac15bf6d635 4695 limit_check_disable = 1;
johnAlexander 6:8ac15bf6d635 4696
johnAlexander 6:8ac15bf6d635 4697 } else {
johnAlexander 6:8ac15bf6d635 4698 VL53L0X_GETARRAYPARAMETERFIELD(dev, LimitChecksValue,
johnAlexander 6:8ac15bf6d635 4699 limit_check_id, temp_fix1616);
johnAlexander 6:8ac15bf6d635 4700 limit_check_disable = 0;
johnAlexander 6:8ac15bf6d635 4701 /* this to be sure to have either 0 or 1 */
johnAlexander 6:8ac15bf6d635 4702 limit_check_enable_int = 1;
johnAlexander 6:8ac15bf6d635 4703 }
johnAlexander 6:8ac15bf6d635 4704
johnAlexander 6:8ac15bf6d635 4705 switch (limit_check_id) {
johnAlexander 6:8ac15bf6d635 4706
johnAlexander 6:8ac15bf6d635 4707 case VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE:
johnAlexander 6:8ac15bf6d635 4708 /* internal computation: */
johnAlexander 6:8ac15bf6d635 4709 VL53L0X_SETARRAYPARAMETERFIELD(dev, LimitChecksEnable,
johnAlexander 6:8ac15bf6d635 4710 VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE,
johnAlexander 6:8ac15bf6d635 4711 limit_check_enable_int);
johnAlexander 6:8ac15bf6d635 4712
johnAlexander 6:8ac15bf6d635 4713 break;
johnAlexander 6:8ac15bf6d635 4714
johnAlexander 6:8ac15bf6d635 4715 case VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE:
johnAlexander 6:8ac15bf6d635 4716
johnAlexander 6:8ac15bf6d635 4717 status = VL53L0X_write_word(dev,
johnAlexander 6:8ac15bf6d635 4718 VL53L0X_REG_FINAL_RANGE_CONFIG_MIN_COUNT_RATE_RTN_LIMIT,
johnAlexander 6:8ac15bf6d635 4719 VL53L0X_FIXPOINT1616TOFIXPOINT97(temp_fix1616));
johnAlexander 6:8ac15bf6d635 4720
johnAlexander 6:8ac15bf6d635 4721 break;
johnAlexander 6:8ac15bf6d635 4722
johnAlexander 6:8ac15bf6d635 4723 case VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP:
johnAlexander 6:8ac15bf6d635 4724
johnAlexander 6:8ac15bf6d635 4725 /* internal computation: */
johnAlexander 6:8ac15bf6d635 4726 VL53L0X_SETARRAYPARAMETERFIELD(dev, LimitChecksEnable,
johnAlexander 6:8ac15bf6d635 4727 VL53L0X_CHECKENABLE_SIGNAL_REF_CLIP,
johnAlexander 6:8ac15bf6d635 4728 limit_check_enable_int);
johnAlexander 6:8ac15bf6d635 4729
johnAlexander 6:8ac15bf6d635 4730 break;
johnAlexander 6:8ac15bf6d635 4731
johnAlexander 6:8ac15bf6d635 4732 case VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD:
johnAlexander 6:8ac15bf6d635 4733
johnAlexander 6:8ac15bf6d635 4734 /* internal computation: */
johnAlexander 6:8ac15bf6d635 4735 VL53L0X_SETARRAYPARAMETERFIELD(dev, LimitChecksEnable,
johnAlexander 6:8ac15bf6d635 4736 VL53L0X_CHECKENABLE_RANGE_IGNORE_THRESHOLD,
johnAlexander 6:8ac15bf6d635 4737 limit_check_enable_int);
johnAlexander 6:8ac15bf6d635 4738
johnAlexander 6:8ac15bf6d635 4739 break;
johnAlexander 6:8ac15bf6d635 4740
johnAlexander 6:8ac15bf6d635 4741 case VL53L0X_CHECKENABLE_SIGNAL_RATE_MSRC:
johnAlexander 6:8ac15bf6d635 4742
johnAlexander 6:8ac15bf6d635 4743 temp8 = (uint8_t)(limit_check_disable << 1);
johnAlexander 6:8ac15bf6d635 4744 status = VL53L0X_update_byte(dev,
johnAlexander 6:8ac15bf6d635 4745 VL53L0X_REG_MSRC_CONFIG_CONTROL,
johnAlexander 6:8ac15bf6d635 4746 0xFE, temp8);
johnAlexander 6:8ac15bf6d635 4747
johnAlexander 6:8ac15bf6d635 4748 break;
johnAlexander 6:8ac15bf6d635 4749
johnAlexander 6:8ac15bf6d635 4750 case VL53L0X_CHECKENABLE_SIGNAL_RATE_PRE_RANGE:
johnAlexander 6:8ac15bf6d635 4751
johnAlexander 6:8ac15bf6d635 4752 temp8 = (uint8_t)(limit_check_disable << 4);
johnAlexander 6:8ac15bf6d635 4753 status = VL53L0X_update_byte(dev,
johnAlexander 6:8ac15bf6d635 4754 VL53L0X_REG_MSRC_CONFIG_CONTROL,
johnAlexander 6:8ac15bf6d635 4755 0xEF, temp8);
johnAlexander 6:8ac15bf6d635 4756
johnAlexander 6:8ac15bf6d635 4757 break;
johnAlexander 6:8ac15bf6d635 4758
johnAlexander 6:8ac15bf6d635 4759
johnAlexander 6:8ac15bf6d635 4760 default:
johnAlexander 6:8ac15bf6d635 4761 status = VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 4762
johnAlexander 6:8ac15bf6d635 4763 }
johnAlexander 6:8ac15bf6d635 4764
johnAlexander 6:8ac15bf6d635 4765 }
johnAlexander 6:8ac15bf6d635 4766
johnAlexander 6:8ac15bf6d635 4767 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4768 if (limit_check_enable == 0) {
johnAlexander 6:8ac15bf6d635 4769 VL53L0X_SETARRAYPARAMETERFIELD(dev, LimitChecksEnable,
johnAlexander 6:8ac15bf6d635 4770 limit_check_id, 0);
johnAlexander 6:8ac15bf6d635 4771 } else {
johnAlexander 6:8ac15bf6d635 4772 VL53L0X_SETARRAYPARAMETERFIELD(dev, LimitChecksEnable,
johnAlexander 6:8ac15bf6d635 4773 limit_check_id, 1);
johnAlexander 6:8ac15bf6d635 4774 }
johnAlexander 6:8ac15bf6d635 4775 }
johnAlexander 6:8ac15bf6d635 4776
johnAlexander 6:8ac15bf6d635 4777 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 4778 return status;
johnAlexander 6:8ac15bf6d635 4779 }
johnAlexander 6:8ac15bf6d635 4780
johnAlexander 6:8ac15bf6d635 4781 VL53L0X_Error VL53L0X::VL53L0X_static_init(VL53L0X_DEV dev)
johnAlexander 6:8ac15bf6d635 4782 {
johnAlexander 6:8ac15bf6d635 4783 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 4784 VL53L0X_DeviceParameters_t current_parameters = {0};
johnAlexander 6:8ac15bf6d635 4785 uint8_t *p_tuning_setting_buffer;
johnAlexander 6:8ac15bf6d635 4786 uint16_t tempword = 0;
johnAlexander 6:8ac15bf6d635 4787 uint8_t tempbyte = 0;
johnAlexander 6:8ac15bf6d635 4788 uint8_t use_internal_tuning_settings = 0;
johnAlexander 6:8ac15bf6d635 4789 uint32_t count = 0;
johnAlexander 6:8ac15bf6d635 4790 uint8_t is_aperture_spads = 0;
johnAlexander 6:8ac15bf6d635 4791 uint32_t ref_spad_count = 0;
johnAlexander 6:8ac15bf6d635 4792 uint8_t aperture_spads = 0;
johnAlexander 6:8ac15bf6d635 4793 uint8_t vcsel_pulse_period_pclk;
johnAlexander 6:8ac15bf6d635 4794 uint32_t seq_timeout_micro_secs;
johnAlexander 6:8ac15bf6d635 4795
johnAlexander 6:8ac15bf6d635 4796 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 4797
johnAlexander 6:8ac15bf6d635 4798 status = VL53L0X_get_info_from_device(dev, 1);
johnAlexander 6:8ac15bf6d635 4799
johnAlexander 6:8ac15bf6d635 4800 /* set the ref spad from NVM */
johnAlexander 6:8ac15bf6d635 4801 count = (uint32_t)VL53L0X_GETDEVICESPECIFICPARAMETER(dev,
johnAlexander 6:8ac15bf6d635 4802 ReferenceSpadCount);
johnAlexander 6:8ac15bf6d635 4803 aperture_spads = VL53L0X_GETDEVICESPECIFICPARAMETER(dev,
johnAlexander 6:8ac15bf6d635 4804 ReferenceSpadType);
johnAlexander 6:8ac15bf6d635 4805
johnAlexander 6:8ac15bf6d635 4806 /* NVM value invalid */
johnAlexander 6:8ac15bf6d635 4807 if ((aperture_spads > 1) ||
johnAlexander 6:8ac15bf6d635 4808 ((aperture_spads == 1) && (count > 32)) ||
johnAlexander 6:8ac15bf6d635 4809 ((aperture_spads == 0) && (count > 12))) {
johnAlexander 6:8ac15bf6d635 4810 status = wrapped_VL53L0X_perform_ref_spad_management(dev, &ref_spad_count,
johnAlexander 6:8ac15bf6d635 4811 &is_aperture_spads);
johnAlexander 6:8ac15bf6d635 4812 } else {
johnAlexander 6:8ac15bf6d635 4813 status = VL53L0X_set_reference_spads(dev, count, aperture_spads);
johnAlexander 6:8ac15bf6d635 4814 }
johnAlexander 6:8ac15bf6d635 4815
johnAlexander 6:8ac15bf6d635 4816
johnAlexander 6:8ac15bf6d635 4817 /* Initialize tuning settings buffer to prevent compiler warning. */
johnAlexander 6:8ac15bf6d635 4818 p_tuning_setting_buffer = DefaultTuningSettings;
johnAlexander 6:8ac15bf6d635 4819
johnAlexander 6:8ac15bf6d635 4820 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4821 use_internal_tuning_settings = PALDevDataGet(dev,
johnAlexander 6:8ac15bf6d635 4822 UseInternalTuningSettings);
johnAlexander 6:8ac15bf6d635 4823
johnAlexander 6:8ac15bf6d635 4824 if (use_internal_tuning_settings == 0) {
johnAlexander 6:8ac15bf6d635 4825 p_tuning_setting_buffer = PALDevDataGet(dev,
johnAlexander 6:8ac15bf6d635 4826 pTuningSettingsPointer);
johnAlexander 6:8ac15bf6d635 4827 } else {
johnAlexander 6:8ac15bf6d635 4828 p_tuning_setting_buffer = DefaultTuningSettings;
johnAlexander 6:8ac15bf6d635 4829 }
johnAlexander 6:8ac15bf6d635 4830
johnAlexander 6:8ac15bf6d635 4831 }
johnAlexander 6:8ac15bf6d635 4832
johnAlexander 6:8ac15bf6d635 4833 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4834 status = VL53L0X_load_tuning_settings(dev, p_tuning_setting_buffer);
johnAlexander 6:8ac15bf6d635 4835 }
johnAlexander 6:8ac15bf6d635 4836
johnAlexander 6:8ac15bf6d635 4837
johnAlexander 6:8ac15bf6d635 4838 /* Set interrupt config to new sample ready */
johnAlexander 6:8ac15bf6d635 4839 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4840 status = VL53L0X_set_gpio_config(dev, 0, 0,
johnAlexander 6:8ac15bf6d635 4841 VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY,
johnAlexander 6:8ac15bf6d635 4842 VL53L0X_INTERRUPTPOLARITY_LOW);
johnAlexander 6:8ac15bf6d635 4843 }
johnAlexander 6:8ac15bf6d635 4844
johnAlexander 6:8ac15bf6d635 4845 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4846 status = VL53L0X_write_byte(dev, 0xFF, 0x01);
johnAlexander 6:8ac15bf6d635 4847 status |= VL53L0X_read_word(dev, 0x84, &tempword);
johnAlexander 6:8ac15bf6d635 4848 status |= VL53L0X_write_byte(dev, 0xFF, 0x00);
johnAlexander 6:8ac15bf6d635 4849 }
johnAlexander 6:8ac15bf6d635 4850
johnAlexander 6:8ac15bf6d635 4851 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4852 VL53L0X_SETDEVICESPECIFICPARAMETER(dev, OscFrequencyMHz,
johnAlexander 6:8ac15bf6d635 4853 VL53L0X_FIXPOINT412TOFIXPOINT1616(tempword));
johnAlexander 6:8ac15bf6d635 4854 }
johnAlexander 6:8ac15bf6d635 4855
johnAlexander 6:8ac15bf6d635 4856 /* After static init, some device parameters may be changed,
johnAlexander 6:8ac15bf6d635 4857 * so update them */
johnAlexander 6:8ac15bf6d635 4858 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4859 status = VL53L0X_get_device_parameters(dev, &current_parameters);
johnAlexander 6:8ac15bf6d635 4860 }
johnAlexander 6:8ac15bf6d635 4861
johnAlexander 6:8ac15bf6d635 4862
johnAlexander 6:8ac15bf6d635 4863 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4864 status = VL53L0X_get_fraction_enable(dev, &tempbyte);
johnAlexander 6:8ac15bf6d635 4865 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4866 PALDevDataSet(dev, RangeFractionalEnable, tempbyte);
johnAlexander 6:8ac15bf6d635 4867 }
johnAlexander 6:8ac15bf6d635 4868
johnAlexander 6:8ac15bf6d635 4869 }
johnAlexander 6:8ac15bf6d635 4870
johnAlexander 6:8ac15bf6d635 4871 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4872 PALDevDataSet(dev, CurrentParameters, current_parameters);
johnAlexander 6:8ac15bf6d635 4873 }
johnAlexander 6:8ac15bf6d635 4874
johnAlexander 6:8ac15bf6d635 4875
johnAlexander 6:8ac15bf6d635 4876 /* read the sequence config and save it */
johnAlexander 6:8ac15bf6d635 4877 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4878 status = VL53L0X_read_byte(dev,
johnAlexander 6:8ac15bf6d635 4879 VL53L0X_REG_SYSTEM_SEQUENCE_CONFIG, &tempbyte);
johnAlexander 6:8ac15bf6d635 4880 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4881 PALDevDataSet(dev, SequenceConfig, tempbyte);
johnAlexander 6:8ac15bf6d635 4882 }
johnAlexander 6:8ac15bf6d635 4883 }
johnAlexander 6:8ac15bf6d635 4884
johnAlexander 6:8ac15bf6d635 4885 /* Disable MSRC and TCC by default */
johnAlexander 6:8ac15bf6d635 4886 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4887 status = VL53L0X_set_sequence_step_enable(dev,
johnAlexander 6:8ac15bf6d635 4888 VL53L0X_SEQUENCESTEP_TCC, 0);
johnAlexander 6:8ac15bf6d635 4889 }
johnAlexander 6:8ac15bf6d635 4890
johnAlexander 6:8ac15bf6d635 4891 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4892 status = VL53L0X_set_sequence_step_enable(dev,
johnAlexander 6:8ac15bf6d635 4893 VL53L0X_SEQUENCESTEP_MSRC, 0);
johnAlexander 6:8ac15bf6d635 4894 }
johnAlexander 6:8ac15bf6d635 4895
johnAlexander 6:8ac15bf6d635 4896 /* Set PAL State to standby */
johnAlexander 6:8ac15bf6d635 4897 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4898 PALDevDataSet(dev, PalState, VL53L0X_STATE_IDLE);
johnAlexander 6:8ac15bf6d635 4899 }
johnAlexander 6:8ac15bf6d635 4900
johnAlexander 6:8ac15bf6d635 4901 /* Store pre-range vcsel period */
johnAlexander 6:8ac15bf6d635 4902 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4903 status = VL53L0X_get_vcsel_pulse_period(
johnAlexander 6:8ac15bf6d635 4904 dev,
johnAlexander 6:8ac15bf6d635 4905 VL53L0X_VCSEL_PERIOD_PRE_RANGE,
johnAlexander 6:8ac15bf6d635 4906 &vcsel_pulse_period_pclk);
johnAlexander 6:8ac15bf6d635 4907 }
johnAlexander 6:8ac15bf6d635 4908
johnAlexander 6:8ac15bf6d635 4909 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4910 VL53L0X_SETDEVICESPECIFICPARAMETER(
johnAlexander 6:8ac15bf6d635 4911 dev,
johnAlexander 6:8ac15bf6d635 4912 PreRangeVcselPulsePeriod,
johnAlexander 6:8ac15bf6d635 4913 vcsel_pulse_period_pclk);
johnAlexander 6:8ac15bf6d635 4914 }
johnAlexander 6:8ac15bf6d635 4915
johnAlexander 6:8ac15bf6d635 4916 /* Store final-range vcsel period */
johnAlexander 6:8ac15bf6d635 4917 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4918 status = VL53L0X_get_vcsel_pulse_period(
johnAlexander 6:8ac15bf6d635 4919 dev,
johnAlexander 6:8ac15bf6d635 4920 VL53L0X_VCSEL_PERIOD_FINAL_RANGE,
johnAlexander 6:8ac15bf6d635 4921 &vcsel_pulse_period_pclk);
johnAlexander 6:8ac15bf6d635 4922 }
johnAlexander 6:8ac15bf6d635 4923
johnAlexander 6:8ac15bf6d635 4924 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4925 VL53L0X_SETDEVICESPECIFICPARAMETER(
johnAlexander 6:8ac15bf6d635 4926 dev,
johnAlexander 6:8ac15bf6d635 4927 FinalRangeVcselPulsePeriod,
johnAlexander 6:8ac15bf6d635 4928 vcsel_pulse_period_pclk);
johnAlexander 6:8ac15bf6d635 4929 }
johnAlexander 6:8ac15bf6d635 4930
johnAlexander 6:8ac15bf6d635 4931 /* Store pre-range timeout */
johnAlexander 6:8ac15bf6d635 4932 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4933 status = get_sequence_step_timeout(
johnAlexander 6:8ac15bf6d635 4934 dev,
johnAlexander 6:8ac15bf6d635 4935 VL53L0X_SEQUENCESTEP_PRE_RANGE,
johnAlexander 6:8ac15bf6d635 4936 &seq_timeout_micro_secs);
johnAlexander 6:8ac15bf6d635 4937 }
johnAlexander 6:8ac15bf6d635 4938
johnAlexander 6:8ac15bf6d635 4939 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4940 VL53L0X_SETDEVICESPECIFICPARAMETER(
johnAlexander 6:8ac15bf6d635 4941 dev,
johnAlexander 6:8ac15bf6d635 4942 PreRangeTimeoutMicroSecs,
johnAlexander 6:8ac15bf6d635 4943 seq_timeout_micro_secs);
johnAlexander 6:8ac15bf6d635 4944 }
johnAlexander 6:8ac15bf6d635 4945
johnAlexander 6:8ac15bf6d635 4946 /* Store final-range timeout */
johnAlexander 6:8ac15bf6d635 4947 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4948 status = get_sequence_step_timeout(
johnAlexander 6:8ac15bf6d635 4949 dev,
johnAlexander 6:8ac15bf6d635 4950 VL53L0X_SEQUENCESTEP_FINAL_RANGE,
johnAlexander 6:8ac15bf6d635 4951 &seq_timeout_micro_secs);
johnAlexander 6:8ac15bf6d635 4952 }
johnAlexander 6:8ac15bf6d635 4953
johnAlexander 6:8ac15bf6d635 4954 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4955 VL53L0X_SETDEVICESPECIFICPARAMETER(
johnAlexander 6:8ac15bf6d635 4956 dev,
johnAlexander 6:8ac15bf6d635 4957 FinalRangeTimeoutMicroSecs,
johnAlexander 6:8ac15bf6d635 4958 seq_timeout_micro_secs);
johnAlexander 6:8ac15bf6d635 4959 }
johnAlexander 6:8ac15bf6d635 4960
johnAlexander 6:8ac15bf6d635 4961 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 4962 return status;
johnAlexander 6:8ac15bf6d635 4963 }
johnAlexander 6:8ac15bf6d635 4964
johnAlexander 6:8ac15bf6d635 4965
johnAlexander 6:8ac15bf6d635 4966 VL53L0X_Error VL53L0X::VL53L0X_stop_measurement(VL53L0X_DEV dev)
johnAlexander 6:8ac15bf6d635 4967 {
johnAlexander 6:8ac15bf6d635 4968 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 4969 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 4970
johnAlexander 6:8ac15bf6d635 4971 status = VL53L0X_write_byte(dev, VL53L0X_REG_SYSRANGE_START,
johnAlexander 6:8ac15bf6d635 4972 VL53L0X_REG_SYSRANGE_MODE_SINGLESHOT);
johnAlexander 6:8ac15bf6d635 4973
johnAlexander 6:8ac15bf6d635 4974 status = VL53L0X_write_byte(dev, 0xFF, 0x01);
johnAlexander 6:8ac15bf6d635 4975 status = VL53L0X_write_byte(dev, 0x00, 0x00);
johnAlexander 6:8ac15bf6d635 4976 status = VL53L0X_write_byte(dev, 0x91, 0x00);
johnAlexander 6:8ac15bf6d635 4977 status = VL53L0X_write_byte(dev, 0x00, 0x01);
johnAlexander 6:8ac15bf6d635 4978 status = VL53L0X_write_byte(dev, 0xFF, 0x00);
johnAlexander 6:8ac15bf6d635 4979
johnAlexander 6:8ac15bf6d635 4980 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4981 /* Set PAL State to Idle */
johnAlexander 6:8ac15bf6d635 4982 PALDevDataSet(dev, PalState, VL53L0X_STATE_IDLE);
johnAlexander 6:8ac15bf6d635 4983 }
johnAlexander 6:8ac15bf6d635 4984
johnAlexander 6:8ac15bf6d635 4985 /* Check if need to apply interrupt settings */
johnAlexander 6:8ac15bf6d635 4986 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 4987 status = VL53L0X_check_and_load_interrupt_settings(dev, 0);
johnAlexander 6:8ac15bf6d635 4988 }
johnAlexander 6:8ac15bf6d635 4989
johnAlexander 6:8ac15bf6d635 4990 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 4991 return status;
johnAlexander 6:8ac15bf6d635 4992 }
johnAlexander 6:8ac15bf6d635 4993
johnAlexander 6:8ac15bf6d635 4994 VL53L0X_Error VL53L0X::VL53L0X_get_stop_completed_status(VL53L0X_DEV dev,
johnAlexander 6:8ac15bf6d635 4995 uint32_t *p_stop_status)
johnAlexander 6:8ac15bf6d635 4996 {
johnAlexander 6:8ac15bf6d635 4997 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 4998 uint8_t byte = 0;
johnAlexander 6:8ac15bf6d635 4999 LOG_FUNCTION_START("");
johnAlexander 6:8ac15bf6d635 5000
johnAlexander 6:8ac15bf6d635 5001 status = VL53L0X_write_byte(dev, 0xFF, 0x01);
johnAlexander 6:8ac15bf6d635 5002
johnAlexander 6:8ac15bf6d635 5003 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5004 status = VL53L0X_read_byte(dev, 0x04, &byte);
johnAlexander 6:8ac15bf6d635 5005 }
johnAlexander 6:8ac15bf6d635 5006
johnAlexander 6:8ac15bf6d635 5007 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5008 status = VL53L0X_write_byte(dev, 0xFF, 0x0);
johnAlexander 6:8ac15bf6d635 5009 }
johnAlexander 6:8ac15bf6d635 5010
johnAlexander 6:8ac15bf6d635 5011 *p_stop_status = byte;
johnAlexander 6:8ac15bf6d635 5012
johnAlexander 6:8ac15bf6d635 5013 if (byte == 0) {
johnAlexander 6:8ac15bf6d635 5014 status = VL53L0X_write_byte(dev, 0x80, 0x01);
johnAlexander 6:8ac15bf6d635 5015 status = VL53L0X_write_byte(dev, 0xFF, 0x01);
johnAlexander 6:8ac15bf6d635 5016 status = VL53L0X_write_byte(dev, 0x00, 0x00);
johnAlexander 6:8ac15bf6d635 5017 status = VL53L0X_write_byte(dev, 0x91,
johnAlexander 6:8ac15bf6d635 5018 PALDevDataGet(dev, StopVariable));
johnAlexander 6:8ac15bf6d635 5019 status = VL53L0X_write_byte(dev, 0x00, 0x01);
johnAlexander 6:8ac15bf6d635 5020 status = VL53L0X_write_byte(dev, 0xFF, 0x00);
johnAlexander 6:8ac15bf6d635 5021 status = VL53L0X_write_byte(dev, 0x80, 0x00);
johnAlexander 6:8ac15bf6d635 5022 }
johnAlexander 6:8ac15bf6d635 5023
johnAlexander 6:8ac15bf6d635 5024 LOG_FUNCTION_END(status);
johnAlexander 6:8ac15bf6d635 5025 return status;
johnAlexander 6:8ac15bf6d635 5026 }
johnAlexander 6:8ac15bf6d635 5027
johnAlexander 6:8ac15bf6d635 5028 /****************** Write and read functions from I2C *************************/
johnAlexander 6:8ac15bf6d635 5029
johnAlexander 6:8ac15bf6d635 5030 VL53L0X_Error VL53L0X::VL53L0X_write_multi(VL53L0X_DEV dev, uint8_t index, uint8_t *p_data, uint32_t count)
johnAlexander 6:8ac15bf6d635 5031 {
johnAlexander 6:8ac15bf6d635 5032 int status;
johnAlexander 6:8ac15bf6d635 5033
johnAlexander 6:8ac15bf6d635 5034 status = VL53L0X_i2c_write(dev->I2cDevAddr, index, p_data, (uint16_t)count);
johnAlexander 6:8ac15bf6d635 5035 return status;
johnAlexander 6:8ac15bf6d635 5036 }
johnAlexander 6:8ac15bf6d635 5037
johnAlexander 6:8ac15bf6d635 5038 VL53L0X_Error VL53L0X::VL53L0X_read_multi(VL53L0X_DEV dev, uint8_t index, uint8_t *p_data, uint32_t count)
johnAlexander 6:8ac15bf6d635 5039 {
johnAlexander 6:8ac15bf6d635 5040 int status;
johnAlexander 6:8ac15bf6d635 5041
johnAlexander 6:8ac15bf6d635 5042 if (count >= VL53L0X_MAX_I2C_XFER_SIZE) {
johnAlexander 6:8ac15bf6d635 5043 status = VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 5044 }
johnAlexander 6:8ac15bf6d635 5045
johnAlexander 6:8ac15bf6d635 5046 status = VL53L0X_i2c_read(dev->I2cDevAddr, index, p_data, (uint16_t)count);
johnAlexander 6:8ac15bf6d635 5047
johnAlexander 6:8ac15bf6d635 5048 return status;
johnAlexander 6:8ac15bf6d635 5049 }
johnAlexander 6:8ac15bf6d635 5050
johnAlexander 6:8ac15bf6d635 5051
johnAlexander 6:8ac15bf6d635 5052 VL53L0X_Error VL53L0X::VL53L0X_write_byte(VL53L0X_DEV Dev, uint8_t index, uint8_t data)
johnAlexander 6:8ac15bf6d635 5053 {
johnAlexander 6:8ac15bf6d635 5054 int status;
johnAlexander 6:8ac15bf6d635 5055
johnAlexander 6:8ac15bf6d635 5056 status = VL53L0X_i2c_write(Dev->I2cDevAddr, index, &data, 1);
johnAlexander 6:8ac15bf6d635 5057 return status;
johnAlexander 6:8ac15bf6d635 5058 }
johnAlexander 6:8ac15bf6d635 5059
johnAlexander 6:8ac15bf6d635 5060 VL53L0X_Error VL53L0X::VL53L0X_write_word(VL53L0X_DEV dev, uint8_t index, uint16_t data)
johnAlexander 6:8ac15bf6d635 5061 {
johnAlexander 6:8ac15bf6d635 5062 int status;
johnAlexander 6:8ac15bf6d635 5063 uint8_t buffer[2];
johnAlexander 6:8ac15bf6d635 5064
johnAlexander 6:8ac15bf6d635 5065 buffer[0] = data >> 8;
johnAlexander 6:8ac15bf6d635 5066 buffer[1] = data & 0x00FF;
johnAlexander 6:8ac15bf6d635 5067 status = VL53L0X_i2c_write(dev->I2cDevAddr, index, (uint8_t *)buffer, 2);
johnAlexander 6:8ac15bf6d635 5068 return status;
johnAlexander 6:8ac15bf6d635 5069 }
johnAlexander 6:8ac15bf6d635 5070
johnAlexander 6:8ac15bf6d635 5071 VL53L0X_Error VL53L0X::VL53L0X_write_dword(VL53L0X_DEV Dev, uint8_t index, uint32_t data)
johnAlexander 6:8ac15bf6d635 5072 {
johnAlexander 6:8ac15bf6d635 5073 int status;
johnAlexander 6:8ac15bf6d635 5074 uint8_t buffer[4];
johnAlexander 6:8ac15bf6d635 5075
johnAlexander 6:8ac15bf6d635 5076 buffer[0] = (data >> 24) & 0xFF;
johnAlexander 6:8ac15bf6d635 5077 buffer[1] = (data >> 16) & 0xFF;
johnAlexander 6:8ac15bf6d635 5078 buffer[2] = (data >> 8) & 0xFF;
johnAlexander 6:8ac15bf6d635 5079 buffer[3] = (data >> 0) & 0xFF;
johnAlexander 6:8ac15bf6d635 5080 status = VL53L0X_i2c_write(Dev->I2cDevAddr, index, (uint8_t *)buffer, 4);
johnAlexander 6:8ac15bf6d635 5081 return status;
johnAlexander 6:8ac15bf6d635 5082 }
johnAlexander 6:8ac15bf6d635 5083
johnAlexander 6:8ac15bf6d635 5084
johnAlexander 6:8ac15bf6d635 5085 VL53L0X_Error VL53L0X::VL53L0X_read_byte(VL53L0X_DEV Dev, uint8_t index, uint8_t *p_data)
johnAlexander 6:8ac15bf6d635 5086 {
johnAlexander 6:8ac15bf6d635 5087 int status;
johnAlexander 6:8ac15bf6d635 5088
johnAlexander 6:8ac15bf6d635 5089 status = VL53L0X_i2c_read(Dev->I2cDevAddr, index, p_data, 1);
johnAlexander 6:8ac15bf6d635 5090
johnAlexander 6:8ac15bf6d635 5091 if (status) {
evgeniik 7:a4452bd2b83b 5092 return -3;
johnAlexander 6:8ac15bf6d635 5093 }
johnAlexander 6:8ac15bf6d635 5094
johnAlexander 6:8ac15bf6d635 5095 return 0;
johnAlexander 6:8ac15bf6d635 5096 }
johnAlexander 6:8ac15bf6d635 5097
johnAlexander 6:8ac15bf6d635 5098 VL53L0X_Error VL53L0X::VL53L0X_read_word(VL53L0X_DEV Dev, uint8_t index, uint16_t *p_data)
johnAlexander 6:8ac15bf6d635 5099 {
johnAlexander 6:8ac15bf6d635 5100 int status;
johnAlexander 6:8ac15bf6d635 5101 uint8_t buffer[2] = {0, 0};
evgeniik 7:a4452bd2b83b 5102
evgeniik 7:a4452bd2b83b 5103 status = VL53L0X_i2c_read(Dev->I2cDevAddr, index, buffer, 2);
johnAlexander 6:8ac15bf6d635 5104 if (!status) {
johnAlexander 6:8ac15bf6d635 5105 *p_data = (buffer[0] << 8) + buffer[1];
johnAlexander 6:8ac15bf6d635 5106 }
johnAlexander 6:8ac15bf6d635 5107 return status;
johnAlexander 6:8ac15bf6d635 5108 }
johnAlexander 6:8ac15bf6d635 5109
johnAlexander 6:8ac15bf6d635 5110 VL53L0X_Error VL53L0X::VL53L0X_read_dword(VL53L0X_DEV Dev, uint8_t index, uint32_t *p_data)
johnAlexander 6:8ac15bf6d635 5111 {
johnAlexander 6:8ac15bf6d635 5112 int status;
johnAlexander 6:8ac15bf6d635 5113 uint8_t buffer[4] = {0, 0, 0, 0};
johnAlexander 6:8ac15bf6d635 5114
johnAlexander 6:8ac15bf6d635 5115 status = VL53L0X_i2c_read(Dev->I2cDevAddr, index, buffer, 4);
johnAlexander 6:8ac15bf6d635 5116 if (!status) {
johnAlexander 6:8ac15bf6d635 5117 *p_data = (buffer[0] << 24) + (buffer[1] << 16) + (buffer[2] << 8) + buffer[3];
johnAlexander 6:8ac15bf6d635 5118 }
johnAlexander 6:8ac15bf6d635 5119 return status;
johnAlexander 6:8ac15bf6d635 5120
johnAlexander 6:8ac15bf6d635 5121 }
johnAlexander 6:8ac15bf6d635 5122
johnAlexander 6:8ac15bf6d635 5123 VL53L0X_Error VL53L0X::VL53L0X_update_byte(VL53L0X_DEV Dev, uint8_t index, uint8_t and_data, uint8_t or_data)
johnAlexander 6:8ac15bf6d635 5124 {
johnAlexander 6:8ac15bf6d635 5125 int status;
johnAlexander 6:8ac15bf6d635 5126 uint8_t buffer = 0;
johnAlexander 6:8ac15bf6d635 5127
johnAlexander 6:8ac15bf6d635 5128 /* read data direct onto buffer */
johnAlexander 6:8ac15bf6d635 5129 status = VL53L0X_i2c_read(Dev->I2cDevAddr, index, &buffer, 1);
johnAlexander 6:8ac15bf6d635 5130 if (!status) {
johnAlexander 6:8ac15bf6d635 5131 buffer = (buffer & and_data) | or_data;
johnAlexander 6:8ac15bf6d635 5132 status = VL53L0X_i2c_write(Dev->I2cDevAddr, index, &buffer, (uint8_t)1);
johnAlexander 6:8ac15bf6d635 5133 }
johnAlexander 6:8ac15bf6d635 5134 return status;
johnAlexander 6:8ac15bf6d635 5135 }
johnAlexander 6:8ac15bf6d635 5136
johnAlexander 6:8ac15bf6d635 5137 VL53L0X_Error VL53L0X::VL53L0X_i2c_write(uint8_t DeviceAddr, uint8_t RegisterAddr, uint8_t *p_data,
johnAlexander 6:8ac15bf6d635 5138 uint16_t NumByteToWrite)
johnAlexander 6:8ac15bf6d635 5139 {
johnAlexander 6:8ac15bf6d635 5140 int ret;
johnAlexander 6:8ac15bf6d635 5141
johnAlexander 6:8ac15bf6d635 5142 ret = _dev_i2c->i2c_write(p_data, DeviceAddr, RegisterAddr, NumByteToWrite);
johnAlexander 6:8ac15bf6d635 5143
johnAlexander 6:8ac15bf6d635 5144 if (ret) {
johnAlexander 6:8ac15bf6d635 5145 return -1;
johnAlexander 6:8ac15bf6d635 5146 }
johnAlexander 6:8ac15bf6d635 5147 return 0;
johnAlexander 6:8ac15bf6d635 5148 }
johnAlexander 6:8ac15bf6d635 5149
johnAlexander 6:8ac15bf6d635 5150 VL53L0X_Error VL53L0X::VL53L0X_i2c_read(uint8_t DeviceAddr, uint8_t RegisterAddr, uint8_t *p_data,
johnAlexander 6:8ac15bf6d635 5151 uint16_t NumByteToRead)
johnAlexander 6:8ac15bf6d635 5152 {
johnAlexander 6:8ac15bf6d635 5153 int ret;
evgeniik 7:a4452bd2b83b 5154
johnAlexander 6:8ac15bf6d635 5155 ret = _dev_i2c->i2c_read(p_data, DeviceAddr, RegisterAddr, NumByteToRead);
johnAlexander 6:8ac15bf6d635 5156 if (ret) {
johnAlexander 6:8ac15bf6d635 5157 return -1;
johnAlexander 6:8ac15bf6d635 5158 }
johnAlexander 6:8ac15bf6d635 5159 return 0;
johnAlexander 6:8ac15bf6d635 5160 }
johnAlexander 6:8ac15bf6d635 5161
johnAlexander 6:8ac15bf6d635 5162 int VL53L0X::read_id(uint8_t *id)
johnAlexander 6:8ac15bf6d635 5163 {
johnAlexander 6:8ac15bf6d635 5164 int status = 0;
johnAlexander 6:8ac15bf6d635 5165 uint16_t rl_id = 0;
johnAlexander 6:8ac15bf6d635 5166
johnAlexander 6:8ac15bf6d635 5167 status = VL53L0X_read_word(_device, VL53L0X_REG_IDENTIFICATION_MODEL_ID, &rl_id);
johnAlexander 6:8ac15bf6d635 5168 if (rl_id == 0xEEAA) {
johnAlexander 6:8ac15bf6d635 5169 return status;
johnAlexander 6:8ac15bf6d635 5170 }
johnAlexander 6:8ac15bf6d635 5171
johnAlexander 6:8ac15bf6d635 5172 return -1;
johnAlexander 6:8ac15bf6d635 5173 }
johnAlexander 6:8ac15bf6d635 5174
johnAlexander 6:8ac15bf6d635 5175
johnAlexander 6:8ac15bf6d635 5176 VL53L0X_Error VL53L0X::wait_measurement_data_ready(VL53L0X_DEV dev)
johnAlexander 6:8ac15bf6d635 5177 {
johnAlexander 6:8ac15bf6d635 5178 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 5179 uint8_t new_dat_ready = 0;
johnAlexander 6:8ac15bf6d635 5180 uint32_t loop_nb;
johnAlexander 6:8ac15bf6d635 5181
johnAlexander 6:8ac15bf6d635 5182 // Wait until it finished
johnAlexander 6:8ac15bf6d635 5183 // use timeout to avoid deadlock
johnAlexander 6:8ac15bf6d635 5184 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5185 loop_nb = 0;
johnAlexander 6:8ac15bf6d635 5186 do {
johnAlexander 6:8ac15bf6d635 5187 status = VL53L0X_get_measurement_data_ready(dev, &new_dat_ready);
johnAlexander 6:8ac15bf6d635 5188 if ((new_dat_ready == 0x01) || status != VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5189 break;
johnAlexander 6:8ac15bf6d635 5190 }
johnAlexander 6:8ac15bf6d635 5191 loop_nb = loop_nb + 1;
johnAlexander 6:8ac15bf6d635 5192 VL53L0X_polling_delay(dev);
johnAlexander 6:8ac15bf6d635 5193 } while (loop_nb < VL53L0X_DEFAULT_MAX_LOOP);
johnAlexander 6:8ac15bf6d635 5194
johnAlexander 6:8ac15bf6d635 5195 if (loop_nb >= VL53L0X_DEFAULT_MAX_LOOP) {
johnAlexander 6:8ac15bf6d635 5196 status = VL53L0X_ERROR_TIME_OUT;
johnAlexander 6:8ac15bf6d635 5197 }
johnAlexander 6:8ac15bf6d635 5198 }
johnAlexander 6:8ac15bf6d635 5199
johnAlexander 6:8ac15bf6d635 5200 return status;
johnAlexander 6:8ac15bf6d635 5201 }
johnAlexander 6:8ac15bf6d635 5202
johnAlexander 6:8ac15bf6d635 5203 VL53L0X_Error VL53L0X::wait_stop_completed(VL53L0X_DEV dev)
johnAlexander 6:8ac15bf6d635 5204 {
johnAlexander 6:8ac15bf6d635 5205 VL53L0X_Error status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 5206 uint32_t stop_completed = 0;
johnAlexander 6:8ac15bf6d635 5207 uint32_t loop_nb;
johnAlexander 6:8ac15bf6d635 5208
johnAlexander 6:8ac15bf6d635 5209 // Wait until it finished
johnAlexander 6:8ac15bf6d635 5210 // use timeout to avoid deadlock
johnAlexander 6:8ac15bf6d635 5211 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5212 loop_nb = 0;
johnAlexander 6:8ac15bf6d635 5213 do {
johnAlexander 6:8ac15bf6d635 5214 status = VL53L0X_get_stop_completed_status(dev, &stop_completed);
johnAlexander 6:8ac15bf6d635 5215 if ((stop_completed == 0x00) || status != VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5216 break;
johnAlexander 6:8ac15bf6d635 5217 }
johnAlexander 6:8ac15bf6d635 5218 loop_nb = loop_nb + 1;
johnAlexander 6:8ac15bf6d635 5219 VL53L0X_polling_delay(dev);
johnAlexander 6:8ac15bf6d635 5220 } while (loop_nb < VL53L0X_DEFAULT_MAX_LOOP);
johnAlexander 6:8ac15bf6d635 5221
johnAlexander 6:8ac15bf6d635 5222 if (loop_nb >= VL53L0X_DEFAULT_MAX_LOOP) {
johnAlexander 6:8ac15bf6d635 5223 status = VL53L0X_ERROR_TIME_OUT;
johnAlexander 6:8ac15bf6d635 5224 }
johnAlexander 6:8ac15bf6d635 5225
johnAlexander 6:8ac15bf6d635 5226 }
johnAlexander 6:8ac15bf6d635 5227
johnAlexander 6:8ac15bf6d635 5228 return status;
johnAlexander 6:8ac15bf6d635 5229 }
johnAlexander 6:8ac15bf6d635 5230
johnAlexander 6:8ac15bf6d635 5231
johnAlexander 6:8ac15bf6d635 5232 int VL53L0X::init_sensor(uint8_t new_addr)
johnAlexander 6:8ac15bf6d635 5233 {
johnAlexander 6:8ac15bf6d635 5234 int status;
johnAlexander 6:8ac15bf6d635 5235
evgeniik 7:a4452bd2b83b 5236 //VL53L0X_off();
johnAlexander 6:8ac15bf6d635 5237 VL53L0X_on();
johnAlexander 6:8ac15bf6d635 5238
johnAlexander 6:8ac15bf6d635 5239 // status=VL53L0X_WaitDeviceBooted(Device);
johnAlexander 6:8ac15bf6d635 5240 // if(status)
johnAlexander 6:8ac15bf6d635 5241 // printf("WaitDeviceBooted fail\n\r");
johnAlexander 6:8ac15bf6d635 5242 status = is_present();
johnAlexander 6:8ac15bf6d635 5243 if (!status) {
evgeniik 7:a4452bd2b83b 5244 //printf(" La ");
johnAlexander 6:8ac15bf6d635 5245 status = init(&_my_device);
johnAlexander 6:8ac15bf6d635 5246 if (status != VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5247 printf("Failed to init VL53L0X sensor!\n\r");
johnAlexander 6:8ac15bf6d635 5248 return status;
johnAlexander 6:8ac15bf6d635 5249 }
johnAlexander 6:8ac15bf6d635 5250
johnAlexander 6:8ac15bf6d635 5251 // deduce silicon version
johnAlexander 6:8ac15bf6d635 5252 status = VL53L0X_get_device_info(&_my_device, &_device_info);
evgeniik 7:a4452bd2b83b 5253
johnAlexander 6:8ac15bf6d635 5254
johnAlexander 6:8ac15bf6d635 5255 status = prepare();
johnAlexander 6:8ac15bf6d635 5256 if (status != VL53L0X_ERROR_NONE) {
evgeniik 7:a4452bd2b83b 5257 //printf("Failed to prepare VL53L0X!\n\r");
johnAlexander 6:8ac15bf6d635 5258 return status;
johnAlexander 6:8ac15bf6d635 5259 }
johnAlexander 6:8ac15bf6d635 5260
johnAlexander 6:8ac15bf6d635 5261 if (new_addr != VL53L0X_DEFAULT_ADDRESS) {
johnAlexander 6:8ac15bf6d635 5262 status = set_device_address(new_addr);
johnAlexander 6:8ac15bf6d635 5263 if (status) {
johnAlexander 6:8ac15bf6d635 5264 printf("Failed to change I2C address!\n\r");
johnAlexander 6:8ac15bf6d635 5265 return status;
johnAlexander 6:8ac15bf6d635 5266 }
johnAlexander 6:8ac15bf6d635 5267 } else {
johnAlexander 6:8ac15bf6d635 5268 printf("Invalid new address!\n\r");
johnAlexander 6:8ac15bf6d635 5269 return VL53L0X_ERROR_INVALID_PARAMS;
johnAlexander 6:8ac15bf6d635 5270 }
johnAlexander 6:8ac15bf6d635 5271 }
johnAlexander 6:8ac15bf6d635 5272 return status;
johnAlexander 6:8ac15bf6d635 5273 }
johnAlexander 6:8ac15bf6d635 5274
johnAlexander 6:8ac15bf6d635 5275 int VL53L0X::range_meas_int_continuous_mode(void (*fptr)(void))
johnAlexander 6:8ac15bf6d635 5276 {
johnAlexander 6:8ac15bf6d635 5277 int status, clr_status;
johnAlexander 6:8ac15bf6d635 5278
johnAlexander 6:8ac15bf6d635 5279 status = VL53L0X_stop_measurement(_device); // it is safer to do this while sensor is stopped
johnAlexander 6:8ac15bf6d635 5280
johnAlexander 6:8ac15bf6d635 5281 // status = VL53L0X_SetInterruptThresholds(Device, VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, 0, 300);
johnAlexander 6:8ac15bf6d635 5282
johnAlexander 6:8ac15bf6d635 5283 status = VL53L0X_set_gpio_config(_device, 0, VL53L0X_DEVICEMODE_CONTINUOUS_RANGING,
johnAlexander 6:8ac15bf6d635 5284 VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY,
johnAlexander 6:8ac15bf6d635 5285 VL53L0X_INTERRUPTPOLARITY_HIGH);
johnAlexander 6:8ac15bf6d635 5286
johnAlexander 6:8ac15bf6d635 5287 if (!status) {
johnAlexander 6:8ac15bf6d635 5288 attach_interrupt_measure_detection_irq(fptr);
johnAlexander 6:8ac15bf6d635 5289 enable_interrupt_measure_detection_irq();
johnAlexander 6:8ac15bf6d635 5290 }
johnAlexander 6:8ac15bf6d635 5291
johnAlexander 6:8ac15bf6d635 5292 clr_status = clear_interrupt(VL53L0X_REG_RESULT_INTERRUPT_STATUS | VL53L0X_REG_RESULT_RANGE_STATUS);
johnAlexander 6:8ac15bf6d635 5293 if (clr_status) {
johnAlexander 6:8ac15bf6d635 5294 VL53L0X_ErrLog("VL53L0X_ClearErrorInterrupt fail\r\n");
johnAlexander 6:8ac15bf6d635 5295 }
johnAlexander 6:8ac15bf6d635 5296
johnAlexander 6:8ac15bf6d635 5297 if (!status) {
johnAlexander 6:8ac15bf6d635 5298 status = range_start_continuous_mode();
johnAlexander 6:8ac15bf6d635 5299 }
johnAlexander 6:8ac15bf6d635 5300 return status;
johnAlexander 6:8ac15bf6d635 5301 }
johnAlexander 6:8ac15bf6d635 5302
johnAlexander 6:8ac15bf6d635 5303
johnAlexander 6:8ac15bf6d635 5304 int VL53L0X::start_measurement(OperatingMode operating_mode, void (*fptr)(void))
johnAlexander 6:8ac15bf6d635 5305 {
johnAlexander 6:8ac15bf6d635 5306 int Status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 5307 int ClrStatus;
johnAlexander 6:8ac15bf6d635 5308
johnAlexander 6:8ac15bf6d635 5309 uint8_t VhvSettings;
johnAlexander 6:8ac15bf6d635 5310 uint8_t PhaseCal;
johnAlexander 6:8ac15bf6d635 5311 // *** from mass market cube expansion v1.1, ranging with satellites.
johnAlexander 6:8ac15bf6d635 5312 // default settings, for normal range.
johnAlexander 6:8ac15bf6d635 5313 FixPoint1616_t signalLimit = (FixPoint1616_t)(0.25 * 65536);
johnAlexander 6:8ac15bf6d635 5314 FixPoint1616_t sigmaLimit = (FixPoint1616_t)(18 * 65536);
johnAlexander 6:8ac15bf6d635 5315 uint32_t timingBudget = 33000;
johnAlexander 6:8ac15bf6d635 5316 uint8_t preRangeVcselPeriod = 14;
johnAlexander 6:8ac15bf6d635 5317 uint8_t finalRangeVcselPeriod = 10;
johnAlexander 6:8ac15bf6d635 5318
johnAlexander 6:8ac15bf6d635 5319 if (operating_mode == range_continuous_interrupt) {
johnAlexander 6:8ac15bf6d635 5320 if (_gpio1Int == NULL) {
johnAlexander 6:8ac15bf6d635 5321 printf("GPIO1 Error\r\n");
johnAlexander 6:8ac15bf6d635 5322 return 1;
johnAlexander 6:8ac15bf6d635 5323 }
johnAlexander 6:8ac15bf6d635 5324
johnAlexander 6:8ac15bf6d635 5325 Status = VL53L0X_stop_measurement(_device); // it is safer to do this while sensor is stopped
johnAlexander 6:8ac15bf6d635 5326
johnAlexander 6:8ac15bf6d635 5327 // Status = VL53L0X_SetInterruptThresholds(Device, VL53L0X_DEVICEMODE_CONTINUOUS_RANGING, 0, 300);
johnAlexander 6:8ac15bf6d635 5328
johnAlexander 6:8ac15bf6d635 5329 Status = VL53L0X_set_gpio_config(_device, 0, VL53L0X_DEVICEMODE_CONTINUOUS_RANGING,
johnAlexander 6:8ac15bf6d635 5330 VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY,
johnAlexander 6:8ac15bf6d635 5331 VL53L0X_INTERRUPTPOLARITY_HIGH);
johnAlexander 6:8ac15bf6d635 5332
johnAlexander 6:8ac15bf6d635 5333 if (Status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5334 attach_interrupt_measure_detection_irq(fptr);
johnAlexander 6:8ac15bf6d635 5335 enable_interrupt_measure_detection_irq();
johnAlexander 6:8ac15bf6d635 5336 }
johnAlexander 6:8ac15bf6d635 5337
johnAlexander 6:8ac15bf6d635 5338 ClrStatus = clear_interrupt(VL53L0X_REG_RESULT_INTERRUPT_STATUS | VL53L0X_REG_RESULT_RANGE_STATUS);
johnAlexander 6:8ac15bf6d635 5339 if (ClrStatus) {
johnAlexander 6:8ac15bf6d635 5340 VL53L0X_ErrLog("VL53L0X_ClearErrorInterrupt fail\r\n");
johnAlexander 6:8ac15bf6d635 5341 }
johnAlexander 6:8ac15bf6d635 5342
johnAlexander 6:8ac15bf6d635 5343 if (Status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5344 Status = VL53L0X_set_device_mode(_device, VL53L0X_DEVICEMODE_CONTINUOUS_RANGING); // Setup in continuous ranging mode
johnAlexander 6:8ac15bf6d635 5345 }
johnAlexander 6:8ac15bf6d635 5346
johnAlexander 6:8ac15bf6d635 5347 if (Status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5348 Status = VL53L0X_start_measurement(_device);
johnAlexander 6:8ac15bf6d635 5349 }
johnAlexander 6:8ac15bf6d635 5350 }
johnAlexander 6:8ac15bf6d635 5351
johnAlexander 6:8ac15bf6d635 5352 if (operating_mode == range_single_shot_polling) {
johnAlexander 6:8ac15bf6d635 5353 // singelshot, polled ranging
evgeniik 7:a4452bd2b83b 5354 /*if (Status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5355 // no need to do this when we use VL53L0X_PerformSingleRangingMeasurement
evgeniik 7:a4452bd2b83b 5356
johnAlexander 6:8ac15bf6d635 5357 Status = VL53L0X_set_device_mode(_device, VL53L0X_DEVICEMODE_SINGLE_RANGING); // Setup in single ranging mode
evgeniik 7:a4452bd2b83b 5358 }*/
johnAlexander 6:8ac15bf6d635 5359
johnAlexander 6:8ac15bf6d635 5360 // Enable/Disable Sigma and Signal check
johnAlexander 6:8ac15bf6d635 5361 if (Status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5362 Status = VL53L0X_set_limit_check_enable(_device,
johnAlexander 6:8ac15bf6d635 5363 VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, 1);
johnAlexander 6:8ac15bf6d635 5364 }
johnAlexander 6:8ac15bf6d635 5365 if (Status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5366 Status = VL53L0X_set_limit_check_enable(_device,
johnAlexander 6:8ac15bf6d635 5367 VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, 1);
johnAlexander 6:8ac15bf6d635 5368 }
johnAlexander 6:8ac15bf6d635 5369
johnAlexander 6:8ac15bf6d635 5370 // *** from mass market cube expansion v1.1, ranging with satellites.
johnAlexander 6:8ac15bf6d635 5371 /* Ranging configuration */
johnAlexander 6:8ac15bf6d635 5372 //*
johnAlexander 6:8ac15bf6d635 5373 // switch(rangingConfig) {
johnAlexander 6:8ac15bf6d635 5374 // case LONG_RANGE:
johnAlexander 6:8ac15bf6d635 5375 signalLimit = (FixPoint1616_t)(0.1 * 65536);
johnAlexander 6:8ac15bf6d635 5376 sigmaLimit = (FixPoint1616_t)(60 * 65536);
johnAlexander 6:8ac15bf6d635 5377 timingBudget = 33000;
johnAlexander 6:8ac15bf6d635 5378 preRangeVcselPeriod = 18;
johnAlexander 6:8ac15bf6d635 5379 finalRangeVcselPeriod = 14;
johnAlexander 6:8ac15bf6d635 5380 /* break;
johnAlexander 6:8ac15bf6d635 5381 case HIGH_ACCURACY:
johnAlexander 6:8ac15bf6d635 5382 signalLimit = (FixPoint1616_t)(0.25*65536);
johnAlexander 6:8ac15bf6d635 5383 sigmaLimit = (FixPoint1616_t)(18*65536);
johnAlexander 6:8ac15bf6d635 5384 timingBudget = 200000;
johnAlexander 6:8ac15bf6d635 5385 preRangeVcselPeriod = 14;
johnAlexander 6:8ac15bf6d635 5386 finalRangeVcselPeriod = 10;
johnAlexander 6:8ac15bf6d635 5387 break;
johnAlexander 6:8ac15bf6d635 5388 case HIGH_SPEED:
johnAlexander 6:8ac15bf6d635 5389 signalLimit = (FixPoint1616_t)(0.25*65536);
johnAlexander 6:8ac15bf6d635 5390 sigmaLimit = (FixPoint1616_t)(32*65536);
johnAlexander 6:8ac15bf6d635 5391 timingBudget = 20000;
johnAlexander 6:8ac15bf6d635 5392 preRangeVcselPeriod = 14;
johnAlexander 6:8ac15bf6d635 5393 finalRangeVcselPeriod = 10;
johnAlexander 6:8ac15bf6d635 5394 break;
johnAlexander 6:8ac15bf6d635 5395 default:
johnAlexander 6:8ac15bf6d635 5396 debug_printf("Not Supported");
johnAlexander 6:8ac15bf6d635 5397 }
johnAlexander 6:8ac15bf6d635 5398 */
johnAlexander 6:8ac15bf6d635 5399
johnAlexander 6:8ac15bf6d635 5400 if (Status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5401 Status = VL53L0X_set_limit_check_value(_device,
johnAlexander 6:8ac15bf6d635 5402 VL53L0X_CHECKENABLE_SIGNAL_RATE_FINAL_RANGE, signalLimit);
johnAlexander 6:8ac15bf6d635 5403 }
johnAlexander 6:8ac15bf6d635 5404
johnAlexander 6:8ac15bf6d635 5405 if (Status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5406 Status = VL53L0X_set_limit_check_value(_device,
johnAlexander 6:8ac15bf6d635 5407 VL53L0X_CHECKENABLE_SIGMA_FINAL_RANGE, sigmaLimit);
johnAlexander 6:8ac15bf6d635 5408 }
johnAlexander 6:8ac15bf6d635 5409
johnAlexander 6:8ac15bf6d635 5410 if (Status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5411 Status = VL53L0X_set_measurement_timing_budget_micro_seconds(_device, timingBudget);
johnAlexander 6:8ac15bf6d635 5412 }
johnAlexander 6:8ac15bf6d635 5413
johnAlexander 6:8ac15bf6d635 5414 if (Status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5415 Status = VL53L0X_set_vcsel_pulse_period(_device,
johnAlexander 6:8ac15bf6d635 5416 VL53L0X_VCSEL_PERIOD_PRE_RANGE, preRangeVcselPeriod);
johnAlexander 6:8ac15bf6d635 5417 }
johnAlexander 6:8ac15bf6d635 5418
johnAlexander 6:8ac15bf6d635 5419 if (Status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5420 Status = VL53L0X_set_vcsel_pulse_period(_device,
johnAlexander 6:8ac15bf6d635 5421 VL53L0X_VCSEL_PERIOD_FINAL_RANGE, finalRangeVcselPeriod);
johnAlexander 6:8ac15bf6d635 5422 }
johnAlexander 6:8ac15bf6d635 5423
johnAlexander 6:8ac15bf6d635 5424 if (Status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5425 Status = VL53L0X_perform_ref_calibration(_device, &VhvSettings, &PhaseCal);
johnAlexander 6:8ac15bf6d635 5426 }
johnAlexander 6:8ac15bf6d635 5427
johnAlexander 6:8ac15bf6d635 5428 }
johnAlexander 6:8ac15bf6d635 5429
johnAlexander 6:8ac15bf6d635 5430 if (operating_mode == range_continuous_polling) {
johnAlexander 6:8ac15bf6d635 5431 if (Status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5432 //printf("Call of VL53L0X_SetDeviceMode\n");
johnAlexander 6:8ac15bf6d635 5433 Status = VL53L0X_set_device_mode(_device, VL53L0X_DEVICEMODE_CONTINUOUS_RANGING); // Setup in continuous ranging mode
johnAlexander 6:8ac15bf6d635 5434 }
johnAlexander 6:8ac15bf6d635 5435
johnAlexander 6:8ac15bf6d635 5436 if (Status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5437 //printf("Call of VL53L0X_StartMeasurement\n");
johnAlexander 6:8ac15bf6d635 5438 Status = VL53L0X_start_measurement(_device);
johnAlexander 6:8ac15bf6d635 5439 }
johnAlexander 6:8ac15bf6d635 5440 }
johnAlexander 6:8ac15bf6d635 5441
johnAlexander 6:8ac15bf6d635 5442 return Status;
johnAlexander 6:8ac15bf6d635 5443 }
johnAlexander 6:8ac15bf6d635 5444
johnAlexander 6:8ac15bf6d635 5445
johnAlexander 6:8ac15bf6d635 5446 int VL53L0X::get_measurement(OperatingMode operating_mode, VL53L0X_RangingMeasurementData_t *p_data)
evgeniik 7:a4452bd2b83b 5447 {
johnAlexander 6:8ac15bf6d635 5448 int Status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 5449
johnAlexander 6:8ac15bf6d635 5450 if (operating_mode == range_single_shot_polling) {
johnAlexander 6:8ac15bf6d635 5451 Status = VL53L0X_perform_single_ranging_measurement(_device, p_data);
johnAlexander 6:8ac15bf6d635 5452 }
johnAlexander 6:8ac15bf6d635 5453 if (operating_mode == range_continuous_polling) {
johnAlexander 6:8ac15bf6d635 5454 if (Status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5455 Status = VL53L0X_measurement_poll_for_completion(_device);
johnAlexander 6:8ac15bf6d635 5456 }
johnAlexander 6:8ac15bf6d635 5457
johnAlexander 6:8ac15bf6d635 5458 if (Status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5459 Status = VL53L0X_get_ranging_measurement_data(_device, p_data);
johnAlexander 6:8ac15bf6d635 5460
johnAlexander 6:8ac15bf6d635 5461 // Clear the interrupt
johnAlexander 6:8ac15bf6d635 5462 VL53L0X_clear_interrupt_mask(_device, VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY);
johnAlexander 6:8ac15bf6d635 5463 VL53L0X_polling_delay(_device);
johnAlexander 6:8ac15bf6d635 5464 }
johnAlexander 6:8ac15bf6d635 5465 }
johnAlexander 6:8ac15bf6d635 5466
johnAlexander 6:8ac15bf6d635 5467 if (operating_mode == range_continuous_interrupt) {
johnAlexander 6:8ac15bf6d635 5468 Status = VL53L0X_get_ranging_measurement_data(_device, p_data);
johnAlexander 6:8ac15bf6d635 5469 VL53L0X_clear_interrupt_mask(_device, VL53L0X_REG_SYSTEM_INTERRUPT_CLEAR | VL53L0X_REG_RESULT_INTERRUPT_STATUS);
johnAlexander 6:8ac15bf6d635 5470 }
johnAlexander 6:8ac15bf6d635 5471
johnAlexander 6:8ac15bf6d635 5472 return Status;
johnAlexander 6:8ac15bf6d635 5473 }
johnAlexander 6:8ac15bf6d635 5474
johnAlexander 6:8ac15bf6d635 5475
johnAlexander 6:8ac15bf6d635 5476 int VL53L0X::stop_measurement(OperatingMode operating_mode)
johnAlexander 6:8ac15bf6d635 5477 {
johnAlexander 6:8ac15bf6d635 5478 int status = VL53L0X_ERROR_NONE;
johnAlexander 6:8ac15bf6d635 5479
johnAlexander 6:8ac15bf6d635 5480
johnAlexander 6:8ac15bf6d635 5481 // don't need to stop for a singleshot range!
johnAlexander 6:8ac15bf6d635 5482 if (operating_mode == range_single_shot_polling) {
johnAlexander 6:8ac15bf6d635 5483 }
johnAlexander 6:8ac15bf6d635 5484
johnAlexander 6:8ac15bf6d635 5485 if (operating_mode == range_continuous_interrupt || operating_mode == range_continuous_polling) {
johnAlexander 6:8ac15bf6d635 5486 // continuous mode
johnAlexander 6:8ac15bf6d635 5487 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5488 //printf("Call of VL53L0X_StopMeasurement\n");
johnAlexander 6:8ac15bf6d635 5489 status = VL53L0X_stop_measurement(_device);
johnAlexander 6:8ac15bf6d635 5490 }
johnAlexander 6:8ac15bf6d635 5491
johnAlexander 6:8ac15bf6d635 5492 if (status == VL53L0X_ERROR_NONE) {
johnAlexander 6:8ac15bf6d635 5493 //printf("Wait Stop to be competed\n");
johnAlexander 6:8ac15bf6d635 5494 status = wait_stop_completed(_device);
johnAlexander 6:8ac15bf6d635 5495 }
johnAlexander 6:8ac15bf6d635 5496
johnAlexander 6:8ac15bf6d635 5497 if (status == VL53L0X_ERROR_NONE)
johnAlexander 6:8ac15bf6d635 5498 status = VL53L0X_clear_interrupt_mask(_device,
johnAlexander 6:8ac15bf6d635 5499 VL53L0X_REG_SYSTEM_INTERRUPT_GPIO_NEW_SAMPLE_READY);
johnAlexander 6:8ac15bf6d635 5500 }
johnAlexander 6:8ac15bf6d635 5501
johnAlexander 6:8ac15bf6d635 5502 return status;
johnAlexander 6:8ac15bf6d635 5503 }
johnAlexander 6:8ac15bf6d635 5504
johnAlexander 6:8ac15bf6d635 5505
johnAlexander 6:8ac15bf6d635 5506 int VL53L0X::handle_irq(OperatingMode operating_mode, VL53L0X_RangingMeasurementData_t *data)
johnAlexander 6:8ac15bf6d635 5507 {
johnAlexander 6:8ac15bf6d635 5508 int status;
johnAlexander 6:8ac15bf6d635 5509 status = get_measurement(operating_mode, data);
johnAlexander 6:8ac15bf6d635 5510 enable_interrupt_measure_detection_irq();
johnAlexander 6:8ac15bf6d635 5511 return status;
johnAlexander 6:8ac15bf6d635 5512 }
johnAlexander 6:8ac15bf6d635 5513
johnAlexander 6:8ac15bf6d635 5514
johnAlexander 6:8ac15bf6d635 5515 /******************************************************************************/