This is a library to read out sensor values from Silicon Labs' si70xx-range of relative humidity and temperature sensors.
Dependents: MemLCD-Temperature-Humidity-Demo lab123
Information
All examples in this repo are considered EXPERIMENTAL QUALITY, meaning this code has been created as one-off proof-of-concept and is suitable as a demonstration for experimental purposes only. This code will not be regularly maintained by Silicon Labs and there is no guarantee that these projects will work across all environments, SDK versions and hardware.
Caution
This library targets mbed's asynchronous transfer APIs, so it can only be used in conjunction with platforms supporting these APIs.
The library is currently compatible with Si7013, Si7020 and Si7021 parts.
Usage
Include mbed low-power to use this driver
#include "mbed.h" #include "SILABS_RHT.h" I2C sensorI2C(PD6, PD7); //PD6=SDA, PD7=SCL silabs::SILABS_RHT rhtSensor(&sensorI2C); volatile bool busChecked = false; void respondedCallback( void ) { busChecked = true; } int main() { rhtSensor.check_availability(si7021, respondedCallback); while(busChecked == false) sleep(); busChecked = false; rhtSensor.measure(si7021, respondedCallback); while(busChecked == false) sleep(); if(rhtSensor.get_active()) { printf("Temperature: %d.%03d degC\n", rhtSensor.get_Temperature()/1000, rhtSensor.get_Temperature()%1000); } else { printf("No sensor found\n"); } while(1) sleep(); }
Datasheets
http://www.silabs.com/products/sensors/humidity-sensors/Pages/si7013-20-21.aspx
SILABS_RHT.cpp@0:9fd18754e0c0, 2015-03-17 (annotated)
- Committer:
- Steven Cooreman
- Date:
- Tue Mar 17 13:46:44 2015 -0500
- Revision:
- 0:9fd18754e0c0
- Child:
- 1:f3c25dea392e
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
Steven Cooreman |
0:9fd18754e0c0 | 1 | /***************************************************************************//** |
Steven Cooreman |
0:9fd18754e0c0 | 2 | * @file SILABS_RHT.cpp |
Steven Cooreman |
0:9fd18754e0c0 | 3 | * @brief Driver class for the Silicon Labs si70xx series I2C RHT sensors |
Steven Cooreman |
0:9fd18754e0c0 | 4 | ******************************************************************************* |
Steven Cooreman |
0:9fd18754e0c0 | 5 | * @section License |
Steven Cooreman |
0:9fd18754e0c0 | 6 | * <b>(C) Copyright 2015 Silicon Labs, http://www.silabs.com</b> |
Steven Cooreman |
0:9fd18754e0c0 | 7 | ******************************************************************************* |
Steven Cooreman |
0:9fd18754e0c0 | 8 | * |
Steven Cooreman |
0:9fd18754e0c0 | 9 | * Permission is granted to anyone to use this software for any purpose, |
Steven Cooreman |
0:9fd18754e0c0 | 10 | * including commercial applications, and to alter it and redistribute it |
Steven Cooreman |
0:9fd18754e0c0 | 11 | * freely, subject to the following restrictions: |
Steven Cooreman |
0:9fd18754e0c0 | 12 | * |
Steven Cooreman |
0:9fd18754e0c0 | 13 | * 1. The origin of this software must not be misrepresented; you must not |
Steven Cooreman |
0:9fd18754e0c0 | 14 | * claim that you wrote the original software. |
Steven Cooreman |
0:9fd18754e0c0 | 15 | * 2. Altered source versions must be plainly marked as such, and must not be |
Steven Cooreman |
0:9fd18754e0c0 | 16 | * misrepresented as being the original software. |
Steven Cooreman |
0:9fd18754e0c0 | 17 | * 3. This notice may not be removed or altered from any source distribution. |
Steven Cooreman |
0:9fd18754e0c0 | 18 | * |
Steven Cooreman |
0:9fd18754e0c0 | 19 | * DISCLAIMER OF WARRANTY/LIMITATION OF REMEDIES: Silicon Labs has no |
Steven Cooreman |
0:9fd18754e0c0 | 20 | * obligation to support this Software. Silicon Labs is providing the |
Steven Cooreman |
0:9fd18754e0c0 | 21 | * Software "AS IS", with no express or implied warranties of any kind, |
Steven Cooreman |
0:9fd18754e0c0 | 22 | * including, but not limited to, any implied warranties of merchantability |
Steven Cooreman |
0:9fd18754e0c0 | 23 | * or fitness for any particular purpose or warranties against infringement |
Steven Cooreman |
0:9fd18754e0c0 | 24 | * of any proprietary rights of a third party. |
Steven Cooreman |
0:9fd18754e0c0 | 25 | * |
Steven Cooreman |
0:9fd18754e0c0 | 26 | * Silicon Labs will not be liable for any consequential, incidental, or |
Steven Cooreman |
0:9fd18754e0c0 | 27 | * special damages, or any other relief, or for any claim by any third party, |
Steven Cooreman |
0:9fd18754e0c0 | 28 | * arising from your use of this Software. |
Steven Cooreman |
0:9fd18754e0c0 | 29 | * |
Steven Cooreman |
0:9fd18754e0c0 | 30 | ******************************************************************************/ |
Steven Cooreman |
0:9fd18754e0c0 | 31 | |
Steven Cooreman |
0:9fd18754e0c0 | 32 | #include <mbed.h> |
Steven Cooreman |
0:9fd18754e0c0 | 33 | #include "SILABS_RHT.h" |
Steven Cooreman |
0:9fd18754e0c0 | 34 | #include "I2C.h" |
Steven Cooreman |
0:9fd18754e0c0 | 35 | |
Steven Cooreman |
0:9fd18754e0c0 | 36 | /******************************************************************************* |
Steven Cooreman |
0:9fd18754e0c0 | 37 | ******************************* DEFINES *********************************** |
Steven Cooreman |
0:9fd18754e0c0 | 38 | ******************************************************************************/ |
Steven Cooreman |
0:9fd18754e0c0 | 39 | |
Steven Cooreman |
0:9fd18754e0c0 | 40 | /** @cond DO_NOT_INCLUDE_WITH_DOXYGEN */ |
Steven Cooreman |
0:9fd18754e0c0 | 41 | |
Steven Cooreman |
0:9fd18754e0c0 | 42 | /** Si7013 Read Temperature Command */ |
Steven Cooreman |
0:9fd18754e0c0 | 43 | #define SI7013_READ_TEMP 0xE0 /* Read previous T data from RH measurement |
Steven Cooreman |
0:9fd18754e0c0 | 44 | command*/ |
Steven Cooreman |
0:9fd18754e0c0 | 45 | /** Si7013 Read RH Command */ |
Steven Cooreman |
0:9fd18754e0c0 | 46 | #define SI7013_READ_RH 0xE5 /* Perform RH (and T) measurement. */ |
Steven Cooreman |
0:9fd18754e0c0 | 47 | /** Si7013 Read ID */ |
Steven Cooreman |
0:9fd18754e0c0 | 48 | #define SI7013_READ_ID1_1 0xFA |
Steven Cooreman |
0:9fd18754e0c0 | 49 | #define SI7013_READ_ID1_2 0x0F |
Steven Cooreman |
0:9fd18754e0c0 | 50 | #define SI7013_READ_ID2_1 0xFc |
Steven Cooreman |
0:9fd18754e0c0 | 51 | #define SI7013_READ_ID2_2 0xc9 |
Steven Cooreman |
0:9fd18754e0c0 | 52 | /** Si7013 Read Firmware Revision */ |
Steven Cooreman |
0:9fd18754e0c0 | 53 | #define SI7013_READ_FWREV_1 0x84 |
Steven Cooreman |
0:9fd18754e0c0 | 54 | #define SI7013_READ_FWREV_2 0xB8 |
Steven Cooreman |
0:9fd18754e0c0 | 55 | |
Steven Cooreman |
0:9fd18754e0c0 | 56 | /** I2C device address for Si7013 */ |
Steven Cooreman |
0:9fd18754e0c0 | 57 | #define SI7013_ADDR 0x82 |
Steven Cooreman |
0:9fd18754e0c0 | 58 | /** I2C device address for Si7021 */ |
Steven Cooreman |
0:9fd18754e0c0 | 59 | #define SI7021_ADDR 0x80 |
Steven Cooreman |
0:9fd18754e0c0 | 60 | |
Steven Cooreman |
0:9fd18754e0c0 | 61 | |
Steven Cooreman |
0:9fd18754e0c0 | 62 | /** Device ID value for Si7013 */ |
Steven Cooreman |
0:9fd18754e0c0 | 63 | #define SI7013_DEVICE_ID 0x0D |
Steven Cooreman |
0:9fd18754e0c0 | 64 | /** Device ID value for Si7020 */ |
Steven Cooreman |
0:9fd18754e0c0 | 65 | #define SI7020_DEVICE_ID 0x14 |
Steven Cooreman |
0:9fd18754e0c0 | 66 | /** Device ID value for Si7021 */ |
Steven Cooreman |
0:9fd18754e0c0 | 67 | #define SI7021_DEVICE_ID 0x15 |
Steven Cooreman |
0:9fd18754e0c0 | 68 | |
Steven Cooreman |
0:9fd18754e0c0 | 69 | /** @endcond */ |
Steven Cooreman |
0:9fd18754e0c0 | 70 | |
Steven Cooreman |
0:9fd18754e0c0 | 71 | /******************************************************************************* |
Steven Cooreman |
0:9fd18754e0c0 | 72 | ************************** GLOBAL FUNCTIONS ******************************* |
Steven Cooreman |
0:9fd18754e0c0 | 73 | ******************************************************************************/ |
Steven Cooreman |
0:9fd18754e0c0 | 74 | |
Steven Cooreman |
0:9fd18754e0c0 | 75 | namespace silabs |
Steven Cooreman |
0:9fd18754e0c0 | 76 | { |
Steven Cooreman |
0:9fd18754e0c0 | 77 | |
Steven Cooreman |
0:9fd18754e0c0 | 78 | SILABS_RHT::SILABS_RHT(mbed::I2C * i2c) |
Steven Cooreman |
0:9fd18754e0c0 | 79 | { |
Steven Cooreman |
0:9fd18754e0c0 | 80 | //Save pointer to i2c peripheral |
Steven Cooreman |
0:9fd18754e0c0 | 81 | _i2c = i2c; |
Steven Cooreman |
0:9fd18754e0c0 | 82 | _internalCallback.attach(this, &SILABS_RHT::_cbHandler); |
Steven Cooreman |
0:9fd18754e0c0 | 83 | _completionCallbackPtr = NULL; |
Steven Cooreman |
0:9fd18754e0c0 | 84 | |
Steven Cooreman |
0:9fd18754e0c0 | 85 | _address = 0; |
Steven Cooreman |
0:9fd18754e0c0 | 86 | _rhData = 0; |
Steven Cooreman |
0:9fd18754e0c0 | 87 | _tData = 0; |
Steven Cooreman |
0:9fd18754e0c0 | 88 | |
Steven Cooreman |
0:9fd18754e0c0 | 89 | _state = RHT_IDLE; |
Steven Cooreman |
0:9fd18754e0c0 | 90 | } |
Steven Cooreman |
0:9fd18754e0c0 | 91 | |
Steven Cooreman |
0:9fd18754e0c0 | 92 | /* |
Steven Cooreman |
0:9fd18754e0c0 | 93 | * Get device bus address |
Steven Cooreman |
0:9fd18754e0c0 | 94 | */ |
Steven Cooreman |
0:9fd18754e0c0 | 95 | inline uint8_t SILABS_RHT::get_address(SILABS_RHT_device_t device) |
Steven Cooreman |
0:9fd18754e0c0 | 96 | { |
Steven Cooreman |
0:9fd18754e0c0 | 97 | switch(device) |
Steven Cooreman |
0:9fd18754e0c0 | 98 | { |
Steven Cooreman |
0:9fd18754e0c0 | 99 | case si7013: |
Steven Cooreman |
0:9fd18754e0c0 | 100 | return SI7013_ADDR; |
Steven Cooreman |
0:9fd18754e0c0 | 101 | case si7020: |
Steven Cooreman |
0:9fd18754e0c0 | 102 | case si7021: |
Steven Cooreman |
0:9fd18754e0c0 | 103 | return SI7021_ADDR; |
Steven Cooreman |
0:9fd18754e0c0 | 104 | default: |
Steven Cooreman |
0:9fd18754e0c0 | 105 | return 0; |
Steven Cooreman |
0:9fd18754e0c0 | 106 | } |
Steven Cooreman |
0:9fd18754e0c0 | 107 | } |
Steven Cooreman |
0:9fd18754e0c0 | 108 | |
Steven Cooreman |
0:9fd18754e0c0 | 109 | /* |
Steven Cooreman |
0:9fd18754e0c0 | 110 | * Get last measured temperature data |
Steven Cooreman |
0:9fd18754e0c0 | 111 | */ |
Steven Cooreman |
0:9fd18754e0c0 | 112 | int32_t SILABS_RHT::get_temperature() |
Steven Cooreman |
0:9fd18754e0c0 | 113 | { |
Steven Cooreman |
0:9fd18754e0c0 | 114 | return _tData; |
Steven Cooreman |
0:9fd18754e0c0 | 115 | } |
Steven Cooreman |
0:9fd18754e0c0 | 116 | |
Steven Cooreman |
0:9fd18754e0c0 | 117 | /* |
Steven Cooreman |
0:9fd18754e0c0 | 118 | * Get last measured relative humidity data |
Steven Cooreman |
0:9fd18754e0c0 | 119 | */ |
Steven Cooreman |
0:9fd18754e0c0 | 120 | uint32_t SILABS_RHT::get_humidity() |
Steven Cooreman |
0:9fd18754e0c0 | 121 | { |
Steven Cooreman |
0:9fd18754e0c0 | 122 | return _rhData; |
Steven Cooreman |
0:9fd18754e0c0 | 123 | } |
Steven Cooreman |
0:9fd18754e0c0 | 124 | |
Steven Cooreman |
0:9fd18754e0c0 | 125 | /* |
Steven Cooreman |
0:9fd18754e0c0 | 126 | * Get current state of the sensor, active or inactive. Need to call check_availability first. |
Steven Cooreman |
0:9fd18754e0c0 | 127 | */ |
Steven Cooreman |
0:9fd18754e0c0 | 128 | bool SILABS_RHT::get_active() |
Steven Cooreman |
0:9fd18754e0c0 | 129 | { |
Steven Cooreman |
0:9fd18754e0c0 | 130 | if(_state == RHT_IDLE) return false; |
Steven Cooreman |
0:9fd18754e0c0 | 131 | else return true; |
Steven Cooreman |
0:9fd18754e0c0 | 132 | } |
Steven Cooreman |
0:9fd18754e0c0 | 133 | |
Steven Cooreman |
0:9fd18754e0c0 | 134 | /* |
Steven Cooreman |
0:9fd18754e0c0 | 135 | * Perform measurement |
Steven Cooreman |
0:9fd18754e0c0 | 136 | */ |
Steven Cooreman |
0:9fd18754e0c0 | 137 | int SILABS_RHT::measure(SILABS_RHT_device_t deviceType, cbptr_t callback) |
Steven Cooreman |
0:9fd18754e0c0 | 138 | { |
Steven Cooreman |
0:9fd18754e0c0 | 139 | /* Check to see we're available */ |
Steven Cooreman |
0:9fd18754e0c0 | 140 | if((_state != RHT_IDLE) && (_state != RHT_ACTIVE)) return SILABS_RHT_ERROR_BUSY; |
Steven Cooreman |
0:9fd18754e0c0 | 141 | |
Steven Cooreman |
0:9fd18754e0c0 | 142 | /* Set internal state */ |
Steven Cooreman |
0:9fd18754e0c0 | 143 | _state = RHT_MEASURING; |
Steven Cooreman |
0:9fd18754e0c0 | 144 | _completionCallbackPtr = callback; |
Steven Cooreman |
0:9fd18754e0c0 | 145 | |
Steven Cooreman |
0:9fd18754e0c0 | 146 | _tx_buf[0] = SI7013_READ_RH; |
Steven Cooreman |
0:9fd18754e0c0 | 147 | |
Steven Cooreman |
0:9fd18754e0c0 | 148 | /* Get device bus address */ |
Steven Cooreman |
0:9fd18754e0c0 | 149 | _address = get_address(deviceType); |
Steven Cooreman |
0:9fd18754e0c0 | 150 | if (_address == 0) |
Steven Cooreman |
0:9fd18754e0c0 | 151 | { |
Steven Cooreman |
0:9fd18754e0c0 | 152 | _state = RHT_IDLE; |
Steven Cooreman |
0:9fd18754e0c0 | 153 | return SILABS_RHT_ERROR_ARGUMENT; |
Steven Cooreman |
0:9fd18754e0c0 | 154 | } |
Steven Cooreman |
0:9fd18754e0c0 | 155 | |
Steven Cooreman |
0:9fd18754e0c0 | 156 | /* Start transfer */ |
Steven Cooreman |
0:9fd18754e0c0 | 157 | if(_i2c->transfer(_address, (char*)_tx_buf, 1, (char*)_rx_buf, 2, &_internalCallback, I2C_EVENT_ALL) != 0) |
Steven Cooreman |
0:9fd18754e0c0 | 158 | { |
Steven Cooreman |
0:9fd18754e0c0 | 159 | _state = RHT_IDLE; |
Steven Cooreman |
0:9fd18754e0c0 | 160 | return SILABS_RHT_ERROR_I2C_BUSY; |
Steven Cooreman |
0:9fd18754e0c0 | 161 | } |
Steven Cooreman |
0:9fd18754e0c0 | 162 | |
Steven Cooreman |
0:9fd18754e0c0 | 163 | return SILABS_RHT_OK; |
Steven Cooreman |
0:9fd18754e0c0 | 164 | } |
Steven Cooreman |
0:9fd18754e0c0 | 165 | |
Steven Cooreman |
0:9fd18754e0c0 | 166 | /* |
Steven Cooreman |
0:9fd18754e0c0 | 167 | * Check if the sensor is active and responding |
Steven Cooreman |
0:9fd18754e0c0 | 168 | */ |
Steven Cooreman |
0:9fd18754e0c0 | 169 | int SILABS_RHT::check_availability(SILABS_RHT_device_t deviceType, cbptr_t callback) |
Steven Cooreman |
0:9fd18754e0c0 | 170 | { |
Steven Cooreman |
0:9fd18754e0c0 | 171 | /* Check to see we're available */ |
Steven Cooreman |
0:9fd18754e0c0 | 172 | if((_state != RHT_IDLE) && (_state != RHT_ACTIVE)) return SILABS_RHT_ERROR_BUSY; |
Steven Cooreman |
0:9fd18754e0c0 | 173 | |
Steven Cooreman |
0:9fd18754e0c0 | 174 | /* Set internal state */ |
Steven Cooreman |
0:9fd18754e0c0 | 175 | _state = RHT_PINGING; |
Steven Cooreman |
0:9fd18754e0c0 | 176 | _completionCallbackPtr = callback; |
Steven Cooreman |
0:9fd18754e0c0 | 177 | |
Steven Cooreman |
0:9fd18754e0c0 | 178 | _tx_buf[0] = SI7013_READ_ID2_1; |
Steven Cooreman |
0:9fd18754e0c0 | 179 | _tx_buf[1] = SI7013_READ_ID2_2; |
Steven Cooreman |
0:9fd18754e0c0 | 180 | |
Steven Cooreman |
0:9fd18754e0c0 | 181 | /* Get device bus address */ |
Steven Cooreman |
0:9fd18754e0c0 | 182 | _address = get_address(deviceType); |
Steven Cooreman |
0:9fd18754e0c0 | 183 | if (_address == 0) |
Steven Cooreman |
0:9fd18754e0c0 | 184 | { |
Steven Cooreman |
0:9fd18754e0c0 | 185 | _state = RHT_IDLE; |
Steven Cooreman |
0:9fd18754e0c0 | 186 | return SILABS_RHT_ERROR_ARGUMENT; |
Steven Cooreman |
0:9fd18754e0c0 | 187 | } |
Steven Cooreman |
0:9fd18754e0c0 | 188 | |
Steven Cooreman |
0:9fd18754e0c0 | 189 | /* Start transfer */ |
Steven Cooreman |
0:9fd18754e0c0 | 190 | if(_i2c->transfer(_address, (char*)_tx_buf, 2, (char*)_rx_buf, 8, &_internalCallback, I2C_EVENT_ALL) != 0) |
Steven Cooreman |
0:9fd18754e0c0 | 191 | { |
Steven Cooreman |
0:9fd18754e0c0 | 192 | _state = RHT_IDLE; |
Steven Cooreman |
0:9fd18754e0c0 | 193 | return SILABS_RHT_ERROR_I2C_BUSY; |
Steven Cooreman |
0:9fd18754e0c0 | 194 | } |
Steven Cooreman |
0:9fd18754e0c0 | 195 | |
Steven Cooreman |
0:9fd18754e0c0 | 196 | return SILABS_RHT_OK; |
Steven Cooreman |
0:9fd18754e0c0 | 197 | } |
Steven Cooreman |
0:9fd18754e0c0 | 198 | |
Steven Cooreman |
0:9fd18754e0c0 | 199 | void SILABS_RHT::_cbHandlerTimeout( void ) |
Steven Cooreman |
0:9fd18754e0c0 | 200 | { |
Steven Cooreman |
0:9fd18754e0c0 | 201 | this->_cbHandler(0); |
Steven Cooreman |
0:9fd18754e0c0 | 202 | } |
Steven Cooreman |
0:9fd18754e0c0 | 203 | |
Steven Cooreman |
0:9fd18754e0c0 | 204 | void SILABS_RHT::_cbHandler( int event ) |
Steven Cooreman |
0:9fd18754e0c0 | 205 | { |
Steven Cooreman |
0:9fd18754e0c0 | 206 | if (_state == RHT_IDLE || _state == RHT_ACTIVE) |
Steven Cooreman |
0:9fd18754e0c0 | 207 | { |
Steven Cooreman |
0:9fd18754e0c0 | 208 | return; |
Steven Cooreman |
0:9fd18754e0c0 | 209 | } |
Steven Cooreman |
0:9fd18754e0c0 | 210 | else if (event & I2C_EVENT_ERROR_NO_SLAVE) |
Steven Cooreman |
0:9fd18754e0c0 | 211 | { |
Steven Cooreman |
0:9fd18754e0c0 | 212 | /* Slave is no longer responding */ |
Steven Cooreman |
0:9fd18754e0c0 | 213 | _state = RHT_IDLE; |
Steven Cooreman |
0:9fd18754e0c0 | 214 | } |
Steven Cooreman |
0:9fd18754e0c0 | 215 | else if (event & I2C_EVENT_ERROR) |
Steven Cooreman |
0:9fd18754e0c0 | 216 | { |
Steven Cooreman |
0:9fd18754e0c0 | 217 | /* Do nothing when an I2C error occurred */ |
Steven Cooreman |
0:9fd18754e0c0 | 218 | } |
Steven Cooreman |
0:9fd18754e0c0 | 219 | else if (_state == RHT_PINGING) |
Steven Cooreman |
0:9fd18754e0c0 | 220 | { |
Steven Cooreman |
0:9fd18754e0c0 | 221 | _state = RHT_ACTIVE; |
Steven Cooreman |
0:9fd18754e0c0 | 222 | |
Steven Cooreman |
0:9fd18754e0c0 | 223 | /* check ID byte */ |
Steven Cooreman |
0:9fd18754e0c0 | 224 | switch(_rx_buf[0]) |
Steven Cooreman |
0:9fd18754e0c0 | 225 | { |
Steven Cooreman |
0:9fd18754e0c0 | 226 | case SI7013_DEVICE_ID: |
Steven Cooreman |
0:9fd18754e0c0 | 227 | case SI7020_DEVICE_ID: |
Steven Cooreman |
0:9fd18754e0c0 | 228 | case SI7021_DEVICE_ID: |
Steven Cooreman |
0:9fd18754e0c0 | 229 | /* ID byte indicates one of the supported devices */ |
Steven Cooreman |
0:9fd18754e0c0 | 230 | break; |
Steven Cooreman |
0:9fd18754e0c0 | 231 | default: |
Steven Cooreman |
0:9fd18754e0c0 | 232 | /* Unsupported device */ |
Steven Cooreman |
0:9fd18754e0c0 | 233 | _state = RHT_IDLE; |
Steven Cooreman |
0:9fd18754e0c0 | 234 | } |
Steven Cooreman |
0:9fd18754e0c0 | 235 | } |
Steven Cooreman |
0:9fd18754e0c0 | 236 | else if (_state == RHT_MEASURING) |
Steven Cooreman |
0:9fd18754e0c0 | 237 | { |
Steven Cooreman |
0:9fd18754e0c0 | 238 | /* Store raw RH info */ |
Steven Cooreman |
0:9fd18754e0c0 | 239 | _rhData = ((uint32_t)_rx_buf[0] << 8) + (_rx_buf[1] & 0xFC); |
Steven Cooreman |
0:9fd18754e0c0 | 240 | /* Convert value to milli-percent */ |
Steven Cooreman |
0:9fd18754e0c0 | 241 | _rhData = (((_rhData) * 15625L) >> 13) - 6000; |
Steven Cooreman |
0:9fd18754e0c0 | 242 | |
Steven Cooreman |
0:9fd18754e0c0 | 243 | /* Read back the temperature value */ |
Steven Cooreman |
0:9fd18754e0c0 | 244 | _state = RHT_TEMPERATURE; |
Steven Cooreman |
0:9fd18754e0c0 | 245 | |
Steven Cooreman |
0:9fd18754e0c0 | 246 | _tx_buf[0] = SI7013_READ_TEMP; |
Steven Cooreman |
0:9fd18754e0c0 | 247 | |
Steven Cooreman |
0:9fd18754e0c0 | 248 | if(_i2c->transfer(_address, (char*)_tx_buf, 1, (char*)_rx_buf, 2, &_internalCallback, I2C_EVENT_ALL) == 0) |
Steven Cooreman |
0:9fd18754e0c0 | 249 | { |
Steven Cooreman |
0:9fd18754e0c0 | 250 | // Succeeded in adding the transfer, so return here to avoid calling the callback. |
Steven Cooreman |
0:9fd18754e0c0 | 251 | return; |
Steven Cooreman |
0:9fd18754e0c0 | 252 | } |
Steven Cooreman |
0:9fd18754e0c0 | 253 | |
Steven Cooreman |
0:9fd18754e0c0 | 254 | // Did not succeed in adding the temperature transfer, so bail. |
Steven Cooreman |
0:9fd18754e0c0 | 255 | _state = RHT_ACTIVE; |
Steven Cooreman |
0:9fd18754e0c0 | 256 | } |
Steven Cooreman |
0:9fd18754e0c0 | 257 | else if (_state == RHT_TEMPERATURE) |
Steven Cooreman |
0:9fd18754e0c0 | 258 | { |
Steven Cooreman |
0:9fd18754e0c0 | 259 | /* Store raw temperature info */ |
Steven Cooreman |
0:9fd18754e0c0 | 260 | _tData = ((uint32_t)_rx_buf[0] << 8) + (_rx_buf[1] & 0xFC); |
Steven Cooreman |
0:9fd18754e0c0 | 261 | /* Convert to milli-degC */ |
Steven Cooreman |
0:9fd18754e0c0 | 262 | _tData = (((_tData) * 21965L) >> 13) - 46850; |
Steven Cooreman |
0:9fd18754e0c0 | 263 | |
Steven Cooreman |
0:9fd18754e0c0 | 264 | /* Go back to idling */ |
Steven Cooreman |
0:9fd18754e0c0 | 265 | _state = RHT_ACTIVE; |
Steven Cooreman |
0:9fd18754e0c0 | 266 | } |
Steven Cooreman |
0:9fd18754e0c0 | 267 | else if (_state == RHT_FWREV) |
Steven Cooreman |
0:9fd18754e0c0 | 268 | { |
Steven Cooreman |
0:9fd18754e0c0 | 269 | _state = RHT_ACTIVE; |
Steven Cooreman |
0:9fd18754e0c0 | 270 | } |
Steven Cooreman |
0:9fd18754e0c0 | 271 | |
Steven Cooreman |
0:9fd18754e0c0 | 272 | /* If a callback has been registered, call it */ |
Steven Cooreman |
0:9fd18754e0c0 | 273 | if (_completionCallbackPtr != NULL) |
Steven Cooreman |
0:9fd18754e0c0 | 274 | { |
Steven Cooreman |
0:9fd18754e0c0 | 275 | _completionCallbackPtr(); |
Steven Cooreman |
0:9fd18754e0c0 | 276 | _completionCallbackPtr = NULL; |
Steven Cooreman |
0:9fd18754e0c0 | 277 | } |
Steven Cooreman |
0:9fd18754e0c0 | 278 | } |
Steven Cooreman |
0:9fd18754e0c0 | 279 | |
Steven Cooreman |
0:9fd18754e0c0 | 280 | } // namespace silabs |