INSAT Mini Project
Dependencies: ST_INTERFACES X_NUCLEO_COMMON
Fork of X_NUCLEO_6180XA1 by
Components/VL6180X/vl6180x_class.cpp@3:454541a079f4, 2015-09-11 (annotated)
- Committer:
- gallonm
- Date:
- Fri Sep 11 14:39:00 2015 +0200
- Revision:
- 3:454541a079f4
- Parent:
- 1:1de1ea2994d9
- Child:
- 4:a5abf7757947
init function, readID function
update sensors.h
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gallonm | 1:1de1ea2994d9 | 1 | /** |
gallonm | 1:1de1ea2994d9 | 2 | ****************************************************************************** |
gallonm | 1:1de1ea2994d9 | 3 | * @file vl6180x_class.cpp |
gallonm | 1:1de1ea2994d9 | 4 | * @author AST / EST |
gallonm | 1:1de1ea2994d9 | 5 | * @version V0.0.1 |
gallonm | 1:1de1ea2994d9 | 6 | * @date 14-April-2015 |
gallonm | 1:1de1ea2994d9 | 7 | * @brief Implementation file for the HTS221 driver class |
gallonm | 1:1de1ea2994d9 | 8 | ****************************************************************************** |
gallonm | 1:1de1ea2994d9 | 9 | * @attention |
gallonm | 1:1de1ea2994d9 | 10 | * |
gallonm | 1:1de1ea2994d9 | 11 | * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> |
gallonm | 1:1de1ea2994d9 | 12 | * |
gallonm | 1:1de1ea2994d9 | 13 | * Redistribution and use in source and binary forms, with or without modification, |
gallonm | 1:1de1ea2994d9 | 14 | * are permitted provided that the following conditions are met: |
gallonm | 1:1de1ea2994d9 | 15 | * 1. Redistributions of source code must retain the above copyright notice, |
gallonm | 1:1de1ea2994d9 | 16 | * this list of conditions and the following disclaimer. |
gallonm | 1:1de1ea2994d9 | 17 | * 2. Redistributions in binary form must reproduce the above copyright notice, |
gallonm | 1:1de1ea2994d9 | 18 | * this list of conditions and the following disclaimer in the documentation |
gallonm | 1:1de1ea2994d9 | 19 | * and/or other materials provided with the distribution. |
gallonm | 1:1de1ea2994d9 | 20 | * 3. Neither the name of STMicroelectronics nor the names of its contributors |
gallonm | 1:1de1ea2994d9 | 21 | * may be used to endorse or promote products derived from this software |
gallonm | 1:1de1ea2994d9 | 22 | * without specific prior written permission. |
gallonm | 1:1de1ea2994d9 | 23 | * |
gallonm | 1:1de1ea2994d9 | 24 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
gallonm | 1:1de1ea2994d9 | 25 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
gallonm | 1:1de1ea2994d9 | 26 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
gallonm | 1:1de1ea2994d9 | 27 | * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE |
gallonm | 1:1de1ea2994d9 | 28 | * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
gallonm | 1:1de1ea2994d9 | 29 | * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
gallonm | 1:1de1ea2994d9 | 30 | * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER |
gallonm | 1:1de1ea2994d9 | 31 | * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, |
gallonm | 1:1de1ea2994d9 | 32 | * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
gallonm | 1:1de1ea2994d9 | 33 | * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
gallonm | 1:1de1ea2994d9 | 34 | * |
gallonm | 1:1de1ea2994d9 | 35 | ****************************************************************************** |
gallonm | 1:1de1ea2994d9 | 36 | */ |
gallonm | 1:1de1ea2994d9 | 37 | |
gallonm | 1:1de1ea2994d9 | 38 | /* Includes ------------------------------------------------------------------*/ |
gallonm | 1:1de1ea2994d9 | 39 | #include "vl6180x_class.h" |
gallonm | 1:1de1ea2994d9 | 40 | |
gallonm | 3:454541a079f4 | 41 | #define Fix7_2_KCPs(x) ((((uint32_t)(x))*1000)>>7) |
gallonm | 1:1de1ea2994d9 | 42 | |
gallonm | 3:454541a079f4 | 43 | int VL6180X::VL6180x_InitData(VL6180xDev_t dev) |
gallonm | 1:1de1ea2994d9 | 44 | { |
gallonm | 3:454541a079f4 | 45 | int status, dmax_status ; |
gallonm | 3:454541a079f4 | 46 | int8_t offset; |
gallonm | 3:454541a079f4 | 47 | uint8_t FreshOutReset; |
gallonm | 3:454541a079f4 | 48 | uint32_t CalValue; |
gallonm | 3:454541a079f4 | 49 | uint16_t u16; |
gallonm | 3:454541a079f4 | 50 | uint32_t XTalkCompRate_KCps; |
gallonm | 3:454541a079f4 | 51 | |
gallonm | 3:454541a079f4 | 52 | LOG_FUNCTION_START(""); |
gallonm | 3:454541a079f4 | 53 | |
gallonm | 3:454541a079f4 | 54 | VL6180xDevDataSet(dev, EceFactorM , DEF_ECE_FACTOR_M); |
gallonm | 3:454541a079f4 | 55 | VL6180xDevDataSet(dev, EceFactorD , DEF_ECE_FACTOR_D); |
gallonm | 3:454541a079f4 | 56 | |
gallonm | 3:454541a079f4 | 57 | #ifdef VL6180x_HAVE_UPSCALE_DATA |
gallonm | 3:454541a079f4 | 58 | VL6180xDevDataSet(dev, UpscaleFactor , DEF_UPSCALE); |
gallonm | 3:454541a079f4 | 59 | #endif |
gallonm | 3:454541a079f4 | 60 | |
gallonm | 3:454541a079f4 | 61 | #ifdef VL6180x_HAVE_ALS_DATA |
gallonm | 3:454541a079f4 | 62 | VL6180xDevDataSet(dev, IntegrationPeriod, DEF_INT_PEFRIOD); |
gallonm | 3:454541a079f4 | 63 | VL6180xDevDataSet(dev, AlsGainCode, DEF_ALS_GAIN); |
gallonm | 3:454541a079f4 | 64 | VL6180xDevDataSet(dev, AlsScaler, DEF_ALS_SCALER); |
gallonm | 3:454541a079f4 | 65 | #endif |
gallonm | 3:454541a079f4 | 66 | |
gallonm | 3:454541a079f4 | 67 | #ifdef VL6180x_HAVE_WRAP_AROUND_DATA |
gallonm | 3:454541a079f4 | 68 | VL6180xDevDataSet(dev, WrapAroundFilterActive, (VL6180x_WRAP_AROUND_FILTER_SUPPORT >0)); |
gallonm | 3:454541a079f4 | 69 | VL6180xDevDataSet(dev, DMaxEnable, DEF_DMAX_ENABLE); |
gallonm | 3:454541a079f4 | 70 | #endif |
gallonm | 3:454541a079f4 | 71 | |
gallonm | 3:454541a079f4 | 72 | _DMax_OneTimeInit(dev); |
gallonm | 3:454541a079f4 | 73 | do{ |
gallonm | 3:454541a079f4 | 74 | |
gallonm | 3:454541a079f4 | 75 | /* backup offset initial value from nvm these must be done prior any over call that use offset */ |
gallonm | 3:454541a079f4 | 76 | status = VL6180x_RdByte(dev,SYSRANGE_PART_TO_PART_RANGE_OFFSET, (uint8_t*)&offset); |
gallonm | 3:454541a079f4 | 77 | if( status ){ |
gallonm | 3:454541a079f4 | 78 | VL6180x_ErrLog("SYSRANGE_PART_TO_PART_RANGE_OFFSET rd fail"); |
gallonm | 3:454541a079f4 | 79 | break; |
gallonm | 3:454541a079f4 | 80 | } |
gallonm | 3:454541a079f4 | 81 | VL6180xDevDataSet(dev, Part2PartOffsetNVM, offset); |
gallonm | 1:1de1ea2994d9 | 82 | |
gallonm | 3:454541a079f4 | 83 | status=VL6180x_RdDWord( dev, SYSRANGE_RANGE_IGNORE_THRESHOLD, &CalValue); |
gallonm | 3:454541a079f4 | 84 | if( status ){ |
gallonm | 3:454541a079f4 | 85 | VL6180x_ErrLog("Part2PartAmbNVM rd fail"); |
gallonm | 3:454541a079f4 | 86 | break; |
gallonm | 3:454541a079f4 | 87 | } |
gallonm | 3:454541a079f4 | 88 | if( (CalValue&0xFFFF0000) == 0 ){ |
gallonm | 3:454541a079f4 | 89 | CalValue=0x00CE03F8; |
gallonm | 3:454541a079f4 | 90 | } |
gallonm | 3:454541a079f4 | 91 | VL6180xDevDataSet(dev, Part2PartAmbNVM, CalValue); |
gallonm | 3:454541a079f4 | 92 | |
gallonm | 3:454541a079f4 | 93 | status = VL6180x_RdWord(dev, SYSRANGE_CROSSTALK_COMPENSATION_RATE ,&u16); |
gallonm | 3:454541a079f4 | 94 | if( status){ |
gallonm | 3:454541a079f4 | 95 | VL6180x_ErrLog("SYSRANGE_CROSSTALK_COMPENSATION_RATE rd fail "); |
gallonm | 3:454541a079f4 | 96 | break; |
gallonm | 3:454541a079f4 | 97 | } |
gallonm | 3:454541a079f4 | 98 | XTalkCompRate_KCps = Fix7_2_KCPs(u16); |
gallonm | 3:454541a079f4 | 99 | VL6180xDevDataSet(dev, XTalkCompRate_KCps , XTalkCompRate_KCps ); |
gallonm | 1:1de1ea2994d9 | 100 | |
gallonm | 3:454541a079f4 | 101 | dmax_status = _DMax_InitData(dev); |
gallonm | 3:454541a079f4 | 102 | if( dmax_status < 0 ){ |
gallonm | 3:454541a079f4 | 103 | VL6180x_ErrLog("DMax init failure"); |
gallonm | 3:454541a079f4 | 104 | break; |
gallonm | 3:454541a079f4 | 105 | } |
gallonm | 3:454541a079f4 | 106 | |
gallonm | 3:454541a079f4 | 107 | /* Read or wait for fresh out of reset */ |
gallonm | 3:454541a079f4 | 108 | status = VL6180x_RdByte(dev,SYSTEM_FRESH_OUT_OF_RESET, &FreshOutReset); |
gallonm | 3:454541a079f4 | 109 | if( status ) { |
gallonm | 3:454541a079f4 | 110 | VL6180x_ErrLog("SYSTEM_FRESH_OUT_OF_RESET rd fail"); |
gallonm | 3:454541a079f4 | 111 | break; |
gallonm | 3:454541a079f4 | 112 | } |
gallonm | 3:454541a079f4 | 113 | if( FreshOutReset!= 1 || dmax_status ) |
gallonm | 3:454541a079f4 | 114 | status = CALIBRATION_WARNING; |
gallonm | 3:454541a079f4 | 115 | |
gallonm | 3:454541a079f4 | 116 | } |
gallonm | 3:454541a079f4 | 117 | while(0); |
gallonm | 3:454541a079f4 | 118 | |
gallonm | 3:454541a079f4 | 119 | LOG_FUNCTION_END(status); |
gallonm | 3:454541a079f4 | 120 | return status; |
gallonm | 1:1de1ea2994d9 | 121 | } |
gallonm | 1:1de1ea2994d9 | 122 | |
gallonm | 1:1de1ea2994d9 | 123 | |
gallonm | 3:454541a079f4 | 124 | int VL6180X::VL6180XReadID(uint8_t *rl_id) |
gallonm | 1:1de1ea2994d9 | 125 | { |
gallonm | 3:454541a079f4 | 126 | if(!rl_id) |
gallonm | 3:454541a079f4 | 127 | { |
gallonm | 3:454541a079f4 | 128 | return API_ERROR; |
gallonm | 3:454541a079f4 | 129 | } |
gallonm | 3:454541a079f4 | 130 | return VL6180X_IO_Read(rl_id, IDENTIFICATION_MODEL_ID, 1); |
gallonm | 1:1de1ea2994d9 | 131 | } |
gallonm | 1:1de1ea2994d9 | 132 | |
gallonm | 3:454541a079f4 | 133 | int VL6180X::VL6180X_IO_Read(uint8_t *pBuffer, uint8_t RegisterAddress, uint16 NumByteToRead) |
gallonm | 1:1de1ea2994d9 | 134 | { |
gallonm | 3:454541a079f4 | 135 | int lecture |
gallonm | 1:1de1ea2994d9 | 136 | |
gallonm | 3:454541a079f4 | 137 | lecture=dev_i2c.i2c_read(pBuffer, DevAddress, RegisterAddress, NumByteToRead); |
gallonm | 3:454541a079f4 | 138 | if(lecture!=0) |
gallonm | 1:1de1ea2994d9 | 139 | { |
gallonm | 3:454541a079f4 | 140 | return API_ERROR; |
gallonm | 1:1de1ea2994d9 | 141 | } |
gallonm | 3:454541a079f4 | 142 | return API_NO_ERROR; |
gallonm | 1:1de1ea2994d9 | 143 | } |
gallonm | 1:1de1ea2994d9 | 144 | |
gallonm | 1:1de1ea2994d9 | 145 | |
gallonm | 3:454541a079f4 | 146 | |
gallonm | 3:454541a079f4 | 147 | |
gallonm | 3:454541a079f4 | 148 | |
gallonm | 3:454541a079f4 | 149 | |
gallonm | 3:454541a079f4 | 150 | |
gallonm | 3:454541a079f4 | 151 | static int _DMax_InitData(VL6180xDev_t dev){ |
gallonm | 3:454541a079f4 | 152 | int status, warning; |
gallonm | 3:454541a079f4 | 153 | uint8_t u8; |
gallonm | 3:454541a079f4 | 154 | uint16_t u16; |
gallonm | 3:454541a079f4 | 155 | uint32_t u32; |
gallonm | 3:454541a079f4 | 156 | uint32_t Reg2A_KCps; |
gallonm | 3:454541a079f4 | 157 | uint32_t RegB8; |
gallonm | 3:454541a079f4 | 158 | uint8_t MaxConvTime; |
gallonm | 3:454541a079f4 | 159 | uint32_t XTalkCompRate_KCps; |
gallonm | 3:454541a079f4 | 160 | uint32_t RangeIgnoreThreshold; |
gallonm | 3:454541a079f4 | 161 | int32_t minSignalNeeded; |
gallonm | 3:454541a079f4 | 162 | uint8_t SysRangeCheckEn; |
gallonm | 3:454541a079f4 | 163 | uint8_t snrLimit; |
gallonm | 3:454541a079f4 | 164 | warning=0; |
gallonm | 3:454541a079f4 | 165 | |
gallonm | 3:454541a079f4 | 166 | static const int ROMABLE_DATA MaxConvTimeAdjust=-4; |
gallonm | 3:454541a079f4 | 167 | |
gallonm | 3:454541a079f4 | 168 | LOG_FUNCTION_START(""); |
gallonm | 3:454541a079f4 | 169 | do{ |
gallonm | 3:454541a079f4 | 170 | status = VL6180x_RdByte(dev, 0x02A ,&u8); |
gallonm | 3:454541a079f4 | 171 | if( status ){ |
gallonm | 3:454541a079f4 | 172 | VL6180x_ErrLog("Reg 0x02A rd fail"); |
gallonm | 3:454541a079f4 | 173 | break; |
gallonm | 3:454541a079f4 | 174 | } |
gallonm | 3:454541a079f4 | 175 | |
gallonm | 3:454541a079f4 | 176 | if( u8 == 0 ) { |
gallonm | 3:454541a079f4 | 177 | warning = CALIBRATION_WARNING; |
gallonm | 3:454541a079f4 | 178 | u8 = 40; /* use a default average value */ |
gallonm | 3:454541a079f4 | 179 | } |
gallonm | 3:454541a079f4 | 180 | Reg2A_KCps = Fix7_2_KCPs(u8); /* convert to KCPs */ |
gallonm | 3:454541a079f4 | 181 | |
gallonm | 3:454541a079f4 | 182 | status = VL6180x_RdByte(dev, SYSRANGE_RANGE_CHECK_ENABLES, &SysRangeCheckEn); |
gallonm | 3:454541a079f4 | 183 | if (status) { |
gallonm | 3:454541a079f4 | 184 | VL6180x_ErrLog("SYSRANGE_RANGE_CHECK_ENABLES rd fail "); |
gallonm | 3:454541a079f4 | 185 | break; |
gallonm | 3:454541a079f4 | 186 | } |
gallonm | 3:454541a079f4 | 187 | |
gallonm | 3:454541a079f4 | 188 | status = VL6180x_RdByte(dev, SYSRANGE_MAX_CONVERGENCE_TIME, &MaxConvTime); |
gallonm | 3:454541a079f4 | 189 | if( status){ |
gallonm | 3:454541a079f4 | 190 | VL6180x_ErrLog("SYSRANGE_MAX_CONVERGENCE_TIME rd fail "); |
gallonm | 3:454541a079f4 | 191 | break; |
gallonm | 3:454541a079f4 | 192 | } |
gallonm | 3:454541a079f4 | 193 | |
gallonm | 3:454541a079f4 | 194 | status = VL6180x_RdDWord(dev, 0x0B8, &RegB8); |
gallonm | 3:454541a079f4 | 195 | if( status ){ |
gallonm | 3:454541a079f4 | 196 | VL6180x_ErrLog("reg 0x0B8 rd fail "); |
gallonm | 3:454541a079f4 | 197 | break; |
gallonm | 3:454541a079f4 | 198 | } |
gallonm | 3:454541a079f4 | 199 | |
gallonm | 3:454541a079f4 | 200 | status = VL6180x_RdByte(dev, SYSRANGE_MAX_AMBIENT_LEVEL_MULT, &snrLimit); |
gallonm | 3:454541a079f4 | 201 | if( status){ |
gallonm | 3:454541a079f4 | 202 | VL6180x_ErrLog("SYSRANGE_MAX_AMBIENT_LEVEL_MULT rd fail "); |
gallonm | 3:454541a079f4 | 203 | break; |
gallonm | 3:454541a079f4 | 204 | } |
gallonm | 3:454541a079f4 | 205 | _DMaxData(snrLimit_K) = (int32_t)16*1000/snrLimit; |
gallonm | 3:454541a079f4 | 206 | XTalkCompRate_KCps = VL6180xDevDataGet(dev, XTalkCompRate_KCps ); |
gallonm | 3:454541a079f4 | 207 | |
gallonm | 3:454541a079f4 | 208 | if( Reg2A_KCps >= XTalkCompRate_KCps){ |
gallonm | 3:454541a079f4 | 209 | _DMaxData(retSignalAt400mm)=( Reg2A_KCps - XTalkCompRate_KCps); |
gallonm | 3:454541a079f4 | 210 | } |
gallonm | 3:454541a079f4 | 211 | else{ |
gallonm | 3:454541a079f4 | 212 | _DMaxData(retSignalAt400mm)=0; /* Reg2A_K - XTalkCompRate_KCp <0 is invalid */ |
gallonm | 3:454541a079f4 | 213 | } |
gallonm | 3:454541a079f4 | 214 | |
gallonm | 3:454541a079f4 | 215 | /* if xtalk range check is off omit it in snr clipping */ |
gallonm | 3:454541a079f4 | 216 | if( SysRangeCheckEn&RANGE_CHECK_RANGE_ENABLE_MASK ){ |
gallonm | 3:454541a079f4 | 217 | status = VL6180x_RdWord(dev, SYSRANGE_RANGE_IGNORE_THRESHOLD, &u16); |
gallonm | 3:454541a079f4 | 218 | if( status){ |
gallonm | 3:454541a079f4 | 219 | VL6180x_ErrLog("SYSRANGE_RANGE_IGNORE_THRESHOLD rd fail "); |
gallonm | 3:454541a079f4 | 220 | break; |
gallonm | 3:454541a079f4 | 221 | } |
gallonm | 3:454541a079f4 | 222 | RangeIgnoreThreshold = Fix7_2_KCPs(u16); |
gallonm | 3:454541a079f4 | 223 | } |
gallonm | 3:454541a079f4 | 224 | else{ |
gallonm | 3:454541a079f4 | 225 | RangeIgnoreThreshold = 0; |
gallonm | 3:454541a079f4 | 226 | } |
gallonm | 3:454541a079f4 | 227 | |
gallonm | 3:454541a079f4 | 228 | minSignalNeeded = (RegB8*256)/((int32_t)MaxConvTime+(int32_t)MaxConvTimeAdjust); /* KCps 8+8 bit -(1 to 6 bit) => 15-10 bit */ |
gallonm | 3:454541a079f4 | 229 | /* minSignalNeeded = max ( minSignalNeeded, RangeIgnoreThreshold - XTalkCompRate_KCps) */ |
gallonm | 3:454541a079f4 | 230 | if( minSignalNeeded <= RangeIgnoreThreshold - XTalkCompRate_KCps ) |
gallonm | 3:454541a079f4 | 231 | minSignalNeeded = RangeIgnoreThreshold - XTalkCompRate_KCps; |
gallonm | 3:454541a079f4 | 232 | |
gallonm | 3:454541a079f4 | 233 | u32 = (minSignalNeeded*(uint32_t)snrLimit)/16; |
gallonm | 3:454541a079f4 | 234 | _DMaxData(ClipSnrLimit ) = _DMax_RawValueAtRateKCps(dev, u32 ); /* clip to dmax to min signal snr limit rate*/ |
gallonm | 3:454541a079f4 | 235 | } |
gallonm | 3:454541a079f4 | 236 | while(0); |
gallonm | 3:454541a079f4 | 237 | if( !status ) |
gallonm | 3:454541a079f4 | 238 | status = warning; |
gallonm | 3:454541a079f4 | 239 | LOG_FUNCTION_END(status); |
gallonm | 3:454541a079f4 | 240 | return status; |
gallonm | 1:1de1ea2994d9 | 241 | } |
gallonm | 1:1de1ea2994d9 | 242 | |
gallonm | 3:454541a079f4 | 243 | #undef Fix7_2_KCPs |
gallonm | 1:1de1ea2994d9 | 244 | |
gallonm | 1:1de1ea2994d9 | 245 | /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ |