INSAT Mini Project

Dependencies:   ST_INTERFACES X_NUCLEO_COMMON

Fork of X_NUCLEO_6180XA1 by ST

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?

UserRevisionLine numberNew 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>&copy; 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****/