//=============================================================================
// S E N S I R I O N AG, Laubisruetistr. 50, CH-8712 Staefa, Switzerland
//=============================================================================
// Project : SHT3x Sample Code (V1.1)
// File : sht3x.c (V1.1)
// Author : RFU
// Date : 6-Mai-2015
// Controller: STM32F100RB
// IDE : 猩ision V5.12.0.0
// Compiler : Armcc
// Brief : Sensor Layer: Implementation of functions for sensor access.
//=============================================================================
//-- Includes -----------------------------------------------------------------
#include "sht3x.h"
#include "i2c_hal.h"
//-- Defines ------------------------------------------------------------------
// Generator polynomial for CRC
#define POLYNOMIAL 0x131 // P(x) = x^8 + x^5 + x^4 + 1 = 100110001
//=============================================================================
// IO-Pins /* -- adapt the defines for your uC -- */
//-----------------------------------------------------------------------------
// Reset on port B, bit 12
#define RESET_LOW() (GPIOB->BSRR = 0x10000000) // set Reset to low
#define RESET_HIGH() (GPIOB->BSRR = 0x00001000) // set Reset to high
// Alert on port B, bit 10
#define ALERT_READ (GPIOB->IDR & 0x0400) // read Alert
//=============================================================================
//-- Global variables ---------------------------------------------------------
static u8t _i2cAddress; // I2C Address
//-- Static function prototypes -----------------------------------------------
static etError SHT3X_WriteAlertLimitData(ft humidity, ft temperature);
static etError SHT3X_ReadAlertLimitData(ft* humidity, ft* temperature);
static etError SHT3X_StartWriteAccess(void);
static etError SHT3X_StartReadAccess(void);
static void SHT3X_StopAccess(void);
static etError SHT3X_WriteCommand(etCommands command);
static etError SHT3X_Read2BytesAndCrc(u16t* data, etI2cAck finaleAckNack,
u8t timeout);
static etError SHT3X_Write2BytesAndCrc(u16t data);
static u8t SHT3X_CalcCrc(u8t data[], u8t nbrOfBytes);
static etError SHT3X_CheckCrc(u8t data[], u8t nbrOfBytes, u8t checksum);
static ft SHT3X_CalcTemperature(u16t rawValue);
static ft SHT3X_CalcHumidity(u16t rawValue);
static u16t SHT3X_CalcRawTemperature(ft temperature);
static u16t SHT3X_CalcRawHumidity(ft humidity);
//-----------------------------------------------------------------------------
void SHT3X_Init(u8t i2cAddress) /* -- adapt the init for your uC -- */
{
// init I/O-pins
RCC->APB2ENR |= 0x00000008; // I/O port B clock enabled
// Alert on port B, bit 10
GPIOB->CRH &= 0xFFFFF0FF; // set floating input for Alert-Pin
GPIOB->CRH |= 0x00000400; //
// Reset on port B, bit 12
GPIOB->CRH &= 0xFFF0FFFF; // set push-pull output for Reset pin
GPIOB->CRH |= 0x00010000; //
RESET_LOW();
I2c_Init(); // init I2C
SHT3X_SetI2cAdr(i2cAddress);
// release reset
RESET_HIGH();
}
//-----------------------------------------------------------------------------
void SHT3X_SetI2cAdr(u8t i2cAddress)
{
_i2cAddress = i2cAddress;
}
//-----------------------------------------------------------------------------
etError SHT3x_ReadSerialNumber(u32t* serialNumber)
{
etError error; // error code
u16t serialNumWords[2];
error = SHT3X_StartWriteAccess();
// write "read serial number" command
error |= SHT3X_WriteCommand(CMD_READ_SERIALNBR);
// if no error, start read access
if(error == NO_ERROR) error = SHT3X_StartReadAccess();
// if no error, read first serial number word
if(error == NO_ERROR) error = SHT3X_Read2BytesAndCrc(&serialNumWords[0], ACK, 100);
// if no error, read second serial number word
if(error == NO_ERROR) error = SHT3X_Read2BytesAndCrc(&serialNumWords[1], NACK, 0);
SHT3X_StopAccess();
// if no error, calc serial number as 32-bit integer
if(error == NO_ERROR)
{
*serialNumber = (serialNumWords[0] << 16) | serialNumWords[1];
}
return error;
}
//-----------------------------------------------------------------------------
etError SHT3X_ReadStatus(u16t* status)
{
etError error; // error code
error = SHT3X_StartWriteAccess();
// if no error, write "read status" command
if(error == NO_ERROR) error = SHT3X_WriteCommand(CMD_READ_STATUS);
// if no error, start read access
if(error == NO_ERROR) error = SHT3X_StartReadAccess();
// if no error, read status
if(error == NO_ERROR) error = SHT3X_Read2BytesAndCrc(status, NACK, 0);
SHT3X_StopAccess();
return error;
}
//-----------------------------------------------------------------------------
etError SHT3X_ClearAllAlertFlags(void)
{
etError error; // error code
error = SHT3X_StartWriteAccess();
// if no error, write clear status register command
if(error == NO_ERROR) error = SHT3X_WriteCommand(CMD_CLEAR_STATUS);
SHT3X_StopAccess();
return error;
}
//-----------------------------------------------------------------------------
etError SHT3X_GetTempAndHumi(ft* temperature, ft* humidity,
etRepeatability repeatability, etMode mode,
u8t timeout)
{
etError error;
switch(mode)
{
case MODE_CLKSTRETCH: // get temperature with clock stretching mode
error = SHT3X_GetTempAndHumiClkStretch(temperature, humidity,
repeatability, timeout);
break;
case MODE_POLLING: // get temperature with polling mode
error = SHT3X_GetTempAndHumiPolling(temperature, humidity,
repeatability, timeout);
break;
default:
error = PARM_ERROR;
break;
}
return error;
}
//-----------------------------------------------------------------------------
etError SHT3X_GetTempAndHumiClkStretch(ft* temperature, ft* humidity,
etRepeatability repeatability,
u8t timeout)
{
etError error; // error code
u16t rawValueTemp; // temperature raw value from sensor
u16t rawValueHumi; // humidity raw value from sensor
error = SHT3X_StartWriteAccess();
// if no error ...
if(error == NO_ERROR)
{
// start measurement in clock stretching mode
// use depending on the required repeatability, the corresponding command
switch(repeatability)
{
case REPEATAB_LOW:
error = SHT3X_WriteCommand(CMD_MEAS_CLOCKSTR_L);
break;
case REPEATAB_MEDIUM:
error = SHT3X_WriteCommand(CMD_MEAS_CLOCKSTR_M);
break;
case REPEATAB_HIGH:
error = SHT3X_WriteCommand(CMD_MEAS_CLOCKSTR_H);
break;
default:
error = PARM_ERROR;
break;
}
}
// if no error, start read access
if(error == NO_ERROR) error = SHT3X_StartReadAccess();
// if no error, read temperature raw values
if(error == NO_ERROR) error = SHT3X_Read2BytesAndCrc(&rawValueTemp, ACK, timeout);
// if no error, read humidity raw values
if(error == NO_ERROR) error = SHT3X_Read2BytesAndCrc(&rawValueHumi, NACK, 0);
SHT3X_StopAccess();
// if no error, calculate temperature in 蚓 and humidity in %RH
if(error == NO_ERROR)
{
*temperature = SHT3X_CalcTemperature(rawValueTemp);
*humidity = SHT3X_CalcHumidity(rawValueHumi);
}
return error;
}
//-----------------------------------------------------------------------------
etError SHT3X_GetTempAndHumiPolling(ft* temperature, ft* humidity,
etRepeatability