Port of the SHT2x example code from Sensirion

Dependents:   sht21_test ENVLogger

Committer:
ssozonoff
Date:
Sat Apr 23 14:08:11 2011 +0000
Revision:
0:74df6ab91c79
Child:
1:d0f691423bf1
Alpha

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ssozonoff 0:74df6ab91c79 1 //
ssozonoff 0:74df6ab91c79 2 // S E N S I R I O N AG, Laubisruetistr. 50, CH-8712 Staefa, Switzerland
ssozonoff 0:74df6ab91c79 3 //==============================================================================//
ssozonoff 0:74df6ab91c79 4 // Project : SHT2x Sample Code (V1.2)
ssozonoff 0:74df6ab91c79 5 // File : SHT2x.c
ssozonoff 0:74df6ab91c79 6 // Author : MST
ssozonoff 0:74df6ab91c79 7 // Controller: NEC V850/SG3 (uPD70F3740)
ssozonoff 0:74df6ab91c79 8 // Compiler : IAR compiler for V850 (3.50A)
ssozonoff 0:74df6ab91c79 9 // Brief : Sensor layer. Functions for sensor access
ssozonoff 0:74df6ab91c79 10 //==============================================================================//
ssozonoff 0:74df6ab91c79 11 //---------- Includes ----------------------------------------------------------
ssozonoff 0:74df6ab91c79 12 #include "SHT2x.h"
ssozonoff 0:74df6ab91c79 13
ssozonoff 0:74df6ab91c79 14 SHT2x::SHT2x (PinName p_sda, PinName p_scl) : i2c(p_sda, p_scl) {
ssozonoff 0:74df6ab91c79 15 }
ssozonoff 0:74df6ab91c79 16
ssozonoff 0:74df6ab91c79 17 SHT2x::SHT2x (I2C& p_i2c) : i2c(p_i2c) {
ssozonoff 0:74df6ab91c79 18 }
ssozonoff 0:74df6ab91c79 19
ssozonoff 0:74df6ab91c79 20 //==============================================================================//
ssozonoff 0:74df6ab91c79 21 int SHT2x::SHT2x_CheckCrc(int data[], int nbrOfBytes, int checksum)
ssozonoff 0:74df6ab91c79 22 //==============================================================================//
ssozonoff 0:74df6ab91c79 23 {
ssozonoff 0:74df6ab91c79 24 int crc = 0;
ssozonoff 0:74df6ab91c79 25 int byteCtr;
ssozonoff 0:74df6ab91c79 26 //calculates 8-Bit checksum with given polynomial
ssozonoff 0:74df6ab91c79 27 for (byteCtr = 0; byteCtr < nbrOfBytes; ++byteCtr) {
ssozonoff 0:74df6ab91c79 28 crc ^= (data[byteCtr]);
ssozonoff 0:74df6ab91c79 29 for (int bit = 8; bit > 0; --bit) {
ssozonoff 0:74df6ab91c79 30 if (crc & 0x80) crc = (crc << 1) ^ POLYNOMIAL;
ssozonoff 0:74df6ab91c79 31 else crc = (crc << 1);
ssozonoff 0:74df6ab91c79 32 }
ssozonoff 0:74df6ab91c79 33 }
ssozonoff 0:74df6ab91c79 34 if (crc != checksum) return CHECKSUM_ERROR;
ssozonoff 0:74df6ab91c79 35 else return 0;
ssozonoff 0:74df6ab91c79 36 }
ssozonoff 0:74df6ab91c79 37 //===========================================================================//
ssozonoff 0:74df6ab91c79 38 int SHT2x::SHT2x_ReadUserRegister(int *pRegisterValue)
ssozonoff 0:74df6ab91c79 39 //===========================================================================//
ssozonoff 0:74df6ab91c79 40 {
ssozonoff 0:74df6ab91c79 41 int checksum; //variable for checksum byte
ssozonoff 0:74df6ab91c79 42 int error=0; //variable for error code
ssozonoff 0:74df6ab91c79 43
ssozonoff 0:74df6ab91c79 44 i2c.start();
ssozonoff 0:74df6ab91c79 45 i2c.write(I2C_ADR_W);
ssozonoff 0:74df6ab91c79 46 i2c.write(USER_REG_R);
ssozonoff 0:74df6ab91c79 47
ssozonoff 0:74df6ab91c79 48 i2c.start();
ssozonoff 0:74df6ab91c79 49 i2c.write(I2C_ADR_R);
ssozonoff 0:74df6ab91c79 50
ssozonoff 0:74df6ab91c79 51
ssozonoff 0:74df6ab91c79 52 *pRegisterValue = i2c.read(1);
ssozonoff 0:74df6ab91c79 53
ssozonoff 0:74df6ab91c79 54 checksum=i2c.read(0);
ssozonoff 0:74df6ab91c79 55
ssozonoff 0:74df6ab91c79 56 error |= SHT2x_CheckCrc (pRegisterValue,1,checksum);
ssozonoff 0:74df6ab91c79 57
ssozonoff 0:74df6ab91c79 58 i2c.stop();
ssozonoff 0:74df6ab91c79 59 return error;
ssozonoff 0:74df6ab91c79 60 }
ssozonoff 0:74df6ab91c79 61 //===========================================================================//
ssozonoff 0:74df6ab91c79 62 int SHT2x::SHT2x_WriteUserRegister(int *pRegisterValue)
ssozonoff 0:74df6ab91c79 63 //===========================================================================//
ssozonoff 0:74df6ab91c79 64 {
ssozonoff 0:74df6ab91c79 65 int error=0; //variable for error code
ssozonoff 0:74df6ab91c79 66 i2c.start();
ssozonoff 0:74df6ab91c79 67
ssozonoff 0:74df6ab91c79 68 i2c.write(I2C_ADR_W);
ssozonoff 0:74df6ab91c79 69 i2c.write(USER_REG_W);
ssozonoff 0:74df6ab91c79 70 i2c.write(*pRegisterValue);
ssozonoff 0:74df6ab91c79 71 i2c.stop();
ssozonoff 0:74df6ab91c79 72
ssozonoff 0:74df6ab91c79 73 return error;
ssozonoff 0:74df6ab91c79 74 }
ssozonoff 0:74df6ab91c79 75 //===========================================================================//
ssozonoff 0:74df6ab91c79 76 int SHT2x::SHT2x_MeasureHM(etSHT2xMeasureType eSHT2xMeasureType, int *pMeasurand)
ssozonoff 0:74df6ab91c79 77 //===========================================================================//
ssozonoff 0:74df6ab91c79 78 {
ssozonoff 0:74df6ab91c79 79 int checksum; //checksum
ssozonoff 0:74df6ab91c79 80 int data[2]; //data array for checksum verification
ssozonoff 0:74df6ab91c79 81 int error=0; //error variable
ssozonoff 0:74df6ab91c79 82
ssozonoff 0:74df6ab91c79 83 //-- write I2C sensor address and command --
ssozonoff 0:74df6ab91c79 84 i2c.start();
ssozonoff 0:74df6ab91c79 85
ssozonoff 0:74df6ab91c79 86 i2c.write(I2C_ADR_W); // I2C Adr
ssozonoff 0:74df6ab91c79 87 switch (eSHT2xMeasureType) {
ssozonoff 0:74df6ab91c79 88 case HUMIDITY:
ssozonoff 0:74df6ab91c79 89 i2c.write(TRIG_RH_MEASUREMENT_HM);
ssozonoff 0:74df6ab91c79 90 break;
ssozonoff 0:74df6ab91c79 91 case TEMP :
ssozonoff 0:74df6ab91c79 92 i2c.write(TRIG_T_MEASUREMENT_HM);
ssozonoff 0:74df6ab91c79 93 break;
ssozonoff 0:74df6ab91c79 94 default:
ssozonoff 0:74df6ab91c79 95 break;
ssozonoff 0:74df6ab91c79 96 }
ssozonoff 0:74df6ab91c79 97 //-- wait until hold master is released --
ssozonoff 0:74df6ab91c79 98 i2c.start();
ssozonoff 0:74df6ab91c79 99 i2c.write(I2C_ADR_R);
ssozonoff 0:74df6ab91c79 100
ssozonoff 0:74df6ab91c79 101 //SCL=HIGH; // set SCL I/O port as input
ssozonoff 0:74df6ab91c79 102
ssozonoff 0:74df6ab91c79 103 //for (i=0; i<1000; i++) { // wait until master hold is released or
ssozonoff 0:74df6ab91c79 104 // DelayMicroSeconds(1000); // a timeout (~1s) is reached
ssozonoff 0:74df6ab91c79 105 // if (SCL_CONF==1) break;
ssozonoff 0:74df6ab91c79 106 //}
ssozonoff 0:74df6ab91c79 107
ssozonoff 0:74df6ab91c79 108 //-- check for timeout --
ssozonoff 0:74df6ab91c79 109 //if (SCL_CONF==0) error |= TIME_OUT_ERROR;
ssozonoff 0:74df6ab91c79 110 //-- read two data bytes and one checksum byte --
ssozonoff 0:74df6ab91c79 111
ssozonoff 0:74df6ab91c79 112 data[0] = i2c.read(1);
ssozonoff 0:74df6ab91c79 113 data[1] = i2c.read(1);
ssozonoff 0:74df6ab91c79 114
ssozonoff 0:74df6ab91c79 115 *pMeasurand = data[0] << 8;
ssozonoff 0:74df6ab91c79 116 *pMeasurand |= data[1];
ssozonoff 0:74df6ab91c79 117
ssozonoff 0:74df6ab91c79 118 checksum = i2c.read(0);
ssozonoff 0:74df6ab91c79 119 //-- verify checksum --
ssozonoff 0:74df6ab91c79 120 error |= SHT2x_CheckCrc (data, 2, checksum);
ssozonoff 0:74df6ab91c79 121
ssozonoff 0:74df6ab91c79 122 i2c.stop();
ssozonoff 0:74df6ab91c79 123 return error;
ssozonoff 0:74df6ab91c79 124 }
ssozonoff 0:74df6ab91c79 125 //===========================================================================//
ssozonoff 0:74df6ab91c79 126 int SHT2x::SHT2x_MeasurePoll(etSHT2xMeasureType eSHT2xMeasureType, int *pMeasurand)
ssozonoff 0:74df6ab91c79 127 //===========================================================================//
ssozonoff 0:74df6ab91c79 128 {
ssozonoff 0:74df6ab91c79 129 int checksum; //checksum
ssozonoff 0:74df6ab91c79 130 int data[2]; //data array for checksum verification
ssozonoff 0:74df6ab91c79 131 int error = 0; //error variable
ssozonoff 0:74df6ab91c79 132 int i = 0; //counting variableSample Code SHT21
ssozonoff 0:74df6ab91c79 133
ssozonoff 0:74df6ab91c79 134 //-- write I2C sensor address and command --
ssozonoff 0:74df6ab91c79 135 i2c.start();
ssozonoff 0:74df6ab91c79 136
ssozonoff 0:74df6ab91c79 137 i2c.write(I2C_ADR_W);
ssozonoff 0:74df6ab91c79 138 switch (eSHT2xMeasureType) {
ssozonoff 0:74df6ab91c79 139 case HUMIDITY:
ssozonoff 0:74df6ab91c79 140 i2c.write(TRIG_RH_MEASUREMENT_POLL);
ssozonoff 0:74df6ab91c79 141 break;
ssozonoff 0:74df6ab91c79 142 case TEMP:
ssozonoff 0:74df6ab91c79 143 i2c.write(TRIG_T_MEASUREMENT_POLL);
ssozonoff 0:74df6ab91c79 144 break;
ssozonoff 0:74df6ab91c79 145 default:
ssozonoff 0:74df6ab91c79 146 break;
ssozonoff 0:74df6ab91c79 147
ssozonoff 0:74df6ab91c79 148 }
ssozonoff 0:74df6ab91c79 149 //-- poll every 10ms for measurement ready. Timeout after 20 retries (200ms)--
ssozonoff 0:74df6ab91c79 150 do {
ssozonoff 0:74df6ab91c79 151 i2c.start();
ssozonoff 0:74df6ab91c79 152 wait_ms(10);
ssozonoff 0:74df6ab91c79 153 if (i++ >= 20) break;
ssozonoff 0:74df6ab91c79 154 } while (i2c.write(I2C_ADR_R) == 0);
ssozonoff 0:74df6ab91c79 155
ssozonoff 0:74df6ab91c79 156 if (i >= 20) error |= TIME_OUT_ERROR;
ssozonoff 0:74df6ab91c79 157
ssozonoff 0:74df6ab91c79 158 //-- read two data bytes and one checksum byte --
ssozonoff 0:74df6ab91c79 159 data[0] = i2c.read(1);
ssozonoff 0:74df6ab91c79 160 data[1] = i2c.read(1);
ssozonoff 0:74df6ab91c79 161
ssozonoff 0:74df6ab91c79 162 *pMeasurand = data[0] << 8;
ssozonoff 0:74df6ab91c79 163 *pMeasurand |= data[1];
ssozonoff 0:74df6ab91c79 164
ssozonoff 0:74df6ab91c79 165 checksum = i2c.read(0);
ssozonoff 0:74df6ab91c79 166 //-- verify checksum --
ssozonoff 0:74df6ab91c79 167 error |= SHT2x_CheckCrc (data,2,checksum);
ssozonoff 0:74df6ab91c79 168 i2c.stop();
ssozonoff 0:74df6ab91c79 169 return error;
ssozonoff 0:74df6ab91c79 170 }
ssozonoff 0:74df6ab91c79 171 //===========================================================================//
ssozonoff 0:74df6ab91c79 172 int SHT2x::SHT2x_SoftReset()
ssozonoff 0:74df6ab91c79 173 //===========================================================================//
ssozonoff 0:74df6ab91c79 174 {
ssozonoff 0:74df6ab91c79 175 int error=0; //error variable
ssozonoff 0:74df6ab91c79 176 i2c.start();
ssozonoff 0:74df6ab91c79 177 error |= i2c.write(I2C_ADR_W); // I2C Adr
ssozonoff 0:74df6ab91c79 178 error |= i2c.write(SOFT_RESET); // Command
ssozonoff 0:74df6ab91c79 179 i2c.stop();
ssozonoff 0:74df6ab91c79 180 wait_ms(15);
ssozonoff 0:74df6ab91c79 181 return error;
ssozonoff 0:74df6ab91c79 182 }
ssozonoff 0:74df6ab91c79 183 //==============================================================================//
ssozonoff 0:74df6ab91c79 184 float SHT2x::SHT2x_CalcRH(int u16sRH)
ssozonoff 0:74df6ab91c79 185 //==============================================================================//
ssozonoff 0:74df6ab91c79 186 {
ssozonoff 0:74df6ab91c79 187 float humidityRH; // variable for result
ssozonoff 0:74df6ab91c79 188 u16sRH &= ~0x0003; // clear bits [1..0] (status bits)
ssozonoff 0:74df6ab91c79 189 //-- calculate relative humidity [%RH] --
ssozonoff 0:74df6ab91c79 190 humidityRH = -6.0 + 125.0/65536 * (float)u16sRH; // RH= -6 + 125 * SRH/2^16
ssozonoff 0:74df6ab91c79 191 return humidityRH;
ssozonoff 0:74df6ab91c79 192 }
ssozonoff 0:74df6ab91c79 193 //==============================================================================//
ssozonoff 0:74df6ab91c79 194 float SHT2x::SHT2x_CalcTemperatureC(int u16sT)
ssozonoff 0:74df6ab91c79 195 //==============================================================================//
ssozonoff 0:74df6ab91c79 196 {
ssozonoff 0:74df6ab91c79 197 float temperatureC; // variable for result
ssozonoff 0:74df6ab91c79 198 u16sT &= ~0x0003; // clear bits [1..0] (status bits)
ssozonoff 0:74df6ab91c79 199 //-- calculate temperature [°C] --
ssozonoff 0:74df6ab91c79 200 temperatureC= -46.85 + 175.72/65536 *(float)u16sT; //T= -46.85 + 175.72 * ST/2^16
ssozonoff 0:74df6ab91c79 201 return temperatureC;
ssozonoff 0:74df6ab91c79 202 }
ssozonoff 0:74df6ab91c79 203 //==============================================================================//
ssozonoff 0:74df6ab91c79 204 int SHT2x::SHT2x_GetSerialNumber(int u8SerialNumber[])
ssozonoff 0:74df6ab91c79 205 //==============================================================================//
ssozonoff 0:74df6ab91c79 206 {
ssozonoff 0:74df6ab91c79 207 int error=0; //error variable
ssozonoff 0:74df6ab91c79 208 //Read from memory location 1
ssozonoff 0:74df6ab91c79 209 i2c.start();
ssozonoff 0:74df6ab91c79 210 error |= i2c.write(I2C_ADR_W);
ssozonoff 0:74df6ab91c79 211 error |= i2c.write(0xFA); //Command for readout on-chip memory
ssozonoff 0:74df6ab91c79 212 error |= i2c.write(0x0F); //on-chip memory address
ssozonoff 0:74df6ab91c79 213 i2c.start();
ssozonoff 0:74df6ab91c79 214 error |= i2c.write(I2C_ADR_R); //I2C address
ssozonoff 0:74df6ab91c79 215 u8SerialNumber[5] = i2c.read(1); //Read SNB_3
ssozonoff 0:74df6ab91c79 216 i2c.read(1); //Read CRC SNB_3 (CRC is not analyzed)
ssozonoff 0:74df6ab91c79 217 u8SerialNumber[4] = i2c.read(1); //Read SNB_2
ssozonoff 0:74df6ab91c79 218 i2c.read(1); //Read CRC SNB_2 (CRC is not analyzed)
ssozonoff 0:74df6ab91c79 219 u8SerialNumber[3] = i2c.read(1); //Read SNB_1Sample Code SHT21
ssozonoff 0:74df6ab91c79 220 i2c.read(1); //Read CRC SNB_1 (CRC is not analyzed)
ssozonoff 0:74df6ab91c79 221 u8SerialNumber[2] = i2c.read(1); //Read SNB_0
ssozonoff 0:74df6ab91c79 222 i2c.read(0); //Read CRC SNB_0 (CRC is not analyzed)
ssozonoff 0:74df6ab91c79 223 i2c.stop();
ssozonoff 0:74df6ab91c79 224 //Read from memory location 2
ssozonoff 0:74df6ab91c79 225 i2c.start();
ssozonoff 0:74df6ab91c79 226 error |= i2c.write(I2C_ADR_W); //I2C address
ssozonoff 0:74df6ab91c79 227 error |= i2c.write(0xFC); //Command for readout on-chip memory
ssozonoff 0:74df6ab91c79 228 error |= i2c.write(0xC9); //on-chip memory address
ssozonoff 0:74df6ab91c79 229 i2c.start();
ssozonoff 0:74df6ab91c79 230 error |= i2c.write(I2C_ADR_R); //I2C address
ssozonoff 0:74df6ab91c79 231 u8SerialNumber[1] = i2c.read(1); //Read SNC_1
ssozonoff 0:74df6ab91c79 232 u8SerialNumber[0] = i2c.read(1); //Read SNC_0
ssozonoff 0:74df6ab91c79 233 i2c.read(1);
ssozonoff 0:74df6ab91c79 234 u8SerialNumber[7] = i2c.read(1); //Read SNA_1
ssozonoff 0:74df6ab91c79 235 u8SerialNumber[6] = i2c.read(1); //Read SNA_0
ssozonoff 0:74df6ab91c79 236 i2c.read(0); //Read CRC SNA0/1 (CRC is not analyzed)
ssozonoff 0:74df6ab91c79 237 i2c.stop();
ssozonoff 0:74df6ab91c79 238 return error;
ssozonoff 0:74df6ab91c79 239 }