Joel von Rotz / VL53L0X

Dependents:   BigBot_v1 PololuDistanceSensorTest Lidar Ares test ... more

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

Who changed what in which revision?

UserRevisionLine numberNew contents of line
joelvonrotz 0:11ad6aaed10a 1 /*******************************************************************************
joelvonrotz 0:11ad6aaed10a 2 Copyright � 2015, STMicroelectronics International N.V.
joelvonrotz 0:11ad6aaed10a 3 All rights reserved.
joelvonrotz 0:11ad6aaed10a 4
joelvonrotz 0:11ad6aaed10a 5 Redistribution and use in source and binary forms, with or without
joelvonrotz 0:11ad6aaed10a 6 modification, are permitted provided that the following conditions are met:
joelvonrotz 0:11ad6aaed10a 7 * Redistributions of source code must retain the above copyright
joelvonrotz 0:11ad6aaed10a 8 notice, this list of conditions and the following disclaimer.
joelvonrotz 0:11ad6aaed10a 9 * Redistributions in binary form must reproduce the above copyright
joelvonrotz 0:11ad6aaed10a 10 notice, this list of conditions and the following disclaimer in the
joelvonrotz 0:11ad6aaed10a 11 documentation and/or other materials provided with the distribution.
joelvonrotz 0:11ad6aaed10a 12 * Neither the name of STMicroelectronics nor the
joelvonrotz 0:11ad6aaed10a 13 names of its contributors may be used to endorse or promote products
joelvonrotz 0:11ad6aaed10a 14 derived from this software without specific prior written permission.
joelvonrotz 0:11ad6aaed10a 15
joelvonrotz 0:11ad6aaed10a 16 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
joelvonrotz 0:11ad6aaed10a 17 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
joelvonrotz 0:11ad6aaed10a 18 WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, AND
joelvonrotz 0:11ad6aaed10a 19 NON-INFRINGEMENT OF INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED.
joelvonrotz 0:11ad6aaed10a 20 IN NO EVENT SHALL STMICROELECTRONICS INTERNATIONAL N.V. BE LIABLE FOR ANY
joelvonrotz 0:11ad6aaed10a 21 DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
joelvonrotz 0:11ad6aaed10a 22 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
joelvonrotz 0:11ad6aaed10a 23 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
joelvonrotz 0:11ad6aaed10a 24 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
joelvonrotz 0:11ad6aaed10a 25 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
joelvonrotz 0:11ad6aaed10a 26 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
joelvonrotz 0:11ad6aaed10a 27 ********************************************************************************/
joelvonrotz 0:11ad6aaed10a 28
joelvonrotz 0:11ad6aaed10a 29 /**
joelvonrotz 0:11ad6aaed10a 30 * @file VL53L0X_i2c.c
joelvonrotz 0:11ad6aaed10a 31 *
joelvonrotz 0:11ad6aaed10a 32 * Copyright (C) 2014 ST MicroElectronics
joelvonrotz 0:11ad6aaed10a 33 *
joelvonrotz 0:11ad6aaed10a 34 * provide variable word size byte/Word/dword VL6180x register access via i2c
joelvonrotz 0:11ad6aaed10a 35 *
joelvonrotz 0:11ad6aaed10a 36 */
joelvonrotz 0:11ad6aaed10a 37 #include "mbed.h"
joelvonrotz 0:11ad6aaed10a 38 #include "vl53l0x_platform.h"
joelvonrotz 0:11ad6aaed10a 39 #include "vl53l0x_api.h"
joelvonrotz 0:11ad6aaed10a 40 #include "stdint.h"
joelvonrotz 0:11ad6aaed10a 41
joelvonrotz 0:11ad6aaed10a 42 /**
joelvonrotz 0:11ad6aaed10a 43 * @def I2C_BUFFER_CONFIG
joelvonrotz 0:11ad6aaed10a 44 *
joelvonrotz 0:11ad6aaed10a 45 * @brief Configure Device register I2C access
joelvonrotz 0:11ad6aaed10a 46 *
joelvonrotz 0:11ad6aaed10a 47 * @li 0 : one GLOBAL buffer \n
joelvonrotz 0:11ad6aaed10a 48 * Use one global buffer of MAX_I2C_XFER_SIZE byte in data space \n
joelvonrotz 0:11ad6aaed10a 49 * This solution is not multi-Device compliant nor multi-thread cpu safe \n
joelvonrotz 0:11ad6aaed10a 50 * It can be the best option for small 8/16 bit MCU without stack and limited ram (STM8s, 80C51 ...)
joelvonrotz 0:11ad6aaed10a 51 *
joelvonrotz 0:11ad6aaed10a 52 * @li 1 : ON_STACK/local \n
joelvonrotz 0:11ad6aaed10a 53 * Use local variable (on stack) buffer \n
joelvonrotz 0:11ad6aaed10a 54 * This solution is multi-thread with use of i2c resource lock or mutex see VL6180x_GetI2CAccess() \n
joelvonrotz 0:11ad6aaed10a 55 *
joelvonrotz 0:11ad6aaed10a 56 * @li 2 : User defined \n
joelvonrotz 0:11ad6aaed10a 57 * Per Device potentially dynamic allocated. Requires VL6180x_GetI2cBuffer() to be implemented.
joelvonrotz 0:11ad6aaed10a 58 * @ingroup Configuration
joelvonrotz 0:11ad6aaed10a 59 */
joelvonrotz 0:11ad6aaed10a 60 #define I2C_BUFFER_CONFIG 1
joelvonrotz 0:11ad6aaed10a 61 /** Maximum buffer size to be used in i2c */
joelvonrotz 0:11ad6aaed10a 62 #define VL53L0X_MAX_I2C_XFER_SIZE 64 /* Maximum buffer size to be used in i2c */
joelvonrotz 0:11ad6aaed10a 63
joelvonrotz 0:11ad6aaed10a 64 #if I2C_BUFFER_CONFIG == 0
joelvonrotz 0:11ad6aaed10a 65 /* GLOBAL config buffer */
joelvonrotz 0:11ad6aaed10a 66 uint8_t i2c_global_buffer[VL53L0X_MAX_I2C_XFER_SIZE];
joelvonrotz 0:11ad6aaed10a 67
joelvonrotz 0:11ad6aaed10a 68 #define DECL_I2C_BUFFER
joelvonrotz 0:11ad6aaed10a 69 #define VL53L0X_GetLocalBuffer(Dev, n_byte) i2c_global_buffer
joelvonrotz 0:11ad6aaed10a 70
joelvonrotz 0:11ad6aaed10a 71 #elif I2C_BUFFER_CONFIG == 1
joelvonrotz 0:11ad6aaed10a 72 /* ON STACK */
joelvonrotz 0:11ad6aaed10a 73 #define DECL_I2C_BUFFER uint8_t LocBuffer[VL53L0X_MAX_I2C_XFER_SIZE];
joelvonrotz 0:11ad6aaed10a 74 #define VL53L0X_GetLocalBuffer(Dev, n_byte) LocBuffer
joelvonrotz 0:11ad6aaed10a 75 #elif I2C_BUFFER_CONFIG == 2
joelvonrotz 0:11ad6aaed10a 76 /* user define buffer type declare DECL_I2C_BUFFER as access via VL53L0X_GetLocalBuffer */
joelvonrotz 0:11ad6aaed10a 77 #define DECL_I2C_BUFFER
joelvonrotz 0:11ad6aaed10a 78 #else
joelvonrotz 0:11ad6aaed10a 79 #error "invalid I2C_BUFFER_CONFIG "
joelvonrotz 0:11ad6aaed10a 80 #endif
joelvonrotz 0:11ad6aaed10a 81
joelvonrotz 0:11ad6aaed10a 82 VL53L0X_Error VL53L0X_LockSequenceAccess(VL53L0X_DEV Dev)
joelvonrotz 0:11ad6aaed10a 83 {
joelvonrotz 0:11ad6aaed10a 84 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 85
joelvonrotz 0:11ad6aaed10a 86 return Status;
joelvonrotz 0:11ad6aaed10a 87 }
joelvonrotz 0:11ad6aaed10a 88
joelvonrotz 0:11ad6aaed10a 89 VL53L0X_Error VL53L0X_UnlockSequenceAccess(VL53L0X_DEV Dev)
joelvonrotz 0:11ad6aaed10a 90 {
joelvonrotz 0:11ad6aaed10a 91 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 92
joelvonrotz 0:11ad6aaed10a 93 return Status;
joelvonrotz 0:11ad6aaed10a 94 }
joelvonrotz 0:11ad6aaed10a 95
joelvonrotz 0:11ad6aaed10a 96 VL53L0X_Error VL53L0X_WriteMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata, uint32_t count)
joelvonrotz 0:11ad6aaed10a 97 {
joelvonrotz 0:11ad6aaed10a 98 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 99 int32_t status_int = 0;
joelvonrotz 0:11ad6aaed10a 100
joelvonrotz 0:11ad6aaed10a 101 char data[count+1];
joelvonrotz 0:11ad6aaed10a 102 data[0]=index;
joelvonrotz 0:11ad6aaed10a 103 for (int i = 1; i< count+1; i++)
joelvonrotz 0:11ad6aaed10a 104 {
joelvonrotz 0:11ad6aaed10a 105 data[i]=pdata[i-1];
joelvonrotz 0:11ad6aaed10a 106 }
joelvonrotz 0:11ad6aaed10a 107 status_int = Dev->i2c_device->write((Dev->i2c_address << 1), data, static_cast<int>(count));
joelvonrotz 0:11ad6aaed10a 108
joelvonrotz 0:11ad6aaed10a 109 if (status_int != 0)
joelvonrotz 0:11ad6aaed10a 110 {
joelvonrotz 0:11ad6aaed10a 111 Status = VL53L0X_ERROR_CONTROL_INTERFACE;
joelvonrotz 0:11ad6aaed10a 112 }
joelvonrotz 0:11ad6aaed10a 113
joelvonrotz 0:11ad6aaed10a 114 return Status;
joelvonrotz 0:11ad6aaed10a 115 }
joelvonrotz 0:11ad6aaed10a 116
joelvonrotz 0:11ad6aaed10a 117 // the ranging_sensor_comms.dll will take care of the page selection
joelvonrotz 0:11ad6aaed10a 118 VL53L0X_Error VL53L0X_ReadMulti(VL53L0X_DEV Dev, uint8_t index, uint8_t *pdata, uint32_t count)
joelvonrotz 0:11ad6aaed10a 119 {
joelvonrotz 0:11ad6aaed10a 120 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 121 int32_t status_int;
joelvonrotz 0:11ad6aaed10a 122 char i2c_package_cmd[1];
joelvonrotz 0:11ad6aaed10a 123 char i2c_package_data[count];
joelvonrotz 0:11ad6aaed10a 124
joelvonrotz 0:11ad6aaed10a 125
joelvonrotz 0:11ad6aaed10a 126 if (count >= VL53L0X_MAX_I2C_XFER_SIZE)
joelvonrotz 0:11ad6aaed10a 127 {
joelvonrotz 0:11ad6aaed10a 128
joelvonrotz 0:11ad6aaed10a 129 Status = VL53L0X_ERROR_INVALID_PARAMS;
joelvonrotz 0:11ad6aaed10a 130 }
joelvonrotz 0:11ad6aaed10a 131 else
joelvonrotz 0:11ad6aaed10a 132 {
joelvonrotz 0:11ad6aaed10a 133 i2c_package_cmd[0]=index;
joelvonrotz 0:11ad6aaed10a 134 status_int = Dev->i2c_device->write((Dev->i2c_address << 1), i2c_package_cmd, 1, true);
joelvonrotz 0:11ad6aaed10a 135 status_int = Dev->i2c_device->read( (Dev->i2c_address << 1), i2c_package_data, count);
joelvonrotz 0:11ad6aaed10a 136 }
joelvonrotz 0:11ad6aaed10a 137
joelvonrotz 0:11ad6aaed10a 138 for(int x = 0 ; x < count ; x++)
joelvonrotz 0:11ad6aaed10a 139 {
joelvonrotz 0:11ad6aaed10a 140 pdata[x] = i2c_package_data[x];
joelvonrotz 0:11ad6aaed10a 141 }
joelvonrotz 0:11ad6aaed10a 142
joelvonrotz 0:11ad6aaed10a 143 if (status_int != 0)
joelvonrotz 0:11ad6aaed10a 144 {
joelvonrotz 0:11ad6aaed10a 145 Status = VL53L0X_ERROR_CONTROL_INTERFACE;
joelvonrotz 0:11ad6aaed10a 146 }
joelvonrotz 0:11ad6aaed10a 147
joelvonrotz 0:11ad6aaed10a 148 return Status;
joelvonrotz 0:11ad6aaed10a 149 }
joelvonrotz 0:11ad6aaed10a 150
joelvonrotz 0:11ad6aaed10a 151 VL53L0X_Error VL53L0X_WrByte(VL53L0X_DEV Dev, uint8_t index, uint8_t data)
joelvonrotz 0:11ad6aaed10a 152 {
joelvonrotz 0:11ad6aaed10a 153 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 154 int32_t status_int;
joelvonrotz 0:11ad6aaed10a 155 char i2c_package[2];
joelvonrotz 0:11ad6aaed10a 156 i2c_package[0] = index;
joelvonrotz 0:11ad6aaed10a 157 i2c_package[1] = data;
joelvonrotz 0:11ad6aaed10a 158
joelvonrotz 0:11ad6aaed10a 159 status_int = Dev->i2c_device->write((Dev->i2c_address << 1), i2c_package, 2);
joelvonrotz 0:11ad6aaed10a 160
joelvonrotz 0:11ad6aaed10a 161 if (status_int != 0)
joelvonrotz 0:11ad6aaed10a 162 {
joelvonrotz 0:11ad6aaed10a 163 Status = VL53L0X_ERROR_CONTROL_INTERFACE;
joelvonrotz 0:11ad6aaed10a 164 }
joelvonrotz 0:11ad6aaed10a 165
joelvonrotz 0:11ad6aaed10a 166 return Status;
joelvonrotz 0:11ad6aaed10a 167 }
joelvonrotz 0:11ad6aaed10a 168
joelvonrotz 0:11ad6aaed10a 169 VL53L0X_Error VL53L0X_WrWord(VL53L0X_DEV Dev, uint8_t index, uint16_t data)
joelvonrotz 0:11ad6aaed10a 170 {
joelvonrotz 0:11ad6aaed10a 171 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 172 int32_t status_int;
joelvonrotz 0:11ad6aaed10a 173 char i2c_package[3];
joelvonrotz 0:11ad6aaed10a 174 i2c_package[0] = index;
joelvonrotz 0:11ad6aaed10a 175 i2c_package[1] = (data >> 8) & 0xFF;
joelvonrotz 0:11ad6aaed10a 176 i2c_package[2] = (data >> 0) & 0xFF;
joelvonrotz 0:11ad6aaed10a 177
joelvonrotz 0:11ad6aaed10a 178 status_int = Dev->i2c_device->write((Dev->i2c_address << 1), i2c_package, 3);
joelvonrotz 0:11ad6aaed10a 179
joelvonrotz 0:11ad6aaed10a 180 if (status_int != 0)
joelvonrotz 0:11ad6aaed10a 181 {
joelvonrotz 0:11ad6aaed10a 182 Status = VL53L0X_ERROR_CONTROL_INTERFACE;
joelvonrotz 0:11ad6aaed10a 183 }
joelvonrotz 0:11ad6aaed10a 184
joelvonrotz 0:11ad6aaed10a 185 return Status;
joelvonrotz 0:11ad6aaed10a 186 }
joelvonrotz 0:11ad6aaed10a 187
joelvonrotz 0:11ad6aaed10a 188 VL53L0X_Error VL53L0X_WrDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t data)
joelvonrotz 0:11ad6aaed10a 189 {
joelvonrotz 0:11ad6aaed10a 190 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 191 int32_t status_int;
joelvonrotz 0:11ad6aaed10a 192
joelvonrotz 0:11ad6aaed10a 193 char i2c_package[5];
joelvonrotz 0:11ad6aaed10a 194 i2c_package[0] = index;
joelvonrotz 0:11ad6aaed10a 195 i2c_package[1] = (data >> 24) & 0xFF;
joelvonrotz 0:11ad6aaed10a 196 i2c_package[2] = (data >> 16) & 0xFF;
joelvonrotz 0:11ad6aaed10a 197 i2c_package[3] = (data >> 8) & 0xFF;
joelvonrotz 0:11ad6aaed10a 198 i2c_package[4] = (data >> 0) & 0xFF;
joelvonrotz 0:11ad6aaed10a 199
joelvonrotz 0:11ad6aaed10a 200 status_int = Dev->i2c_device->write((Dev->i2c_address << 1), i2c_package, 5);
joelvonrotz 0:11ad6aaed10a 201
joelvonrotz 0:11ad6aaed10a 202 if (status_int != 0)
joelvonrotz 0:11ad6aaed10a 203 {
joelvonrotz 0:11ad6aaed10a 204 Status = VL53L0X_ERROR_CONTROL_INTERFACE;
joelvonrotz 0:11ad6aaed10a 205 }
joelvonrotz 0:11ad6aaed10a 206 return Status;
joelvonrotz 0:11ad6aaed10a 207 }
joelvonrotz 0:11ad6aaed10a 208
joelvonrotz 0:11ad6aaed10a 209 VL53L0X_Error VL53L0X_UpdateByte(VL53L0X_DEV Dev, uint8_t index, uint8_t AndData, uint8_t OrData)
joelvonrotz 0:11ad6aaed10a 210 {
joelvonrotz 0:11ad6aaed10a 211 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 212 int32_t status_int;
joelvonrotz 0:11ad6aaed10a 213 char data;
joelvonrotz 0:11ad6aaed10a 214 char ind = index;
joelvonrotz 0:11ad6aaed10a 215 status_int = Dev->i2c_device->write((Dev->i2c_address << 1), &ind, 1, true);
joelvonrotz 0:11ad6aaed10a 216 status_int = Dev->i2c_device->read((Dev->i2c_address << 1), &data, 1);
joelvonrotz 0:11ad6aaed10a 217
joelvonrotz 0:11ad6aaed10a 218 if (status_int != 0)
joelvonrotz 0:11ad6aaed10a 219 {
joelvonrotz 0:11ad6aaed10a 220 Status = VL53L0X_ERROR_CONTROL_INTERFACE;
joelvonrotz 0:11ad6aaed10a 221 }
joelvonrotz 0:11ad6aaed10a 222
joelvonrotz 0:11ad6aaed10a 223 if (Status == VL53L0X_ERROR_NONE)
joelvonrotz 0:11ad6aaed10a 224 {
joelvonrotz 0:11ad6aaed10a 225 data = (data & AndData) | OrData;
joelvonrotz 0:11ad6aaed10a 226
joelvonrotz 0:11ad6aaed10a 227 status_int = Dev->i2c_device->write((Dev->i2c_address << 1), &data, 1);
joelvonrotz 0:11ad6aaed10a 228
joelvonrotz 0:11ad6aaed10a 229 if (status_int != 0)
joelvonrotz 0:11ad6aaed10a 230 {
joelvonrotz 0:11ad6aaed10a 231 Status = VL53L0X_ERROR_CONTROL_INTERFACE;
joelvonrotz 0:11ad6aaed10a 232 }
joelvonrotz 0:11ad6aaed10a 233 }
joelvonrotz 0:11ad6aaed10a 234
joelvonrotz 0:11ad6aaed10a 235 return Status;
joelvonrotz 0:11ad6aaed10a 236 }
joelvonrotz 0:11ad6aaed10a 237
joelvonrotz 0:11ad6aaed10a 238 VL53L0X_Error VL53L0X_RdByte(VL53L0X_DEV Dev, uint8_t index, uint8_t *data)
joelvonrotz 0:11ad6aaed10a 239 {
joelvonrotz 0:11ad6aaed10a 240 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 241 int32_t status_int;
joelvonrotz 0:11ad6aaed10a 242 char pdata;
joelvonrotz 0:11ad6aaed10a 243 char ind = index;
joelvonrotz 0:11ad6aaed10a 244
joelvonrotz 0:11ad6aaed10a 245 status_int = Dev->i2c_device->write((Dev->i2c_address << 1), &ind, 1, true);
joelvonrotz 0:11ad6aaed10a 246 status_int = Dev->i2c_device->read((Dev->i2c_address << 1), &pdata, 1);
joelvonrotz 0:11ad6aaed10a 247
joelvonrotz 0:11ad6aaed10a 248 *data = pdata;
joelvonrotz 0:11ad6aaed10a 249
joelvonrotz 0:11ad6aaed10a 250 if (status_int != 0)
joelvonrotz 0:11ad6aaed10a 251 {
joelvonrotz 0:11ad6aaed10a 252 Status = VL53L0X_ERROR_CONTROL_INTERFACE;
joelvonrotz 0:11ad6aaed10a 253 }
joelvonrotz 0:11ad6aaed10a 254
joelvonrotz 0:11ad6aaed10a 255 return Status;
joelvonrotz 0:11ad6aaed10a 256 }
joelvonrotz 0:11ad6aaed10a 257
joelvonrotz 0:11ad6aaed10a 258 VL53L0X_Error VL53L0X_RdWord(VL53L0X_DEV Dev, uint8_t index, uint16_t *data)
joelvonrotz 0:11ad6aaed10a 259 {
joelvonrotz 0:11ad6aaed10a 260 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 261 int32_t status_int;
joelvonrotz 0:11ad6aaed10a 262 char pdata[2];
joelvonrotz 0:11ad6aaed10a 263 char ind = index;
joelvonrotz 0:11ad6aaed10a 264 uint16_t tmp = 0;
joelvonrotz 0:11ad6aaed10a 265
joelvonrotz 0:11ad6aaed10a 266 status_int = Dev->i2c_device->write((Dev->i2c_address << 1), &ind, 1, true);
joelvonrotz 0:11ad6aaed10a 267 status_int = Dev->i2c_device->read((Dev->i2c_address << 1), pdata, 2);
joelvonrotz 0:11ad6aaed10a 268 tmp |= pdata[1]<<0;
joelvonrotz 0:11ad6aaed10a 269 tmp |= pdata[0]<<8;
joelvonrotz 0:11ad6aaed10a 270 *data = tmp;
joelvonrotz 0:11ad6aaed10a 271
joelvonrotz 0:11ad6aaed10a 272 if (status_int != 0)
joelvonrotz 0:11ad6aaed10a 273 {
joelvonrotz 0:11ad6aaed10a 274 Status = VL53L0X_ERROR_CONTROL_INTERFACE;
joelvonrotz 0:11ad6aaed10a 275 }
joelvonrotz 0:11ad6aaed10a 276
joelvonrotz 0:11ad6aaed10a 277
joelvonrotz 0:11ad6aaed10a 278 return Status;
joelvonrotz 0:11ad6aaed10a 279 }
joelvonrotz 0:11ad6aaed10a 280
joelvonrotz 0:11ad6aaed10a 281 VL53L0X_Error VL53L0X_RdDWord(VL53L0X_DEV Dev, uint8_t index, uint32_t *data)
joelvonrotz 0:11ad6aaed10a 282 {
joelvonrotz 0:11ad6aaed10a 283 VL53L0X_Error Status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 284 int32_t status_int;
joelvonrotz 0:11ad6aaed10a 285 char pdata[4];
joelvonrotz 0:11ad6aaed10a 286 char ind = index;
joelvonrotz 0:11ad6aaed10a 287 uint32_t tmp = 0;
joelvonrotz 0:11ad6aaed10a 288
joelvonrotz 0:11ad6aaed10a 289 status_int = Dev->i2c_device->write((Dev->i2c_address << 1), &ind, 1, true);
joelvonrotz 0:11ad6aaed10a 290 status_int = Dev->i2c_device->read((Dev->i2c_address << 1), pdata, 4);
joelvonrotz 0:11ad6aaed10a 291 tmp |= pdata[3]<<0;
joelvonrotz 0:11ad6aaed10a 292 tmp |= pdata[2]<<8;
joelvonrotz 0:11ad6aaed10a 293 tmp |= pdata[1]<<16;
joelvonrotz 0:11ad6aaed10a 294 tmp |= pdata[0]<<24;
joelvonrotz 0:11ad6aaed10a 295 *data = tmp;
joelvonrotz 0:11ad6aaed10a 296
joelvonrotz 0:11ad6aaed10a 297 if (status_int != 0)
joelvonrotz 0:11ad6aaed10a 298 {
joelvonrotz 0:11ad6aaed10a 299 Status = VL53L0X_ERROR_CONTROL_INTERFACE;
joelvonrotz 0:11ad6aaed10a 300 }
joelvonrotz 0:11ad6aaed10a 301
joelvonrotz 0:11ad6aaed10a 302 return Status;
joelvonrotz 0:11ad6aaed10a 303 }
joelvonrotz 0:11ad6aaed10a 304
joelvonrotz 0:11ad6aaed10a 305 #define VL53L0X_POLLINGDELAY_LOOPNB 250
joelvonrotz 0:11ad6aaed10a 306
joelvonrotz 0:11ad6aaed10a 307 VL53L0X_Error VL53L0X_PollingDelay(VL53L0X_DEV Dev)
joelvonrotz 0:11ad6aaed10a 308 {
joelvonrotz 0:11ad6aaed10a 309 VL53L0X_Error status = VL53L0X_ERROR_NONE;
joelvonrotz 0:11ad6aaed10a 310 volatile uint32_t i;
joelvonrotz 0:11ad6aaed10a 311 for(i=0;i<VL53L0X_POLLINGDELAY_LOOPNB;i++){
joelvonrotz 0:11ad6aaed10a 312 //Do nothing
joelvonrotz 0:11ad6aaed10a 313 asm("nop");
joelvonrotz 0:11ad6aaed10a 314 }
joelvonrotz 0:11ad6aaed10a 315 return status;
joelvonrotz 0:11ad6aaed10a 316 }