htu21d_for_weather_shield
Dependents: SPARKFUN_WEATHER_SHIELD
Fork of htu21d by
htu21d.cpp@2:8fbe84ed61e6, 2014-05-22 (annotated)
- Committer:
- loopsva
- Date:
- Thu May 22 18:48:46 2014 +0000
- Revision:
- 2:8fbe84ed61e6
- Parent:
- 1:d3ed713f8354
- Child:
- 3:5c0f8e91d319
Updated Temperature and Humidity i2c read functions to free up the RTOS and i2c bus while waiting for the Hum / Temp command in the HTU21D to complete.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
loopsva | 0:2dab43acb3a4 | 1 | /** |
loopsva | 1:d3ed713f8354 | 2 | HTU21D / HPP828E031 driver for mbed. |
loopsva | 1:d3ed713f8354 | 3 | - Includes RTOS hooks if RTOS is detected during compile. |
loopsva | 0:2dab43acb3a4 | 4 | Author: Kevin Braun |
loopsva | 0:2dab43acb3a4 | 5 | **/ |
loopsva | 1:d3ed713f8354 | 6 | |
loopsva | 0:2dab43acb3a4 | 7 | #include "htu21d.h" |
loopsva | 0:2dab43acb3a4 | 8 | |
loopsva | 0:2dab43acb3a4 | 9 | #ifdef RTOS_H |
loopsva | 0:2dab43acb3a4 | 10 | extern Mutex MutexI2cWait; |
loopsva | 0:2dab43acb3a4 | 11 | #endif |
loopsva | 0:2dab43acb3a4 | 12 | |
loopsva | 2:8fbe84ed61e6 | 13 | double theTempIs = 0.0; |
loopsva | 2:8fbe84ed61e6 | 14 | double theHumIs = 0.0; |
loopsva | 2:8fbe84ed61e6 | 15 | |
loopsva | 0:2dab43acb3a4 | 16 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 0:2dab43acb3a4 | 17 | //Contstructor |
loopsva | 0:2dab43acb3a4 | 18 | |
loopsva | 0:2dab43acb3a4 | 19 | htu21d::htu21d(PinName sda, PinName scl) : _i2c(sda, scl) { |
loopsva | 1:d3ed713f8354 | 20 | _i2c.frequency(400000); |
loopsva | 1:d3ed713f8354 | 21 | } |
loopsva | 1:d3ed713f8354 | 22 | |
loopsva | 1:d3ed713f8354 | 23 | htu21d::htu21d(PinName sda, PinName scl, int i2cFrequency) : _i2c(sda, scl) { |
loopsva | 1:d3ed713f8354 | 24 | _i2c.frequency(i2cFrequency); |
loopsva | 0:2dab43acb3a4 | 25 | } |
loopsva | 0:2dab43acb3a4 | 26 | |
loopsva | 0:2dab43acb3a4 | 27 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 1:d3ed713f8354 | 28 | //Destructor |
loopsva | 0:2dab43acb3a4 | 29 | |
loopsva | 0:2dab43acb3a4 | 30 | htu21d::~htu21d() { |
loopsva | 0:2dab43acb3a4 | 31 | } |
loopsva | 0:2dab43acb3a4 | 32 | |
loopsva | 0:2dab43acb3a4 | 33 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 0:2dab43acb3a4 | 34 | //Perform a soft reset on the HTU21D. REturn of 1 = ok, 0 = timeout. |
loopsva | 0:2dab43acb3a4 | 35 | |
loopsva | 0:2dab43acb3a4 | 36 | int htu21d::softReset() { |
loopsva | 0:2dab43acb3a4 | 37 | |
loopsva | 0:2dab43acb3a4 | 38 | #ifdef RTOS_H |
loopsva | 0:2dab43acb3a4 | 39 | MutexI2cWait.lock(); |
loopsva | 0:2dab43acb3a4 | 40 | #endif |
loopsva | 0:2dab43acb3a4 | 41 | |
loopsva | 0:2dab43acb3a4 | 42 | int htu21 = 0; |
loopsva | 0:2dab43acb3a4 | 43 | _i2c.start(); |
loopsva | 0:2dab43acb3a4 | 44 | htu21 = _i2c.write(HTU21Di2cWRITE); //i2c, 1 = ack |
loopsva | 0:2dab43acb3a4 | 45 | if(htu21 == 1) { |
loopsva | 0:2dab43acb3a4 | 46 | _i2c.write(HTU21DRESET); //soft reset, must wait 15mS |
loopsva | 0:2dab43acb3a4 | 47 | _i2c.stop(); |
loopsva | 1:d3ed713f8354 | 48 | wait_ms(16); //must wait a least 15mS for reset to finish |
loopsva | 1:d3ed713f8354 | 49 | htu21d::getSNReg(); //go load up the s/n registers |
loopsva | 0:2dab43acb3a4 | 50 | } |
loopsva | 1:d3ed713f8354 | 51 | |
loopsva | 0:2dab43acb3a4 | 52 | #ifdef RTOS_H |
loopsva | 0:2dab43acb3a4 | 53 | MutexI2cWait.unlock(); |
loopsva | 0:2dab43acb3a4 | 54 | #endif |
loopsva | 0:2dab43acb3a4 | 55 | |
loopsva | 0:2dab43acb3a4 | 56 | return(htu21); |
loopsva | 0:2dab43acb3a4 | 57 | } |
loopsva | 0:2dab43acb3a4 | 58 | |
loopsva | 0:2dab43acb3a4 | 59 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 0:2dab43acb3a4 | 60 | //Get the HTU21D user register. Returns 8 bit register. |
loopsva | 0:2dab43acb3a4 | 61 | |
loopsva | 0:2dab43acb3a4 | 62 | uint8_t htu21d::getUserReg() { |
loopsva | 0:2dab43acb3a4 | 63 | |
loopsva | 0:2dab43acb3a4 | 64 | #ifdef RTOS_H |
loopsva | 0:2dab43acb3a4 | 65 | MutexI2cWait.lock(); |
loopsva | 0:2dab43acb3a4 | 66 | #endif |
loopsva | 0:2dab43acb3a4 | 67 | |
loopsva | 0:2dab43acb3a4 | 68 | int htu21 = 0; |
loopsva | 0:2dab43acb3a4 | 69 | uint8_t htu21data = 0; |
loopsva | 0:2dab43acb3a4 | 70 | _i2c.start(); |
loopsva | 0:2dab43acb3a4 | 71 | htu21 = _i2c.write(HTU21Di2cWRITE); //i2c, 1 = ack |
loopsva | 0:2dab43acb3a4 | 72 | if(htu21 == 1) { |
loopsva | 0:2dab43acb3a4 | 73 | _i2c.write(HTU21DREADUSER); |
loopsva | 0:2dab43acb3a4 | 74 | _i2c.start(); |
loopsva | 0:2dab43acb3a4 | 75 | htu21 = _i2c.write(HTU21Di2cREAD); |
loopsva | 0:2dab43acb3a4 | 76 | htu21data = _i2c.read(0); |
loopsva | 0:2dab43acb3a4 | 77 | _i2c.stop(); |
loopsva | 0:2dab43acb3a4 | 78 | } |
loopsva | 0:2dab43acb3a4 | 79 | |
loopsva | 0:2dab43acb3a4 | 80 | #ifdef RTOS_H |
loopsva | 0:2dab43acb3a4 | 81 | MutexI2cWait.unlock(); |
loopsva | 0:2dab43acb3a4 | 82 | #endif |
loopsva | 0:2dab43acb3a4 | 83 | |
loopsva | 0:2dab43acb3a4 | 84 | return(htu21data); |
loopsva | 0:2dab43acb3a4 | 85 | } |
loopsva | 0:2dab43acb3a4 | 86 | |
loopsva | 0:2dab43acb3a4 | 87 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 0:2dab43acb3a4 | 88 | //Turn ON the heater the HTU21D user register. |
loopsva | 0:2dab43acb3a4 | 89 | |
loopsva | 0:2dab43acb3a4 | 90 | int htu21d::heaterOn() { |
loopsva | 0:2dab43acb3a4 | 91 | uint8_t htu21data = htu21d::getUserReg(); |
loopsva | 0:2dab43acb3a4 | 92 | htu21data |= HTU21DHEATER; |
loopsva | 0:2dab43acb3a4 | 93 | |
loopsva | 0:2dab43acb3a4 | 94 | #ifdef RTOS_H |
loopsva | 0:2dab43acb3a4 | 95 | MutexI2cWait.lock(); |
loopsva | 0:2dab43acb3a4 | 96 | #endif |
loopsva | 0:2dab43acb3a4 | 97 | |
loopsva | 0:2dab43acb3a4 | 98 | int htu21 = 0; |
loopsva | 0:2dab43acb3a4 | 99 | _i2c.start(); |
loopsva | 0:2dab43acb3a4 | 100 | htu21 = _i2c.write(HTU21Di2cWRITE); //i2c, 1 = ack |
loopsva | 0:2dab43acb3a4 | 101 | if(htu21 == 1) { |
loopsva | 0:2dab43acb3a4 | 102 | _i2c.write(HTU21DWRITEUSER); |
loopsva | 0:2dab43acb3a4 | 103 | htu21 = _i2c.write(htu21data); |
loopsva | 0:2dab43acb3a4 | 104 | _i2c.stop(); |
loopsva | 0:2dab43acb3a4 | 105 | } |
loopsva | 0:2dab43acb3a4 | 106 | |
loopsva | 0:2dab43acb3a4 | 107 | #ifdef RTOS_H |
loopsva | 0:2dab43acb3a4 | 108 | MutexI2cWait.unlock(); |
loopsva | 0:2dab43acb3a4 | 109 | #endif |
loopsva | 0:2dab43acb3a4 | 110 | |
loopsva | 0:2dab43acb3a4 | 111 | return(htu21); |
loopsva | 0:2dab43acb3a4 | 112 | } |
loopsva | 0:2dab43acb3a4 | 113 | |
loopsva | 0:2dab43acb3a4 | 114 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 0:2dab43acb3a4 | 115 | //Turn OFF the heater the HTU21D user register. |
loopsva | 0:2dab43acb3a4 | 116 | |
loopsva | 0:2dab43acb3a4 | 117 | int htu21d::heaterOff() { |
loopsva | 0:2dab43acb3a4 | 118 | uint8_t htu21data = htu21d::getUserReg(); |
loopsva | 0:2dab43acb3a4 | 119 | htu21data &= ~HTU21DHEATER; |
loopsva | 0:2dab43acb3a4 | 120 | |
loopsva | 0:2dab43acb3a4 | 121 | #ifdef RTOS_H |
loopsva | 0:2dab43acb3a4 | 122 | MutexI2cWait.lock(); |
loopsva | 0:2dab43acb3a4 | 123 | #endif |
loopsva | 0:2dab43acb3a4 | 124 | |
loopsva | 0:2dab43acb3a4 | 125 | int htu21 = 0; |
loopsva | 0:2dab43acb3a4 | 126 | _i2c.start(); |
loopsva | 0:2dab43acb3a4 | 127 | htu21 = _i2c.write(HTU21Di2cWRITE); //i2c, 1 = ack |
loopsva | 0:2dab43acb3a4 | 128 | if(htu21 == 1) { |
loopsva | 0:2dab43acb3a4 | 129 | _i2c.write(HTU21DWRITEUSER); |
loopsva | 0:2dab43acb3a4 | 130 | htu21 = _i2c.write(htu21data); |
loopsva | 0:2dab43acb3a4 | 131 | _i2c.stop(); |
loopsva | 0:2dab43acb3a4 | 132 | } |
loopsva | 0:2dab43acb3a4 | 133 | |
loopsva | 0:2dab43acb3a4 | 134 | #ifdef RTOS_H |
loopsva | 0:2dab43acb3a4 | 135 | MutexI2cWait.unlock(); |
loopsva | 0:2dab43acb3a4 | 136 | #endif |
loopsva | 0:2dab43acb3a4 | 137 | |
loopsva | 0:2dab43acb3a4 | 138 | return(htu21); |
loopsva | 0:2dab43acb3a4 | 139 | } |
loopsva | 0:2dab43acb3a4 | 140 | |
loopsva | 0:2dab43acb3a4 | 141 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 0:2dab43acb3a4 | 142 | //Get the status of the heater the HTU21D user register. 0 = off, 4 = on. |
loopsva | 0:2dab43acb3a4 | 143 | |
loopsva | 0:2dab43acb3a4 | 144 | uint8_t htu21d::getHeater() { |
loopsva | 0:2dab43acb3a4 | 145 | uint8_t htu21data = htu21d::getUserReg(); |
loopsva | 0:2dab43acb3a4 | 146 | htu21data &= HTU21DHEATER; |
loopsva | 0:2dab43acb3a4 | 147 | return(htu21data); |
loopsva | 0:2dab43acb3a4 | 148 | } |
loopsva | 0:2dab43acb3a4 | 149 | |
loopsva | 0:2dab43acb3a4 | 150 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 0:2dab43acb3a4 | 151 | //generic routine to get temp or humidity from HTU21D. |
loopsva | 0:2dab43acb3a4 | 152 | //Returns 14 bits of data (anded 0xFFFC) or 0000 if i2c timeout occurs. |
loopsva | 0:2dab43acb3a4 | 153 | //After a read temp or humidity command, HTU21D responds with NACKs until data is ready. |
loopsva | 0:2dab43acb3a4 | 154 | //NOTE: Use non-hold commands |
loopsva | 0:2dab43acb3a4 | 155 | |
loopsva | 0:2dab43acb3a4 | 156 | uint16_t htu21d::getData(uint8_t reg) { |
loopsva | 0:2dab43acb3a4 | 157 | int htu21 = 0; //ACK flag |
loopsva | 0:2dab43acb3a4 | 158 | int htu21cnt = 0; //number of NACKs before ACK or timeout |
loopsva | 0:2dab43acb3a4 | 159 | uint16_t htu21data = 0; //returned data |
loopsva | 0:2dab43acb3a4 | 160 | |
loopsva | 0:2dab43acb3a4 | 161 | #ifdef RTOS_H |
loopsva | 0:2dab43acb3a4 | 162 | MutexI2cWait.lock(); |
loopsva | 0:2dab43acb3a4 | 163 | #endif |
loopsva | 0:2dab43acb3a4 | 164 | _i2c.start(); |
loopsva | 0:2dab43acb3a4 | 165 | htu21 = _i2c.write(HTU21Di2cWRITE); |
loopsva | 0:2dab43acb3a4 | 166 | _i2c.write(reg); //read temp, no hold |
loopsva | 2:8fbe84ed61e6 | 167 | _i2c.stop(); |
loopsva | 2:8fbe84ed61e6 | 168 | #ifdef RTOS_H |
loopsva | 2:8fbe84ed61e6 | 169 | MutexI2cWait.unlock(); |
loopsva | 2:8fbe84ed61e6 | 170 | #endif |
loopsva | 2:8fbe84ed61e6 | 171 | |
loopsva | 0:2dab43acb3a4 | 172 | if(htu21 == 0) return 0; //HTU21T not responding |
loopsva | 0:2dab43acb3a4 | 173 | do { |
loopsva | 0:2dab43acb3a4 | 174 | htu21cnt++; |
loopsva | 2:8fbe84ed61e6 | 175 | #ifdef RTOS_H |
loopsva | 2:8fbe84ed61e6 | 176 | MutexI2cWait.lock(); |
loopsva | 2:8fbe84ed61e6 | 177 | #endif |
loopsva | 0:2dab43acb3a4 | 178 | _i2c.start(); |
loopsva | 0:2dab43acb3a4 | 179 | htu21 = _i2c.write(HTU21Di2cREAD); |
loopsva | 0:2dab43acb3a4 | 180 | if(htu21 == 1) { |
loopsva | 0:2dab43acb3a4 | 181 | htu21data = _i2c.read(1) << 8; |
loopsva | 0:2dab43acb3a4 | 182 | htu21data |= _i2c.read(0) & 0xFC; |
loopsva | 0:2dab43acb3a4 | 183 | _i2c.stop(); |
loopsva | 0:2dab43acb3a4 | 184 | } |
loopsva | 0:2dab43acb3a4 | 185 | #ifdef RTOS_H |
loopsva | 2:8fbe84ed61e6 | 186 | MutexI2cWait.unlock(); //free up the I2C bus |
loopsva | 2:8fbe84ed61e6 | 187 | Thread::wait(1); //allow other RTOS functions to sneak in |
loopsva | 2:8fbe84ed61e6 | 188 | #else |
loopsva | 2:8fbe84ed61e6 | 189 | wait_us(1000); |
loopsva | 0:2dab43acb3a4 | 190 | #endif |
loopsva | 2:8fbe84ed61e6 | 191 | } while((htu21cnt < 100) && (htu21 == 0)); //htu21cnt takes 55 to get temp, 16 for humidity (at 1mS loops) |
loopsva | 2:8fbe84ed61e6 | 192 | |
loopsva | 0:2dab43acb3a4 | 193 | if(htu21 == 0) return 0; //HTU21D ACK response timed out |
loopsva | 0:2dab43acb3a4 | 194 | return(htu21data); //return 14 bit value |
loopsva | 0:2dab43acb3a4 | 195 | } |
loopsva | 0:2dab43acb3a4 | 196 | |
loopsva | 0:2dab43acb3a4 | 197 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 0:2dab43acb3a4 | 198 | //get temperature from HTU21D in degrees C. Returns with 255.0 if HTU21D had timed out. |
loopsva | 0:2dab43acb3a4 | 199 | |
loopsva | 0:2dab43acb3a4 | 200 | float htu21d::getTemp() { |
loopsva | 0:2dab43acb3a4 | 201 | uint16_t getData = htu21d::getData(HTU21DtempNOHOLD); |
loopsva | 0:2dab43acb3a4 | 202 | if (getData == 0) return(255.0); //return with error |
loopsva | 0:2dab43acb3a4 | 203 | double tempData = (double)getData / 65536.0; |
loopsva | 0:2dab43acb3a4 | 204 | theTempIs = -46.85 + (175.72 * tempData); |
loopsva | 0:2dab43acb3a4 | 205 | return(theTempIs); |
loopsva | 0:2dab43acb3a4 | 206 | } |
loopsva | 0:2dab43acb3a4 | 207 | |
loopsva | 0:2dab43acb3a4 | 208 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 0:2dab43acb3a4 | 209 | //get humidity from HTU21D in percentage. Returns with 255.0 if HTU21D had timed out. |
loopsva | 0:2dab43acb3a4 | 210 | |
loopsva | 0:2dab43acb3a4 | 211 | float htu21d::getHum() { |
loopsva | 0:2dab43acb3a4 | 212 | uint16_t getData = htu21d::getData(HTU21DhumNOHOLD); |
loopsva | 0:2dab43acb3a4 | 213 | if (getData == 0) return(255.0); //return with error |
loopsva | 0:2dab43acb3a4 | 214 | double tempData = (double)getData / 65536.0; |
loopsva | 0:2dab43acb3a4 | 215 | theHumIs = -6.0 + (125.0 * tempData); |
loopsva | 0:2dab43acb3a4 | 216 | return(theHumIs); |
loopsva | 0:2dab43acb3a4 | 217 | } |
loopsva | 0:2dab43acb3a4 | 218 | |
loopsva | 0:2dab43acb3a4 | 219 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 0:2dab43acb3a4 | 220 | //Calculate the Dew Point from getTemp and getHum. User must first execute both getTemp and getHum for an accurate result. |
loopsva | 0:2dab43acb3a4 | 221 | //Calculations come from DHT library |
loopsva | 0:2dab43acb3a4 | 222 | /* Copyright (C) Wim De Roeve |
loopsva | 0:2dab43acb3a4 | 223 | * based on DHT22 sensor library by HO WING KIT |
loopsva | 0:2dab43acb3a4 | 224 | * Arduino DHT11 library |
loopsva | 0:2dab43acb3a4 | 225 | */ |
loopsva | 0:2dab43acb3a4 | 226 | |
loopsva | 0:2dab43acb3a4 | 227 | float htu21d::getDewPt() { |
loopsva | 0:2dab43acb3a4 | 228 | // dewPoint function NOAA |
loopsva | 0:2dab43acb3a4 | 229 | // reference: http://wahiduddin.net/calc/density_algorithms.htm |
loopsva | 0:2dab43acb3a4 | 230 | double A0= 373.15/(273.15 + (double)theTempIs); |
loopsva | 0:2dab43acb3a4 | 231 | double SUM = -7.90298 * (A0-1); |
loopsva | 0:2dab43acb3a4 | 232 | SUM += 5.02808 * log10(A0); |
loopsva | 0:2dab43acb3a4 | 233 | SUM += -1.3816e-7 * (pow(10, (11.344*(1-1/A0)))-1) ; |
loopsva | 0:2dab43acb3a4 | 234 | SUM += 8.1328e-3 * (pow(10,(-3.49149*(A0-1)))-1) ; |
loopsva | 0:2dab43acb3a4 | 235 | SUM += log10(1013.246); |
loopsva | 0:2dab43acb3a4 | 236 | double VP = pow(10, SUM-3) * theHumIs; |
loopsva | 0:2dab43acb3a4 | 237 | double T = log(VP/0.61078); // temp var |
loopsva | 0:2dab43acb3a4 | 238 | return (241.88 * T) / (17.558-T); |
loopsva | 0:2dab43acb3a4 | 239 | } |
loopsva | 0:2dab43acb3a4 | 240 | |
loopsva | 0:2dab43acb3a4 | 241 | float htu21d::getDewPtFast() { |
loopsva | 0:2dab43acb3a4 | 242 | // delta max = 0.6544 wrt dewPoint() |
loopsva | 0:2dab43acb3a4 | 243 | // 5x faster than dewPoint() |
loopsva | 0:2dab43acb3a4 | 244 | // reference: http://en.wikipedia.org/wiki/Dew_point |
loopsva | 0:2dab43acb3a4 | 245 | double h21DtzA = 17.271; |
loopsva | 0:2dab43acb3a4 | 246 | double h21DtzB = 237.7; |
loopsva | 0:2dab43acb3a4 | 247 | double h21DtzC = (h21DtzA * theTempIs) / (h21DtzB + theTempIs) + log(theHumIs/100); |
loopsva | 0:2dab43acb3a4 | 248 | double h21DtzD = (h21DtzB * h21DtzC) / (h21DtzA - h21DtzC); |
loopsva | 0:2dab43acb3a4 | 249 | return (h21DtzD); |
loopsva | 0:2dab43acb3a4 | 250 | } |
loopsva | 1:d3ed713f8354 | 251 | |
loopsva | 1:d3ed713f8354 | 252 | //--------------------------------------------------------------------------------------------------------------------------------------// |
loopsva | 1:d3ed713f8354 | 253 | //Get the HTU21D serial number registers. Returns 64 bit register. |
loopsva | 1:d3ed713f8354 | 254 | //should return 0x4854 00xx xxxx 32xx |
loopsva | 1:d3ed713f8354 | 255 | |
loopsva | 1:d3ed713f8354 | 256 | void htu21d::getSNReg() { |
loopsva | 1:d3ed713f8354 | 257 | |
loopsva | 1:d3ed713f8354 | 258 | #ifdef RTOS_H |
loopsva | 1:d3ed713f8354 | 259 | MutexI2cWait.lock(); |
loopsva | 1:d3ed713f8354 | 260 | #endif |
loopsva | 1:d3ed713f8354 | 261 | |
loopsva | 1:d3ed713f8354 | 262 | //get 16 bit SNC register, 8 bit SNC-CRC, 16 bit SNA register, 8 bit SNA-CRC |
loopsva | 1:d3ed713f8354 | 263 | int htu21 = 0; |
loopsva | 1:d3ed713f8354 | 264 | _i2c.start(); |
loopsva | 1:d3ed713f8354 | 265 | htu21 = _i2c.write(HTU21Di2cWRITE); //i2c, 1 = ack |
loopsva | 1:d3ed713f8354 | 266 | if(htu21 == 1) { |
loopsva | 1:d3ed713f8354 | 267 | _i2c.write(HTU21SNAC1); |
loopsva | 1:d3ed713f8354 | 268 | _i2c.write(HTU21SNAC2); |
loopsva | 1:d3ed713f8354 | 269 | _i2c.start(); |
loopsva | 1:d3ed713f8354 | 270 | htu21 = _i2c.write(HTU21Di2cREAD); |
loopsva | 1:d3ed713f8354 | 271 | HTU21sn.HTU21D_snc = _i2c.read(1) << 8; |
loopsva | 1:d3ed713f8354 | 272 | HTU21sn.HTU21D_snc |= _i2c.read(1); |
loopsva | 1:d3ed713f8354 | 273 | HTU21sn.HTU21D_crcc = _i2c.read(1); |
loopsva | 1:d3ed713f8354 | 274 | HTU21sn.HTU21D_sna = _i2c.read(1) << 8; |
loopsva | 1:d3ed713f8354 | 275 | HTU21sn.HTU21D_sna |= _i2c.read(1); |
loopsva | 1:d3ed713f8354 | 276 | HTU21sn.HTU21D_crca = _i2c.read(0); |
loopsva | 1:d3ed713f8354 | 277 | _i2c.stop(); |
loopsva | 1:d3ed713f8354 | 278 | } |
loopsva | 1:d3ed713f8354 | 279 | |
loopsva | 1:d3ed713f8354 | 280 | //get 32 bit SNB register, 32 bit SNB-CRC - regs are intermixed |
loopsva | 1:d3ed713f8354 | 281 | htu21 = 0; |
loopsva | 1:d3ed713f8354 | 282 | _i2c.start(); |
loopsva | 1:d3ed713f8354 | 283 | htu21 = _i2c.write(HTU21Di2cWRITE); //i2c, 1 = ack |
loopsva | 1:d3ed713f8354 | 284 | if(htu21 == 1) { |
loopsva | 1:d3ed713f8354 | 285 | _i2c.write(HTU21SNB1); |
loopsva | 1:d3ed713f8354 | 286 | _i2c.write(HTU21SNB2); |
loopsva | 1:d3ed713f8354 | 287 | _i2c.start(); |
loopsva | 1:d3ed713f8354 | 288 | htu21 = _i2c.write(HTU21Di2cREAD); |
loopsva | 1:d3ed713f8354 | 289 | HTU21sn.HTU21D_snb = _i2c.read(1) << 24; |
loopsva | 1:d3ed713f8354 | 290 | HTU21sn.HTU21D_crcb = _i2c.read(1) << 24; |
loopsva | 1:d3ed713f8354 | 291 | HTU21sn.HTU21D_snb |= _i2c.read(1) << 16; |
loopsva | 1:d3ed713f8354 | 292 | HTU21sn.HTU21D_crcb |= _i2c.read(1) << 16; |
loopsva | 1:d3ed713f8354 | 293 | HTU21sn.HTU21D_snb |= _i2c.read(1) << 8; |
loopsva | 1:d3ed713f8354 | 294 | HTU21sn.HTU21D_crcb |= _i2c.read(1) << 8; |
loopsva | 1:d3ed713f8354 | 295 | HTU21sn.HTU21D_snb |= _i2c.read(1); |
loopsva | 1:d3ed713f8354 | 296 | HTU21sn.HTU21D_crcb |= _i2c.read(0); |
loopsva | 1:d3ed713f8354 | 297 | _i2c.stop(); |
loopsva | 1:d3ed713f8354 | 298 | } |
loopsva | 1:d3ed713f8354 | 299 | |
loopsva | 1:d3ed713f8354 | 300 | #ifdef RTOS_H |
loopsva | 1:d3ed713f8354 | 301 | MutexI2cWait.unlock(); |
loopsva | 1:d3ed713f8354 | 302 | #endif |
loopsva | 1:d3ed713f8354 | 303 | |
loopsva | 1:d3ed713f8354 | 304 | } |
loopsva | 1:d3ed713f8354 | 305 |