323 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			323 lines
		
	
	
		
			9.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
//==============================================================================
 | 
						||
//    S E N S I R I O N   AG,  Laubisruetistr. 50, CH-8712 Staefa, Switzerland
 | 
						||
//==============================================================================
 | 
						||
// Project   :  SHT2x Sample Code (V1.2)
 | 
						||
// File      :  SHT2x.c
 | 
						||
// Author    :  MST
 | 
						||
// Controller:  NEC V850/SG3 (uPD70F3740)
 | 
						||
// Compiler  :  IAR compiler for V850 (3.50A)
 | 
						||
// Brief     :  Sensor layer. Functions for sensor access
 | 
						||
//==============================================================================
 | 
						||
 | 
						||
//---------- Includes ----------------------------------------------------------
 | 
						||
#include "SHT2x.h"
 | 
						||
 | 
						||
#include "iot_i2c_api.h"
 | 
						||
#include "iot_io_api.h"
 | 
						||
 | 
						||
 | 
						||
extern void delay_sometime(void);
 | 
						||
extern int g_port;
 | 
						||
 | 
						||
//==============================================================================
 | 
						||
u8t SHT2x_CheckCrc(u8t data[], u8t nbrOfBytes, u8t checksum)
 | 
						||
//==============================================================================
 | 
						||
{
 | 
						||
  u8t crc = 0;
 | 
						||
  u8t byteCtr;
 | 
						||
  //calculates 8-Bit checksum with given polynomial
 | 
						||
  for (byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr)
 | 
						||
  { crc ^= (data[byteCtr]);
 | 
						||
    for (u8t bit = 8; bit > 0; --bit)
 | 
						||
    { if (crc & 0x80) crc = (crc << 1) ^ POLYNOMIAL;
 | 
						||
      else crc = (crc << 1);
 | 
						||
    }
 | 
						||
  }
 | 
						||
  if (crc != checksum) return CHECKSUM_ERROR;
 | 
						||
  else return 0;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//===========================================================================
 | 
						||
u8t SHT2x_ReadUserRegister(u8t *pRegisterValue)
 | 
						||
//===========================================================================
 | 
						||
{
 | 
						||
    u8t checksum;   //variable for checksum byte
 | 
						||
    u8t error=0;    //variable for error code
 | 
						||
 | 
						||
    int ret ;
 | 
						||
    char send_buf[6];
 | 
						||
 | 
						||
    send_buf[0] = USER_REG_R;
 | 
						||
 | 
						||
    //Read from memory location 1
 | 
						||
    ret = iot_i2c_write(g_port,SHT2X_ADDR,(char *)send_buf, 1);
 | 
						||
    if ( ret ) {
 | 
						||
        iot_printf("write failed ret = %d.\n", ret);
 | 
						||
    }
 | 
						||
 | 
						||
    if (iot_i2c_read(g_port, SHT2X_ADDR, send_buf, 2)) {
 | 
						||
        iot_printf("read failed.\n");
 | 
						||
    } else {
 | 
						||
        for (int i = 0; i < 4; i++) {
 | 
						||
            iot_printf("read[%d]=%02x\r\n", i, send_buf[i] & 0xff);
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
    *pRegisterValue = send_buf[0];
 | 
						||
    checksum = send_buf[1];
 | 
						||
    error |= SHT2x_CheckCrc (pRegisterValue, 1, checksum);
 | 
						||
    if (error) {
 | 
						||
        iot_printf("read user crc err\r\n");
 | 
						||
    }
 | 
						||
 | 
						||
    return error;
 | 
						||
}
 | 
						||
 | 
						||
//===========================================================================
 | 
						||
u8t SHT2x_WriteUserRegister(u8t *pRegisterValue)
 | 
						||
//===========================================================================
 | 
						||
{
 | 
						||
  u8t error=0;   //variable for error code
 | 
						||
 | 
						||
  int ret ;
 | 
						||
  char send_buf[6];
 | 
						||
 | 
						||
  send_buf[0] = USER_REG_W;
 | 
						||
 | 
						||
  ret = iot_i2c_write(g_port,SHT2X_ADDR,(char *)send_buf, 1);
 | 
						||
  if ( ret ) {
 | 
						||
      iot_printf("write failed ret = %d.\n", ret);
 | 
						||
  }
 | 
						||
  return error;
 | 
						||
}
 | 
						||
#if 0
 | 
						||
 | 
						||
 | 
						||
//===========================================================================
 | 
						||
u8t SHT2x_MeasureHM(etSHT2xMeasureType eSHT2xMeasureType, nt16 *pMeasurand)
 | 
						||
//===========================================================================
 | 
						||
{
 | 
						||
 | 
						||
  u8t  checksum;   //checksum
 | 
						||
  u8t  data[2];    //data array for checksum verification
 | 
						||
  u8t  error=0;    //error variable
 | 
						||
  u16t i;          //counting variable
 | 
						||
 | 
						||
  //-- write I2C sensor address and command --
 | 
						||
  I2c_StartCondition();
 | 
						||
  error |= I2c_WriteByte (I2C_ADR_W); // I2C Adr
 | 
						||
  switch(eSHT2xMeasureType)
 | 
						||
  { case HUMIDITY: error |= I2c_WriteByte (TRIG_RH_MEASUREMENT_HM); break;
 | 
						||
    case TEMP    : error |= I2c_WriteByte (TRIG_T_MEASUREMENT_HM);  break;
 | 
						||
    default: break;
 | 
						||
  }
 | 
						||
  //-- wait until hold master is released --
 | 
						||
  I2c_StartCondition();
 | 
						||
  error |= I2c_WriteByte (I2C_ADR_R);
 | 
						||
  SCL=HIGH;                     // set SCL I/O port as input
 | 
						||
  for(i=0; i<1000; i++)         // wait until master hold is released or
 | 
						||
  { DelayMicroSeconds(1000);    // a timeout (~1s) is reached
 | 
						||
    if (SCL_CONF==1) break;
 | 
						||
  }
 | 
						||
  //-- check for timeout --
 | 
						||
  if(SCL_CONF==0) error |= TIME_OUT_ERROR;
 | 
						||
 | 
						||
  //-- read two data bytes and one checksum byte --
 | 
						||
  pMeasurand->s16.u8H = data[0] = I2c_ReadByte(ACK);
 | 
						||
  pMeasurand->s16.u8L = data[1] = I2c_ReadByte(ACK);
 | 
						||
  checksum=I2c_ReadByte(NO_ACK);
 | 
						||
 | 
						||
  //-- verify checksum --
 | 
						||
  error |= SHT2x_CheckCrc (data,2,checksum);
 | 
						||
  I2c_StopCondition();
 | 
						||
  return error;
 | 
						||
 | 
						||
}
 | 
						||
#endif
 | 
						||
 | 
						||
//===========================================================================
 | 
						||
u8t SHT2x_MeasurePoll(etSHT2xMeasureType eSHT2xMeasureType, nt16 *pMeasurand)
 | 
						||
//===========================================================================
 | 
						||
{
 | 
						||
  u8t  checksum;   //checksum
 | 
						||
  u8t  error=0;    //error variable
 | 
						||
 | 
						||
  //-- write I2C sensor address and command --
 | 
						||
 | 
						||
    int ret ;
 | 
						||
    char send_buf[6];
 | 
						||
 | 
						||
    switch(eSHT2xMeasureType)
 | 
						||
    { case HUMIDITY: send_buf[0] = TRIG_RH_MEASUREMENT_POLL; break;
 | 
						||
    case TEMP    : send_buf[0] = TRIG_T_MEASUREMENT_POLL; break;
 | 
						||
    default: break;
 | 
						||
    }
 | 
						||
 | 
						||
    ret = iot_i2c_write(g_port,SHT2X_ADDR,(char *)send_buf, 1);
 | 
						||
    if ( ret ) {
 | 
						||
      iot_printf("write failed ret = %d.\n", ret);
 | 
						||
    }
 | 
						||
 | 
						||
    delay_sometime();
 | 
						||
    delay_sometime();
 | 
						||
    delay_sometime();
 | 
						||
 | 
						||
    //-- read two data bytes and one checksum byte --
 | 
						||
    if (iot_i2c_read(g_port, SHT2X_ADDR, send_buf, 3)) {
 | 
						||
        iot_printf("read failed.\n");
 | 
						||
    } else {
 | 
						||
        //for (int i = 0; i < 3; i++) {
 | 
						||
            //iot_printf("read[%d]=%02x\r\n", i, send_buf[i] & 0xff);
 | 
						||
        //}
 | 
						||
    }
 | 
						||
 | 
						||
 | 
						||
    pMeasurand->s16.u8H = send_buf[0];
 | 
						||
    pMeasurand->s16.u8L = send_buf[1];
 | 
						||
    checksum = (u8t)send_buf[2];
 | 
						||
 | 
						||
    //-- verify checksum --
 | 
						||
    error |= SHT2x_CheckCrc ((u8t *)send_buf, 2, checksum);
 | 
						||
 | 
						||
    if (error) {
 | 
						||
        iot_printf("MeasurePoll crc err\r\n");
 | 
						||
    }
 | 
						||
 | 
						||
    return error;
 | 
						||
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//===========================================================================
 | 
						||
u8t SHT2x_SoftReset()
 | 
						||
//===========================================================================
 | 
						||
{
 | 
						||
    u8t  error=0;           //error variable
 | 
						||
    int ret;
 | 
						||
 | 
						||
    char send_buf[1];
 | 
						||
    send_buf[0] = SOFT_RESET;
 | 
						||
    ret = iot_i2c_write(g_port,SHT2X_ADDR,(char *)send_buf, sizeof(send_buf));
 | 
						||
    if ( ret ) {
 | 
						||
        iot_printf("write failed ret = %d.\n", ret);
 | 
						||
    }
 | 
						||
 | 
						||
    delay_sometime();
 | 
						||
  return error;
 | 
						||
}
 | 
						||
 | 
						||
//==============================================================================
 | 
						||
float SHT2x_CalcRH(u16t u16sRH)
 | 
						||
//==============================================================================
 | 
						||
{
 | 
						||
  ft humidityRH;              // variable for result
 | 
						||
 | 
						||
  u16sRH &= ~0x0003;          // clear bits [1..0] (status bits)
 | 
						||
  //-- calculate relative humidity [%RH] --
 | 
						||
 | 
						||
  humidityRH = -6.0 + 125.0/65536 * (ft)u16sRH; // RH= -6 + 125 * SRH/2^16
 | 
						||
  return humidityRH;
 | 
						||
}
 | 
						||
 | 
						||
//==============================================================================
 | 
						||
float SHT2x_CalcTemperatureC(u16t u16sT)
 | 
						||
//==============================================================================
 | 
						||
{
 | 
						||
  ft temperatureC;            // variable for result
 | 
						||
 | 
						||
  u16sT &= ~0x0003;           // clear bits [1..0] (status bits)
 | 
						||
 | 
						||
  //-- calculate temperature [<5B>C] --
 | 
						||
  temperatureC= -46.85 + 175.72/65536 *(ft)u16sT; //T= -46.85 + 175.72 * ST/2^16
 | 
						||
  return temperatureC;
 | 
						||
}
 | 
						||
 | 
						||
//==============================================================================
 | 
						||
u8t SHT2x_GetSerialNumber(u8t u8SerialNumber[])
 | 
						||
//==============================================================================
 | 
						||
{
 | 
						||
    u8t  error=0;                          //error variable
 | 
						||
 | 
						||
    int ret ;
 | 
						||
    char send_buf[6];
 | 
						||
 | 
						||
    send_buf[0] = 0xFA;
 | 
						||
    send_buf[1] = 0x0F;
 | 
						||
 | 
						||
    //Read from memory location 1
 | 
						||
    ret = iot_i2c_write(g_port,SHT2X_ADDR,(char *)send_buf, 2);
 | 
						||
    if ( ret ) {
 | 
						||
        iot_printf("write failed ret = %d.\n", ret);
 | 
						||
    }
 | 
						||
 | 
						||
 | 
						||
    if (iot_i2c_read(g_port, SHT2X_ADDR, send_buf, 4)) {
 | 
						||
        iot_printf("read failed.\n");
 | 
						||
    } else {
 | 
						||
        for (int i = 0; i < 4; i++) {
 | 
						||
            iot_printf("read[%d]=%02x\r\n", i, send_buf[i] & 0xff);
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
    //Read from memory location 2
 | 
						||
 | 
						||
    send_buf[0] = 0xFC;
 | 
						||
    send_buf[1] = 0xC9;
 | 
						||
 | 
						||
    //Read from memory location 1
 | 
						||
    ret = iot_i2c_write(g_port,SHT2X_ADDR,(char *)send_buf, 2);
 | 
						||
    if ( ret ) {
 | 
						||
        iot_printf("write failed ret = %d.\n", ret);
 | 
						||
    }
 | 
						||
 | 
						||
 | 
						||
    if (iot_i2c_read(g_port, SHT2X_ADDR, send_buf, 6)) {
 | 
						||
        iot_printf("read failed.\n");
 | 
						||
    } else {
 | 
						||
        for (int i = 0; i < 6; i++) {
 | 
						||
            iot_printf("read[%d]=%02x\r\n", i, send_buf[i] & 0xff);
 | 
						||
        }
 | 
						||
    }
 | 
						||
 | 
						||
  return error;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
void SHT2x_test_loop(void)
 | 
						||
{
 | 
						||
    u8t  error = 0;              //variable for error code. For codes see system.h
 | 
						||
    u8t  userRegister;           //variable for user register
 | 
						||
    u8t serial_num[6] ;
 | 
						||
    nt16 sT;
 | 
						||
    nt16 sRH;
 | 
						||
    ft   temperatureC;
 | 
						||
    ft   humidityRH;
 | 
						||
 | 
						||
    SHT2x_SoftReset();
 | 
						||
    SHT2x_GetSerialNumber(serial_num);
 | 
						||
 | 
						||
 | 
						||
    // --- Set Resolution e.g. RH 10bit, Temp 13bit ---
 | 
						||
    error |= SHT2x_ReadUserRegister(&userRegister);  //get actual user reg
 | 
						||
    userRegister = (userRegister & ~SHT2x_RES_MASK) | SHT2x_RES_10_13BIT;
 | 
						||
    error |= SHT2x_WriteUserRegister(&userRegister); //write changed user reg
 | 
						||
 | 
						||
    while(1)
 | 
						||
    {
 | 
						||
        SHT2x_MeasurePoll(TEMP, &sT);
 | 
						||
        //-- calculate humidity and temperature --
 | 
						||
        temperatureC = SHT2x_CalcTemperatureC(sT.u16);
 | 
						||
        delay_sometime();
 | 
						||
        SHT2x_MeasurePoll(HUMIDITY, &sRH);
 | 
						||
        humidityRH   = SHT2x_CalcRH(sRH.u16);
 | 
						||
 | 
						||
        iot_printf("temp=%f, humidityRH=%f\r\n", temperatureC, humidityRH);
 | 
						||
 | 
						||
        delay_sometime();
 | 
						||
        delay_sometime();
 | 
						||
        delay_sometime();
 | 
						||
    }
 | 
						||
}
 | 
						||
 |