Files
2024-09-28 14:24:04 +08:00

323 lines
9.5 KiB
C
Raw Permalink Blame History

//==============================================================================
// 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();
}
}