Steve Martin / libdev_si7021
Committer:
ninensei
Date:
Tue Sep 12 17:17:03 2017 +0000
Revision:
0:9909c9c7d326
Initial driver release

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ninensei 0:9909c9c7d326 1 #include "si7021.h"
ninensei 0:9909c9c7d326 2
ninensei 0:9909c9c7d326 3 #define SI7021A20_I2C_ADDR 0x80
ninensei 0:9909c9c7d326 4
ninensei 0:9909c9c7d326 5 #define SI7021A20_CMD_MEAS_RH_HMM 0xE5
ninensei 0:9909c9c7d326 6 #define SI7021A20_CMD_MEAS_RH_NHMM 0xF5
ninensei 0:9909c9c7d326 7 #define SI7021A20_CMD_MEAS_TEMP_HMM 0xE3
ninensei 0:9909c9c7d326 8 #define SI7021A20_CMD_MEAS_TEMP_NHMM 0xF3
ninensei 0:9909c9c7d326 9 #define SI7021A20_CMD_READ_TEMP 0xE0
ninensei 0:9909c9c7d326 10 #define SI7021A20_CMD_RESET 0xFE
ninensei 0:9909c9c7d326 11 #define SI7021A20_CMD_WRITE_USER1 0xE6
ninensei 0:9909c9c7d326 12 #define SI7021A20_CMD_WRITE_USER2 0xE7
ninensei 0:9909c9c7d326 13 #define SI7021A20_CMD_WRITE_HEAT_CTRL 0x51
ninensei 0:9909c9c7d326 14 #define SI7021A20_CMD_READ_HEAT_CTRL 0x11
ninensei 0:9909c9c7d326 15 #define SI7021A20_CMD_READ_ID1 0xFA0F
ninensei 0:9909c9c7d326 16 #define SI7021A20_CMD_READ_ID2 0xFCC9
ninensei 0:9909c9c7d326 17 #define SI7021A20_REGF_ID2_DEV_ID 0x15
ninensei 0:9909c9c7d326 18 #define SI7021A20_CMD_READ_FW_REV 0x84B8
ninensei 0:9909c9c7d326 19
ninensei 0:9909c9c7d326 20 bool SI7021::_i2c_transfer(int address, void * buff, size_t write_size, size_t read_size)
ninensei 0:9909c9c7d326 21 {
ninensei 0:9909c9c7d326 22 bool ok;
ninensei 0:9909c9c7d326 23 bool expect_response = (read_size != 0);
ninensei 0:9909c9c7d326 24
ninensei 0:9909c9c7d326 25 ok = !_i2c->write(address, (char*)buff, write_size, expect_response);
ninensei 0:9909c9c7d326 26 if (ok && expect_response)
ninensei 0:9909c9c7d326 27 ok = !_i2c->read(address, (char*)buff, read_size);
ninensei 0:9909c9c7d326 28
ninensei 0:9909c9c7d326 29 return ok;
ninensei 0:9909c9c7d326 30 }
ninensei 0:9909c9c7d326 31
ninensei 0:9909c9c7d326 32 /*
ninensei 0:9909c9c7d326 33 bool SI7021::_validate(void)
ninensei 0:9909c9c7d326 34 {
ninensei 0:9909c9c7d326 35 bool ok;
ninensei 0:9909c9c7d326 36 uint8_t buff[4];
ninensei 0:9909c9c7d326 37
ninensei 0:9909c9c7d326 38 buff[0] = (uint8_t)(SI7021A20_CMD_READ_ID2 >> 8);
ninensei 0:9909c9c7d326 39 buff[1] = (uint8_t)(SI7021A20_CMD_READ_ID2);
ninensei 0:9909c9c7d326 40
ninensei 0:9909c9c7d326 41 ok = (i2c_transfer(SI7021A20_I2C_ADDR, buff, 2, 1)) &&
ninensei 0:9909c9c7d326 42 (SI7021A20_REGF_ID2_DEV_ID == buff[0]);
ninensei 0:9909c9c7d326 43
ninensei 0:9909c9c7d326 44 return ok;
ninensei 0:9909c9c7d326 45 }
ninensei 0:9909c9c7d326 46 */
ninensei 0:9909c9c7d326 47
ninensei 0:9909c9c7d326 48 bool SI7021::read(si7021_measurements_t * data) {
ninensei 0:9909c9c7d326 49 bool ok;
ninensei 0:9909c9c7d326 50 union {
ninensei 0:9909c9c7d326 51 char cmd;
ninensei 0:9909c9c7d326 52 struct {
ninensei 0:9909c9c7d326 53 uint8_t meas_msb;
ninensei 0:9909c9c7d326 54 uint8_t meas_lsb;
ninensei 0:9909c9c7d326 55 };
ninensei 0:9909c9c7d326 56 } buff;
ninensei 0:9909c9c7d326 57
ninensei 0:9909c9c7d326 58 buff.cmd = SI7021A20_CMD_MEAS_RH_HMM;
ninensei 0:9909c9c7d326 59 ok = (_i2c_transfer(SI7021A20_I2C_ADDR, &buff, 1, 2));
ninensei 0:9909c9c7d326 60 if (ok) {
ninensei 0:9909c9c7d326 61 // Humidity% = measurement * 125/65536 - 6
ninensei 0:9909c9c7d326 62 int meas_raw = ((int)buff.meas_msb << 8) + buff.meas_lsb;
ninensei 0:9909c9c7d326 63 data->humidity_PR = (float)meas_raw * (125.0F/65536.0F) - 6.0F;
ninensei 0:9909c9c7d326 64 // data->humidity = meas_raw / 2 - 1573;
ninensei 0:9909c9c7d326 65 // data->humidity_norm = 262;
ninensei 0:9909c9c7d326 66 // printf("<humidityH/r = %f/%d>", Humidity, meas_raw);
ninensei 0:9909c9c7d326 67
ninensei 0:9909c9c7d326 68 buff.cmd = SI7021A20_CMD_READ_TEMP;
ninensei 0:9909c9c7d326 69 ok = _i2c_transfer(SI7021A20_I2C_ADDR, &buff, 1, 2);
ninensei 0:9909c9c7d326 70 }
ninensei 0:9909c9c7d326 71 if (ok) {
ninensei 0:9909c9c7d326 72 // TempC = measurement * 175.72/65536 - 46.85
ninensei 0:9909c9c7d326 73 int meas_raw = ((int)buff.meas_msb << 8) + buff.meas_lsb;
ninensei 0:9909c9c7d326 74 data->temp_C = meas_raw * (175.72/65536.0) - 46.85;
ninensei 0:9909c9c7d326 75 // data->temp = meas_raw / 2 - 8736;
ninensei 0:9909c9c7d326 76 // data->temp_norm = 186;
ninensei 0:9909c9c7d326 77 // printf("<tempC/F/r = %f/%f/%d>", Temp, Temp * 9 / 5 + 32, meas_raw);
ninensei 0:9909c9c7d326 78 }
ninensei 0:9909c9c7d326 79 return ok;
ninensei 0:9909c9c7d326 80 }