KM3NeT CLB  2.0
KM3NeT CLB v2 Embedded Software
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
sht21.c
1 /*
2  * KM3NeT CLB v2 Firmware
3  * ----------------------
4  *
5  * Copyright 2013 KM3NeT Collaboration
6  *
7  * All Rights Reserved.
8  *
9  *
10  * File : ahrs.c
11  * Created : 18 jun. 2013
12  * Author : Antonio Orzelli
13  * Modified: Simone Biagi
14  */
15 
16 
17 #include <stdio.h>
18 
19 #include "drv/i2c/sht21.h"
20 #include "drv/wb/i2c.h"
21 #include "kernel/err.h"
22 
23 /**
24  * Define Commands for SHT21 - NO hold master mode (see datasheet).
25  */
26 #define SHT21_TRIGGER_T_MEAS 0xF3 ///< Start of a temperature measurement
27 #define SHT21_TRIGGER_RH_MEAS 0xF5 ///< Start of a relative humidity measurement
28 
29 /**
30  * Define Commands for SHT21 - hold master mode (see datasheet).
31  */
32 #define SHT21_T_MEAS 0xE3 ///< Start of a temperature measurement
33 #define SHT21_RH_MEAS 0xE5 ///< Start of a relative humidity measurement
34 
35 
36 
37 bool sht21StartTempMeas(I2C_Device * dev, uint8_t addr)
38 {
39 
40  uint8_t data;
41 
42  data = SHT21_TRIGGER_T_MEAS;
43 
44  return errCondRebase(i2cWrite(dev, addr, &data, 1), "SHT21");
45 }
46 
47 static int convToC(uint8_t * data) {
48 
49  int32_t myval;
50  // conversion of the temperature:
51  // T = -46.85 + 175.72 * (St / 2^16)
52  myval = (data[0] << 8) + data[1];
53  myval *= 17572;
54  myval = myval >> 16;
55  myval -= 4685;
56  return (int)(myval);
57 
58 }
59 
60 
61 bool sht21ReadTemp(I2C_Device * dev, uint8_t addr, int * answer)
62 {
63 
64  uint8_t myansw[2];
65 
66  if (!i2cRead(dev, addr, myansw, sizeof(myansw))){
67  return errRebase("SHT21");
68  }
69 
70 
71  *answer = convToC(myansw);
72 
73  return true;
74 }
75 
76 bool sht21Temp(I2C_Device * dev, uint8_t addr, int * answer)
77 {
78 
79  uint8_t data;
80  uint8_t myansw[2];
81 
82  data = SHT21_T_MEAS;
83 
84  if (!i2cWrite(dev, addr, &data, 1)){
85  return errRebase("SHT21");
86  }
87 
88  if(!i2cRead(dev, addr, myansw, sizeof(myansw))){
89  return errRebase("SHT21");
90  }
91 
92 
93  //*answer = (int)(myval / 10);
94  *answer = convToC(myansw);
95 
96  return true;
97 }
98 
99 
100 bool sht21StartHumidMeas(I2C_Device * dev, uint8_t addr)
101 {
102 
103  uint8_t data;
104 
105  data = SHT21_TRIGGER_RH_MEAS;
106 
107  return errCondRebase(i2cWrite(dev, addr, &data, 1), "SHT21");
108 }
109 
110 static int convToHum(uint8_t * data) {
111 
112 
113  // conversion of the relative humidity:
114  // RH = -6 + 125 * (St / 2^16)
115  uint32_t myval;
116  myval = (data[0] << 8) + data[1];
117  myval *= 12500;
118  myval = myval >> 16;
119  myval -= 600;
120  return (int)(myval);
121 
122 }
123 
124 bool sht21ReadHumid(I2C_Device * dev, uint8_t addr, int * answer)
125 {
126 
127  uint8_t myansw[2];
128 
129 
130  if (!i2cRead(dev, addr, myansw, sizeof(myansw))){
131  return errRebase("SHT21");
132  }
133 
134  *answer = convToHum(myansw);
135 
136  return true;
137 }
138 
139 bool sht21Humi(I2C_Device * dev, uint8_t addr, int * answer)
140 {
141 
142  uint8_t data;
143  uint8_t myansw[2];
144 
145  data = SHT21_RH_MEAS;
146 
147  if (!i2cWrite(dev, addr, &data, 1)){
148  return errRebase("SHT21");
149  }
150 
151  if (!i2cRead(dev, addr, myansw, sizeof(myansw))){
152  return errRebase("SHT21");
153  }
154 
155  *answer = convToHum(myansw);
156 
157  return true;
158 }
bool i2cWrite(I2C_Device *dev, i2cAddr addr, uint8_t *bytes, int len)
Writes to the I2C device.
Definition: i2c.c:219
bool sht21Humi(I2C_Device *dev, uint8_t addr, int *answer)
Starts and reads the relative humidity from SHT21 at I2C address &#39;addr&#39; (hold master mode); puts the ...
Definition: sht21.c:139
Structure defines OpenCores I2C Device.
Definition: dev_i2c.h:55
bool sht21Temp(I2C_Device *dev, uint8_t addr, int *answer)
Starts and reads the temperatures from SHT21 at I2C address &#39;addr&#39; (hold master mode); puts the resul...
Definition: sht21.c:76
bool sht21ReadTemp(I2C_Device *dev, uint8_t addr, int *answer)
Reads the temperatures from SHT21 at I2C address &#39;addr&#39;; puts the result in answer.
Definition: sht21.c:61
static bool errCondRebase(bool err, const char *name)
Transparent conditional error rebase.
Definition: err.h:117
bool sht21ReadHumid(I2C_Device *dev, uint8_t addr, int *answer)
Reads the relative humidity from SHT21 at I2C address &#39;addr&#39;; puts the result in answer.
Definition: sht21.c:124
Manages the global system error.
This driver is to read the SHT21 I2C temperature and humidity sensor.
bool i2cRead(I2C_Device *dev, i2cAddr addr, uint8_t *bytes, int len)
Reads from the I2C device.
Definition: i2c.c:161
static bool errRebase(const char *name)
Rebases the cause of the error message.
Definition: err.h:104
bool sht21StartTempMeas(I2C_Device *dev, uint8_t addr)
Starts the temperature measurement in the SHT21 module at I2C address &#39;addr&#39;.
Definition: sht21.c:37
bool sht21StartHumidMeas(I2C_Device *dev, uint8_t addr)
Starts the relative humidity measurement in the SHT21 module at I2C address &#39;addr&#39;.
Definition: sht21.c:100
OpenCores I2C device driver.