User | Revision | Line number | New contents of line |
mcm |
1:fc952e73a23e
|
1
|
/**
|
mcm |
1:fc952e73a23e
|
2
|
* @brief DS1624.h
|
mcm |
1:fc952e73a23e
|
3
|
* @details Digital Thermometer and Memory.
|
mcm |
1:fc952e73a23e
|
4
|
* Function file.
|
mcm |
1:fc952e73a23e
|
5
|
*
|
mcm |
1:fc952e73a23e
|
6
|
*
|
mcm |
1:fc952e73a23e
|
7
|
* @return NA
|
mcm |
1:fc952e73a23e
|
8
|
*
|
mcm |
1:fc952e73a23e
|
9
|
* @author Manuel Caballero
|
mcm |
1:fc952e73a23e
|
10
|
* @date 31/January/2018
|
mcm |
1:fc952e73a23e
|
11
|
* @version 31/January/2018 The ORIGIN
|
mcm |
1:fc952e73a23e
|
12
|
* @pre NaN.
|
mcm |
1:fc952e73a23e
|
13
|
* @warning NaN
|
mcm |
1:fc952e73a23e
|
14
|
* @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
|
mcm |
1:fc952e73a23e
|
15
|
*/
|
mcm |
1:fc952e73a23e
|
16
|
|
mcm |
1:fc952e73a23e
|
17
|
#include "DS1624.h"
|
mcm |
1:fc952e73a23e
|
18
|
|
mcm |
1:fc952e73a23e
|
19
|
|
mcm |
1:fc952e73a23e
|
20
|
DS1624::DS1624 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq )
|
mcm |
1:fc952e73a23e
|
21
|
: _i2c ( sda, scl )
|
mcm |
1:fc952e73a23e
|
22
|
, _DS1624_Addr ( addr )
|
mcm |
1:fc952e73a23e
|
23
|
{
|
mcm |
1:fc952e73a23e
|
24
|
_i2c.frequency( freq );
|
mcm |
1:fc952e73a23e
|
25
|
}
|
mcm |
1:fc952e73a23e
|
26
|
|
mcm |
1:fc952e73a23e
|
27
|
|
mcm |
1:fc952e73a23e
|
28
|
DS1624::~DS1624()
|
mcm |
1:fc952e73a23e
|
29
|
{
|
mcm |
1:fc952e73a23e
|
30
|
}
|
mcm |
1:fc952e73a23e
|
31
|
|
mcm |
1:fc952e73a23e
|
32
|
|
mcm |
1:fc952e73a23e
|
33
|
|
mcm |
1:fc952e73a23e
|
34
|
/**
|
mcm |
1:fc952e73a23e
|
35
|
* @brief DS1624_StartConvertTemperature ( void )
|
mcm |
1:fc952e73a23e
|
36
|
*
|
mcm |
1:fc952e73a23e
|
37
|
* @details It triggers a new temperature conversion.
|
mcm |
1:fc952e73a23e
|
38
|
*
|
mcm |
1:fc952e73a23e
|
39
|
* @param[in] N/A.
|
mcm |
1:fc952e73a23e
|
40
|
*
|
mcm |
1:fc952e73a23e
|
41
|
* @param[out] N/A.
|
mcm |
1:fc952e73a23e
|
42
|
*
|
mcm |
1:fc952e73a23e
|
43
|
*
|
mcm |
1:fc952e73a23e
|
44
|
* @return Status of DS1624_StartConvertTemperature.
|
mcm |
1:fc952e73a23e
|
45
|
*
|
mcm |
1:fc952e73a23e
|
46
|
*
|
mcm |
1:fc952e73a23e
|
47
|
* @author Manuel Caballero
|
mcm |
1:fc952e73a23e
|
48
|
* @date 31/January/2018
|
mcm |
1:fc952e73a23e
|
49
|
* @version 31/January/2018 The ORIGIN
|
mcm |
1:fc952e73a23e
|
50
|
* @pre Temperature Conversion Time ( t_TC ) 200ms maximum.
|
mcm |
1:fc952e73a23e
|
51
|
* @warning N/A.
|
mcm |
1:fc952e73a23e
|
52
|
*/
|
mcm |
1:fc952e73a23e
|
53
|
DS1624::DS1624_status_t DS1624::DS1624_StartConvertTemperature ( void )
|
mcm |
1:fc952e73a23e
|
54
|
{
|
mcm |
1:fc952e73a23e
|
55
|
char cmd = DS1624_START_CONVERT_T;
|
mcm |
1:fc952e73a23e
|
56
|
uint32_t aux = 0;
|
mcm |
1:fc952e73a23e
|
57
|
|
mcm |
1:fc952e73a23e
|
58
|
|
mcm |
1:fc952e73a23e
|
59
|
// It triggers a new temperature conversion
|
mcm |
1:fc952e73a23e
|
60
|
aux = _i2c.write ( _DS1624_Addr, &cmd, 1, false );
|
mcm |
1:fc952e73a23e
|
61
|
|
mcm |
1:fc952e73a23e
|
62
|
|
mcm |
1:fc952e73a23e
|
63
|
|
mcm |
1:fc952e73a23e
|
64
|
|
mcm |
1:fc952e73a23e
|
65
|
if ( aux == I2C_SUCCESS )
|
mcm |
1:fc952e73a23e
|
66
|
return DS1624_SUCCESS;
|
mcm |
1:fc952e73a23e
|
67
|
else
|
mcm |
1:fc952e73a23e
|
68
|
return DS1624_FAILURE;
|
mcm |
1:fc952e73a23e
|
69
|
}
|
mcm |
1:fc952e73a23e
|
70
|
|
mcm |
1:fc952e73a23e
|
71
|
|
mcm |
1:fc952e73a23e
|
72
|
/**
|
mcm |
1:fc952e73a23e
|
73
|
* @brief DS1624_StopConvertTemperature ( void )
|
mcm |
1:fc952e73a23e
|
74
|
*
|
mcm |
1:fc952e73a23e
|
75
|
* @details It halts the temperature conversion.
|
mcm |
1:fc952e73a23e
|
76
|
*
|
mcm |
1:fc952e73a23e
|
77
|
* @param[in] N/A.
|
mcm |
1:fc952e73a23e
|
78
|
*
|
mcm |
1:fc952e73a23e
|
79
|
* @param[out] N/A.
|
mcm |
1:fc952e73a23e
|
80
|
*
|
mcm |
1:fc952e73a23e
|
81
|
*
|
mcm |
1:fc952e73a23e
|
82
|
* @return Status of DS1624_StopConvertTemperature.
|
mcm |
1:fc952e73a23e
|
83
|
*
|
mcm |
1:fc952e73a23e
|
84
|
*
|
mcm |
1:fc952e73a23e
|
85
|
* @author Manuel Caballero
|
mcm |
1:fc952e73a23e
|
86
|
* @date 31/January/2018
|
mcm |
1:fc952e73a23e
|
87
|
* @version 31/January/2018 The ORIGIN
|
mcm |
1:fc952e73a23e
|
88
|
* @pre In continuous conversion mode, a StopConvertT command halt
|
mcm |
1:fc952e73a23e
|
89
|
* a continuous conversion. To restart, the StartConvertT
|
mcm |
1:fc952e73a23e
|
90
|
* command must be issued. In one-shot mode, a StartConvertT command
|
mcm |
1:fc952e73a23e
|
91
|
* must be issued for every temperature reading desired.
|
mcm |
1:fc952e73a23e
|
92
|
* @warning N/A.
|
mcm |
1:fc952e73a23e
|
93
|
*/
|
mcm |
1:fc952e73a23e
|
94
|
DS1624::DS1624_status_t DS1624::DS1624_StopConvertTemperature ( void )
|
mcm |
1:fc952e73a23e
|
95
|
{
|
mcm |
1:fc952e73a23e
|
96
|
char cmd = DS1624_STOP_CONVERT_T;
|
mcm |
1:fc952e73a23e
|
97
|
uint32_t aux = 0;
|
mcm |
1:fc952e73a23e
|
98
|
|
mcm |
1:fc952e73a23e
|
99
|
|
mcm |
1:fc952e73a23e
|
100
|
// It sends the command
|
mcm |
1:fc952e73a23e
|
101
|
aux = _i2c.write ( _DS1624_Addr, &cmd, 1, false );
|
mcm |
1:fc952e73a23e
|
102
|
|
mcm |
1:fc952e73a23e
|
103
|
|
mcm |
1:fc952e73a23e
|
104
|
|
mcm |
1:fc952e73a23e
|
105
|
|
mcm |
1:fc952e73a23e
|
106
|
if ( aux == I2C_SUCCESS )
|
mcm |
1:fc952e73a23e
|
107
|
return DS1624_SUCCESS;
|
mcm |
1:fc952e73a23e
|
108
|
else
|
mcm |
1:fc952e73a23e
|
109
|
return DS1624_FAILURE;
|
mcm |
1:fc952e73a23e
|
110
|
}
|
mcm |
1:fc952e73a23e
|
111
|
|
mcm |
1:fc952e73a23e
|
112
|
|
mcm |
1:fc952e73a23e
|
113
|
|
mcm |
1:fc952e73a23e
|
114
|
/**
|
mcm |
1:fc952e73a23e
|
115
|
* @brief DS1624_ReadRawTemperature ( DS1624_vector_data_t* )
|
mcm |
1:fc952e73a23e
|
116
|
*
|
mcm |
1:fc952e73a23e
|
117
|
* @details It reads the last raw temperature conversion result.
|
mcm |
1:fc952e73a23e
|
118
|
*
|
mcm |
1:fc952e73a23e
|
119
|
* @param[in] N/A.
|
mcm |
1:fc952e73a23e
|
120
|
*
|
mcm |
1:fc952e73a23e
|
121
|
* @param[out] myRawTemperature: Raw temperature ( two bytes ).
|
mcm |
1:fc952e73a23e
|
122
|
*
|
mcm |
1:fc952e73a23e
|
123
|
*
|
mcm |
1:fc952e73a23e
|
124
|
* @return Status of DS1624_ReadRawTemperature.
|
mcm |
1:fc952e73a23e
|
125
|
*
|
mcm |
1:fc952e73a23e
|
126
|
*
|
mcm |
1:fc952e73a23e
|
127
|
* @author Manuel Caballero
|
mcm |
1:fc952e73a23e
|
128
|
* @date 31/January/2018
|
mcm |
1:fc952e73a23e
|
129
|
* @version 31/January/2018 The ORIGIN
|
mcm |
1:fc952e73a23e
|
130
|
* @pre DONE bit needs to be checked before calling this function.
|
mcm |
1:fc952e73a23e
|
131
|
* @warning N/A.
|
mcm |
1:fc952e73a23e
|
132
|
*/
|
mcm |
1:fc952e73a23e
|
133
|
DS1624::DS1624_status_t DS1624::DS1624_ReadRawTemperature ( DS1624_vector_data_t* myRawTemperature )
|
mcm |
1:fc952e73a23e
|
134
|
{
|
mcm |
1:fc952e73a23e
|
135
|
char cmd[] = { DS1624_READ_TEMPERATURE, 0 };
|
mcm |
1:fc952e73a23e
|
136
|
uint32_t aux = 0;
|
mcm |
1:fc952e73a23e
|
137
|
|
mcm |
1:fc952e73a23e
|
138
|
|
mcm |
1:fc952e73a23e
|
139
|
|
mcm |
1:fc952e73a23e
|
140
|
// It sends the command and gets the result otherwise
|
mcm |
1:fc952e73a23e
|
141
|
aux = _i2c.write ( _DS1624_Addr, &cmd[0], 1, true );
|
mcm |
1:fc952e73a23e
|
142
|
aux = _i2c.read ( _DS1624_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
|
mcm |
1:fc952e73a23e
|
143
|
|
mcm |
1:fc952e73a23e
|
144
|
|
mcm |
1:fc952e73a23e
|
145
|
// Parse the data
|
mcm |
1:fc952e73a23e
|
146
|
myRawTemperature->MSBTemperature = cmd[0];
|
mcm |
1:fc952e73a23e
|
147
|
myRawTemperature->LSBTemperature = cmd[1];
|
mcm |
1:fc952e73a23e
|
148
|
|
mcm |
1:fc952e73a23e
|
149
|
|
mcm |
1:fc952e73a23e
|
150
|
|
mcm |
1:fc952e73a23e
|
151
|
|
mcm |
1:fc952e73a23e
|
152
|
if ( aux == I2C_SUCCESS )
|
mcm |
1:fc952e73a23e
|
153
|
return DS1624_SUCCESS;
|
mcm |
1:fc952e73a23e
|
154
|
else
|
mcm |
1:fc952e73a23e
|
155
|
return DS1624_FAILURE;
|
mcm |
1:fc952e73a23e
|
156
|
}
|
mcm |
1:fc952e73a23e
|
157
|
|
mcm |
1:fc952e73a23e
|
158
|
|
mcm |
1:fc952e73a23e
|
159
|
|
mcm |
1:fc952e73a23e
|
160
|
/**
|
mcm |
1:fc952e73a23e
|
161
|
* @brief DS1624_ReadTemperature ( DS1624_vector_data_t* )
|
mcm |
1:fc952e73a23e
|
162
|
*
|
mcm |
1:fc952e73a23e
|
163
|
* @details It reads the last current temperature conversion result.
|
mcm |
1:fc952e73a23e
|
164
|
*
|
mcm |
1:fc952e73a23e
|
165
|
* @param[in] N/A.
|
mcm |
1:fc952e73a23e
|
166
|
*
|
mcm |
1:fc952e73a23e
|
167
|
* @param[out] myTemperature: Current temperature.
|
mcm |
1:fc952e73a23e
|
168
|
*
|
mcm |
1:fc952e73a23e
|
169
|
*
|
mcm |
1:fc952e73a23e
|
170
|
* @return Status of DS1624_ReadTemperature.
|
mcm |
1:fc952e73a23e
|
171
|
*
|
mcm |
1:fc952e73a23e
|
172
|
*
|
mcm |
1:fc952e73a23e
|
173
|
* @author Manuel Caballero
|
mcm |
1:fc952e73a23e
|
174
|
* @date 31/January/2018
|
mcm |
1:fc952e73a23e
|
175
|
* @version 31/January/2018 The ORIGIN
|
mcm |
1:fc952e73a23e
|
176
|
* @pre This function updates the raw temperature variables.
|
mcm |
1:fc952e73a23e
|
177
|
* @pre DONE bit needs to be checked before calling this function.
|
mcm |
1:fc952e73a23e
|
178
|
* @warning N/A.
|
mcm |
1:fc952e73a23e
|
179
|
*/
|
mcm |
1:fc952e73a23e
|
180
|
DS1624::DS1624_status_t DS1624::DS1624_ReadTemperature ( DS1624_vector_data_t* myTemperature )
|
mcm |
1:fc952e73a23e
|
181
|
{
|
mcm |
1:fc952e73a23e
|
182
|
char cmd[] = { DS1624_READ_TEMPERATURE, 0 };
|
mcm |
1:fc952e73a23e
|
183
|
uint32_t aux = 0;
|
mcm |
1:fc952e73a23e
|
184
|
uint32_t i = 0;
|
mcm |
1:fc952e73a23e
|
185
|
|
mcm |
1:fc952e73a23e
|
186
|
|
mcm |
1:fc952e73a23e
|
187
|
|
mcm |
1:fc952e73a23e
|
188
|
// It sends the command and gets the result otherwise
|
mcm |
1:fc952e73a23e
|
189
|
aux = _i2c.write ( _DS1624_Addr, &cmd[0], 1, true );
|
mcm |
1:fc952e73a23e
|
190
|
aux = _i2c.read ( _DS1624_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
|
mcm |
1:fc952e73a23e
|
191
|
|
mcm |
1:fc952e73a23e
|
192
|
|
mcm |
1:fc952e73a23e
|
193
|
// Update the raw temperature value
|
mcm |
1:fc952e73a23e
|
194
|
myTemperature->MSBTemperature = cmd[0];
|
mcm |
1:fc952e73a23e
|
195
|
myTemperature->LSBTemperature = cmd[1];
|
mcm |
1:fc952e73a23e
|
196
|
|
mcm |
1:fc952e73a23e
|
197
|
|
mcm |
1:fc952e73a23e
|
198
|
// Calculate the current temperature
|
mcm |
1:fc952e73a23e
|
199
|
// Check if the temperature is positive or negative
|
mcm |
1:fc952e73a23e
|
200
|
if ( ( myTemperature->MSBTemperature & MSB_TEMPERATURE_SIGN_BIT_MASK ) == MSB_TEMPERATURE_SIGN_BIT_NEGATIVE )
|
mcm |
1:fc952e73a23e
|
201
|
{
|
mcm |
1:fc952e73a23e
|
202
|
// The temperature is NEGATIVE
|
mcm |
1:fc952e73a23e
|
203
|
myTemperature->MSBTemperature -= 1;
|
mcm |
1:fc952e73a23e
|
204
|
myTemperature->MSBTemperature = ~myTemperature->MSBTemperature;
|
mcm |
1:fc952e73a23e
|
205
|
|
mcm |
1:fc952e73a23e
|
206
|
myTemperature->LSBTemperature -= 1;
|
mcm |
1:fc952e73a23e
|
207
|
myTemperature->LSBTemperature = ( ~myTemperature->LSBTemperature & 0xF0 );
|
mcm |
1:fc952e73a23e
|
208
|
|
mcm |
1:fc952e73a23e
|
209
|
myTemperature->Temperature = ( -1.0 * myTemperature->MSBTemperature );
|
mcm |
1:fc952e73a23e
|
210
|
}
|
mcm |
1:fc952e73a23e
|
211
|
else
|
mcm |
1:fc952e73a23e
|
212
|
{
|
mcm |
1:fc952e73a23e
|
213
|
// The temperature is POSITIVE
|
mcm |
1:fc952e73a23e
|
214
|
myTemperature->Temperature = myTemperature->MSBTemperature;
|
mcm |
1:fc952e73a23e
|
215
|
}
|
mcm |
1:fc952e73a23e
|
216
|
|
mcm |
1:fc952e73a23e
|
217
|
|
mcm |
1:fc952e73a23e
|
218
|
// Update the decimal value
|
mcm |
1:fc952e73a23e
|
219
|
for ( i = 0; i < ( myTemperature->LSBTemperature >> 4 ); i++ )
|
mcm |
1:fc952e73a23e
|
220
|
myTemperature->Temperature += DS1624_TEMPERATURE_RESOLUTION;
|
mcm |
1:fc952e73a23e
|
221
|
|
mcm |
1:fc952e73a23e
|
222
|
|
mcm |
1:fc952e73a23e
|
223
|
|
mcm |
1:fc952e73a23e
|
224
|
|
mcm |
1:fc952e73a23e
|
225
|
|
mcm |
1:fc952e73a23e
|
226
|
|
mcm |
1:fc952e73a23e
|
227
|
if ( aux == I2C_SUCCESS )
|
mcm |
1:fc952e73a23e
|
228
|
return DS1624_SUCCESS;
|
mcm |
1:fc952e73a23e
|
229
|
else
|
mcm |
1:fc952e73a23e
|
230
|
return DS1624_FAILURE;
|
mcm |
1:fc952e73a23e
|
231
|
}
|
mcm |
1:fc952e73a23e
|
232
|
|
mcm |
1:fc952e73a23e
|
233
|
|
mcm |
1:fc952e73a23e
|
234
|
|
mcm |
1:fc952e73a23e
|
235
|
/**
|
mcm |
1:fc952e73a23e
|
236
|
* @brief DS1624_GetStatusRegister ( DS1624_vector_data_t* )
|
mcm |
1:fc952e73a23e
|
237
|
*
|
mcm |
1:fc952e73a23e
|
238
|
* @details It reads the CONFIGURATION/STATUS register.
|
mcm |
1:fc952e73a23e
|
239
|
*
|
mcm |
1:fc952e73a23e
|
240
|
* @param[in] N/A.
|
mcm |
1:fc952e73a23e
|
241
|
*
|
mcm |
1:fc952e73a23e
|
242
|
* @param[out] myStatusRegister: Current Status register value.
|
mcm |
1:fc952e73a23e
|
243
|
*
|
mcm |
1:fc952e73a23e
|
244
|
*
|
mcm |
1:fc952e73a23e
|
245
|
* @return Status of DS1624_GetStatusRegister.
|
mcm |
1:fc952e73a23e
|
246
|
*
|
mcm |
1:fc952e73a23e
|
247
|
*
|
mcm |
1:fc952e73a23e
|
248
|
* @author Manuel Caballero
|
mcm |
1:fc952e73a23e
|
249
|
* @date 31/January/2018
|
mcm |
1:fc952e73a23e
|
250
|
* @version 31/January/2018 The ORIGIN
|
mcm |
1:fc952e73a23e
|
251
|
* @pre N/A.
|
mcm |
1:fc952e73a23e
|
252
|
* @warning N/A.
|
mcm |
1:fc952e73a23e
|
253
|
*/
|
mcm |
1:fc952e73a23e
|
254
|
DS1624::DS1624_status_t DS1624::DS1624_GetStatusRegister ( DS1624_vector_data_t* myStatusRegister )
|
mcm |
1:fc952e73a23e
|
255
|
{
|
mcm |
1:fc952e73a23e
|
256
|
char cmd = DS1624_ACCESS_CONFIG;
|
mcm |
1:fc952e73a23e
|
257
|
uint32_t aux = 0;
|
mcm |
1:fc952e73a23e
|
258
|
|
mcm |
1:fc952e73a23e
|
259
|
|
mcm |
1:fc952e73a23e
|
260
|
// It sends the command and gets the result
|
mcm |
1:fc952e73a23e
|
261
|
aux = _i2c.write ( _DS1624_Addr, &cmd, 1, true );
|
mcm |
1:fc952e73a23e
|
262
|
aux = _i2c.read ( _DS1624_Addr, &myStatusRegister->Control_Status_Register, 1 );
|
mcm |
1:fc952e73a23e
|
263
|
|
mcm |
1:fc952e73a23e
|
264
|
|
mcm |
1:fc952e73a23e
|
265
|
|
mcm |
1:fc952e73a23e
|
266
|
|
mcm |
1:fc952e73a23e
|
267
|
|
mcm |
1:fc952e73a23e
|
268
|
if ( aux == I2C_SUCCESS )
|
mcm |
1:fc952e73a23e
|
269
|
return DS1624_SUCCESS;
|
mcm |
1:fc952e73a23e
|
270
|
else
|
mcm |
1:fc952e73a23e
|
271
|
return DS1624_FAILURE;
|
mcm |
1:fc952e73a23e
|
272
|
}
|
mcm |
1:fc952e73a23e
|
273
|
|
mcm |
1:fc952e73a23e
|
274
|
|
mcm |
1:fc952e73a23e
|
275
|
|
mcm |
1:fc952e73a23e
|
276
|
/**
|
mcm |
1:fc952e73a23e
|
277
|
* @brief DS1624_SetConversionMode ( DS1624_access_config_1shot_t )
|
mcm |
1:fc952e73a23e
|
278
|
*
|
mcm |
1:fc952e73a23e
|
279
|
* @details It sets 1SHOT/Continuous temperature conversion mode.
|
mcm |
1:fc952e73a23e
|
280
|
*
|
mcm |
1:fc952e73a23e
|
281
|
* @param[in] myConversionMode: ACCESS_CONFIG_1SHOT_ONE_TEMPERATURE_CONVERSION: 1SHOT temperature conversion mode
|
mcm |
1:fc952e73a23e
|
282
|
* ACCESS_CONFIG_1SHOT_CONTINUOUSLY_TEMPERATURE_CONVERSION: Continuous temperature conversion mode.
|
mcm |
1:fc952e73a23e
|
283
|
*
|
mcm |
1:fc952e73a23e
|
284
|
* @param[out] N/A.
|
mcm |
1:fc952e73a23e
|
285
|
*
|
mcm |
1:fc952e73a23e
|
286
|
*
|
mcm |
1:fc952e73a23e
|
287
|
* @return Status of DS1624_SetConversionMode.
|
mcm |
1:fc952e73a23e
|
288
|
*
|
mcm |
1:fc952e73a23e
|
289
|
*
|
mcm |
1:fc952e73a23e
|
290
|
* @author Manuel Caballero
|
mcm |
1:fc952e73a23e
|
291
|
* @date 31/January/2018
|
mcm |
1:fc952e73a23e
|
292
|
* @version 31/January/2018 The ORIGIN
|
mcm |
1:fc952e73a23e
|
293
|
* @pre N/A
|
mcm |
1:fc952e73a23e
|
294
|
* @warning Since the configuration register is implemented in
|
mcm |
1:fc952e73a23e
|
295
|
* EEPROM, writes to the register require 10ms to complete.
|
mcm |
1:fc952e73a23e
|
296
|
* After issuing a command to write to the configuration register,
|
mcm |
1:fc952e73a23e
|
297
|
* no further accesses to the DS1624 should be made for at least 10ms.
|
mcm |
1:fc952e73a23e
|
298
|
*/
|
mcm |
1:fc952e73a23e
|
299
|
DS1624::DS1624_status_t DS1624::DS1624_SetConversionMode ( DS1624_access_config_1shot_t myConversionMode )
|
mcm |
1:fc952e73a23e
|
300
|
{
|
mcm |
1:fc952e73a23e
|
301
|
char cmd[] = { DS1624_ACCESS_CONFIG, 0 };
|
mcm |
1:fc952e73a23e
|
302
|
uint32_t aux = 0;
|
mcm |
1:fc952e73a23e
|
303
|
|
mcm |
1:fc952e73a23e
|
304
|
|
mcm |
1:fc952e73a23e
|
305
|
// It sends the command and gets the result
|
mcm |
1:fc952e73a23e
|
306
|
aux = _i2c.write ( _DS1624_Addr, &cmd[0], 1, true );
|
mcm |
1:fc952e73a23e
|
307
|
aux = _i2c.read ( _DS1624_Addr, &cmd[1], 1 );
|
mcm |
1:fc952e73a23e
|
308
|
|
mcm |
1:fc952e73a23e
|
309
|
|
mcm |
1:fc952e73a23e
|
310
|
// Mask the bit and check which mode to use
|
mcm |
1:fc952e73a23e
|
311
|
cmd[1] &= ~ACCESS_CONFIG_1SHOT_MASK;
|
mcm |
1:fc952e73a23e
|
312
|
|
mcm |
1:fc952e73a23e
|
313
|
if ( myConversionMode == ACCESS_CONFIG_1SHOT_ONE_TEMPERATURE_CONVERSION )
|
mcm |
1:fc952e73a23e
|
314
|
{
|
mcm |
1:fc952e73a23e
|
315
|
// 1SHOT Mode
|
mcm |
1:fc952e73a23e
|
316
|
cmd[1] |= ACCESS_CONFIG_1SHOT_ONE_TEMPERATURE_CONVERSION;
|
mcm |
1:fc952e73a23e
|
317
|
}
|
mcm |
1:fc952e73a23e
|
318
|
else
|
mcm |
1:fc952e73a23e
|
319
|
{
|
mcm |
1:fc952e73a23e
|
320
|
// Continuously Mode
|
mcm |
1:fc952e73a23e
|
321
|
cmd[1] &= ~ACCESS_CONFIG_1SHOT_ONE_TEMPERATURE_CONVERSION;
|
mcm |
1:fc952e73a23e
|
322
|
}
|
mcm |
1:fc952e73a23e
|
323
|
|
mcm |
1:fc952e73a23e
|
324
|
|
mcm |
1:fc952e73a23e
|
325
|
// Update the CONFIGURATION/STATUS register
|
mcm |
1:fc952e73a23e
|
326
|
aux = _i2c.write ( _DS1624_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), false );
|
mcm |
1:fc952e73a23e
|
327
|
|
mcm |
1:fc952e73a23e
|
328
|
|
mcm |
1:fc952e73a23e
|
329
|
|
mcm |
1:fc952e73a23e
|
330
|
|
mcm |
1:fc952e73a23e
|
331
|
if ( aux == I2C_SUCCESS )
|
mcm |
1:fc952e73a23e
|
332
|
return DS1624_SUCCESS;
|
mcm |
1:fc952e73a23e
|
333
|
else
|
mcm |
1:fc952e73a23e
|
334
|
return DS1624_FAILURE;
|
mcm |
1:fc952e73a23e
|
335
|
}
|
mcm |
1:fc952e73a23e
|
336
|
|
mcm |
1:fc952e73a23e
|
337
|
|
mcm |
1:fc952e73a23e
|
338
|
|
mcm |
1:fc952e73a23e
|
339
|
/**
|
mcm |
1:fc952e73a23e
|
340
|
* @brief DS1624_IsTemperatureConversionDone ( DS1624_vector_data_t* )
|
mcm |
1:fc952e73a23e
|
341
|
*
|
mcm |
1:fc952e73a23e
|
342
|
* @details It checks if a temperature conversion is done.
|
mcm |
1:fc952e73a23e
|
343
|
*
|
mcm |
1:fc952e73a23e
|
344
|
* @param[in] N/A.
|
mcm |
1:fc952e73a23e
|
345
|
*
|
mcm |
1:fc952e73a23e
|
346
|
* @param[out] myTemperatureConversionStatus: Temperature conversion bit:
|
mcm |
1:fc952e73a23e
|
347
|
* ACCESS_CONFIG_DONE_CONVERSION_COMPLETE
|
mcm |
1:fc952e73a23e
|
348
|
* ACCESS_CONFIG_DONE_CONVERSION_IN_PROGRESS.
|
mcm |
1:fc952e73a23e
|
349
|
*
|
mcm |
1:fc952e73a23e
|
350
|
*
|
mcm |
1:fc952e73a23e
|
351
|
* @return Status of DS1624_IsTemperatureConversionDone.
|
mcm |
1:fc952e73a23e
|
352
|
*
|
mcm |
1:fc952e73a23e
|
353
|
*
|
mcm |
1:fc952e73a23e
|
354
|
* @author Manuel Caballero
|
mcm |
1:fc952e73a23e
|
355
|
* @date 31/January/2018
|
mcm |
1:fc952e73a23e
|
356
|
* @version 31/January/2018 The ORIGIN
|
mcm |
1:fc952e73a23e
|
357
|
* @pre N/A.
|
mcm |
1:fc952e73a23e
|
358
|
* @warning N/A.
|
mcm |
1:fc952e73a23e
|
359
|
*/
|
mcm |
1:fc952e73a23e
|
360
|
DS1624::DS1624_status_t DS1624::DS1624_IsTemperatureConversionDone ( DS1624_access_config_done_t* myTemperatureConversionStatus )
|
mcm |
1:fc952e73a23e
|
361
|
{
|
mcm |
1:fc952e73a23e
|
362
|
char cmd[] = { DS1624_ACCESS_CONFIG, 0 };
|
mcm |
1:fc952e73a23e
|
363
|
uint32_t aux = 0;
|
mcm |
1:fc952e73a23e
|
364
|
|
mcm |
1:fc952e73a23e
|
365
|
|
mcm |
1:fc952e73a23e
|
366
|
// It sends the command and gets the result
|
mcm |
1:fc952e73a23e
|
367
|
aux = _i2c.write ( _DS1624_Addr, &cmd[0], 1, true );
|
mcm |
1:fc952e73a23e
|
368
|
aux = _i2c.read ( _DS1624_Addr, &cmd[1], 1 );
|
mcm |
1:fc952e73a23e
|
369
|
|
mcm |
1:fc952e73a23e
|
370
|
|
mcm |
1:fc952e73a23e
|
371
|
// Update the value
|
mcm |
1:fc952e73a23e
|
372
|
*myTemperatureConversionStatus = ( DS1624_access_config_done_t )( cmd[1] & ACCESS_CONFIG_DONE_MASK );
|
mcm |
1:fc952e73a23e
|
373
|
|
mcm |
1:fc952e73a23e
|
374
|
|
mcm |
1:fc952e73a23e
|
375
|
|
mcm |
1:fc952e73a23e
|
376
|
if ( aux == I2C_SUCCESS )
|
mcm |
1:fc952e73a23e
|
377
|
return DS1624_SUCCESS;
|
mcm |
1:fc952e73a23e
|
378
|
else
|
mcm |
1:fc952e73a23e
|
379
|
return DS1624_FAILURE;
|
mcm |
1:fc952e73a23e
|
380
|
}
|
mcm |
1:fc952e73a23e
|
381
|
|
mcm |
1:fc952e73a23e
|
382
|
|
mcm |
1:fc952e73a23e
|
383
|
|
mcm |
1:fc952e73a23e
|
384
|
/**
|
mcm |
3:3a26cd3cd594
|
385
|
* @brief DS1624_ReadBytesEEPROM ( char , char* , uint8_t )
|
mcm |
1:fc952e73a23e
|
386
|
*
|
mcm |
1:fc952e73a23e
|
387
|
* @details It reads a certain number of bytes from EEPROM memory.
|
mcm |
1:fc952e73a23e
|
388
|
*
|
mcm |
1:fc952e73a23e
|
389
|
* @param[in] myStartingAddress: Starting address to read the EEPROM memory.
|
mcm |
1:fc952e73a23e
|
390
|
* @param[in] myLength: Amount of bytes to read.
|
mcm |
1:fc952e73a23e
|
391
|
*
|
mcm |
1:fc952e73a23e
|
392
|
* @param[out] myReadBytesEEPROM: Read values from EEPROM memory.
|
mcm |
1:fc952e73a23e
|
393
|
*
|
mcm |
1:fc952e73a23e
|
394
|
*
|
mcm |
1:fc952e73a23e
|
395
|
* @return Status of DS1624_ReadBytesEEPROM.
|
mcm |
1:fc952e73a23e
|
396
|
*
|
mcm |
1:fc952e73a23e
|
397
|
*
|
mcm |
1:fc952e73a23e
|
398
|
* @author Manuel Caballero
|
mcm |
1:fc952e73a23e
|
399
|
* @date 31/January/2018
|
mcm |
1:fc952e73a23e
|
400
|
* @version 31/January/2018 The ORIGIN
|
mcm |
1:fc952e73a23e
|
401
|
* @pre N/A.
|
mcm |
1:fc952e73a23e
|
402
|
* @warning When the address pointer reaches the end of the 256-byte memory space ( address FFh )
|
mcm |
1:fc952e73a23e
|
403
|
* it increments from the end of the memory back to the first location of the memory
|
mcm |
1:fc952e73a23e
|
404
|
* ( address 00h ).
|
mcm |
1:fc952e73a23e
|
405
|
*/
|
mcm |
1:fc952e73a23e
|
406
|
DS1624::DS1624_status_t DS1624::DS1624_ReadBytesEEPROM ( char myStartingAddress, char* myReadBytesEEPROM, uint8_t myLength )
|
mcm |
1:fc952e73a23e
|
407
|
{
|
mcm |
1:fc952e73a23e
|
408
|
char cmd[] = { DS1624_ACCESS_MEMORY, 0 };
|
mcm |
1:fc952e73a23e
|
409
|
uint32_t aux = 0;
|
mcm |
1:fc952e73a23e
|
410
|
|
mcm |
1:fc952e73a23e
|
411
|
|
mcm |
1:fc952e73a23e
|
412
|
|
mcm |
1:fc952e73a23e
|
413
|
// It sends the command, the address location and gets the result
|
mcm |
1:fc952e73a23e
|
414
|
cmd[1] = myStartingAddress;
|
mcm |
1:fc952e73a23e
|
415
|
aux = _i2c.write ( _DS1624_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ), true );
|
mcm |
1:fc952e73a23e
|
416
|
aux = _i2c.read ( _DS1624_Addr, myReadBytesEEPROM, myLength );
|
mcm |
1:fc952e73a23e
|
417
|
|
mcm |
1:fc952e73a23e
|
418
|
|
mcm |
1:fc952e73a23e
|
419
|
|
mcm |
1:fc952e73a23e
|
420
|
|
mcm |
1:fc952e73a23e
|
421
|
|
mcm |
1:fc952e73a23e
|
422
|
if ( aux == I2C_SUCCESS )
|
mcm |
1:fc952e73a23e
|
423
|
return DS1624_SUCCESS;
|
mcm |
1:fc952e73a23e
|
424
|
else
|
mcm |
1:fc952e73a23e
|
425
|
return DS1624_FAILURE;
|
mcm |
1:fc952e73a23e
|
426
|
}
|
mcm |
1:fc952e73a23e
|
427
|
|
mcm |
1:fc952e73a23e
|
428
|
|
mcm |
1:fc952e73a23e
|
429
|
|
mcm |
1:fc952e73a23e
|
430
|
/**
|
mcm |
3:3a26cd3cd594
|
431
|
* @brief DS1624_WriteBytesEEPROM ( char , char , uint8_t )
|
mcm |
1:fc952e73a23e
|
432
|
*
|
mcm |
1:fc952e73a23e
|
433
|
* @details It writes a certain number of bytes to EEPROM memory.
|
mcm |
1:fc952e73a23e
|
434
|
*
|
mcm |
1:fc952e73a23e
|
435
|
* @param[in] myStartingAddress: Starting address to write the EEPROM memory.
|
mcm |
1:fc952e73a23e
|
436
|
* @param[in] myWriteBytesEEPROM: Bytes to write to the EEPROM memory.
|
mcm |
1:fc952e73a23e
|
437
|
* @param[in] myLength: Amount of bytes to write.
|
mcm |
1:fc952e73a23e
|
438
|
*
|
mcm |
1:fc952e73a23e
|
439
|
* @param[out] N/A.
|
mcm |
1:fc952e73a23e
|
440
|
*
|
mcm |
1:fc952e73a23e
|
441
|
*
|
mcm |
1:fc952e73a23e
|
442
|
* @return Status of DS1624_WriteBytesEEPROM.
|
mcm |
1:fc952e73a23e
|
443
|
*
|
mcm |
1:fc952e73a23e
|
444
|
*
|
mcm |
1:fc952e73a23e
|
445
|
* @author Manuel Caballero
|
mcm |
1:fc952e73a23e
|
446
|
* @date 31/January/2018
|
mcm |
1:fc952e73a23e
|
447
|
* @version 31/January/2018 The ORIGIN
|
mcm |
1:fc952e73a23e
|
448
|
* @pre N/A.
|
mcm |
1:fc952e73a23e
|
449
|
* @warning The STOP condition causes the DS1624 to initiate the write to EEPROM sequence.
|
mcm |
1:fc952e73a23e
|
450
|
* @warning If the starting address is 00 and the incoming data is 00 11 22 33 44 55 66 77 88 99,
|
mcm |
1:fc952e73a23e
|
451
|
* the result is mem00=88 mem01=99 mem02=22 mem03=33 mem04=44 mem05=55 mem06=66 mem07=77.
|
mcm |
1:fc952e73a23e
|
452
|
* The data wraps around and overwrites itself.
|
mcm |
3:3a26cd3cd594
|
453
|
* @warning EEPROM Write Cycle Time: 50ms ( maximum ). The user must take care of this time!.
|
mcm |
1:fc952e73a23e
|
454
|
*/
|
mcm |
1:fc952e73a23e
|
455
|
DS1624::DS1624_status_t DS1624::DS1624_WriteBytesEEPROM ( char myStartingAddress, char myWriteBytesEEPROM[], uint8_t myLength )
|
mcm |
1:fc952e73a23e
|
456
|
{
|
mcm |
3:3a26cd3cd594
|
457
|
char cmd[ myLength + 2 ];
|
mcm |
3:3a26cd3cd594
|
458
|
uint32_t i = 0;
|
mcm |
1:fc952e73a23e
|
459
|
uint32_t aux = 0;
|
mcm |
1:fc952e73a23e
|
460
|
|
mcm |
1:fc952e73a23e
|
461
|
|
mcm |
3:3a26cd3cd594
|
462
|
// Prepare COMMANDS
|
mcm |
3:3a26cd3cd594
|
463
|
cmd[0] = DS1624_ACCESS_MEMORY;
|
mcm |
1:fc952e73a23e
|
464
|
cmd[1] = myStartingAddress;
|
mcm |
1:fc952e73a23e
|
465
|
|
mcm |
3:3a26cd3cd594
|
466
|
// Prepare the payload to be stored into the EEPROM memory
|
mcm |
3:3a26cd3cd594
|
467
|
for ( i = 2 ; i < ( myLength + 2 ); i++ )
|
mcm |
3:3a26cd3cd594
|
468
|
cmd[ i ] = myWriteBytesEEPROM[ i - 2 ];
|
mcm |
3:3a26cd3cd594
|
469
|
|
mcm |
3:3a26cd3cd594
|
470
|
// It sends the command, the address location as well as the payload
|
mcm |
3:3a26cd3cd594
|
471
|
aux = _i2c.write ( _DS1624_Addr, &cmd[0], myLength + 2, false );
|
mcm |
1:fc952e73a23e
|
472
|
|
mcm |
1:fc952e73a23e
|
473
|
|
mcm |
1:fc952e73a23e
|
474
|
|
mcm |
1:fc952e73a23e
|
475
|
|
mcm |
1:fc952e73a23e
|
476
|
if ( aux == I2C_SUCCESS )
|
mcm |
1:fc952e73a23e
|
477
|
return DS1624_SUCCESS;
|
mcm |
1:fc952e73a23e
|
478
|
else
|
mcm |
1:fc952e73a23e
|
479
|
return DS1624_FAILURE;
|
mcm |
1:fc952e73a23e
|
480
|
}
|