Firmware Library for X-NUCLEO-IKS01A1 (MEMS Inertial & Environmental Sensors) Expansion Board
Dependencies: X_NUCLEO_COMMON ST_INTERFACES
Dependents: MultiTech_Dragonfly_2015_ATT_Gov_Solutions_Hackathon_Example HelloWorld_IKS01A1 LoRaWAN-test-10secs ServoMotorDemo ... more
Fork of X_NUCLEO_IKS01A1 by
hts221_class.cpp
00001 /** 00002 ****************************************************************************** 00003 * @file hts221_class.cpp 00004 * @author AST / EST 00005 * @version V0.0.1 00006 * @date 14-April-2015 00007 * @brief Implementation file for the HTS221 driver class 00008 ****************************************************************************** 00009 * @attention 00010 * 00011 * <h2><center>© COPYRIGHT(c) 2015 STMicroelectronics</center></h2> 00012 * 00013 * Redistribution and use in source and binary forms, with or without modification, 00014 * are permitted provided that the following conditions are met: 00015 * 1. Redistributions of source code must retain the above copyright notice, 00016 * this list of conditions and the following disclaimer. 00017 * 2. Redistributions in binary form must reproduce the above copyright notice, 00018 * this list of conditions and the following disclaimer in the documentation 00019 * and/or other materials provided with the distribution. 00020 * 3. Neither the name of STMicroelectronics nor the names of its contributors 00021 * may be used to endorse or promote products derived from this software 00022 * without specific prior written permission. 00023 * 00024 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00025 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00026 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 00027 * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE 00028 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 00029 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 00030 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER 00031 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 00032 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 00033 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00034 * 00035 ****************************************************************************** 00036 */ 00037 00038 /* Includes ------------------------------------------------------------------*/ 00039 #include "hts221_class.h" 00040 #include "hts221.h" 00041 00042 /* Methods -------------------------------------------------------------------*/ 00043 /* betzw - based on: 00044 X-CUBE-MEMS1/trunk/Drivers/BSP/Components/hts221/hts221.c: revision #410, 00045 X-CUBE-MEMS1/trunk: revision #416 00046 */ 00047 00048 /** 00049 * @brief HTS221 Calibration procedure 00050 * @retval HUM_TEMP_OK in case of success, an error code otherwise 00051 */ 00052 HUM_TEMP_StatusTypeDef HTS221::HTS221_Calibration(void) 00053 { 00054 /* Temperature Calibration */ 00055 /* Temperature in degree for calibration ( "/8" to obtain float) */ 00056 uint16_t T0_degC_x8_L, T0_degC_x8_H, T1_degC_x8_L, T1_degC_x8_H; 00057 uint8_t H0_rh_x2, H1_rh_x2; 00058 uint8_t tempReg[2] = {0, 0}; 00059 00060 if(HTS221_IO_Read(tempReg, HTS221_T0_degC_X8_ADDR, 1) != HUM_TEMP_OK) 00061 { 00062 return HUM_TEMP_ERROR; 00063 } 00064 00065 T0_degC_x8_L = (uint16_t)tempReg[0]; 00066 00067 if(HTS221_IO_Read(tempReg, HTS221_T1_T0_MSB_X8_ADDR, 1) != HUM_TEMP_OK) 00068 { 00069 return HUM_TEMP_ERROR; 00070 } 00071 00072 T0_degC_x8_H = (uint16_t) (tempReg[0] & 0x03); 00073 T0_degC = ((float)((T0_degC_x8_H << 8) | (T0_degC_x8_L))) / 8; 00074 00075 if(HTS221_IO_Read(tempReg, HTS221_T1_degC_X8_ADDR, 1) != HUM_TEMP_OK) 00076 { 00077 return HUM_TEMP_ERROR; 00078 } 00079 00080 T1_degC_x8_L = (uint16_t)tempReg[0]; 00081 00082 if(HTS221_IO_Read(tempReg, HTS221_T1_T0_MSB_X8_ADDR, 1) != HUM_TEMP_OK) 00083 { 00084 return HUM_TEMP_ERROR; 00085 } 00086 00087 T1_degC_x8_H = (uint16_t) (tempReg[0] & 0x0C); 00088 T1_degC_x8_H = T1_degC_x8_H >> 2; 00089 T1_degC = ((float)((T1_degC_x8_H << 8) | (T1_degC_x8_L))) / 8; 00090 00091 if(HTS221_IO_Read(tempReg, (HTS221_T0_OUT_L_ADDR | HTS221_I2C_MULTIPLEBYTE_CMD), 2) != HUM_TEMP_OK) 00092 { 00093 return HUM_TEMP_ERROR; 00094 } 00095 00096 T0_out = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]); 00097 00098 if(HTS221_IO_Read(tempReg, (HTS221_T1_OUT_L_ADDR | HTS221_I2C_MULTIPLEBYTE_CMD), 2) != HUM_TEMP_OK) 00099 { 00100 return HUM_TEMP_ERROR; 00101 } 00102 00103 T1_out = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]); 00104 00105 /* Humidity Calibration */ 00106 /* Humidity in degree for calibration ( "/2" to obtain float) */ 00107 00108 if(HTS221_IO_Read(&H0_rh_x2, HTS221_H0_RH_X2_ADDR, 1) != HUM_TEMP_OK) 00109 { 00110 return HUM_TEMP_ERROR; 00111 } 00112 00113 if(HTS221_IO_Read(&H1_rh_x2, HTS221_H1_RH_X2_ADDR, 1) != HUM_TEMP_OK) 00114 { 00115 return HUM_TEMP_ERROR; 00116 } 00117 00118 if(HTS221_IO_Read(&tempReg[0], (HTS221_H0_T0_OUT_L_ADDR | HTS221_I2C_MULTIPLEBYTE_CMD), 00119 2) != HUM_TEMP_OK) 00120 { 00121 return HUM_TEMP_ERROR; 00122 } 00123 00124 H0_T0_out = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]); 00125 00126 if(HTS221_IO_Read(&tempReg[0], (HTS221_H1_T0_OUT_L_ADDR | HTS221_I2C_MULTIPLEBYTE_CMD), 00127 2) != HUM_TEMP_OK) 00128 { 00129 return HUM_TEMP_ERROR; 00130 } 00131 00132 H1_T0_out = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]); 00133 00134 H0_rh = ((float)H0_rh_x2) / 2; 00135 H1_rh = ((float)H1_rh_x2) / 2; 00136 00137 return HUM_TEMP_OK; 00138 } 00139 00140 00141 /** 00142 * @brief Set HTS221 Initialization 00143 * @param HTS221_Init the configuration setting for the HTS221 00144 * @retval HUM_TEMP_OK in case of success, an error code otherwise 00145 */ 00146 HUM_TEMP_StatusTypeDef HTS221::HTS221_Init(HUM_TEMP_InitTypeDef *HTS221_Init) 00147 { 00148 uint8_t tmp = 0x00; 00149 00150 /* Configure the low level interface ---------------------------------------*/ 00151 if(HTS221_IO_Init() != HUM_TEMP_OK) 00152 { 00153 return HUM_TEMP_ERROR; 00154 } 00155 00156 if(HTS221_Power_On() != HUM_TEMP_OK) 00157 { 00158 return HUM_TEMP_ERROR; 00159 } 00160 00161 if(HTS221_Calibration() != HUM_TEMP_OK) 00162 { 00163 return HUM_TEMP_ERROR; 00164 } 00165 00166 if(HTS221_IO_Read(&tmp, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK) 00167 { 00168 return HUM_TEMP_ERROR; 00169 } 00170 00171 /* Output Data Rate selection */ 00172 tmp &= ~(HTS221_ODR_MASK); 00173 tmp |= HTS221_Init->OutputDataRate; 00174 00175 if(HTS221_IO_Write(&tmp, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK) 00176 { 00177 return HUM_TEMP_ERROR; 00178 } 00179 00180 HTS221_IO_ITConfig(); 00181 00182 return HUM_TEMP_OK; 00183 } 00184 00185 /** 00186 * @brief Read ID address of HTS221 00187 * @param ht_id the pointer where the ID of the device is stored 00188 * @retval HUM_TEMP_OK in case of success, an error code otherwise 00189 */ 00190 HUM_TEMP_StatusTypeDef HTS221::HTS221_ReadID(uint8_t *ht_id) 00191 { 00192 if(!ht_id) 00193 { 00194 return HUM_TEMP_ERROR; 00195 } 00196 00197 return HTS221_IO_Read(ht_id, HTS221_WHO_AM_I_ADDR, 1); 00198 } 00199 00200 /** 00201 * @brief Reboot memory content of HTS221 00202 * @retval HUM_TEMP_OK in case of success, an error code otherwise 00203 */ 00204 HUM_TEMP_StatusTypeDef HTS221::HTS221_RebootCmd(void) 00205 { 00206 uint8_t tmpreg; 00207 00208 /* Read CTRL_REG2 register */ 00209 if(HTS221_IO_Read(&tmpreg, HTS221_CTRL_REG2_ADDR, 1) != HUM_TEMP_OK) 00210 { 00211 return HUM_TEMP_ERROR; 00212 } 00213 00214 /* Enable or Disable the reboot memory */ 00215 tmpreg |= HTS221_BOOT_REBOOTMEMORY; 00216 00217 /* Write value to MEMS CTRL_REG2 regsister */ 00218 if(HTS221_IO_Write(&tmpreg, HTS221_CTRL_REG2_ADDR, 1) != HUM_TEMP_OK) 00219 { 00220 return HUM_TEMP_ERROR; 00221 } 00222 00223 return HUM_TEMP_OK; 00224 } 00225 00226 00227 /** 00228 * @brief Read HTS221 output register, and calculate the humidity 00229 * @param pfData the pointer to data output 00230 * @retval HUM_TEMP_OK in case of success, an error code otherwise 00231 */ 00232 HUM_TEMP_StatusTypeDef HTS221::HTS221_GetHumidity(float* pfData) 00233 { 00234 int16_t H_T_out, humidity_t; 00235 uint8_t tempReg[2] = {0, 0}; 00236 uint8_t tmp = 0x00; 00237 float H_rh; 00238 00239 if(HTS221_IO_Read(&tmp, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK) 00240 { 00241 return HUM_TEMP_ERROR; 00242 } 00243 00244 /* Output Data Rate selection */ 00245 tmp &= (HTS221_ODR_MASK); 00246 00247 if(tmp == 0x00) 00248 { 00249 if(HTS221_IO_Read(&tmp, HTS221_CTRL_REG2_ADDR, 1) != HUM_TEMP_OK) 00250 { 00251 return HUM_TEMP_ERROR; 00252 } 00253 00254 /* Serial Interface Mode selection */ 00255 tmp &= ~(HTS221_ONE_SHOT_MASK); 00256 tmp |= HTS221_ONE_SHOT_START; 00257 00258 if(HTS221_IO_Write(&tmp, HTS221_CTRL_REG2_ADDR, 1) != HUM_TEMP_OK) 00259 { 00260 return HUM_TEMP_ERROR; 00261 } 00262 00263 do 00264 { 00265 00266 if(HTS221_IO_Read(&tmp, HTS221_STATUS_REG_ADDR, 1) != HUM_TEMP_OK) 00267 { 00268 return HUM_TEMP_ERROR; 00269 } 00270 00271 } 00272 while(!(tmp & 0x02)); 00273 } 00274 00275 00276 if(HTS221_IO_Read(&tempReg[0], (HTS221_HUMIDITY_OUT_L_ADDR | HTS221_I2C_MULTIPLEBYTE_CMD), 00277 2) != HUM_TEMP_OK) 00278 { 00279 return HUM_TEMP_ERROR; 00280 } 00281 00282 H_T_out = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]); 00283 00284 H_rh = ( float )(((( H_T_out - H0_T0_out ) * ( H1_rh - H0_rh )) / ( H1_T0_out - H0_T0_out )) + H0_rh ); 00285 00286 // Truncate to specific number of decimal digits 00287 humidity_t = (uint16_t)(H_rh * pow(10.0f, HUM_DECIMAL_DIGITS)); 00288 *pfData = ((float)humidity_t) / pow(10.0f, HUM_DECIMAL_DIGITS); 00289 00290 // Prevent data going below 0% and above 100% due to linear interpolation 00291 if ( *pfData < 0.0f ) *pfData = 0.0f; 00292 if ( *pfData > 100.0f ) *pfData = 100.0f; 00293 00294 return HUM_TEMP_OK; 00295 } 00296 00297 /** 00298 * @brief Read HTS221 output register, and calculate the temperature 00299 * @param pfData the pointer to data output 00300 * @retval HUM_TEMP_OK in case of success, an error code otherwise 00301 */ 00302 HUM_TEMP_StatusTypeDef HTS221::HTS221_GetTemperature(float* pfData) 00303 { 00304 int16_t T_out, temperature_t; 00305 uint8_t tempReg[2] = {0, 0}; 00306 uint8_t tmp = 0x00; 00307 float T_degC; 00308 00309 if(HTS221_IO_Read(&tmp, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK) 00310 { 00311 return HUM_TEMP_ERROR; 00312 } 00313 00314 /* Output Data Rate selection */ 00315 tmp &= (HTS221_ODR_MASK); 00316 00317 if(tmp == 0x00) 00318 { 00319 if(HTS221_IO_Read(&tmp, HTS221_CTRL_REG2_ADDR, 1) != HUM_TEMP_OK) 00320 { 00321 return HUM_TEMP_ERROR; 00322 } 00323 00324 /* Serial Interface Mode selection */ 00325 tmp &= ~(HTS221_ONE_SHOT_MASK); 00326 tmp |= HTS221_ONE_SHOT_START; 00327 00328 if(HTS221_IO_Write(&tmp, HTS221_CTRL_REG2_ADDR, 1) != HUM_TEMP_OK) 00329 { 00330 return HUM_TEMP_ERROR; 00331 } 00332 00333 do 00334 { 00335 00336 if(HTS221_IO_Read(&tmp, HTS221_STATUS_REG_ADDR, 1) != HUM_TEMP_OK) 00337 { 00338 return HUM_TEMP_ERROR; 00339 } 00340 00341 } 00342 while(!(tmp & 0x01)); 00343 } 00344 00345 if(HTS221_IO_Read(&tempReg[0], (HTS221_TEMP_OUT_L_ADDR | HTS221_I2C_MULTIPLEBYTE_CMD), 00346 2) != HUM_TEMP_OK) 00347 { 00348 return HUM_TEMP_ERROR; 00349 } 00350 00351 T_out = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]); 00352 00353 T_degC = ((float)(T_out - T0_out)) / (T1_out - T0_out) * (T1_degC - T0_degC) + T0_degC; 00354 00355 temperature_t = (int16_t)(T_degC * pow(10.0f, TEMP_DECIMAL_DIGITS)); 00356 00357 *pfData = ((float)temperature_t) / pow(10.0f, TEMP_DECIMAL_DIGITS); 00358 00359 return HUM_TEMP_OK; 00360 } 00361 00362 00363 /** 00364 * @brief Exit the shutdown mode for HTS221 00365 * @retval HUM_TEMP_OK in case of success, an error code otherwise 00366 */ 00367 HUM_TEMP_StatusTypeDef HTS221::HTS221_Power_On(void) 00368 { 00369 uint8_t tmpReg; 00370 00371 /* Read the register content */ 00372 if(HTS221_IO_Read(&tmpReg, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK) 00373 { 00374 return HUM_TEMP_ERROR; 00375 } 00376 00377 /* Set the power down bit */ 00378 tmpReg |= HTS221_MODE_ACTIVE; 00379 00380 /* Write register */ 00381 if(HTS221_IO_Write(&tmpReg, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK) 00382 { 00383 return HUM_TEMP_ERROR; 00384 } 00385 00386 return HUM_TEMP_OK; 00387 } 00388 00389 /** 00390 * @brief Enter the shutdown mode for HTS221 00391 * @retval HUM_TEMP_OK in case of success, an error code otherwise 00392 */ 00393 HUM_TEMP_StatusTypeDef HTS221::HTS221_Power_OFF(void) 00394 { 00395 uint8_t tmpReg; 00396 00397 /* Read the register content */ 00398 if(HTS221_IO_Read(&tmpReg, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK) 00399 { 00400 return HUM_TEMP_ERROR; 00401 } 00402 00403 /* Reset the power down bit */ 00404 tmpReg &= ~(HTS221_MODE_ACTIVE); 00405 00406 /* Write register */ 00407 if(HTS221_IO_Write(&tmpReg, HTS221_CTRL_REG1_ADDR, 1) != HUM_TEMP_OK) 00408 { 00409 return HUM_TEMP_ERROR; 00410 } 00411 00412 return HUM_TEMP_OK; 00413 } 00414 00415 /************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/
Generated on Tue Jul 12 2022 17:19:45 by 1.7.2