/**
* @brief Exit the shutdown mode for HTS221
* @retval HUM_TEMP_OK in case of success, an error code otherwise
*/
void HTS221_Power_On(void)
{
uint8_t order;
/* Read the register content */
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,HTS221_CTRL_REG1, I2C_MEMADD_SIZE_8BIT,&order,1,0xFFFF);
/* Set the power down bit */
order |= HTS221_MODE_ACTIVE;
/**
* @brief Enter the shutdown mode for HTS221
* @retval HUM_TEMP_OK in case of success, an error code otherwise
*/
void HTS221_Power_OFF(void)
{
uint8_t order;
/* Read the register content */
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,HTS221_CTRL_REG1, I2C_MEMADD_SIZE_8BIT,&order,1,0xFFFF);
/* Reset the power down bit */
order &= ~(HTS221_MODE_ACTIVE);
// Truncate to specific number of decimal digits
humidity_t = (uint16_t)(H_rh * pow(10, HUM_DECIMAL_DIGITS));
*pfData = ((float)humidity_t) / pow(10, HUM_DECIMAL_DIGITS);
// Prevent data going below 0% and above 100% due to linear interpolation
if ( *pfData < 0.0f ) *pfData = 0.0f;
if ( *pfData > 100.0f ) *pfData = 100.0f;
#include <math.h>
float T0_degC, T1_degC; //ζÈУ׼
int16_t T0_out, T1_out; //У׼ζÈÖµÊä³ö
float H0_rh, H1_rh; //ʪ¶ÈУ׼
int16_t H0_T0_out, H1_T0_out;//У׼ʪ¶ÈÖµÊä³ö
void HTS221_Init()
{
uint8_t order[2];
//ÅäÖõͼ¶±ð½Ó¿Ú
//1¡¢´ò¿ªHTS221£¬½«DÖÃ1±íʾ¿ªÆô 2¡¢Êä³öÊý¾ÝËÙÂÊÑ¡
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W, HTS221_CTRL_REG1, I2C_MEMADD_SIZE_8BIT,order,1,0xFFFF);
order[0] |= 0x80;
order[0] &= ~(HTS221_ODR_MASK);
order[0] |= 1;//00Ò»´ÎÐÔ£¬01 1Hz£¬10 7Hz£¬11 12.5hz
HAL_I2C_Mem_Write(&hi2c1,HT_ADDR_W,HTS221_CTRL_REG1, I2C_MEMADD_SIZE_8BIT,order,1,0xFFFF);
}
/**
* @brief Exit the shutdown mode for HTS221
* @retval HUM_TEMP_OK in case of success, an error code otherwise
*/
void HTS221_Power_On(void)
{
uint8_t order;
/* Read the register content */
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,HTS221_CTRL_REG1, I2C_MEMADD_SIZE_8BIT,&order,1,0xFFFF);
/* Set the power down bit */
order |= HTS221_MODE_ACTIVE;
/* Write register */
HAL_I2C_Mem_Write(&hi2c1,HT_ADDR_W,HTS221_CTRL_REG1, I2C_MEMADD_SIZE_8BIT,&order,1,0xFFFF);
}
/**
* @brief Enter the shutdown mode for HTS221
* @retval HUM_TEMP_OK in case of success, an error code otherwise
*/
void HTS221_Power_OFF(void)
{
uint8_t order;
/* Read the register content */
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,HTS221_CTRL_REG1, I2C_MEMADD_SIZE_8BIT,&order,1,0xFFFF);
/* Reset the power down bit */
order &= ~(HTS221_MODE_ACTIVE);
/* Write register */
HAL_I2C_Mem_Write(&hi2c1,HT_ADDR_W,HTS221_CTRL_REG1, I2C_MEMADD_SIZE_8BIT,&order,1,0xFFFF);
}
/**
* @brief HTS221 Calibration procedure
* @retval HUM_TEMP_OK in case of success, an error code otherwise
*/
void HTS221_Calibration(void)
{
/* Temperature Calibration */
/* Temperature in degree for calibration ( "/8" to obtain float) */
uint16_t T0_degC_x8_L, T0_degC_x8_H, T1_degC_x8_L, T1_degC_x8_H;
uint8_t H0_rh_x2, H1_rh_x2;
uint8_t tempReg[2] = {0, 0};
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,HTS221_T0_degC_x8, I2C_MEMADD_SIZE_8BIT,tempReg,1,0xFFFF);
T0_degC_x8_L = (uint16_t)tempReg[0];
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,HTS221_T1_T0_msb, I2C_MEMADD_SIZE_8BIT,tempReg,1,0xFFFF);
T0_degC_x8_H = (uint16_t) (tempReg[0] & 0x03);
T0_degC = ((float)((T0_degC_x8_H << 8) | (T0_degC_x8_L))) / 8;
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,HTS221_T1_degC_x8, I2C_MEMADD_SIZE_8BIT,tempReg,1,0xFFFF);
T1_degC_x8_L = (uint16_t)tempReg[0];
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,HTS221_T1_T0_msb, I2C_MEMADD_SIZE_8BIT,tempReg,1,0xFFFF);
T1_degC_x8_H = (uint16_t) (tempReg[0] & 0x0C);
T1_degC_x8_H = T1_degC_x8_H >> 2;
T1_degC = ((float)((T1_degC_x8_H << 8) | (T1_degC_x8_L))) / 8;
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,(HTS221_T0_OUT_Low_Half | HTS221_I2C_MULTIPLEBYTE_CMD), I2C_MEMADD_SIZE_8BIT,tempReg,2,0xFFFF);
T0_out = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]);
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,(HTS221_T1_OUT_Low_Half | HTS221_I2C_MULTIPLEBYTE_CMD), I2C_MEMADD_SIZE_8BIT,tempReg,2,0xFFFF);
T1_out = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]);
/* Humidity Calibration */
/* Humidity in degree for calibration ( "/2" to obtain float) */
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,HTS221_H0_rH_x2, I2C_MEMADD_SIZE_8BIT,&H0_rh_x2,1,0xFFFF);
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,HTS221_H1_rH_x2 , I2C_MEMADD_SIZE_8BIT,&H1_rh_x2,1,0xFFFF);
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,(HTS221_H0_T0_OUT_Low_Half | HTS221_I2C_MULTIPLEBYTE_CMD) , I2C_MEMADD_SIZE_8BIT,&tempReg[0],2,0xFFFF);
H0_T0_out = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]);
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,(HTS221_H1_T0_OUT_Low_Half | HTS221_I2C_MULTIPLEBYTE_CMD) , I2C_MEMADD_SIZE_8BIT,&tempReg[0],2,0xFFFF);
H1_T0_out = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]);
H0_rh = ((float)H0_rh_x2) / 2;
H1_rh = ((float)H1_rh_x2) / 2;
}
void HTS221_ReadID(void)
{
uint8_t tempReg;
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,HTS221_WHO_AM_I , I2C_MEMADD_SIZE_8BIT,&tempReg,1,0xFFFF);
}
/**
* @brief Read HTS221 output register, and calculate the humidity
* @param pfData the pointer to data output
* @retval HUM_TEMP_OK in case of success, an error code otherwise
*/
uint16_t HTS221_Get_Humidity(void)
{
float* pfData;
int16_t H_T_out, humidity_t;
uint8_t tempReg[2] = {0, 0};
uint8_t tmp = 0x00;
float H_rh;
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,HTS221_CTRL_REG1, I2C_MEMADD_SIZE_8BIT,&tmp,1,0xFFFF);
/* Output Data Rate selection */
tmp &= (HTS221_ODR_MASK);
if(tmp == 0x00)
{
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,HTS221_CTRL_REG2, I2C_MEMADD_SIZE_8BIT,&tmp,1,0xFFFF);
/* Serial Interface Mode selection */
tmp &= ~(HTS221_ONE_SHOT_MASK);
tmp |= HTS221_ONE_SHOT_START;
HAL_I2C_Mem_Write(&hi2c1,HT_ADDR_W,HTS221_CTRL_REG2, I2C_MEMADD_SIZE_8BIT,&tmp,1,0xFFFF);
do
{
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,HTS221_STATUS_REG, I2C_MEMADD_SIZE_8BIT,&tmp,1,0xFFFF);
}
while(!(tmp & 0x02));
}
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,(HTS221_HUMIDITY_OUT_L| HTS221_I2C_MULTIPLEBYTE_CMD), I2C_MEMADD_SIZE_8BIT,tempReg,2,0xFFFF);
H_T_out = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]);
H_rh = ( float )(((( H_T_out - H0_T0_out ) * ( H1_rh - H0_rh )) / ( H1_T0_out - H0_T0_out )) + H0_rh );
// Truncate to specific number of decimal digits
humidity_t = (uint16_t)(H_rh * pow(10, HUM_DECIMAL_DIGITS));
*pfData = ((float)humidity_t) / pow(10, HUM_DECIMAL_DIGITS);
// Prevent data going below 0% and above 100% due to linear interpolation
if ( *pfData < 0.0f ) *pfData = 0.0f;
if ( *pfData > 100.0f ) *pfData = 100.0f;
return *pfData;
}
int16_t HTS221_Get_Temperature(void)
{
int16_t pfData;
int16_t T_out, temperature_t;
uint8_t tempReg[2] = {0, 0};
uint8_t tmp = 0x00;
float T_degC;
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,HTS221_CTRL_REG1, I2C_MEMADD_SIZE_8BIT,&tmp,1,0xFFFF);
/* Output Data Rate selection */
tmp &= (HTS221_ODR_MASK);
if(tmp == 0x00)
{
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,HTS221_CTRL_REG2, I2C_MEMADD_SIZE_8BIT,&tmp,1,0xFFFF);
/* Serial Interface Mode selection */
tmp &= ~(HTS221_ONE_SHOT_MASK);
tmp |= HTS221_ONE_SHOT_START;
HAL_I2C_Mem_Write(&hi2c1,HT_ADDR_W,HTS221_CTRL_REG2, I2C_MEMADD_SIZE_8BIT,&tmp,1,0xFFFF);
do
{
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,HTS221_STATUS_REG, I2C_MEMADD_SIZE_8BIT,&tmp,1,0xFFFF);
}
while(!(tmp & 0x01));
}
HAL_I2C_Mem_Read(&hi2c1,HT_ADDR_W,(HTS221_TEMP_OUT_L | HTS221_I2C_MULTIPLEBYTE_CMD), I2C_MEMADD_SIZE_8BIT,tempReg,2,0xFFFF);
T_out = ((((int16_t)tempReg[1]) << 8) + (int16_t)tempReg[0]);
T_degC = ((float)(T_out - T0_out)) / (T1_out - T0_out) * (T1_degC - T0_degC) + T0_degC;
temperature_t = (int16_t)(T_degC * pow(10, TEMP_DECIMAL_DIGITS));
pfData = ((float)temperature_t) / pow(10, TEMP_DECIMAL_DIGITS);
return pfData;
}
[/mw_shl_code]
一周热门 更多>