Device driver for Si7020 Digital humidity and temperature sensor.

Dependents:   Si7020_example MAXWSNENV_sensors MAXWSNENV_sensors Hello-Uzuki-sensor-shield ... more

Si7020 Device Driver

This is a device driver for the Si7020 Humidity and temperature sensor. It uses I2C to communicate humidity and temperature data.

Si7020 Product Page

180

Committer:
kgills
Date:
Fri Apr 17 09:53:45 2015 -0500
Revision:
0:9a1febb56203
Child:
1:eca9d19c17ab
Adding files for Si7020 device driver.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
kgills 0:9a1febb56203 1 /*******************************************************************************
kgills 0:9a1febb56203 2 * Copyright (C) 2015 Maxim Integrated Products, Inc., All Rights Reserved.
kgills 0:9a1febb56203 3 *
kgills 0:9a1febb56203 4 * Permission is hereby granted, free of charge, to any person obtaining a
kgills 0:9a1febb56203 5 * copy of this software and associated documentation files (the "Software"),
kgills 0:9a1febb56203 6 * to deal in the Software without restriction, including without limitation
kgills 0:9a1febb56203 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
kgills 0:9a1febb56203 8 * and/or sell copies of the Software, and to permit persons to whom the
kgills 0:9a1febb56203 9 * Software is furnished to do so, subject to the following conditions:
kgills 0:9a1febb56203 10 *
kgills 0:9a1febb56203 11 * The above copyright notice and this permission notice shall be included
kgills 0:9a1febb56203 12 * in all copies or substantial portions of the Software.
kgills 0:9a1febb56203 13 *
kgills 0:9a1febb56203 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
kgills 0:9a1febb56203 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
kgills 0:9a1febb56203 16 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
kgills 0:9a1febb56203 17 * IN NO EVENT SHALL MAXIM INTEGRATED BE LIABLE FOR ANY CLAIM, DAMAGES
kgills 0:9a1febb56203 18 * OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
kgills 0:9a1febb56203 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
kgills 0:9a1febb56203 20 * OTHER DEALINGS IN THE SOFTWARE.
kgills 0:9a1febb56203 21 *
kgills 0:9a1febb56203 22 * Except as contained in this notice, the name of Maxim Integrated
kgills 0:9a1febb56203 23 * Products, Inc. shall not be used except as stated in the Maxim Integrated
kgills 0:9a1febb56203 24 * Products, Inc. Branding Policy.
kgills 0:9a1febb56203 25 *
kgills 0:9a1febb56203 26 * The mere transfer of this software does not imply any licenses
kgills 0:9a1febb56203 27 * of trade secrets, proprietary technology, copyrights, patents,
kgills 0:9a1febb56203 28 * trademarks, maskwork rights, or any other form of intellectual
kgills 0:9a1febb56203 29 * property whatsoever. Maxim Integrated Products, Inc. retains all
kgills 0:9a1febb56203 30 * ownership rights.
kgills 0:9a1febb56203 31 *******************************************************************************
kgills 0:9a1febb56203 32 */
kgills 0:9a1febb56203 33
kgills 0:9a1febb56203 34 #include "Si7020.h"
kgills 0:9a1febb56203 35
kgills 0:9a1febb56203 36 /***** Definitions *****/
kgills 0:9a1febb56203 37 #define I2C_ADDR (0x80) // 1000000x
kgills 0:9a1febb56203 38 #define POLYVAL (0x131)
kgills 0:9a1febb56203 39
kgills 0:9a1febb56203 40 /***** File Scope Data *****/
kgills 0:9a1febb56203 41 static const char cmd_meas_humid[] = { 0xE5 };
kgills 0:9a1febb56203 42 static const char cmd_meas_humid_no_hold[] = { 0xF5 };
kgills 0:9a1febb56203 43 static const char cmd_meas_temp[] = { 0xE3 };
kgills 0:9a1febb56203 44 static const char cmd_meas_temp_no_hold[] = { 0xF3 };
kgills 0:9a1febb56203 45 static const char cmd_meas_prev_temp[] = { 0xE0 };
kgills 0:9a1febb56203 46 static const char cmd_rst[] = { 0xFE };
kgills 0:9a1febb56203 47 static const char cmd_write_user1[] = { 0xE6 };
kgills 0:9a1febb56203 48 static const char cmd_read_user1[] = { 0xE7 };
kgills 0:9a1febb56203 49 static const char cmd_id_1[] = { 0xFA, 0x0F };
kgills 0:9a1febb56203 50 static const char cmd_id_2[] = { 0xFC, 0xC9 };
kgills 0:9a1febb56203 51 static const char cmd_fw_ver[] = { 0x84, 0xB8 };
kgills 0:9a1febb56203 52
kgills 0:9a1febb56203 53 //******************************************************************************
kgills 0:9a1febb56203 54 Si7020::Si7020(PinName sda, PinName scl)
kgills 0:9a1febb56203 55 {
kgills 0:9a1febb56203 56 i2c_ = new I2C(sda, scl);
kgills 0:9a1febb56203 57 i2c_owner = true;
kgills 0:9a1febb56203 58
kgills 0:9a1febb56203 59 // 400KHz, as specified by the datasheet.
kgills 0:9a1febb56203 60 i2c_->frequency(400000);
kgills 0:9a1febb56203 61 }
kgills 0:9a1febb56203 62
kgills 0:9a1febb56203 63 //******************************************************************************
kgills 0:9a1febb56203 64 Si7020::Si7020(I2C *i2c) :
kgills 0:9a1febb56203 65 i2c_(i2c)
kgills 0:9a1febb56203 66 {
kgills 0:9a1febb56203 67 i2c_owner = false;
kgills 0:9a1febb56203 68 }
kgills 0:9a1febb56203 69
kgills 0:9a1febb56203 70 //******************************************************************************
kgills 0:9a1febb56203 71 Si7020::~Si7020()
kgills 0:9a1febb56203 72 {
kgills 0:9a1febb56203 73 if(i2c_owner) {
kgills 0:9a1febb56203 74 delete i2c_;
kgills 0:9a1febb56203 75 }
kgills 0:9a1febb56203 76 }
kgills 0:9a1febb56203 77
kgills 0:9a1febb56203 78 //******************************************************************************
kgills 0:9a1febb56203 79 int Si7020::reset(void)
kgills 0:9a1febb56203 80 {
kgills 0:9a1febb56203 81 if (i2c_->write(I2C_ADDR, cmd_rst, sizeof(cmd_rst)) != 0) {
kgills 0:9a1febb56203 82 return -1;
kgills 0:9a1febb56203 83 }
kgills 0:9a1febb56203 84
kgills 0:9a1febb56203 85 return 0;
kgills 0:9a1febb56203 86 }
kgills 0:9a1febb56203 87
kgills 0:9a1febb56203 88 //******************************************************************************
kgills 0:9a1febb56203 89 int Si7020::getElectronicId(char* id)
kgills 0:9a1febb56203 90 {
kgills 0:9a1febb56203 91 // Send cmd with repeated start
kgills 0:9a1febb56203 92 if (i2c_->write(I2C_ADDR, cmd_id_1, sizeof(cmd_id_1), true) != 0) {
kgills 0:9a1febb56203 93 return -1;
kgills 0:9a1febb56203 94 }
kgills 0:9a1febb56203 95
kgills 0:9a1febb56203 96 // Read first portion of ID
kgills 0:9a1febb56203 97 char temp[8];
kgills 0:9a1febb56203 98 if (i2c_->read(I2C_ADDR, temp, 8, false) != 0) {
kgills 0:9a1febb56203 99 return -1;
kgills 0:9a1febb56203 100 }
kgills 0:9a1febb56203 101
kgills 0:9a1febb56203 102 // Check the CRC
kgills 0:9a1febb56203 103 char crc = 0;
kgills 0:9a1febb56203 104 int i;
kgills 0:9a1febb56203 105 for(i = 0; i < 4; i++) {
kgills 0:9a1febb56203 106 crc = crc8(temp[2*i], crc);
kgills 0:9a1febb56203 107 if(crc != temp[2*i +1]) {
kgills 0:9a1febb56203 108 return -1;
kgills 0:9a1febb56203 109 }
kgills 0:9a1febb56203 110 }
kgills 0:9a1febb56203 111
kgills 0:9a1febb56203 112 // Save top portion of ID
kgills 0:9a1febb56203 113 id[7] = temp [0];
kgills 0:9a1febb56203 114 id[6] = temp [2];
kgills 0:9a1febb56203 115 id[5] = temp [4];
kgills 0:9a1febb56203 116 id[4] = temp [6];
kgills 0:9a1febb56203 117
kgills 0:9a1febb56203 118 // Send cmd with repeated start
kgills 0:9a1febb56203 119 if (i2c_->write(I2C_ADDR, cmd_id_2, sizeof(cmd_id_2), true) != 0) {
kgills 0:9a1febb56203 120 return -1;
kgills 0:9a1febb56203 121 }
kgills 0:9a1febb56203 122
kgills 0:9a1febb56203 123 // Read rest of ID
kgills 0:9a1febb56203 124 if (i2c_->read(I2C_ADDR, temp, 6, false) != 0) {
kgills 0:9a1febb56203 125 return -1;
kgills 0:9a1febb56203 126 }
kgills 0:9a1febb56203 127
kgills 0:9a1febb56203 128 // Check the CRC
kgills 0:9a1febb56203 129 crc = 0;
kgills 0:9a1febb56203 130 for(i = 0; i < 2; i++) {
kgills 0:9a1febb56203 131 crc = crc8(temp[3*i], crc);
kgills 0:9a1febb56203 132 crc = crc8(temp[3*i + 1], crc);
kgills 0:9a1febb56203 133 if(crc != temp[3*i + 2]) {
kgills 0:9a1febb56203 134 return -1;
kgills 0:9a1febb56203 135 }
kgills 0:9a1febb56203 136 }
kgills 0:9a1febb56203 137
kgills 0:9a1febb56203 138 // Save bottom portion of ID
kgills 0:9a1febb56203 139 id[3] = temp [0];
kgills 0:9a1febb56203 140 id[2] = temp [1];
kgills 0:9a1febb56203 141 id[1] = temp [3];
kgills 0:9a1febb56203 142 id[0] = temp [4];
kgills 0:9a1febb56203 143
kgills 0:9a1febb56203 144 return 0;
kgills 0:9a1febb56203 145 }
kgills 0:9a1febb56203 146
kgills 0:9a1febb56203 147 //******************************************************************************
kgills 0:9a1febb56203 148 int Si7020::configResolution(Si7020::resolution_t resolution)
kgills 0:9a1febb56203 149 {
kgills 0:9a1febb56203 150 char data[2];
kgills 0:9a1febb56203 151
kgills 0:9a1febb56203 152 if (i2c_->write(I2C_ADDR, cmd_read_user1, sizeof(cmd_read_user1)) != 0) {
kgills 0:9a1febb56203 153 return -1;
kgills 0:9a1febb56203 154 }
kgills 0:9a1febb56203 155
kgills 0:9a1febb56203 156 if (i2c_->read(I2C_ADDR, &data[1], 1) != 0) {
kgills 0:9a1febb56203 157 return -1;
kgills 0:9a1febb56203 158 }
kgills 0:9a1febb56203 159
kgills 0:9a1febb56203 160 switch (resolution) {
kgills 0:9a1febb56203 161 case RH_12b_TEMP_14b:
kgills 0:9a1febb56203 162 data[1] &= ~0x81;
kgills 0:9a1febb56203 163 break;
kgills 0:9a1febb56203 164 case RH_8b_TEMP_12b:
kgills 0:9a1febb56203 165 data[1] = (data[1] & ~0x80) | 0x01;
kgills 0:9a1febb56203 166 break;
kgills 0:9a1febb56203 167 case RH_10b_TEMP_13b:
kgills 0:9a1febb56203 168 data[1] = (data[1] & ~0x01) | 0x80;
kgills 0:9a1febb56203 169 break;
kgills 0:9a1febb56203 170 case RH_11b_TEMP_11b:
kgills 0:9a1febb56203 171 data[1] |= 0x81;
kgills 0:9a1febb56203 172 break;
kgills 0:9a1febb56203 173 default:
kgills 0:9a1febb56203 174 return -1;
kgills 0:9a1febb56203 175 }
kgills 0:9a1febb56203 176
kgills 0:9a1febb56203 177 data[0] = cmd_write_user1[0];
kgills 0:9a1febb56203 178
kgills 0:9a1febb56203 179 if (i2c_->write(I2C_ADDR, data, 2) != 0) {
kgills 0:9a1febb56203 180 return -1;
kgills 0:9a1febb56203 181 }
kgills 0:9a1febb56203 182
kgills 0:9a1febb56203 183 return 0;
kgills 0:9a1febb56203 184 }
kgills 0:9a1febb56203 185
kgills 0:9a1febb56203 186 //******************************************************************************
kgills 0:9a1febb56203 187 int Si7020::getTemperature(int16_t *tempCx10)
kgills 0:9a1febb56203 188 {
kgills 0:9a1febb56203 189 if (i2c_->write(I2C_ADDR, cmd_meas_temp, sizeof(cmd_meas_temp)) != 0) {
kgills 0:9a1febb56203 190 return -1;
kgills 0:9a1febb56203 191 }
kgills 0:9a1febb56203 192
kgills 0:9a1febb56203 193 return checkTemperature(tempCx10);
kgills 0:9a1febb56203 194 }
kgills 0:9a1febb56203 195
kgills 0:9a1febb56203 196 //******************************************************************************
kgills 0:9a1febb56203 197 int Si7020::getTemperature(float *tempC)
kgills 0:9a1febb56203 198 {
kgills 0:9a1febb56203 199 if (i2c_->write(I2C_ADDR, cmd_meas_temp, sizeof(cmd_meas_temp)) != 0) {
kgills 0:9a1febb56203 200 return -1;
kgills 0:9a1febb56203 201 }
kgills 0:9a1febb56203 202
kgills 0:9a1febb56203 203 return checkTemperature(tempC);
kgills 0:9a1febb56203 204 }
kgills 0:9a1febb56203 205
kgills 0:9a1febb56203 206 //******************************************************************************
kgills 0:9a1febb56203 207 int Si7020::startTemperature(void)
kgills 0:9a1febb56203 208 {
kgills 0:9a1febb56203 209 if (i2c_->write(I2C_ADDR, cmd_meas_temp_no_hold, sizeof(cmd_meas_temp_no_hold)) != 0) {
kgills 0:9a1febb56203 210 return -1;
kgills 0:9a1febb56203 211 }
kgills 0:9a1febb56203 212
kgills 0:9a1febb56203 213 return 0;
kgills 0:9a1febb56203 214 }
kgills 0:9a1febb56203 215
kgills 0:9a1febb56203 216 //******************************************************************************
kgills 0:9a1febb56203 217 int Si7020::checkTemperature(int16_t *tempCx10)
kgills 0:9a1febb56203 218 {
kgills 0:9a1febb56203 219 char data[3];
kgills 0:9a1febb56203 220 uint16_t code;
kgills 0:9a1febb56203 221 int temp;
kgills 0:9a1febb56203 222
kgills 0:9a1febb56203 223 if (i2c_->read(I2C_ADDR, data, 3) != 0) {
kgills 0:9a1febb56203 224 return -1;
kgills 0:9a1febb56203 225 }
kgills 0:9a1febb56203 226
kgills 0:9a1febb56203 227 // Get 16-bit value from bytes read
kgills 0:9a1febb56203 228 code = ((uint16_t)data[0] << 8) + data[1];
kgills 0:9a1febb56203 229
kgills 0:9a1febb56203 230 // Calculate the temperature using the formula from the datasheet
kgills 0:9a1febb56203 231 // Scaled by 100
kgills 0:9a1febb56203 232 temp = ((((int)17572 * code) + 0x8000) >> 16) - 4685;
kgills 0:9a1febb56203 233
kgills 0:9a1febb56203 234 // Return value is to be scaled by 10
kgills 0:9a1febb56203 235 *tempCx10 = (temp + 5) / 10;
kgills 0:9a1febb56203 236
kgills 0:9a1febb56203 237 return 0;
kgills 0:9a1febb56203 238 }
kgills 0:9a1febb56203 239
kgills 0:9a1febb56203 240 //******************************************************************************
kgills 0:9a1febb56203 241 int Si7020::checkTemperature(float *tempC)
kgills 0:9a1febb56203 242 {
kgills 0:9a1febb56203 243 char data[3];
kgills 0:9a1febb56203 244 uint16_t code;
kgills 0:9a1febb56203 245
kgills 0:9a1febb56203 246 if (i2c_->read(I2C_ADDR, data, 3) != 0) {
kgills 0:9a1febb56203 247 return -1;
kgills 0:9a1febb56203 248 }
kgills 0:9a1febb56203 249
kgills 0:9a1febb56203 250 // Get 16-bit value from bytes read
kgills 0:9a1febb56203 251 code = ((uint16_t)data[0] << 8) + data[1];
kgills 0:9a1febb56203 252
kgills 0:9a1febb56203 253 // Calculate the temperature using the formula from the datasheet
kgills 0:9a1febb56203 254 // Scaled by 100
kgills 0:9a1febb56203 255 *tempC = (((float)175.72 * code) / 65536) - 46.85;
kgills 0:9a1febb56203 256
kgills 0:9a1febb56203 257 return 0;
kgills 0:9a1febb56203 258 }
kgills 0:9a1febb56203 259
kgills 0:9a1febb56203 260 //******************************************************************************
kgills 0:9a1febb56203 261 int Si7020::getHumidity(int16_t *humidx10)
kgills 0:9a1febb56203 262 {
kgills 0:9a1febb56203 263 if (i2c_->write(I2C_ADDR, cmd_meas_humid, sizeof(cmd_meas_humid), true) != 0) {
kgills 0:9a1febb56203 264 return -1;
kgills 0:9a1febb56203 265 }
kgills 0:9a1febb56203 266
kgills 0:9a1febb56203 267 return checkHumidity(humidx10);
kgills 0:9a1febb56203 268 }
kgills 0:9a1febb56203 269
kgills 0:9a1febb56203 270 //******************************************************************************
kgills 0:9a1febb56203 271 int Si7020::getHumidity(float *humid)
kgills 0:9a1febb56203 272 {
kgills 0:9a1febb56203 273 if (i2c_->write(I2C_ADDR, cmd_meas_humid, sizeof(cmd_meas_humid)) != 0) {
kgills 0:9a1febb56203 274 return -1;
kgills 0:9a1febb56203 275 }
kgills 0:9a1febb56203 276
kgills 0:9a1febb56203 277 return checkHumidity(humid);
kgills 0:9a1febb56203 278 }
kgills 0:9a1febb56203 279
kgills 0:9a1febb56203 280 //******************************************************************************
kgills 0:9a1febb56203 281 int Si7020::startHumidity(void)
kgills 0:9a1febb56203 282 {
kgills 0:9a1febb56203 283 if (i2c_->write(I2C_ADDR, cmd_meas_humid_no_hold, sizeof(cmd_meas_humid_no_hold)) != 0) {
kgills 0:9a1febb56203 284 return -1;
kgills 0:9a1febb56203 285 }
kgills 0:9a1febb56203 286
kgills 0:9a1febb56203 287 return 0;
kgills 0:9a1febb56203 288 }
kgills 0:9a1febb56203 289
kgills 0:9a1febb56203 290 //******************************************************************************
kgills 0:9a1febb56203 291 int Si7020::checkHumidity(int16_t *humidx10)
kgills 0:9a1febb56203 292 {
kgills 0:9a1febb56203 293 char data[3];
kgills 0:9a1febb56203 294 uint16_t code;
kgills 0:9a1febb56203 295
kgills 0:9a1febb56203 296 if (i2c_->read(I2C_ADDR, data, 3) != 0) {
kgills 0:9a1febb56203 297 return -1;
kgills 0:9a1febb56203 298 }
kgills 0:9a1febb56203 299
kgills 0:9a1febb56203 300 // Get 16-bit value from bytes read
kgills 0:9a1febb56203 301 code = ((uint16_t)data[0] << 8) + data[1];
kgills 0:9a1febb56203 302
kgills 0:9a1febb56203 303 // Calculate the humidity using the formula from the datasheet
kgills 0:9a1febb56203 304 // Scaled by 10
kgills 0:9a1febb56203 305 *humidx10 = ((((int)1250 * code) + 0x8000) >> 16) - 60;
kgills 0:9a1febb56203 306
kgills 0:9a1febb56203 307 // Check the crc
kgills 0:9a1febb56203 308 char crc = crc8(data[0], 0x00);
kgills 0:9a1febb56203 309 crc = crc8(data[1], crc);
kgills 0:9a1febb56203 310 if(crc != data[2]) {
kgills 0:9a1febb56203 311 return -1;
kgills 0:9a1febb56203 312 }
kgills 0:9a1febb56203 313
kgills 0:9a1febb56203 314 return 0;
kgills 0:9a1febb56203 315 }
kgills 0:9a1febb56203 316
kgills 0:9a1febb56203 317 //******************************************************************************
kgills 0:9a1febb56203 318 int Si7020::checkHumidity(float *humid)
kgills 0:9a1febb56203 319 {
kgills 0:9a1febb56203 320 char data[3];
kgills 0:9a1febb56203 321 uint16_t code;
kgills 0:9a1febb56203 322
kgills 0:9a1febb56203 323 if (i2c_->read(I2C_ADDR, data, 3) != 0) {
kgills 0:9a1febb56203 324 return -1;
kgills 0:9a1febb56203 325 }
kgills 0:9a1febb56203 326
kgills 0:9a1febb56203 327 // Get 16-bit value from bytes read
kgills 0:9a1febb56203 328 code = ((uint16_t)data[0] << 8) + data[1];
kgills 0:9a1febb56203 329
kgills 0:9a1febb56203 330 // Calculate the humidity using the formula from the datasheet
kgills 0:9a1febb56203 331 *humid = (((float)125 * code) / 65536) - 6;
kgills 0:9a1febb56203 332
kgills 0:9a1febb56203 333 return 0;
kgills 0:9a1febb56203 334 }
kgills 0:9a1febb56203 335
kgills 0:9a1febb56203 336 //******************************************************************************
kgills 0:9a1febb56203 337 int Si7020::getPrevTemperature(float *tempC) {
kgills 0:9a1febb56203 338
kgills 0:9a1febb56203 339 if (i2c_->write(I2C_ADDR, cmd_meas_prev_temp, sizeof(cmd_meas_prev_temp)) != 0) {
kgills 0:9a1febb56203 340 return -1;
kgills 0:9a1febb56203 341 }
kgills 0:9a1febb56203 342
kgills 0:9a1febb56203 343 if(checkTemperature(tempC) != 0) {
kgills 0:9a1febb56203 344 return -1;
kgills 0:9a1febb56203 345 }
kgills 0:9a1febb56203 346
kgills 0:9a1febb56203 347 return 0;
kgills 0:9a1febb56203 348 }
kgills 0:9a1febb56203 349
kgills 0:9a1febb56203 350 //******************************************************************************
kgills 0:9a1febb56203 351 int Si7020::getPrevTemperature(int16_t *tempCx10) {
kgills 0:9a1febb56203 352
kgills 0:9a1febb56203 353 if (i2c_->write(I2C_ADDR, cmd_meas_prev_temp, sizeof(cmd_meas_prev_temp)) != 0) {
kgills 0:9a1febb56203 354 return -1;
kgills 0:9a1febb56203 355 }
kgills 0:9a1febb56203 356
kgills 0:9a1febb56203 357 if(checkTemperature(tempCx10) != 0) {
kgills 0:9a1febb56203 358 return -1;
kgills 0:9a1febb56203 359 }
kgills 0:9a1febb56203 360
kgills 0:9a1febb56203 361 return 0;
kgills 0:9a1febb56203 362 }
kgills 0:9a1febb56203 363
kgills 0:9a1febb56203 364 //******************************************************************************
kgills 0:9a1febb56203 365 int Si7020::getRev(char *rev)
kgills 0:9a1febb56203 366 {
kgills 0:9a1febb56203 367 if (i2c_->write(I2C_ADDR, cmd_fw_ver, sizeof(cmd_fw_ver)) != 0) {
kgills 0:9a1febb56203 368 return -1;
kgills 0:9a1febb56203 369 }
kgills 0:9a1febb56203 370
kgills 0:9a1febb56203 371 if (i2c_->read(I2C_ADDR, rev, 1) != 0) {
kgills 0:9a1febb56203 372 return -1;
kgills 0:9a1febb56203 373 }
kgills 0:9a1febb56203 374
kgills 0:9a1febb56203 375 return 0;
kgills 0:9a1febb56203 376 }
kgills 0:9a1febb56203 377
kgills 0:9a1febb56203 378 //******************************************************************************
kgills 0:9a1febb56203 379 int Si7020::heater(bool enable)
kgills 0:9a1febb56203 380 {
kgills 0:9a1febb56203 381 char data[2];
kgills 0:9a1febb56203 382
kgills 0:9a1febb56203 383 if (i2c_->write(I2C_ADDR, cmd_read_user1, sizeof(cmd_read_user1)) != 0) {
kgills 0:9a1febb56203 384 return -1;
kgills 0:9a1febb56203 385 }
kgills 0:9a1febb56203 386
kgills 0:9a1febb56203 387 if (i2c_->read(I2C_ADDR, &data[1], 1) != 0) {
kgills 0:9a1febb56203 388 return -1;
kgills 0:9a1febb56203 389 }
kgills 0:9a1febb56203 390
kgills 0:9a1febb56203 391 if (enable) {
kgills 0:9a1febb56203 392 data[1] |= 0x04;
kgills 0:9a1febb56203 393 } else {
kgills 0:9a1febb56203 394 data[1] &= ~0x04;
kgills 0:9a1febb56203 395 }
kgills 0:9a1febb56203 396
kgills 0:9a1febb56203 397 data[0] = cmd_write_user1[0];
kgills 0:9a1febb56203 398
kgills 0:9a1febb56203 399 if (i2c_->write(I2C_ADDR, data, 2) != 0) {
kgills 0:9a1febb56203 400 return -1;
kgills 0:9a1febb56203 401 }
kgills 0:9a1febb56203 402
kgills 0:9a1febb56203 403 return 0;
kgills 0:9a1febb56203 404 }
kgills 0:9a1febb56203 405
kgills 0:9a1febb56203 406 //******************************************************************************
kgills 0:9a1febb56203 407 char Si7020::crc8(char value, char seed)
kgills 0:9a1febb56203 408 {
kgills 0:9a1febb56203 409 int i;
kgills 0:9a1febb56203 410
kgills 0:9a1febb56203 411 for (i = 0; i < 8; i++) {
kgills 0:9a1febb56203 412
kgills 0:9a1febb56203 413 if ((value ^ seed) & 0x80) {
kgills 0:9a1febb56203 414 seed <<= 1;
kgills 0:9a1febb56203 415 seed ^= POLYVAL;
kgills 0:9a1febb56203 416 } else {
kgills 0:9a1febb56203 417 seed <<= 1;
kgills 0:9a1febb56203 418 }
kgills 0:9a1febb56203 419
kgills 0:9a1febb56203 420 value <<= 1;
kgills 0:9a1febb56203 421 }
kgills 0:9a1febb56203 422
kgills 0:9a1febb56203 423 return seed;
kgills 0:9a1febb56203 424 }