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 ST Expansion SW Team

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers hts221_class.cpp Source File

hts221_class.cpp

Go to the documentation of this file.
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>&copy; 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****/