use VL6180XA1 chip wothout X-NUCLEO-6180XA1 Board. Simple way to use the chip.

Dependents:   Check_VL6180XA1_ToF

Fork of X_NUCLEO_6180XA1 by ST

Committer:
kenjiArai
Date:
Thu Feb 01 12:05:43 2018 +0000
Revision:
60:972b4898a007
Parent:
59:81afbb75311d
more simple / delete DevI2C and others

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Davidroid 57:fa4c622b04a7 1 /**
Davidroid 57:fa4c622b04a7 2 ******************************************************************************
Davidroid 57:fa4c622b04a7 3 * @file VL6180X.cpp
Davidroid 57:fa4c622b04a7 4 * @author AST / EST
Davidroid 57:fa4c622b04a7 5 * @version V0.0.1
Davidroid 57:fa4c622b04a7 6 * @date 14-April-2015
Davidroid 57:fa4c622b04a7 7 * @brief Implementation file for the HTS221 driver class
Davidroid 57:fa4c622b04a7 8 ******************************************************************************
Davidroid 57:fa4c622b04a7 9 * @attention
Davidroid 57:fa4c622b04a7 10 *
Davidroid 57:fa4c622b04a7 11 * <h2><center>&copy; COPYRIGHT(c) 2015 STMicroelectronics</center></h2>
Davidroid 57:fa4c622b04a7 12 *
Davidroid 57:fa4c622b04a7 13 * Redistribution and use in source and binary forms, with or without modification,
Davidroid 57:fa4c622b04a7 14 * are permitted provided that the following conditions are met:
Davidroid 57:fa4c622b04a7 15 * 1. Redistributions of source code must retain the above copyright notice,
Davidroid 57:fa4c622b04a7 16 * this list of conditions and the following disclaimer.
Davidroid 57:fa4c622b04a7 17 * 2. Redistributions in binary form must reproduce the above copyright notice,
Davidroid 57:fa4c622b04a7 18 * this list of conditions and the following disclaimer in the documentation
Davidroid 57:fa4c622b04a7 19 * and/or other materials provided with the distribution.
Davidroid 57:fa4c622b04a7 20 * 3. Neither the name of STMicroelectronics nor the names of its contributors
Davidroid 57:fa4c622b04a7 21 * may be used to endorse or promote products derived from this software
Davidroid 57:fa4c622b04a7 22 * without specific prior written permission.
Davidroid 57:fa4c622b04a7 23 *
Davidroid 57:fa4c622b04a7 24 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
Davidroid 57:fa4c622b04a7 25 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
Davidroid 57:fa4c622b04a7 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
Davidroid 57:fa4c622b04a7 27 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
Davidroid 57:fa4c622b04a7 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
Davidroid 57:fa4c622b04a7 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
Davidroid 57:fa4c622b04a7 30 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
Davidroid 57:fa4c622b04a7 31 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
Davidroid 57:fa4c622b04a7 32 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
Davidroid 57:fa4c622b04a7 33 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Davidroid 57:fa4c622b04a7 34 *
Davidroid 57:fa4c622b04a7 35 ******************************************************************************
Davidroid 57:fa4c622b04a7 36 */
kenjiArai 60:972b4898a007 37
kenjiArai 60:972b4898a007 38 //------- Feburary 1st, 2018 by JH1PJL / K.Arai --------------------------------
kenjiArai 60:972b4898a007 39 // Change X_NUCLEO_6180XA1 library to 6180XA1_simplest library
kenjiArai 60:972b4898a007 40 // modified -> all related files
kenjiArai 60:972b4898a007 41 //------------------------------------------------------------------------------
kenjiArai 60:972b4898a007 42
Davidroid 57:fa4c622b04a7 43 /* Includes */
Davidroid 57:fa4c622b04a7 44 #include "VL6180X.h"
kenjiArai 60:972b4898a007 45
kenjiArai 60:972b4898a007 46 #define VL6180X_DEV_DATA_ATTR
kenjiArai 60:972b4898a007 47 #define ROMABLE_DATA
Davidroid 57:fa4c622b04a7 48
kenjiArai 60:972b4898a007 49 //-------- NOT USE FOLLOING FUNCTIONS -------------
kenjiArai 60:972b4898a007 50 //void OnErrLog(void);
kenjiArai 60:972b4898a007 51 #define LOG_FUNCTION_START(...) (void)0
kenjiArai 60:972b4898a007 52 #define LOG_FUNCTION_END(...) (void)0
kenjiArai 60:972b4898a007 53 #define LOG_FUNCTION_END_FMT(...) (void)0
kenjiArai 60:972b4898a007 54 #define VL6180X_ErrLog(... ) //OnErrLog() //(void)0
kenjiArai 60:972b4898a007 55
kenjiArai 60:972b4898a007 56 #define VL6180XDevDataGet(dev, field) (dev->Data.field)
kenjiArai 60:972b4898a007 57 #define VL6180XDevDataSet(dev, field, data) (dev->Data.field)=(data)
kenjiArai 60:972b4898a007 58
Davidroid 57:fa4c622b04a7 59 /** @defgroup api_init Init functions
Davidroid 57:fa4c622b04a7 60 * @brief API init functions
Davidroid 57:fa4c622b04a7 61 * @ingroup api_hl
kenjiArai 60:972b4898a007 62 * @{
Davidroid 57:fa4c622b04a7 63 */
kenjiArai 60:972b4898a007 64
kenjiArai 60:972b4898a007 65
kenjiArai 60:972b4898a007 66 /****************** define for i2c configuration *******************************/
kenjiArai 60:972b4898a007 67 #define TEMP_BUF_SIZE 32
kenjiArai 60:972b4898a007 68
Davidroid 57:fa4c622b04a7 69 /******************************************************************************/
Davidroid 57:fa4c622b04a7 70 /******************************* file api.c ***********************************/
kenjiArai 60:972b4898a007 71
Davidroid 57:fa4c622b04a7 72 #define VL6180X_9to7Conv(x) (x)
kenjiArai 60:972b4898a007 73
Davidroid 57:fa4c622b04a7 74 /* TODO when set all "cached" value with "default init" are updated after init from register read back */
Davidroid 57:fa4c622b04a7 75 #define REFRESH_CACHED_DATA_AFTER_INIT 1
kenjiArai 60:972b4898a007 76
Davidroid 57:fa4c622b04a7 77 /** default value ECE factor Molecular */
Davidroid 57:fa4c622b04a7 78 #define DEF_ECE_FACTOR_M 85
Davidroid 57:fa4c622b04a7 79 /** default value ECE factor Denominator */
Davidroid 57:fa4c622b04a7 80 #define DEF_ECE_FACTOR_D 100
Davidroid 57:fa4c622b04a7 81 /** default value ALS integration time */
Davidroid 57:fa4c622b04a7 82 #define DEF_INT_PEFRIOD 100
Davidroid 57:fa4c622b04a7 83 /** default value ALS gain */
Davidroid 57:fa4c622b04a7 84 #define DEF_ALS_GAIN 1
Davidroid 57:fa4c622b04a7 85 /** default value ALS scaler */
Davidroid 57:fa4c622b04a7 86 #define DEF_ALS_SCALER 1
Davidroid 57:fa4c622b04a7 87 /** default value for DMAX Enbale */
Davidroid 57:fa4c622b04a7 88 #define DEF_DMAX_ENABLE 1
Davidroid 57:fa4c622b04a7 89 /** default ambient tuning factor %x1000 */
Davidroid 57:fa4c622b04a7 90 #define DEF_AMBIENT_TUNING 80
kenjiArai 60:972b4898a007 91
Davidroid 57:fa4c622b04a7 92 #define LUXRES_FIX_PREC 8
Davidroid 57:fa4c622b04a7 93 #define GAIN_FIX_PREC 8 /* ! if not sme as LUX_PREC then :( adjust GetLux */
Davidroid 57:fa4c622b04a7 94 #define AN_GAIN_MULT (1<<GAIN_FIX_PREC)
kenjiArai 60:972b4898a007 95
Davidroid 57:fa4c622b04a7 96 /**
Davidroid 57:fa4c622b04a7 97 * Als Code gain to fix point gain lookup
Davidroid 57:fa4c622b04a7 98 */
Davidroid 57:fa4c622b04a7 99 static const uint16_t AlsGainLookUp[8] ROMABLE_DATA = {
kenjiArai 60:972b4898a007 100 (uint16_t)(20.0f * AN_GAIN_MULT),
kenjiArai 60:972b4898a007 101 (uint16_t)(10.0f * AN_GAIN_MULT),
kenjiArai 60:972b4898a007 102 (uint16_t)(5.0f * AN_GAIN_MULT),
kenjiArai 60:972b4898a007 103 (uint16_t)(2.5f * AN_GAIN_MULT),
kenjiArai 60:972b4898a007 104 (uint16_t)(1.67f * AN_GAIN_MULT),
kenjiArai 60:972b4898a007 105 (uint16_t)(1.25f * AN_GAIN_MULT),
kenjiArai 60:972b4898a007 106 (uint16_t)(1.0f * AN_GAIN_MULT),
kenjiArai 60:972b4898a007 107 (uint16_t)(40.0f * AN_GAIN_MULT),
Davidroid 57:fa4c622b04a7 108 };
kenjiArai 60:972b4898a007 109
Davidroid 57:fa4c622b04a7 110 #if VL6180X_UPSCALE_SUPPORT == 1
kenjiArai 60:972b4898a007 111 #define _GetUpscale(dev, ... ) 1
kenjiArai 60:972b4898a007 112 #define _SetUpscale(...) -1
kenjiArai 60:972b4898a007 113 #define DEF_UPSCALE 1
Davidroid 57:fa4c622b04a7 114 #elif VL6180X_UPSCALE_SUPPORT == 2
kenjiArai 60:972b4898a007 115 #define _GetUpscale(dev, ... ) 2
kenjiArai 60:972b4898a007 116 #define _SetUpscale(...)
kenjiArai 60:972b4898a007 117 #define DEF_UPSCALE 2
Davidroid 57:fa4c622b04a7 118 #elif VL6180X_UPSCALE_SUPPORT == 3
kenjiArai 60:972b4898a007 119 #define _GetUpscale(dev, ... ) 3
kenjiArai 60:972b4898a007 120 #define _SetUpscale(...)
kenjiArai 60:972b4898a007 121 #define DEF_UPSCALE 3
Davidroid 57:fa4c622b04a7 122 #else
kenjiArai 60:972b4898a007 123 #define DEF_UPSCALE (-(VL6180X_UPSCALE_SUPPORT))
kenjiArai 60:972b4898a007 124 #define _GetUpscale(dev, ... ) VL6180XDevDataGet(dev, UpscaleFactor)
kenjiArai 60:972b4898a007 125 #define _SetUpscale(dev, Scaling ) VL6180XDevDataSet(dev, UpscaleFactor, Scaling)
Davidroid 57:fa4c622b04a7 126 #endif
kenjiArai 60:972b4898a007 127
Davidroid 57:fa4c622b04a7 128 #define Fix7_2_KCPs(x) ((((uint32_t)(x))*1000)>>7)
kenjiArai 60:972b4898a007 129
kenjiArai 60:972b4898a007 130 int VL6180X::VL6180X_WaitDeviceBooted(VL6180XDev_t dev)
kenjiArai 60:972b4898a007 131 {
Davidroid 57:fa4c622b04a7 132 uint8_t FreshOutReset=0;
Davidroid 57:fa4c622b04a7 133 int status;
Davidroid 57:fa4c622b04a7 134 LOG_FUNCTION_START("");
kenjiArai 60:972b4898a007 135 do {
Davidroid 57:fa4c622b04a7 136 status = VL6180X_RdByte(dev,SYSTEM_FRESH_OUT_OF_RESET, &FreshOutReset);
kenjiArai 60:972b4898a007 137 } while( FreshOutReset!=1 && status==0);
Davidroid 57:fa4c622b04a7 138 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 139 return status;
Davidroid 57:fa4c622b04a7 140 }
kenjiArai 60:972b4898a007 141
kenjiArai 60:972b4898a007 142 int VL6180X::VL6180X_InitData(VL6180XDev_t dev)
kenjiArai 60:972b4898a007 143 {
Davidroid 57:fa4c622b04a7 144 int status, dmax_status ;
Davidroid 57:fa4c622b04a7 145 int8_t offset;
Davidroid 57:fa4c622b04a7 146 uint8_t FreshOutReset;
Davidroid 57:fa4c622b04a7 147 uint32_t CalValue;
Davidroid 57:fa4c622b04a7 148 uint16_t u16;
Davidroid 57:fa4c622b04a7 149 uint32_t XTalkCompRate_KCps;
kenjiArai 60:972b4898a007 150
Davidroid 57:fa4c622b04a7 151 LOG_FUNCTION_START("");
kenjiArai 60:972b4898a007 152
Davidroid 57:fa4c622b04a7 153 VL6180XDevDataSet(dev, EceFactorM , DEF_ECE_FACTOR_M);
Davidroid 57:fa4c622b04a7 154 VL6180XDevDataSet(dev, EceFactorD , DEF_ECE_FACTOR_D);
kenjiArai 60:972b4898a007 155
Davidroid 57:fa4c622b04a7 156 #ifdef VL6180X_HAVE_UPSCALE_DATA
Davidroid 57:fa4c622b04a7 157 VL6180XDevDataSet(dev, UpscaleFactor , DEF_UPSCALE);
Davidroid 57:fa4c622b04a7 158 #endif
kenjiArai 60:972b4898a007 159
Davidroid 57:fa4c622b04a7 160 #ifdef VL6180X_HAVE_ALS_DATA
Davidroid 57:fa4c622b04a7 161 VL6180XDevDataSet(dev, IntegrationPeriod, DEF_INT_PEFRIOD);
Davidroid 57:fa4c622b04a7 162 VL6180XDevDataSet(dev, AlsGainCode, DEF_ALS_GAIN);
Davidroid 57:fa4c622b04a7 163 VL6180XDevDataSet(dev, AlsScaler, DEF_ALS_SCALER);
Davidroid 57:fa4c622b04a7 164 #endif
kenjiArai 60:972b4898a007 165 do {
kenjiArai 60:972b4898a007 166
Davidroid 57:fa4c622b04a7 167 /* backup offset initial value from nvm these must be done prior any over call that use offset */
Davidroid 57:fa4c622b04a7 168 status = VL6180X::VL6180X_RdByte(dev,SYSRANGE_PART_TO_PART_RANGE_OFFSET, (uint8_t*)&offset);
kenjiArai 60:972b4898a007 169 if( status ) {
Davidroid 57:fa4c622b04a7 170 VL6180X_ErrLog("SYSRANGE_PART_TO_PART_RANGE_OFFSET rd fail");
Davidroid 57:fa4c622b04a7 171 break;
Davidroid 57:fa4c622b04a7 172 }
Davidroid 57:fa4c622b04a7 173 VL6180XDevDataSet(dev, Part2PartOffsetNVM, offset);
kenjiArai 60:972b4898a007 174
Davidroid 57:fa4c622b04a7 175 status=VL6180X_RdDWord( dev, SYSRANGE_RANGE_IGNORE_THRESHOLD, &CalValue);
kenjiArai 60:972b4898a007 176 if( status ) {
Davidroid 57:fa4c622b04a7 177 VL6180X_ErrLog("Part2PartAmbNVM rd fail");
Davidroid 57:fa4c622b04a7 178 break;
Davidroid 57:fa4c622b04a7 179 }
kenjiArai 60:972b4898a007 180 if( (CalValue&0xFFFF0000) == 0 ) {
Davidroid 57:fa4c622b04a7 181 CalValue=0x00CE03F8;
Davidroid 57:fa4c622b04a7 182 }
Davidroid 57:fa4c622b04a7 183 VL6180XDevDataSet(dev, Part2PartAmbNVM, CalValue);
kenjiArai 60:972b4898a007 184
Davidroid 57:fa4c622b04a7 185 status = VL6180X_RdWord(dev, SYSRANGE_CROSSTALK_COMPENSATION_RATE ,&u16);
kenjiArai 60:972b4898a007 186 if( status) {
Davidroid 57:fa4c622b04a7 187 VL6180X_ErrLog("SYSRANGE_CROSSTALK_COMPENSATION_RATE rd fail ");
Davidroid 57:fa4c622b04a7 188 break;
Davidroid 57:fa4c622b04a7 189 }
Davidroid 57:fa4c622b04a7 190 XTalkCompRate_KCps = Fix7_2_KCPs(u16);
Davidroid 57:fa4c622b04a7 191 VL6180XDevDataSet(dev, XTalkCompRate_KCps , XTalkCompRate_KCps );
Davidroid 57:fa4c622b04a7 192 /* Read or wait for fresh out of reset */
Davidroid 57:fa4c622b04a7 193 status = VL6180X_RdByte(dev,SYSTEM_FRESH_OUT_OF_RESET, &FreshOutReset);
Davidroid 57:fa4c622b04a7 194 if( status ) {
Davidroid 57:fa4c622b04a7 195 VL6180X_ErrLog("SYSTEM_FRESH_OUT_OF_RESET rd fail");
Davidroid 57:fa4c622b04a7 196 break;
Davidroid 57:fa4c622b04a7 197 }
Davidroid 57:fa4c622b04a7 198 if( FreshOutReset!= 1 || dmax_status )
Davidroid 57:fa4c622b04a7 199 status = CALIBRATION_WARNING;
kenjiArai 60:972b4898a007 200
kenjiArai 60:972b4898a007 201 } while(0);
kenjiArai 60:972b4898a007 202
Davidroid 57:fa4c622b04a7 203 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 204 return status;
Davidroid 57:fa4c622b04a7 205 }
kenjiArai 60:972b4898a007 206
kenjiArai 60:972b4898a007 207 int VL6180X::VL6180X_StaticInit(VL6180XDev_t dev)
kenjiArai 60:972b4898a007 208 {
Davidroid 57:fa4c622b04a7 209 int status=0, init_status;
Davidroid 57:fa4c622b04a7 210 LOG_FUNCTION_START("");
kenjiArai 60:972b4898a007 211
kenjiArai 60:972b4898a007 212 if( _GetUpscale(dev) == 1 )
Davidroid 57:fa4c622b04a7 213 init_status=VL6180X_RangeStaticInit(dev);
kenjiArai 60:972b4898a007 214
kenjiArai 60:972b4898a007 215 if( init_status <0 ) {
Davidroid 57:fa4c622b04a7 216 VL6180X_ErrLog("StaticInit fail");
Davidroid 57:fa4c622b04a7 217 goto error;
kenjiArai 60:972b4898a007 218 } else if(init_status > 0) {
Davidroid 57:fa4c622b04a7 219 VL6180X_ErrLog("StaticInit warning");
Davidroid 57:fa4c622b04a7 220 }
kenjiArai 60:972b4898a007 221
Davidroid 57:fa4c622b04a7 222 #if REFRESH_CACHED_DATA_AFTER_INIT
Davidroid 57:fa4c622b04a7 223 /* update cached value after tuning applied */
kenjiArai 60:972b4898a007 224 do {
Davidroid 57:fa4c622b04a7 225 #ifdef VL6180X_HAVE_ALS_DATA
Davidroid 57:fa4c622b04a7 226 uint8_t data;
Davidroid 57:fa4c622b04a7 227 status= VL6180X_RdByte(dev, FW_ALS_RESULT_SCALER, &data);
Davidroid 57:fa4c622b04a7 228 if( status ) break;
Davidroid 57:fa4c622b04a7 229 VL6180XDevDataSet(dev, AlsScaler, data);
kenjiArai 60:972b4898a007 230
Davidroid 57:fa4c622b04a7 231 status= VL6180X_RdByte(dev, SYSALS_ANALOGUE_GAIN, &data);
Davidroid 57:fa4c622b04a7 232 if( status ) break;
Davidroid 57:fa4c622b04a7 233 VL6180X_AlsSetAnalogueGain(dev, data);
Davidroid 57:fa4c622b04a7 234 #endif
kenjiArai 60:972b4898a007 235 } while(0);
Davidroid 57:fa4c622b04a7 236 #endif /* REFRESH_CACHED_DATA_AFTER_INIT */
kenjiArai 60:972b4898a007 237 if( status < 0 ) {
Davidroid 57:fa4c622b04a7 238 VL6180X_ErrLog("StaticInit fail");
Davidroid 57:fa4c622b04a7 239 }
kenjiArai 60:972b4898a007 240 if( !status && init_status) {
Davidroid 57:fa4c622b04a7 241 status = init_status;
Davidroid 57:fa4c622b04a7 242 }
Davidroid 57:fa4c622b04a7 243 error:
Davidroid 57:fa4c622b04a7 244 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 245 return status;
Davidroid 57:fa4c622b04a7 246 }
kenjiArai 60:972b4898a007 247 #if 1
Davidroid 57:fa4c622b04a7 248 int VL6180X::VL6180X_SetGroupParamHold(VL6180XDev_t dev, int Hold)
Davidroid 57:fa4c622b04a7 249 {
Davidroid 57:fa4c622b04a7 250 int status;
Davidroid 57:fa4c622b04a7 251 uint8_t value;
kenjiArai 60:972b4898a007 252
Davidroid 57:fa4c622b04a7 253 LOG_FUNCTION_START("%d", Hold);
Davidroid 57:fa4c622b04a7 254 if( Hold )
Davidroid 57:fa4c622b04a7 255 value = 1;
Davidroid 57:fa4c622b04a7 256 else
Davidroid 57:fa4c622b04a7 257 value = 0;
Davidroid 57:fa4c622b04a7 258 status = VL6180X_WrByte(dev, SYSTEM_GROUPED_PARAMETER_HOLD, value);
kenjiArai 60:972b4898a007 259
Davidroid 57:fa4c622b04a7 260 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 261 return status;
kenjiArai 60:972b4898a007 262
Davidroid 57:fa4c622b04a7 263 }
kenjiArai 60:972b4898a007 264 #endif
Davidroid 57:fa4c622b04a7 265 int VL6180X::VL6180X_Prepare(VL6180XDev_t dev)
Davidroid 57:fa4c622b04a7 266 {
Davidroid 57:fa4c622b04a7 267 int status;
Davidroid 57:fa4c622b04a7 268 LOG_FUNCTION_START("");
kenjiArai 60:972b4898a007 269
kenjiArai 60:972b4898a007 270 do {
Davidroid 57:fa4c622b04a7 271 status=VL6180X_StaticInit(dev);
Davidroid 57:fa4c622b04a7 272 if( status<0) break;
kenjiArai 60:972b4898a007 273
Davidroid 57:fa4c622b04a7 274 /* set default threshold */
Davidroid 57:fa4c622b04a7 275 status=VL6180X_RangeSetRawThresholds(dev, 10, 200);
kenjiArai 60:972b4898a007 276 if( status ) {
Davidroid 57:fa4c622b04a7 277 VL6180X_ErrLog("VL6180X_RangeSetRawThresholds fail");
Davidroid 57:fa4c622b04a7 278 break;
Davidroid 57:fa4c622b04a7 279 }
Davidroid 57:fa4c622b04a7 280 #if VL6180X_ALS_SUPPORT
Davidroid 57:fa4c622b04a7 281 status =VL6180X_AlsSetIntegrationPeriod(dev, 100);
Davidroid 57:fa4c622b04a7 282 if( status ) break;
Davidroid 57:fa4c622b04a7 283 status = VL6180X_AlsSetInterMeasurementPeriod(dev, 200);
Davidroid 57:fa4c622b04a7 284 if( status ) break;
Davidroid 57:fa4c622b04a7 285 status = VL6180X_AlsSetAnalogueGain(dev, 0);
Davidroid 57:fa4c622b04a7 286 if( status ) break;
Davidroid 57:fa4c622b04a7 287 status = VL6180X_AlsSetThresholds(dev, 0, 0xFFFF);
Davidroid 57:fa4c622b04a7 288 if( status ) break;
Davidroid 57:fa4c622b04a7 289 #endif
kenjiArai 60:972b4898a007 290 } while(0);
Davidroid 57:fa4c622b04a7 291 LOG_FUNCTION_END(status);
kenjiArai 60:972b4898a007 292
Davidroid 57:fa4c622b04a7 293 return status;
Davidroid 57:fa4c622b04a7 294 }
kenjiArai 60:972b4898a007 295
Davidroid 57:fa4c622b04a7 296 #if VL6180X_ALS_SUPPORT
Davidroid 57:fa4c622b04a7 297 int VL6180X::VL6180X_AlsGetLux(VL6180XDev_t dev, lux_t *pLux)
Davidroid 57:fa4c622b04a7 298 {
Davidroid 57:fa4c622b04a7 299 int status;
Davidroid 57:fa4c622b04a7 300 uint16_t RawAls;
Davidroid 57:fa4c622b04a7 301 uint32_t luxValue = 0;
Davidroid 57:fa4c622b04a7 302 uint32_t IntPeriod;
Davidroid 57:fa4c622b04a7 303 uint32_t AlsAnGain;
Davidroid 57:fa4c622b04a7 304 uint32_t GainFix;
Davidroid 57:fa4c622b04a7 305 uint32_t AlsScaler;
kenjiArai 60:972b4898a007 306
Davidroid 57:fa4c622b04a7 307 #if LUXRES_FIX_PREC != GAIN_FIX_PREC
Davidroid 57:fa4c622b04a7 308 #error "LUXRES_FIX_PREC != GAIN_FIX_PREC review these code to be correct"
Davidroid 57:fa4c622b04a7 309 #endif
Davidroid 57:fa4c622b04a7 310 const uint32_t LuxResxIntIme =(uint32_t)(0.56f* DEF_INT_PEFRIOD *(1<<LUXRES_FIX_PREC));
kenjiArai 60:972b4898a007 311
Davidroid 57:fa4c622b04a7 312 LOG_FUNCTION_START("%p", pLux);
kenjiArai 60:972b4898a007 313
Davidroid 57:fa4c622b04a7 314 status = VL6180X_RdWord( dev, RESULT_ALS_VAL, &RawAls);
kenjiArai 60:972b4898a007 315 if( !status) {
Davidroid 57:fa4c622b04a7 316 /* wer are yet here at no fix point */
Davidroid 57:fa4c622b04a7 317 IntPeriod=VL6180XDevDataGet(dev, IntegrationPeriod);
Davidroid 57:fa4c622b04a7 318 AlsScaler=VL6180XDevDataGet(dev, AlsScaler);
Davidroid 57:fa4c622b04a7 319 IntPeriod++; /* what stored is real time ms -1 and it can be 0 for or 0 or 1ms */
Davidroid 57:fa4c622b04a7 320 luxValue = (uint32_t)RawAls * LuxResxIntIme; /* max # 16+8bits + 6bit (0.56*100) */
Davidroid 57:fa4c622b04a7 321 luxValue /= IntPeriod; /* max # 16+8bits + 6bit 16+8+1 to 9 bit */
Davidroid 57:fa4c622b04a7 322 /* between 29 - 21 bit */
Davidroid 57:fa4c622b04a7 323 AlsAnGain = VL6180XDevDataGet(dev, AlsGainCode);
Davidroid 57:fa4c622b04a7 324 GainFix = AlsGainLookUp[AlsAnGain];
Davidroid 57:fa4c622b04a7 325 luxValue = luxValue / (AlsScaler * GainFix);
Davidroid 57:fa4c622b04a7 326 *pLux=luxValue;
Davidroid 57:fa4c622b04a7 327 }
kenjiArai 60:972b4898a007 328
Davidroid 57:fa4c622b04a7 329 LOG_FUNCTION_END_FMT(status, "%x",(int)*pLux);
Davidroid 57:fa4c622b04a7 330 return status;
Davidroid 57:fa4c622b04a7 331 }
kenjiArai 60:972b4898a007 332
kenjiArai 60:972b4898a007 333 int VL6180X::VL6180X_AlsWaitDeviceReady(VL6180XDev_t dev, int MaxLoop )
Davidroid 57:fa4c622b04a7 334 {
Davidroid 57:fa4c622b04a7 335 int status;
Davidroid 57:fa4c622b04a7 336 int n;
Davidroid 57:fa4c622b04a7 337 uint8_t u8;
Davidroid 57:fa4c622b04a7 338 LOG_FUNCTION_START("%d", (int)MaxLoop);
kenjiArai 60:972b4898a007 339 if( MaxLoop<1) {
kenjiArai 60:972b4898a007 340 status=INVALID_PARAMS;
kenjiArai 60:972b4898a007 341 } else {
kenjiArai 60:972b4898a007 342 for( n=0; n < MaxLoop ; n++) {
Davidroid 57:fa4c622b04a7 343 status=VL6180X_RdByte(dev, RESULT_ALS_STATUS, &u8);
Davidroid 57:fa4c622b04a7 344 if( status)
Davidroid 57:fa4c622b04a7 345 break;
Davidroid 57:fa4c622b04a7 346 u8 = u8 & ALS_DEVICE_READY_MASK;
Davidroid 57:fa4c622b04a7 347 if( u8 )
Davidroid 57:fa4c622b04a7 348 break;
kenjiArai 60:972b4898a007 349
Davidroid 57:fa4c622b04a7 350 }
kenjiArai 60:972b4898a007 351 if( !status && !u8 ) {
Davidroid 57:fa4c622b04a7 352 status = TIME_OUT;
Davidroid 57:fa4c622b04a7 353 }
Davidroid 57:fa4c622b04a7 354 }
Davidroid 57:fa4c622b04a7 355 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 356 return status;
Davidroid 57:fa4c622b04a7 357 }
kenjiArai 60:972b4898a007 358
Davidroid 57:fa4c622b04a7 359 int VL6180X::VL6180X_AlsSetSystemMode(VL6180XDev_t dev, uint8_t mode)
Davidroid 57:fa4c622b04a7 360 {
Davidroid 57:fa4c622b04a7 361 int status;
Davidroid 57:fa4c622b04a7 362 LOG_FUNCTION_START("%d", (int)mode);
Davidroid 57:fa4c622b04a7 363 /* FIXME if we are called back to back real fast we are not checking
Davidroid 57:fa4c622b04a7 364 * if previous mode "set" got absorbed => bit 0 must be 0 so that wr 1 work */
kenjiArai 60:972b4898a007 365 if( mode <= 3) {
Davidroid 57:fa4c622b04a7 366 status=VL6180X_WrByte(dev, SYSALS_START, mode);
kenjiArai 60:972b4898a007 367 } else {
Davidroid 57:fa4c622b04a7 368 status = INVALID_PARAMS;
Davidroid 57:fa4c622b04a7 369 }
Davidroid 57:fa4c622b04a7 370 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 371 return status;
Davidroid 57:fa4c622b04a7 372 }
kenjiArai 60:972b4898a007 373
kenjiArai 60:972b4898a007 374 int VL6180X::VL6180X_AlsSetThresholds(VL6180XDev_t dev, uint16_t low, uint16_t high)
Davidroid 57:fa4c622b04a7 375 {
Davidroid 57:fa4c622b04a7 376 int status;
Davidroid 57:fa4c622b04a7 377
Davidroid 57:fa4c622b04a7 378 LOG_FUNCTION_START("%d %d", (int )low, (int)high);
Davidroid 57:fa4c622b04a7 379
Davidroid 57:fa4c622b04a7 380 status = VL6180X_WrWord(dev, SYSALS_THRESH_LOW, low);
kenjiArai 60:972b4898a007 381 if(!status ) {
Davidroid 57:fa4c622b04a7 382 status = VL6180X_WrWord(dev, SYSALS_THRESH_HIGH, high);
Davidroid 57:fa4c622b04a7 383 }
Davidroid 57:fa4c622b04a7 384
Davidroid 57:fa4c622b04a7 385 LOG_FUNCTION_END(status) ;
Davidroid 57:fa4c622b04a7 386 return status;
Davidroid 57:fa4c622b04a7 387 }
Davidroid 57:fa4c622b04a7 388
kenjiArai 60:972b4898a007 389 int VL6180X::VL6180X_AlsSetAnalogueGain(VL6180XDev_t dev, uint8_t gain)
kenjiArai 60:972b4898a007 390 {
Davidroid 57:fa4c622b04a7 391 int status;
Davidroid 57:fa4c622b04a7 392 uint8_t GainTotal;
kenjiArai 60:972b4898a007 393
Davidroid 57:fa4c622b04a7 394 LOG_FUNCTION_START("%d", (int )gain);
Davidroid 57:fa4c622b04a7 395 gain&=~0x40;
Davidroid 57:fa4c622b04a7 396 if (gain > 7) {
Davidroid 57:fa4c622b04a7 397 gain = 7;
Davidroid 57:fa4c622b04a7 398 }
Davidroid 57:fa4c622b04a7 399 GainTotal = gain|0x40;
kenjiArai 60:972b4898a007 400
Davidroid 57:fa4c622b04a7 401 status = VL6180X_WrByte(dev, SYSALS_ANALOGUE_GAIN, GainTotal);
kenjiArai 60:972b4898a007 402 if( !status) {
Davidroid 57:fa4c622b04a7 403 VL6180XDevDataSet(dev, AlsGainCode, gain);
Davidroid 57:fa4c622b04a7 404 }
kenjiArai 60:972b4898a007 405
Davidroid 57:fa4c622b04a7 406 LOG_FUNCTION_END_FMT(status, "%d %d", (int ) gain, (int )GainTotal);
Davidroid 57:fa4c622b04a7 407 return status;
Davidroid 57:fa4c622b04a7 408 }
kenjiArai 60:972b4898a007 409
Davidroid 57:fa4c622b04a7 410 int VL6180X::VL6180X_AlsSetInterMeasurementPeriod(VL6180XDev_t dev, uint16_t intermeasurement_period_ms)
Davidroid 57:fa4c622b04a7 411 {
Davidroid 57:fa4c622b04a7 412 int status;
kenjiArai 60:972b4898a007 413
Davidroid 57:fa4c622b04a7 414 LOG_FUNCTION_START("%d",(int)intermeasurement_period_ms);
kenjiArai 60:972b4898a007 415 /* clipping: range is 0-2550ms */
kenjiArai 60:972b4898a007 416 if (intermeasurement_period_ms >= 255 *10)
kenjiArai 60:972b4898a007 417 intermeasurement_period_ms = 255 *10;
Davidroid 57:fa4c622b04a7 418 status=VL6180X_WrByte(dev, SYSALS_INTERMEASUREMENT_PERIOD, (uint8_t)(intermeasurement_period_ms/10));
kenjiArai 60:972b4898a007 419
Davidroid 57:fa4c622b04a7 420 LOG_FUNCTION_END_FMT(status, "%d", (int) intermeasurement_period_ms);
Davidroid 57:fa4c622b04a7 421 return status;
Davidroid 57:fa4c622b04a7 422 }
kenjiArai 60:972b4898a007 423
Davidroid 57:fa4c622b04a7 424 int VL6180X::VL6180X_AlsSetIntegrationPeriod(VL6180XDev_t dev, uint16_t period_ms)
Davidroid 57:fa4c622b04a7 425 {
Davidroid 57:fa4c622b04a7 426 int status;
Davidroid 57:fa4c622b04a7 427 uint16_t SetIntegrationPeriod;
kenjiArai 60:972b4898a007 428
Davidroid 57:fa4c622b04a7 429 LOG_FUNCTION_START("%d", (int)period_ms);
kenjiArai 60:972b4898a007 430
Davidroid 57:fa4c622b04a7 431 if( period_ms>=1 )
Davidroid 57:fa4c622b04a7 432 SetIntegrationPeriod = period_ms - 1;
Davidroid 57:fa4c622b04a7 433 else
Davidroid 57:fa4c622b04a7 434 SetIntegrationPeriod = period_ms;
kenjiArai 60:972b4898a007 435
Davidroid 57:fa4c622b04a7 436 if (SetIntegrationPeriod > 464) {
Davidroid 57:fa4c622b04a7 437 SetIntegrationPeriod = 464;
kenjiArai 60:972b4898a007 438 } else if (SetIntegrationPeriod == 255) {
Davidroid 57:fa4c622b04a7 439 SetIntegrationPeriod++; /* can't write 255 since this causes the device to lock out.*/
Davidroid 57:fa4c622b04a7 440 }
kenjiArai 60:972b4898a007 441
Davidroid 57:fa4c622b04a7 442 status =VL6180X_WrWord(dev, SYSALS_INTEGRATION_PERIOD, SetIntegrationPeriod);
kenjiArai 60:972b4898a007 443 if( !status ) {
Davidroid 57:fa4c622b04a7 444 VL6180XDevDataSet(dev, IntegrationPeriod, SetIntegrationPeriod) ;
Davidroid 57:fa4c622b04a7 445 }
Davidroid 57:fa4c622b04a7 446 LOG_FUNCTION_END_FMT(status, "%d", (int)SetIntegrationPeriod);
Davidroid 57:fa4c622b04a7 447 return status;
Davidroid 57:fa4c622b04a7 448 }
kenjiArai 60:972b4898a007 449
Davidroid 57:fa4c622b04a7 450 #endif /* HAVE_ALS_SUPPORT */
kenjiArai 60:972b4898a007 451
kenjiArai 60:972b4898a007 452 int VL6180X::VL6180X_RangeGetResult(VL6180XDev_t dev, uint32_t *pRange_mm)
Davidroid 57:fa4c622b04a7 453 {
Davidroid 57:fa4c622b04a7 454 int status;
Davidroid 57:fa4c622b04a7 455 uint8_t RawRange;
Davidroid 57:fa4c622b04a7 456 int32_t Upscale;
kenjiArai 60:972b4898a007 457
Davidroid 57:fa4c622b04a7 458 LOG_FUNCTION_START("%p",pRange_mm);
kenjiArai 60:972b4898a007 459
Davidroid 57:fa4c622b04a7 460 status = VL6180X_RdByte(dev, RESULT_RANGE_VAL, &RawRange);
kenjiArai 60:972b4898a007 461 if( !status ) {
kenjiArai 60:972b4898a007 462 Upscale = _GetUpscale(dev);
Davidroid 57:fa4c622b04a7 463 *pRange_mm= Upscale*(int32_t)RawRange;
Davidroid 57:fa4c622b04a7 464 }
Davidroid 57:fa4c622b04a7 465 LOG_FUNCTION_END_FMT(status, "%d", (int)*pRange_mm);
Davidroid 57:fa4c622b04a7 466 return status;
Davidroid 57:fa4c622b04a7 467 }
kenjiArai 60:972b4898a007 468
Davidroid 57:fa4c622b04a7 469 int VL6180X::VL6180X_RangeSetRawThresholds(VL6180XDev_t dev, uint8_t low, uint8_t high)
Davidroid 57:fa4c622b04a7 470 {
Davidroid 57:fa4c622b04a7 471 int status;
Davidroid 57:fa4c622b04a7 472 LOG_FUNCTION_START("%d %d", (int) low, (int)high);
Davidroid 57:fa4c622b04a7 473 /* TODO we can optimize here grouping high/low in a word but that's cpu endianness dependent */
Davidroid 57:fa4c622b04a7 474 status=VL6180X_WrByte(dev, SYSRANGE_THRESH_HIGH,high);
kenjiArai 60:972b4898a007 475 if( !status) {
Davidroid 57:fa4c622b04a7 476 status=VL6180X_WrByte(dev, SYSRANGE_THRESH_LOW, low);
Davidroid 57:fa4c622b04a7 477 }
kenjiArai 60:972b4898a007 478
Davidroid 57:fa4c622b04a7 479 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 480 return status;
Davidroid 57:fa4c622b04a7 481 }
kenjiArai 60:972b4898a007 482
Davidroid 57:fa4c622b04a7 483 int VL6180X::VL6180X_RangeStaticInit(VL6180XDev_t dev)
Davidroid 57:fa4c622b04a7 484 {
Davidroid 57:fa4c622b04a7 485 int status;
Davidroid 57:fa4c622b04a7 486 LOG_FUNCTION_START("");
kenjiArai 60:972b4898a007 487
Davidroid 57:fa4c622b04a7 488 /* REGISTER_TUNING_SR03_270514_CustomerView.txt */
Davidroid 57:fa4c622b04a7 489 VL6180X_WrByte( dev, 0x0207, 0x01);
Davidroid 57:fa4c622b04a7 490 VL6180X_WrByte( dev, 0x0208, 0x01);
Davidroid 57:fa4c622b04a7 491 VL6180X_WrByte( dev, 0x0096, 0x00);
Davidroid 57:fa4c622b04a7 492 VL6180X_WrByte( dev, 0x0097, 0xfd);
Davidroid 57:fa4c622b04a7 493 VL6180X_WrByte( dev, 0x00e3, 0x00);
Davidroid 57:fa4c622b04a7 494 VL6180X_WrByte( dev, 0x00e4, 0x04);
Davidroid 57:fa4c622b04a7 495 VL6180X_WrByte( dev, 0x00e5, 0x02);
Davidroid 57:fa4c622b04a7 496 VL6180X_WrByte( dev, 0x00e6, 0x01);
Davidroid 57:fa4c622b04a7 497 VL6180X_WrByte( dev, 0x00e7, 0x03);
Davidroid 57:fa4c622b04a7 498 VL6180X_WrByte( dev, 0x00f5, 0x02);
Davidroid 57:fa4c622b04a7 499 VL6180X_WrByte( dev, 0x00d9, 0x05);
Davidroid 57:fa4c622b04a7 500 VL6180X_WrByte( dev, 0x00db, 0xce);
Davidroid 57:fa4c622b04a7 501 VL6180X_WrByte( dev, 0x00dc, 0x03);
Davidroid 57:fa4c622b04a7 502 VL6180X_WrByte( dev, 0x00dd, 0xf8);
Davidroid 57:fa4c622b04a7 503 VL6180X_WrByte( dev, 0x009f, 0x00);
Davidroid 57:fa4c622b04a7 504 VL6180X_WrByte( dev, 0x00a3, 0x3c);
Davidroid 57:fa4c622b04a7 505 VL6180X_WrByte( dev, 0x00b7, 0x00);
Davidroid 57:fa4c622b04a7 506 VL6180X_WrByte( dev, 0x00bb, 0x3c);
Davidroid 57:fa4c622b04a7 507 VL6180X_WrByte( dev, 0x00b2, 0x09);
Davidroid 57:fa4c622b04a7 508 VL6180X_WrByte( dev, 0x00ca, 0x09);
Davidroid 57:fa4c622b04a7 509 VL6180X_WrByte( dev, 0x0198, 0x01);
Davidroid 57:fa4c622b04a7 510 VL6180X_WrByte( dev, 0x01b0, 0x17);
Davidroid 57:fa4c622b04a7 511 VL6180X_WrByte( dev, 0x01ad, 0x00);
Davidroid 57:fa4c622b04a7 512 VL6180X_WrByte( dev, 0x00ff, 0x05);
Davidroid 57:fa4c622b04a7 513 VL6180X_WrByte( dev, 0x0100, 0x05);
Davidroid 57:fa4c622b04a7 514 VL6180X_WrByte( dev, 0x0199, 0x05);
Davidroid 57:fa4c622b04a7 515 VL6180X_WrByte( dev, 0x01a6, 0x1b);
Davidroid 57:fa4c622b04a7 516 VL6180X_WrByte( dev, 0x01ac, 0x3e);
Davidroid 57:fa4c622b04a7 517 VL6180X_WrByte( dev, 0x01a7, 0x1f);
Davidroid 57:fa4c622b04a7 518 VL6180X_WrByte( dev, 0x0030, 0x00);
kenjiArai 60:972b4898a007 519
Davidroid 57:fa4c622b04a7 520 /* Recommended : Public registers - See data sheet for more detail */
Davidroid 57:fa4c622b04a7 521 VL6180X_WrByte( dev, SYSTEM_MODE_GPIO1, 0x10); /* Enables polling for New Sample ready when measurement completes */
Davidroid 57:fa4c622b04a7 522 VL6180X_WrByte( dev, READOUT_AVERAGING_SAMPLE_PERIOD, 0x30); /* Set the averaging sample period (compromise between lower noise and increased execution time) */
Davidroid 57:fa4c622b04a7 523 VL6180X_WrByte( dev, SYSALS_ANALOGUE_GAIN, 0x46); /* Sets the light and dark gain (upper nibble). Dark gain should not be changed.*/
Davidroid 57:fa4c622b04a7 524 VL6180X_WrByte( dev, SYSRANGE_VHV_REPEAT_RATE, 0xFF); /* sets the # of range measurements after which auto calibration of system is performed */
Davidroid 57:fa4c622b04a7 525 VL6180X_WrByte( dev, SYSALS_INTEGRATION_PERIOD, 0x63); /* Set ALS integration time to 100ms */
Davidroid 57:fa4c622b04a7 526 VL6180X_WrByte( dev, SYSRANGE_VHV_RECALIBRATE, 0x01); /* perform a single temperature calibration of the ranging sensor */
kenjiArai 60:972b4898a007 527
Davidroid 57:fa4c622b04a7 528 /* Optional: Public registers - See data sheet for more detail */
Davidroid 57:fa4c622b04a7 529 VL6180X_WrByte( dev, SYSRANGE_INTERMEASUREMENT_PERIOD, 0x09); /* Set default ranging inter-measurement period to 100ms */
Davidroid 57:fa4c622b04a7 530 VL6180X_WrByte( dev, SYSALS_INTERMEASUREMENT_PERIOD, 0x31); /* Set default ALS inter-measurement period to 500ms */
Davidroid 57:fa4c622b04a7 531 VL6180X_WrByte( dev, SYSTEM_INTERRUPT_CONFIG_GPIO, 0x24); /* Configures interrupt on New sample ready */
kenjiArai 60:972b4898a007 532
kenjiArai 60:972b4898a007 533
Davidroid 57:fa4c622b04a7 534 status=VL6180X_RangeSetMaxConvergenceTime(dev, 50); /* Calculate ece value on initialization (use max conv) */
Davidroid 57:fa4c622b04a7 535 LOG_FUNCTION_END(status);
kenjiArai 60:972b4898a007 536
Davidroid 57:fa4c622b04a7 537 return status;
Davidroid 57:fa4c622b04a7 538 }
kenjiArai 60:972b4898a007 539
kenjiArai 60:972b4898a007 540 #if VL6180X_UPSCALE_SUPPORT != 1
kenjiArai 60:972b4898a007 541
Davidroid 57:fa4c622b04a7 542 #else
Davidroid 57:fa4c622b04a7 543 #define VL6180X_UpscaleRegInit(...) -1
Davidroid 57:fa4c622b04a7 544 #endif
kenjiArai 60:972b4898a007 545
Davidroid 57:fa4c622b04a7 546 int VL6180X::VL6180X_RangeSetMaxConvergenceTime(VL6180XDev_t dev, uint8_t MaxConTime_msec)
Davidroid 57:fa4c622b04a7 547 {
Davidroid 57:fa4c622b04a7 548 int status = 0;
Davidroid 57:fa4c622b04a7 549 LOG_FUNCTION_START("%d",(int)MaxConTime_msec);
kenjiArai 60:972b4898a007 550 do {
Davidroid 57:fa4c622b04a7 551 status=VL6180X_WrByte(dev, SYSRANGE_MAX_CONVERGENCE_TIME, MaxConTime_msec);
kenjiArai 60:972b4898a007 552 if( status ) {
Davidroid 57:fa4c622b04a7 553 break;
Davidroid 57:fa4c622b04a7 554 }
Davidroid 57:fa4c622b04a7 555 status=VL6180X_RangeSetEarlyConvergenceEestimateThreshold(dev);
kenjiArai 60:972b4898a007 556 if( status) {
Davidroid 57:fa4c622b04a7 557 break;
Davidroid 57:fa4c622b04a7 558 }
kenjiArai 60:972b4898a007 559 } while(0);
Davidroid 57:fa4c622b04a7 560 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 561 return status;
Davidroid 57:fa4c622b04a7 562 }
kenjiArai 60:972b4898a007 563
kenjiArai 60:972b4898a007 564 int VL6180X::VL6180X_RangeWaitDeviceReady(VL6180XDev_t dev, int MaxLoop )
kenjiArai 60:972b4898a007 565 {
Davidroid 57:fa4c622b04a7 566 int status; /* if user specify an invalid <=0 loop count we'll return error */
Davidroid 57:fa4c622b04a7 567 int n;
Davidroid 57:fa4c622b04a7 568 uint8_t u8;
Davidroid 57:fa4c622b04a7 569 LOG_FUNCTION_START("%d", (int)MaxLoop);
kenjiArai 60:972b4898a007 570 if( MaxLoop<1) {
Davidroid 57:fa4c622b04a7 571 status=INVALID_PARAMS;
kenjiArai 60:972b4898a007 572 } else {
kenjiArai 60:972b4898a007 573 for( n=0; n < MaxLoop ; n++) {
Davidroid 57:fa4c622b04a7 574 status=VL6180X_RdByte(dev, RESULT_RANGE_STATUS, &u8);
Davidroid 57:fa4c622b04a7 575 if( status)
Davidroid 57:fa4c622b04a7 576 break;
Davidroid 57:fa4c622b04a7 577 u8 = u8 & RANGE_DEVICE_READY_MASK;
Davidroid 57:fa4c622b04a7 578 if( u8 )
Davidroid 57:fa4c622b04a7 579 break;
kenjiArai 60:972b4898a007 580
Davidroid 57:fa4c622b04a7 581 }
kenjiArai 60:972b4898a007 582 if( !status && !u8 ) {
Davidroid 57:fa4c622b04a7 583 status = TIME_OUT;
Davidroid 57:fa4c622b04a7 584 }
Davidroid 57:fa4c622b04a7 585 }
Davidroid 57:fa4c622b04a7 586 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 587 return status;
Davidroid 57:fa4c622b04a7 588 }
kenjiArai 60:972b4898a007 589
Davidroid 57:fa4c622b04a7 590 int VL6180X::VL6180X_RangeSetSystemMode(VL6180XDev_t dev, uint8_t mode)
Davidroid 57:fa4c622b04a7 591 {
Davidroid 57:fa4c622b04a7 592 int status;
Davidroid 57:fa4c622b04a7 593 LOG_FUNCTION_START("%d", (int)mode);
Davidroid 57:fa4c622b04a7 594 /* FIXME we are not checking device is ready via @a VL6180X_RangeWaitDeviceReady
Davidroid 57:fa4c622b04a7 595 * so if called back to back real fast we are not checking
Davidroid 57:fa4c622b04a7 596 * if previous mode "set" got absorbed => bit 0 must be 0 so that it work
Davidroid 57:fa4c622b04a7 597 */
kenjiArai 60:972b4898a007 598 if( mode <= 3) {
Davidroid 57:fa4c622b04a7 599 status=VL6180X_WrByte(dev, SYSRANGE_START, mode);
kenjiArai 60:972b4898a007 600 if( status ) {
Davidroid 57:fa4c622b04a7 601 VL6180X_ErrLog("SYSRANGE_START wr fail");
Davidroid 57:fa4c622b04a7 602 }
kenjiArai 60:972b4898a007 603 } else {
Davidroid 57:fa4c622b04a7 604 status = INVALID_PARAMS;
Davidroid 57:fa4c622b04a7 605 }
Davidroid 57:fa4c622b04a7 606 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 607 return status;
Davidroid 57:fa4c622b04a7 608 }
kenjiArai 60:972b4898a007 609
Davidroid 57:fa4c622b04a7 610 int VL6180X::VL6180X_RangeSetEarlyConvergenceEestimateThreshold(VL6180XDev_t dev)
Davidroid 57:fa4c622b04a7 611 {
Davidroid 57:fa4c622b04a7 612 int status;
kenjiArai 60:972b4898a007 613
Davidroid 57:fa4c622b04a7 614 const uint32_t cMicroSecPerMilliSec = 1000;
Davidroid 57:fa4c622b04a7 615 const uint32_t cEceSampleTime_us = 500;
Davidroid 57:fa4c622b04a7 616 uint32_t ece_factor_m = VL6180XDevDataGet(dev, EceFactorM);
Davidroid 57:fa4c622b04a7 617 uint32_t ece_factor_d = VL6180XDevDataGet(dev, EceFactorD);
Davidroid 57:fa4c622b04a7 618 uint32_t convergTime_us;
Davidroid 57:fa4c622b04a7 619 uint32_t fineThresh;
Davidroid 57:fa4c622b04a7 620 uint32_t eceThresh;
Davidroid 57:fa4c622b04a7 621 uint8_t u8;
Davidroid 57:fa4c622b04a7 622 uint32_t maxConv_ms;
Davidroid 57:fa4c622b04a7 623 int32_t AveTime;
kenjiArai 60:972b4898a007 624
Davidroid 57:fa4c622b04a7 625 LOG_FUNCTION_START("");
kenjiArai 60:972b4898a007 626
kenjiArai 60:972b4898a007 627 do {
Davidroid 57:fa4c622b04a7 628 status = VL6180X_RdByte(dev, SYSRANGE_MAX_CONVERGENCE_TIME, &u8);
kenjiArai 60:972b4898a007 629 if( status ) {
Davidroid 57:fa4c622b04a7 630 VL6180X_ErrLog("SYSRANGE_MAX_CONVERGENCE_TIME rd fail");
Davidroid 57:fa4c622b04a7 631 break;
Davidroid 57:fa4c622b04a7 632 }
Davidroid 57:fa4c622b04a7 633 maxConv_ms = u8;
Davidroid 57:fa4c622b04a7 634 AveTime = _GetAveTotalTime(dev);
kenjiArai 60:972b4898a007 635 if( AveTime <0 ) {
Davidroid 57:fa4c622b04a7 636 status=-1;
Davidroid 57:fa4c622b04a7 637 break;
Davidroid 57:fa4c622b04a7 638 }
kenjiArai 60:972b4898a007 639
Davidroid 57:fa4c622b04a7 640 convergTime_us = maxConv_ms * cMicroSecPerMilliSec - AveTime;
Davidroid 57:fa4c622b04a7 641 status = VL6180X_RdDWord(dev, 0xB8, &fineThresh);
Davidroid 57:fa4c622b04a7 642 if( status ) {
Davidroid 57:fa4c622b04a7 643 VL6180X_ErrLog("reg 0xB8 rd fail");
Davidroid 57:fa4c622b04a7 644 break;
Davidroid 57:fa4c622b04a7 645 }
Davidroid 57:fa4c622b04a7 646 fineThresh*=256;
Davidroid 57:fa4c622b04a7 647 eceThresh = ece_factor_m * cEceSampleTime_us * fineThresh/(convergTime_us * ece_factor_d);
kenjiArai 60:972b4898a007 648
Davidroid 57:fa4c622b04a7 649 status=VL6180X_WrWord(dev, SYSRANGE_EARLY_CONVERGENCE_ESTIMATE, (uint16_t)eceThresh);
kenjiArai 60:972b4898a007 650 } while(0);
kenjiArai 60:972b4898a007 651
Davidroid 57:fa4c622b04a7 652 LOG_FUNCTION_END(status);
Davidroid 57:fa4c622b04a7 653 return status;
Davidroid 57:fa4c622b04a7 654 }
kenjiArai 60:972b4898a007 655
Davidroid 57:fa4c622b04a7 656 /*
Davidroid 57:fa4c622b04a7 657 * Return >0 = time
Davidroid 57:fa4c622b04a7 658 * <0 1 if fail to get read data from device to compute time
Davidroid 57:fa4c622b04a7 659 */
kenjiArai 60:972b4898a007 660 int32_t VL6180X::_GetAveTotalTime(VL6180XDev_t dev)
kenjiArai 60:972b4898a007 661 {
Davidroid 57:fa4c622b04a7 662 uint32_t cFwOverhead_us = 24;
Davidroid 57:fa4c622b04a7 663 uint32_t cVcpSetupTime_us = 70;
Davidroid 57:fa4c622b04a7 664 uint32_t cPLL2_StartupDelay_us = 200;
Davidroid 57:fa4c622b04a7 665 uint8_t cMeasMask = 0x07;
Davidroid 57:fa4c622b04a7 666 uint32_t Samples;
Davidroid 57:fa4c622b04a7 667 uint32_t SamplePeriod;
Davidroid 57:fa4c622b04a7 668 uint32_t SingleTime_us;
Davidroid 57:fa4c622b04a7 669 int32_t TotalAveTime_us;
Davidroid 57:fa4c622b04a7 670 uint8_t u8;
Davidroid 57:fa4c622b04a7 671 int status;
kenjiArai 60:972b4898a007 672
Davidroid 57:fa4c622b04a7 673 LOG_FUNCTION_START("");
kenjiArai 60:972b4898a007 674
Davidroid 57:fa4c622b04a7 675 status = VL6180X_RdByte(dev, 0x109, &u8);
Davidroid 57:fa4c622b04a7 676 if (status) {
Davidroid 57:fa4c622b04a7 677 VL6180X_ErrLog("rd 0x109 fail");
Davidroid 57:fa4c622b04a7 678 return -1;
Davidroid 57:fa4c622b04a7 679 }
Davidroid 57:fa4c622b04a7 680 Samples = u8 & cMeasMask;
Davidroid 57:fa4c622b04a7 681 status = VL6180X_RdByte(dev, READOUT_AVERAGING_SAMPLE_PERIOD, &u8);
Davidroid 57:fa4c622b04a7 682 if (status) {
Davidroid 57:fa4c622b04a7 683 VL6180X_ErrLog("i2c READOUT_AVERAGING_SAMPLE_PERIOD fail");
Davidroid 57:fa4c622b04a7 684 return -1;
Davidroid 57:fa4c622b04a7 685 }
Davidroid 57:fa4c622b04a7 686 SamplePeriod = u8;
Davidroid 57:fa4c622b04a7 687 SingleTime_us = cFwOverhead_us + cVcpSetupTime_us + (SamplePeriod * 10);
Davidroid 57:fa4c622b04a7 688 TotalAveTime_us = (Samples + 1) * SingleTime_us + cPLL2_StartupDelay_us;
kenjiArai 60:972b4898a007 689
Davidroid 57:fa4c622b04a7 690 LOG_FUNCTION_END(TotalAveTime_us);
Davidroid 57:fa4c622b04a7 691 return TotalAveTime_us;
Davidroid 57:fa4c622b04a7 692 }
kenjiArai 60:972b4898a007 693
kenjiArai 60:972b4898a007 694
Davidroid 57:fa4c622b04a7 695 #ifdef VL6180X_HAVE_RATE_DATA
kenjiArai 60:972b4898a007 696
kenjiArai 60:972b4898a007 697 int VL6180X::_GetRateResult(VL6180XDev_t dev, VL6180X_RangeData_t *pRangeData)
kenjiArai 60:972b4898a007 698 {
Davidroid 57:fa4c622b04a7 699 uint32_t m_rtnConvTime = 0;
Davidroid 57:fa4c622b04a7 700 uint32_t m_rtnSignalRate = 0;
Davidroid 57:fa4c622b04a7 701 uint32_t m_rtnAmbientRate = 0;
Davidroid 57:fa4c622b04a7 702 uint32_t m_rtnSignalCount = 0;
Davidroid 57:fa4c622b04a7 703 uint32_t m_rtnAmbientCount = 0;
Davidroid 57:fa4c622b04a7 704 uint32_t m_refConvTime = 0;
Davidroid 57:fa4c622b04a7 705 uint32_t cRtnSignalCountMax = 0x7FFFFFFF;
Davidroid 57:fa4c622b04a7 706 uint32_t cDllPeriods = 6;
Davidroid 57:fa4c622b04a7 707 uint32_t calcConvTime = 0;
kenjiArai 60:972b4898a007 708
Davidroid 57:fa4c622b04a7 709 int status;
kenjiArai 60:972b4898a007 710
Davidroid 57:fa4c622b04a7 711 do {
kenjiArai 60:972b4898a007 712
Davidroid 57:fa4c622b04a7 713 status = VL6180X_RdDWord(dev, RESULT_RANGE_RETURN_SIGNAL_COUNT, &m_rtnSignalCount);
Davidroid 57:fa4c622b04a7 714 if (status) {
Davidroid 57:fa4c622b04a7 715 VL6180X_ErrLog("RESULT_RANGE_RETURN_SIGNAL_COUNT rd fail");
Davidroid 57:fa4c622b04a7 716 break;
Davidroid 57:fa4c622b04a7 717 }
Davidroid 57:fa4c622b04a7 718 if (m_rtnSignalCount > cRtnSignalCountMax) {
Davidroid 57:fa4c622b04a7 719 m_rtnSignalCount = 0;
Davidroid 57:fa4c622b04a7 720 }
kenjiArai 60:972b4898a007 721
Davidroid 57:fa4c622b04a7 722 status = VL6180X_RdDWord(dev, RESULT_RANGE_RETURN_AMB_COUNT, &m_rtnAmbientCount);
Davidroid 57:fa4c622b04a7 723 if (status) {
Davidroid 57:fa4c622b04a7 724 VL6180X_ErrLog("RESULT_RANGE_RETURN_AMB_COUNTrd fail");
Davidroid 57:fa4c622b04a7 725 break;
Davidroid 57:fa4c622b04a7 726 }
kenjiArai 60:972b4898a007 727
kenjiArai 60:972b4898a007 728
Davidroid 57:fa4c622b04a7 729 status = VL6180X_RdDWord(dev, RESULT_RANGE_RETURN_CONV_TIME, &m_rtnConvTime);
Davidroid 57:fa4c622b04a7 730 if (status) {
Davidroid 57:fa4c622b04a7 731 VL6180X_ErrLog("RESULT_RANGE_RETURN_CONV_TIME rd fail");
Davidroid 57:fa4c622b04a7 732 break;
Davidroid 57:fa4c622b04a7 733 }
kenjiArai 60:972b4898a007 734
Davidroid 57:fa4c622b04a7 735 status = VL6180X_RdDWord(dev, RESULT_RANGE_REFERENCE_CONV_TIME, &m_refConvTime);
Davidroid 57:fa4c622b04a7 736 if (status) {
Davidroid 57:fa4c622b04a7 737 VL6180X_ErrLog("RESULT_RANGE_REFERENCE_CONV_TIME rd fail");
Davidroid 57:fa4c622b04a7 738 break;
Davidroid 57:fa4c622b04a7 739 }
kenjiArai 60:972b4898a007 740
Davidroid 57:fa4c622b04a7 741 pRangeData->rtnConvTime = m_rtnConvTime;
Davidroid 57:fa4c622b04a7 742 pRangeData->refConvTime = m_refConvTime;
kenjiArai 60:972b4898a007 743
Davidroid 57:fa4c622b04a7 744 calcConvTime = m_refConvTime;
Davidroid 57:fa4c622b04a7 745 if (m_rtnConvTime > m_refConvTime) {
Davidroid 57:fa4c622b04a7 746 calcConvTime = m_rtnConvTime;
Davidroid 57:fa4c622b04a7 747 }
Davidroid 57:fa4c622b04a7 748 if (calcConvTime == 0)
Davidroid 57:fa4c622b04a7 749 calcConvTime = 63000;
kenjiArai 60:972b4898a007 750
Davidroid 57:fa4c622b04a7 751 m_rtnSignalRate = (m_rtnSignalCount * 1000) / calcConvTime;
Davidroid 57:fa4c622b04a7 752 m_rtnAmbientRate = (m_rtnAmbientCount * cDllPeriods * 1000) / calcConvTime;
kenjiArai 60:972b4898a007 753
Davidroid 57:fa4c622b04a7 754 pRangeData->rtnRate = m_rtnSignalRate;
Davidroid 57:fa4c622b04a7 755 pRangeData->rtnAmbRate = m_rtnAmbientRate;
kenjiArai 60:972b4898a007 756
kenjiArai 60:972b4898a007 757
Davidroid 57:fa4c622b04a7 758 } while (0);
Davidroid 57:fa4c622b04a7 759 return status;
Davidroid 57:fa4c622b04a7 760 }
Davidroid 57:fa4c622b04a7 761 #endif /* VL6180X_HAVE_RATE_DATA */
kenjiArai 60:972b4898a007 762
kenjiArai 60:972b4898a007 763 /******************************************************************************/
kenjiArai 60:972b4898a007 764 /******************************************************************************/
kenjiArai 60:972b4898a007 765
kenjiArai 60:972b4898a007 766 /****************** Write and read functions from I2C *************************/
kenjiArai 60:972b4898a007 767
kenjiArai 60:972b4898a007 768 int VL6180X::VL6180X_WrByte(VL6180XDev_t dev, uint16_t index, uint8_t data)
kenjiArai 60:972b4898a007 769 {
kenjiArai 60:972b4898a007 770 int status;
kenjiArai 60:972b4898a007 771
kenjiArai 60:972b4898a007 772 status=VL6180X_I2CWrite(dev->I2cAddr, index, &data,(uint8_t)1);
Davidroid 57:fa4c622b04a7 773 return status;
Davidroid 57:fa4c622b04a7 774 }
kenjiArai 60:972b4898a007 775
kenjiArai 60:972b4898a007 776 int VL6180X::VL6180X_WrWord(VL6180XDev_t dev, uint16_t index, uint16_t data)
kenjiArai 60:972b4898a007 777 {
kenjiArai 60:972b4898a007 778 int status;
kenjiArai 60:972b4898a007 779
kenjiArai 60:972b4898a007 780 status=VL6180X_I2CWrite(dev->I2cAddr, index, (uint8_t *)&data,(uint8_t)2);
kenjiArai 60:972b4898a007 781 return status;
kenjiArai 60:972b4898a007 782 }
kenjiArai 60:972b4898a007 783
kenjiArai 60:972b4898a007 784 int VL6180X::VL6180X_WrDWord(VL6180XDev_t dev, uint16_t index, uint32_t data)
kenjiArai 60:972b4898a007 785 {
kenjiArai 60:972b4898a007 786 int status;
kenjiArai 60:972b4898a007 787
kenjiArai 60:972b4898a007 788 status=VL6180X_I2CWrite(dev->I2cAddr, index, (uint8_t *)&data,(uint8_t)4);
Davidroid 57:fa4c622b04a7 789 return status;
Davidroid 57:fa4c622b04a7 790 }
kenjiArai 60:972b4898a007 791
kenjiArai 60:972b4898a007 792 int VL6180X::VL6180X_RdByte(VL6180XDev_t dev, uint16_t index, uint8_t *data)
kenjiArai 60:972b4898a007 793 {
kenjiArai 60:972b4898a007 794 int status;
kenjiArai 60:972b4898a007 795
kenjiArai 60:972b4898a007 796 uint8_t buffer=0;
kenjiArai 60:972b4898a007 797 status=VL6180X_I2CRead(dev->I2cAddr, index, &buffer,1);
kenjiArai 60:972b4898a007 798 if(!status) {
kenjiArai 60:972b4898a007 799 *data=buffer;
Davidroid 57:fa4c622b04a7 800 }
kenjiArai 60:972b4898a007 801 return status;
kenjiArai 60:972b4898a007 802 }
kenjiArai 60:972b4898a007 803
kenjiArai 60:972b4898a007 804 int VL6180X::VL6180X_RdWord(VL6180XDev_t dev, uint16_t index, uint16_t *data)
kenjiArai 60:972b4898a007 805 {
kenjiArai 60:972b4898a007 806 int status;
kenjiArai 60:972b4898a007 807
kenjiArai 60:972b4898a007 808 uint8_t buffer[2];
kenjiArai 60:972b4898a007 809 buffer[0]=buffer[1]=0;
kenjiArai 60:972b4898a007 810 status=VL6180X_I2CRead(dev->I2cAddr, index, buffer, 2);
kenjiArai 60:972b4898a007 811 if(!status) {
kenjiArai 60:972b4898a007 812 memcpy(data, buffer, 2);
kenjiArai 60:972b4898a007 813 }
kenjiArai 60:972b4898a007 814 return status;
Davidroid 57:fa4c622b04a7 815 }
kenjiArai 60:972b4898a007 816
kenjiArai 60:972b4898a007 817 int VL6180X::VL6180X_RdDWord(VL6180XDev_t dev, uint16_t index, uint32_t *data)
kenjiArai 60:972b4898a007 818 {
kenjiArai 60:972b4898a007 819 int status;
kenjiArai 60:972b4898a007 820 uint8_t buffer[4];
kenjiArai 60:972b4898a007 821 buffer[0]=buffer[1]=buffer[2]=buffer[3]=0;
kenjiArai 60:972b4898a007 822 status=VL6180X_I2CRead(dev->I2cAddr, index, buffer,4);
kenjiArai 60:972b4898a007 823 if(!status) {
kenjiArai 60:972b4898a007 824 memcpy(data, buffer, 4);
kenjiArai 60:972b4898a007 825 }
kenjiArai 60:972b4898a007 826 return status;
Davidroid 57:fa4c622b04a7 827 }
kenjiArai 60:972b4898a007 828
kenjiArai 60:972b4898a007 829 int VL6180X::VL6180X_UpdateByte(VL6180XDev_t dev, uint16_t index, uint8_t AndData, uint8_t OrData)
kenjiArai 60:972b4898a007 830 {
kenjiArai 60:972b4898a007 831 int status;
kenjiArai 60:972b4898a007 832 uint8_t buffer=0;
kenjiArai 60:972b4898a007 833
kenjiArai 60:972b4898a007 834 status=VL6180X_I2CWrite(dev->I2cAddr, index, (uint8_t *)&buffer,(uint8_t)0);
kenjiArai 60:972b4898a007 835 if(!status) {
kenjiArai 60:972b4898a007 836 /* read data direct onto buffer */
kenjiArai 60:972b4898a007 837 status=VL6180X_I2CRead(dev->I2cAddr, index, &buffer,1);
kenjiArai 60:972b4898a007 838 if(!status) {
kenjiArai 60:972b4898a007 839 buffer=(buffer & AndData)|OrData;
kenjiArai 60:972b4898a007 840 status=VL6180X_I2CWrite(dev->I2cAddr, index, &buffer, (uint8_t)1);
Davidroid 57:fa4c622b04a7 841 }
Davidroid 57:fa4c622b04a7 842 }
Davidroid 57:fa4c622b04a7 843 return status;
Davidroid 57:fa4c622b04a7 844 }
kenjiArai 60:972b4898a007 845
kenjiArai 60:972b4898a007 846 int VL6180X::VL6180X_I2CWrite(uint8_t DeviceAddr, uint16_t RegisterAddr, uint8_t* pBuffer, uint16_t NumByteToWrite)
kenjiArai 60:972b4898a007 847 {
kenjiArai 60:972b4898a007 848 int ret;
kenjiArai 60:972b4898a007 849 int i;
kenjiArai 60:972b4898a007 850 uint8_t tmp[TEMP_BUF_SIZE];
kenjiArai 60:972b4898a007 851 uint16_t myRegisterAddr = RegisterAddr;
kenjiArai 60:972b4898a007 852 uint16_t WriteDeviceAddr=0;
kenjiArai 60:972b4898a007 853
kenjiArai 60:972b4898a007 854 /* First, prepare 8 bits device address in 7bits i2ci format */
kenjiArai 60:972b4898a007 855 WriteDeviceAddr=DeviceAddr*2;
kenjiArai 60:972b4898a007 856 if(NumByteToWrite >= TEMP_BUF_SIZE) return -2;
kenjiArai 60:972b4898a007 857
kenjiArai 60:972b4898a007 858 /* then prepare 16 bits register address in BE format. Then, send data and STOP condition */
kenjiArai 60:972b4898a007 859 tmp[0] = *(((uint8_t*)&myRegisterAddr)+1);
kenjiArai 60:972b4898a007 860 tmp[1] = (uint8_t)RegisterAddr;
kenjiArai 60:972b4898a007 861
kenjiArai 60:972b4898a007 862 if(NumByteToWrite>1) { /* swap data endianess */
kenjiArai 60:972b4898a007 863 for(i=0; i<NumByteToWrite; i++) {
kenjiArai 60:972b4898a007 864 tmp[NumByteToWrite+sizeof(RegisterAddr)-1-i]=pBuffer[i];
Davidroid 57:fa4c622b04a7 865 }
kenjiArai 60:972b4898a007 866 } else {
kenjiArai 60:972b4898a007 867 memcpy(tmp+sizeof(RegisterAddr), pBuffer, NumByteToWrite);
kenjiArai 60:972b4898a007 868 }
kenjiArai 60:972b4898a007 869 ret = _i2c.write(WriteDeviceAddr, (const char*)tmp, NumByteToWrite+sizeof(RegisterAddr), false);
kenjiArai 60:972b4898a007 870 if(ret)
kenjiArai 60:972b4898a007 871 return -1;
kenjiArai 60:972b4898a007 872 return 0;
kenjiArai 60:972b4898a007 873 }
kenjiArai 60:972b4898a007 874
kenjiArai 60:972b4898a007 875 int VL6180X::VL6180X_I2CRead(uint8_t DeviceAddr, uint16_t RegisterAddr, uint8_t* pBuffer, uint16_t NumByteToRead)
kenjiArai 60:972b4898a007 876 {
kenjiArai 60:972b4898a007 877 int ret,i;
kenjiArai 60:972b4898a007 878 uint8_t tmp[TEMP_BUF_SIZE];
kenjiArai 60:972b4898a007 879 uint16_t myRegisterAddr = RegisterAddr;
kenjiArai 60:972b4898a007 880 uint16_t myRegisterAddrBE;
kenjiArai 60:972b4898a007 881 uint16_t ReadDeviceAddr=DeviceAddr;
kenjiArai 60:972b4898a007 882
kenjiArai 60:972b4898a007 883 ReadDeviceAddr=DeviceAddr*2;
kenjiArai 60:972b4898a007 884 myRegisterAddrBE = *(((uint8_t*)&myRegisterAddr)+1);
kenjiArai 60:972b4898a007 885 *(((uint8_t*)&myRegisterAddrBE)+1) = (uint8_t)myRegisterAddr;
kenjiArai 60:972b4898a007 886
kenjiArai 60:972b4898a007 887 /* Send 8 bits device address and 16 bits register address in BE format, with no STOP condition */
kenjiArai 60:972b4898a007 888 ret = _i2c.write(ReadDeviceAddr, (const char*)&myRegisterAddrBE, sizeof(RegisterAddr), true);
kenjiArai 60:972b4898a007 889 if(!ret) {
kenjiArai 60:972b4898a007 890 ReadDeviceAddr|=0x001;
kenjiArai 60:972b4898a007 891 /* Read data, with STOP condition */
kenjiArai 60:972b4898a007 892 ret = _i2c.read(ReadDeviceAddr, (char*)tmp, NumByteToRead, false);
kenjiArai 60:972b4898a007 893 }
kenjiArai 60:972b4898a007 894 if(ret)
kenjiArai 60:972b4898a007 895 return -1;
kenjiArai 60:972b4898a007 896
kenjiArai 60:972b4898a007 897 if(NumByteToRead>1) { /* swap data endianess */
kenjiArai 60:972b4898a007 898 for(i=0; i<NumByteToRead; i++) {
kenjiArai 60:972b4898a007 899 pBuffer[i] = tmp[NumByteToRead-1-i];
Davidroid 57:fa4c622b04a7 900 }
kenjiArai 60:972b4898a007 901 } else {
kenjiArai 60:972b4898a007 902 memcpy(pBuffer, tmp, NumByteToRead);
Davidroid 57:fa4c622b04a7 903 }
Davidroid 57:fa4c622b04a7 904 return 0;
Davidroid 57:fa4c622b04a7 905 }
Davidroid 57:fa4c622b04a7 906
Davidroid 57:fa4c622b04a7 907 /******************************************************************************/
Davidroid 57:fa4c622b04a7 908 int VL6180X::read_id(uint8_t *id)
Davidroid 57:fa4c622b04a7 909 {
kenjiArai 60:972b4898a007 910 return VL6180X_RdByte(_device, IDENTIFICATION_MODEL_ID, id);
Davidroid 57:fa4c622b04a7 911 }
Davidroid 57:fa4c622b04a7 912
kenjiArai 60:972b4898a007 913 int VL6180X::start_measurement(operating_mode_t operating_mode)
Davidroid 57:fa4c622b04a7 914 {
Davidroid 57:fa4c622b04a7 915
kenjiArai 60:972b4898a007 916 switch (operating_mode) {
kenjiArai 60:972b4898a007 917 case(range_single_shot_polling):
kenjiArai 60:972b4898a007 918 return VL6180X_WrByte(_device, SYSRANGE_START, MODE_START_STOP|MODE_SINGLESHOT);
kenjiArai 60:972b4898a007 919 case(als_single_shot_polling):
kenjiArai 60:972b4898a007 920 return VL6180X_WrByte(_device, SYSALS_START, MODE_START_STOP|MODE_SINGLESHOT);
kenjiArai 60:972b4898a007 921 default:
kenjiArai 60:972b4898a007 922 return INVALID_PARAMS;
kenjiArai 60:972b4898a007 923 }
Davidroid 57:fa4c622b04a7 924 }
Davidroid 57:fa4c622b04a7 925
Davidroid 57:fa4c622b04a7 926 int VL6180X::stop_measurement(operating_mode_t operating_mode)
Davidroid 57:fa4c622b04a7 927 {
kenjiArai 60:972b4898a007 928 switch(operating_mode) {
kenjiArai 60:972b4898a007 929 case(range_single_shot_polling):
kenjiArai 60:972b4898a007 930 return VL6180X_RangeSetSystemMode(_device, MODE_SINGLESHOT);
kenjiArai 60:972b4898a007 931 case(als_single_shot_polling):
kenjiArai 60:972b4898a007 932 return VL6180X_AlsSetSystemMode(_device, MODE_SINGLESHOT);
kenjiArai 60:972b4898a007 933 default:
kenjiArai 60:972b4898a007 934 return INVALID_PARAMS;
kenjiArai 60:972b4898a007 935 }
Davidroid 57:fa4c622b04a7 936 }
kenjiArai 60:972b4898a007 937
Davidroid 57:fa4c622b04a7 938 int VL6180X::IsPresent()
Davidroid 57:fa4c622b04a7 939 {
kenjiArai 60:972b4898a007 940 int status;
kenjiArai 60:972b4898a007 941 uint8_t id;
Davidroid 57:fa4c622b04a7 942
kenjiArai 60:972b4898a007 943 status=read_id(&id);
kenjiArai 60:972b4898a007 944 if(status)
kenjiArai 60:972b4898a007 945 VL6180X_ErrLog("Failed to read ID device. _device not present!\n\r");
kenjiArai 60:972b4898a007 946 return status;
Davidroid 57:fa4c622b04a7 947 }
kenjiArai 60:972b4898a007 948
Davidroid 57:fa4c622b04a7 949 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/