User | Revision | Line number | New contents of line |
mcm |
2:3710775b1864
|
1
|
/**
|
mcm |
2:3710775b1864
|
2
|
* @brief DS3231.cpp
|
mcm |
2:3710775b1864
|
3
|
* @details Extremely Accurate I2C-Integrated RTC/TCXO/Crystal.
|
mcm |
2:3710775b1864
|
4
|
* Function file.
|
mcm |
2:3710775b1864
|
5
|
*
|
mcm |
2:3710775b1864
|
6
|
*
|
mcm |
2:3710775b1864
|
7
|
* @return NA
|
mcm |
2:3710775b1864
|
8
|
*
|
mcm |
2:3710775b1864
|
9
|
* @author Manuel Caballero
|
mcm |
2:3710775b1864
|
10
|
* @date 20/December/2017
|
mcm |
2:3710775b1864
|
11
|
* @version 20/December/2017 The ORIGIN
|
mcm |
2:3710775b1864
|
12
|
* @pre NaN.
|
mcm |
2:3710775b1864
|
13
|
* @warning NaN
|
mcm |
2:3710775b1864
|
14
|
* @pre This code belongs to AqueronteBlog ( http://unbarquero.blogspot.com ).
|
mcm |
2:3710775b1864
|
15
|
*/
|
mcm |
2:3710775b1864
|
16
|
|
mcm |
2:3710775b1864
|
17
|
#include "DS3231.h"
|
mcm |
2:3710775b1864
|
18
|
|
mcm |
2:3710775b1864
|
19
|
|
mcm |
2:3710775b1864
|
20
|
DS3231::DS3231 ( PinName sda, PinName scl, uint32_t addr, uint32_t freq )
|
mcm |
2:3710775b1864
|
21
|
: _i2c ( sda, scl )
|
mcm |
2:3710775b1864
|
22
|
, _DS3231_Addr ( addr )
|
mcm |
2:3710775b1864
|
23
|
{
|
mcm |
2:3710775b1864
|
24
|
_i2c.frequency( freq );
|
mcm |
2:3710775b1864
|
25
|
}
|
mcm |
2:3710775b1864
|
26
|
|
mcm |
2:3710775b1864
|
27
|
|
mcm |
2:3710775b1864
|
28
|
DS3231::~DS3231()
|
mcm |
2:3710775b1864
|
29
|
{
|
mcm |
2:3710775b1864
|
30
|
}
|
mcm |
2:3710775b1864
|
31
|
|
mcm |
2:3710775b1864
|
32
|
|
mcm |
2:3710775b1864
|
33
|
|
mcm |
2:3710775b1864
|
34
|
/**
|
mcm |
2:3710775b1864
|
35
|
* @brief DS3231_ReadTemperature ( DS3231_vector_data_t* )
|
mcm |
2:3710775b1864
|
36
|
*
|
mcm |
2:3710775b1864
|
37
|
* @details It gets the temperature.
|
mcm |
2:3710775b1864
|
38
|
*
|
mcm |
2:3710775b1864
|
39
|
* @param[in] NaN
|
mcm |
2:3710775b1864
|
40
|
*
|
mcm |
2:3710775b1864
|
41
|
* @param[out] myTemperature: Temperature data.
|
mcm |
2:3710775b1864
|
42
|
*
|
mcm |
2:3710775b1864
|
43
|
*
|
mcm |
2:3710775b1864
|
44
|
* @return Status of DS3231_ReadTemperature.
|
mcm |
2:3710775b1864
|
45
|
*
|
mcm |
2:3710775b1864
|
46
|
*
|
mcm |
2:3710775b1864
|
47
|
* @author Manuel Caballero
|
mcm |
2:3710775b1864
|
48
|
* @date 20/December/2017
|
mcm |
2:3710775b1864
|
49
|
* @version 20/December/2017 The ORIGIN
|
mcm |
2:3710775b1864
|
50
|
* @pre The temperature registers are updated after each user-initiated conversion and on every 64-second conversion.
|
mcm |
2:3710775b1864
|
51
|
* @warning NaN.
|
mcm |
2:3710775b1864
|
52
|
*/
|
mcm |
2:3710775b1864
|
53
|
DS3231::DS3231_status_t DS3231::DS3231_ReadTemperature ( DS3231_vector_data_t* myTemperature )
|
mcm |
2:3710775b1864
|
54
|
{
|
mcm |
2:3710775b1864
|
55
|
char cmd[] = { DS3231_MSB_TEMPERATURE, 0 };
|
mcm |
2:3710775b1864
|
56
|
uint32_t aux = 0;
|
mcm |
2:3710775b1864
|
57
|
|
mcm |
2:3710775b1864
|
58
|
|
mcm |
2:3710775b1864
|
59
|
// It gets the temperature
|
mcm |
2:3710775b1864
|
60
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
|
mcm |
2:3710775b1864
|
61
|
aux = _i2c.read ( _DS3231_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
|
mcm |
2:3710775b1864
|
62
|
|
mcm |
2:3710775b1864
|
63
|
|
mcm |
2:3710775b1864
|
64
|
// Parse the data
|
mcm |
2:3710775b1864
|
65
|
// 1. Check if the Temperature is positive or negative
|
mcm |
2:3710775b1864
|
66
|
if ( ( cmd[0] & 0b10000000 ) == 0b00000000 )
|
mcm |
2:3710775b1864
|
67
|
myTemperature->Temperature = cmd[0]; // Positive value
|
mcm |
2:3710775b1864
|
68
|
else
|
mcm |
2:3710775b1864
|
69
|
myTemperature->Temperature = -1.0 * ( ( ~cmd[0] ) + 1 ); // Negative value
|
mcm |
2:3710775b1864
|
70
|
|
mcm |
2:3710775b1864
|
71
|
|
mcm |
2:3710775b1864
|
72
|
// 2. Decimal part. 0.25°C resolution
|
mcm |
2:3710775b1864
|
73
|
switch( cmd[1] )
|
mcm |
2:3710775b1864
|
74
|
{
|
mcm |
2:3710775b1864
|
75
|
// x.00°C
|
mcm |
2:3710775b1864
|
76
|
default:
|
mcm |
2:3710775b1864
|
77
|
case 0b00000000:
|
mcm |
2:3710775b1864
|
78
|
break;
|
mcm |
2:3710775b1864
|
79
|
|
mcm |
2:3710775b1864
|
80
|
// x.25°C
|
mcm |
2:3710775b1864
|
81
|
case 0b01000000:
|
mcm |
2:3710775b1864
|
82
|
myTemperature->Temperature += 0.25;
|
mcm |
2:3710775b1864
|
83
|
break;
|
mcm |
2:3710775b1864
|
84
|
|
mcm |
2:3710775b1864
|
85
|
// x.50°C
|
mcm |
2:3710775b1864
|
86
|
case 0b10000000:
|
mcm |
2:3710775b1864
|
87
|
myTemperature->Temperature += 0.50;
|
mcm |
2:3710775b1864
|
88
|
break;
|
mcm |
2:3710775b1864
|
89
|
|
mcm |
2:3710775b1864
|
90
|
// x.75°C
|
mcm |
2:3710775b1864
|
91
|
case 0b11000000:
|
mcm |
2:3710775b1864
|
92
|
myTemperature->Temperature += 0.75;
|
mcm |
2:3710775b1864
|
93
|
break;
|
mcm |
2:3710775b1864
|
94
|
}
|
mcm |
2:3710775b1864
|
95
|
|
mcm |
2:3710775b1864
|
96
|
|
mcm |
2:3710775b1864
|
97
|
|
mcm |
2:3710775b1864
|
98
|
|
mcm |
2:3710775b1864
|
99
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:3710775b1864
|
100
|
return DS3231_SUCCESS;
|
mcm |
2:3710775b1864
|
101
|
else
|
mcm |
2:3710775b1864
|
102
|
return DS3231_FAILURE;
|
mcm |
2:3710775b1864
|
103
|
}
|
mcm |
2:3710775b1864
|
104
|
|
mcm |
2:3710775b1864
|
105
|
|
mcm |
2:3710775b1864
|
106
|
|
mcm |
2:3710775b1864
|
107
|
/**
|
mcm |
2:3710775b1864
|
108
|
* @brief DS3231_ReadRawTemperature ( DS3231_vector_data_t* )
|
mcm |
2:3710775b1864
|
109
|
*
|
mcm |
2:3710775b1864
|
110
|
* @details It gets the raw temperature.
|
mcm |
2:3710775b1864
|
111
|
*
|
mcm |
2:3710775b1864
|
112
|
* @param[in] NaN
|
mcm |
2:3710775b1864
|
113
|
*
|
mcm |
2:3710775b1864
|
114
|
* @param[out] myRawTemperature: Raw Temperature data.
|
mcm |
2:3710775b1864
|
115
|
*
|
mcm |
2:3710775b1864
|
116
|
*
|
mcm |
2:3710775b1864
|
117
|
* @return Status of DS3231_ReadTemperature.
|
mcm |
2:3710775b1864
|
118
|
*
|
mcm |
2:3710775b1864
|
119
|
*
|
mcm |
2:3710775b1864
|
120
|
* @author Manuel Caballero
|
mcm |
2:3710775b1864
|
121
|
* @date 20/December/2017
|
mcm |
2:3710775b1864
|
122
|
* @version 20/December/2017 The ORIGIN
|
mcm |
2:3710775b1864
|
123
|
* @pre The temperature registers are updated after each user-initiated conversion and on every 64-second conversion.
|
mcm |
2:3710775b1864
|
124
|
* @warning NaN.
|
mcm |
2:3710775b1864
|
125
|
*/
|
mcm |
2:3710775b1864
|
126
|
DS3231::DS3231_status_t DS3231::DS3231_ReadRawTemperature ( DS3231_vector_data_t* myRawTemperature )
|
mcm |
2:3710775b1864
|
127
|
{
|
mcm |
2:3710775b1864
|
128
|
char cmd[] = { DS3231_MSB_TEMPERATURE, 0 };
|
mcm |
2:3710775b1864
|
129
|
uint32_t aux = 0;
|
mcm |
2:3710775b1864
|
130
|
|
mcm |
2:3710775b1864
|
131
|
|
mcm |
2:3710775b1864
|
132
|
// It gets the temperature
|
mcm |
2:3710775b1864
|
133
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
|
mcm |
2:3710775b1864
|
134
|
aux = _i2c.read ( _DS3231_Addr, &cmd[0], sizeof( cmd )/sizeof( cmd[0] ) );
|
mcm |
2:3710775b1864
|
135
|
|
mcm |
2:3710775b1864
|
136
|
|
mcm |
2:3710775b1864
|
137
|
// Parse the data
|
mcm |
2:3710775b1864
|
138
|
myRawTemperature->MSBTemperature = cmd[0];
|
mcm |
2:3710775b1864
|
139
|
myRawTemperature->LSBTemperature = cmd[1];
|
mcm |
2:3710775b1864
|
140
|
|
mcm |
2:3710775b1864
|
141
|
|
mcm |
2:3710775b1864
|
142
|
|
mcm |
2:3710775b1864
|
143
|
|
mcm |
2:3710775b1864
|
144
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:3710775b1864
|
145
|
return DS3231_SUCCESS;
|
mcm |
2:3710775b1864
|
146
|
else
|
mcm |
2:3710775b1864
|
147
|
return DS3231_FAILURE;
|
mcm |
2:3710775b1864
|
148
|
}
|
mcm |
2:3710775b1864
|
149
|
|
mcm |
2:3710775b1864
|
150
|
|
mcm |
2:3710775b1864
|
151
|
|
mcm |
2:3710775b1864
|
152
|
/**
|
mcm |
2:3710775b1864
|
153
|
* @brief DS3231_StartNewConvertTemperature ( void )
|
mcm |
2:3710775b1864
|
154
|
*
|
mcm |
2:3710775b1864
|
155
|
* @details It triggers a new temperature conversion.
|
mcm |
2:3710775b1864
|
156
|
*
|
mcm |
2:3710775b1864
|
157
|
* @param[in] NaN.
|
mcm |
2:3710775b1864
|
158
|
*
|
mcm |
2:3710775b1864
|
159
|
* @param[out] NaN.
|
mcm |
2:3710775b1864
|
160
|
*
|
mcm |
2:3710775b1864
|
161
|
*
|
mcm |
2:3710775b1864
|
162
|
* @return Status of DS3231_StartNewConvertTemperature.
|
mcm |
2:3710775b1864
|
163
|
*
|
mcm |
2:3710775b1864
|
164
|
*
|
mcm |
2:3710775b1864
|
165
|
* @author Manuel Caballero
|
mcm |
2:3710775b1864
|
166
|
* @date 20/December/2017
|
mcm |
2:3710775b1864
|
167
|
* @version 20/December/2017 The ORIGIN
|
mcm |
2:3710775b1864
|
168
|
* @pre NaN
|
mcm |
2:3710775b1864
|
169
|
* @warning NaN.
|
mcm |
2:3710775b1864
|
170
|
*/
|
mcm |
2:3710775b1864
|
171
|
DS3231::DS3231_status_t DS3231::DS3231_StartNewConvertTemperature ( void )
|
mcm |
2:3710775b1864
|
172
|
{
|
mcm |
2:3710775b1864
|
173
|
char cmd[] = { DS3231_CONTROL_STATUS, 0 };
|
mcm |
2:3710775b1864
|
174
|
uint32_t aux = 0;
|
mcm |
2:3710775b1864
|
175
|
uint32_t ii = 0;
|
mcm |
2:3710775b1864
|
176
|
|
mcm |
2:3710775b1864
|
177
|
|
mcm |
2:3710775b1864
|
178
|
// BSY MUST be checked before triggering a new temperature conversion
|
mcm |
2:3710775b1864
|
179
|
do
|
mcm |
2:3710775b1864
|
180
|
{
|
mcm |
2:3710775b1864
|
181
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
|
mcm |
2:3710775b1864
|
182
|
aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
|
mcm |
2:3710775b1864
|
183
|
|
mcm |
2:3710775b1864
|
184
|
ii++;
|
mcm |
2:3710775b1864
|
185
|
}
|
mcm |
2:3710775b1864
|
186
|
while ( ( ( cmd[1] & STATUS_BUSY_MASK ) != STATUS_BUSY_NOBUSY ) && ( ii < DS3231_TIMEOUT ) );
|
mcm |
2:3710775b1864
|
187
|
|
mcm |
2:3710775b1864
|
188
|
|
mcm |
2:3710775b1864
|
189
|
// if something went wrong, there will not be a new temperature conversion
|
mcm |
2:3710775b1864
|
190
|
cmd[0] = DS3231_CONTROL;
|
mcm |
2:3710775b1864
|
191
|
if ( ii < DS3231_TIMEOUT )
|
mcm |
2:3710775b1864
|
192
|
{
|
mcm |
2:3710775b1864
|
193
|
// It triggers a new temperature conversion
|
mcm |
2:3710775b1864
|
194
|
// It reads CONTROL register
|
mcm |
2:3710775b1864
|
195
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
|
mcm |
2:3710775b1864
|
196
|
aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
|
mcm |
2:3710775b1864
|
197
|
|
mcm |
2:3710775b1864
|
198
|
// Start a new temperature conversion
|
mcm |
2:3710775b1864
|
199
|
cmd[1] |= CONTROL_STATUS_CONVERT_TEMPERATURE_ENABLED;
|
mcm |
2:3710775b1864
|
200
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
201
|
|
mcm |
2:3710775b1864
|
202
|
// Wait until the temperature conversion is completed
|
mcm |
2:3710775b1864
|
203
|
ii = 0;
|
mcm |
2:3710775b1864
|
204
|
do
|
mcm |
2:3710775b1864
|
205
|
{
|
mcm |
2:3710775b1864
|
206
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
|
mcm |
2:3710775b1864
|
207
|
aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
|
mcm |
2:3710775b1864
|
208
|
|
mcm |
2:3710775b1864
|
209
|
ii++;
|
mcm |
2:3710775b1864
|
210
|
}
|
mcm |
2:3710775b1864
|
211
|
while ( ( ( cmd[1] & CONTROL_STATUS_CONVERT_TEMPERATURE_MASK ) != CONTROL_STATUS_CONVERT_TEMPERATURE_DISABLED ) && ( ii < DS3231_TIMEOUT ) );
|
mcm |
2:3710775b1864
|
212
|
}
|
mcm |
2:3710775b1864
|
213
|
|
mcm |
2:3710775b1864
|
214
|
// If TIMEOUT happens, something went wrong!
|
mcm |
2:3710775b1864
|
215
|
if ( ii >= DS3231_TIMEOUT )
|
mcm |
2:3710775b1864
|
216
|
aux = I2C_FAILURE;
|
mcm |
2:3710775b1864
|
217
|
|
mcm |
2:3710775b1864
|
218
|
|
mcm |
2:3710775b1864
|
219
|
|
mcm |
2:3710775b1864
|
220
|
|
mcm |
2:3710775b1864
|
221
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:3710775b1864
|
222
|
return DS3231_SUCCESS;
|
mcm |
2:3710775b1864
|
223
|
else
|
mcm |
2:3710775b1864
|
224
|
return DS3231_FAILURE;
|
mcm |
2:3710775b1864
|
225
|
}
|
mcm |
2:3710775b1864
|
226
|
|
mcm |
2:3710775b1864
|
227
|
|
mcm |
2:3710775b1864
|
228
|
|
mcm |
2:3710775b1864
|
229
|
/**
|
mcm |
2:3710775b1864
|
230
|
* @brief DS3231_ReadRawAging ( DS3231_vector_data_t* )
|
mcm |
2:3710775b1864
|
231
|
*
|
mcm |
2:3710775b1864
|
232
|
* @details It gets the raw aging.
|
mcm |
2:3710775b1864
|
233
|
*
|
mcm |
2:3710775b1864
|
234
|
* @param[in] NaN
|
mcm |
2:3710775b1864
|
235
|
*
|
mcm |
2:3710775b1864
|
236
|
* @param[out] myRawAging: Raw Aging data.
|
mcm |
2:3710775b1864
|
237
|
*
|
mcm |
2:3710775b1864
|
238
|
*
|
mcm |
2:3710775b1864
|
239
|
* @return Status of DS3231_ReadRawAging.
|
mcm |
2:3710775b1864
|
240
|
*
|
mcm |
2:3710775b1864
|
241
|
*
|
mcm |
2:3710775b1864
|
242
|
* @author Manuel Caballero
|
mcm |
2:3710775b1864
|
243
|
* @date 20/December/2017
|
mcm |
2:3710775b1864
|
244
|
* @version 20/December/2017 The ORIGIN
|
mcm |
2:3710775b1864
|
245
|
* @pre NaN
|
mcm |
2:3710775b1864
|
246
|
* @warning NaN.
|
mcm |
2:3710775b1864
|
247
|
*/
|
mcm |
2:3710775b1864
|
248
|
DS3231::DS3231_status_t DS3231::DS3231_ReadRawAging ( DS3231_vector_data_t* myRawAging )
|
mcm |
2:3710775b1864
|
249
|
{
|
mcm |
2:3710775b1864
|
250
|
char cmd = DS3231_AGING_OFFSET;
|
mcm |
2:3710775b1864
|
251
|
uint32_t aux = 0;
|
mcm |
2:3710775b1864
|
252
|
|
mcm |
2:3710775b1864
|
253
|
|
mcm |
2:3710775b1864
|
254
|
// It gets the raw aging value
|
mcm |
2:3710775b1864
|
255
|
aux = _i2c.write ( _DS3231_Addr, &cmd, 1, true );
|
mcm |
2:3710775b1864
|
256
|
aux = _i2c.read ( _DS3231_Addr, &cmd, 1 );
|
mcm |
2:3710775b1864
|
257
|
|
mcm |
2:3710775b1864
|
258
|
myRawAging->RawAging = cmd;
|
mcm |
2:3710775b1864
|
259
|
|
mcm |
2:3710775b1864
|
260
|
|
mcm |
2:3710775b1864
|
261
|
|
mcm |
2:3710775b1864
|
262
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:3710775b1864
|
263
|
return DS3231_SUCCESS;
|
mcm |
2:3710775b1864
|
264
|
else
|
mcm |
2:3710775b1864
|
265
|
return DS3231_FAILURE;
|
mcm |
2:3710775b1864
|
266
|
}
|
mcm |
2:3710775b1864
|
267
|
|
mcm |
2:3710775b1864
|
268
|
|
mcm |
2:3710775b1864
|
269
|
|
mcm |
2:3710775b1864
|
270
|
/**
|
mcm |
2:3710775b1864
|
271
|
* @brief DS3231_Status32kHzPin ( DS3231_status_enable_32khz_output_t )
|
mcm |
2:3710775b1864
|
272
|
*
|
mcm |
2:3710775b1864
|
273
|
* @details It enables/disables the 32kHz output pin.
|
mcm |
2:3710775b1864
|
274
|
*
|
mcm |
2:3710775b1864
|
275
|
* @param[in] my32kHzPin: 32kHz pin enabled/disabled.
|
mcm |
2:3710775b1864
|
276
|
*
|
mcm |
2:3710775b1864
|
277
|
* @param[out] NaN.
|
mcm |
2:3710775b1864
|
278
|
*
|
mcm |
2:3710775b1864
|
279
|
*
|
mcm |
2:3710775b1864
|
280
|
* @return Status of DS3231_Status32kHzPin.
|
mcm |
2:3710775b1864
|
281
|
*
|
mcm |
2:3710775b1864
|
282
|
*
|
mcm |
2:3710775b1864
|
283
|
* @author Manuel Caballero
|
mcm |
2:3710775b1864
|
284
|
* @date 20/December/2017
|
mcm |
2:3710775b1864
|
285
|
* @version 20/December/2017 The ORIGIN
|
mcm |
2:3710775b1864
|
286
|
* @pre NaN
|
mcm |
2:3710775b1864
|
287
|
* @warning NaN.
|
mcm |
2:3710775b1864
|
288
|
*/
|
mcm |
2:3710775b1864
|
289
|
DS3231::DS3231_status_t DS3231::DS3231_Status32kHzPin ( DS3231_status_enable_32khz_output_t my32kHzPin )
|
mcm |
2:3710775b1864
|
290
|
{
|
mcm |
2:3710775b1864
|
291
|
char cmd[] = { DS3231_CONTROL_STATUS, 0 };
|
mcm |
2:3710775b1864
|
292
|
uint32_t aux = 0;
|
mcm |
2:3710775b1864
|
293
|
|
mcm |
2:3710775b1864
|
294
|
|
mcm |
2:3710775b1864
|
295
|
// It reads the status register to parse the data
|
mcm |
2:3710775b1864
|
296
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
|
mcm |
2:3710775b1864
|
297
|
aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
|
mcm |
2:3710775b1864
|
298
|
|
mcm |
2:3710775b1864
|
299
|
cmd[1] &= ~STATUS_ENABLE_32KHZ_OUTPUT_MASK;
|
mcm |
2:3710775b1864
|
300
|
cmd[1] |= my32kHzPin;
|
mcm |
2:3710775b1864
|
301
|
|
mcm |
2:3710775b1864
|
302
|
// Update the register
|
mcm |
2:3710775b1864
|
303
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
304
|
|
mcm |
2:3710775b1864
|
305
|
|
mcm |
2:3710775b1864
|
306
|
|
mcm |
2:3710775b1864
|
307
|
|
mcm |
2:3710775b1864
|
308
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:3710775b1864
|
309
|
return DS3231_SUCCESS;
|
mcm |
2:3710775b1864
|
310
|
else
|
mcm |
2:3710775b1864
|
311
|
return DS3231_FAILURE;
|
mcm |
2:3710775b1864
|
312
|
}
|
mcm |
2:3710775b1864
|
313
|
|
mcm |
2:3710775b1864
|
314
|
|
mcm |
2:3710775b1864
|
315
|
|
mcm |
2:3710775b1864
|
316
|
/**
|
mcm |
2:3710775b1864
|
317
|
* @brief DS3231_ClearAlarmFlag ( DS3231_status_alarm1_flag_t , DS3231_status_alarm2_flag_t )
|
mcm |
2:3710775b1864
|
318
|
*
|
mcm |
2:3710775b1864
|
319
|
* @details It clears alarm flags.
|
mcm |
2:3710775b1864
|
320
|
*
|
mcm |
2:3710775b1864
|
321
|
* @param[in] myA1F: Reset/Mask alarm 1 flag.
|
mcm |
2:3710775b1864
|
322
|
* @param[in] myA2F: Reset/Mask alarm 2 flag.
|
mcm |
2:3710775b1864
|
323
|
*
|
mcm |
2:3710775b1864
|
324
|
* @param[out] NaN.
|
mcm |
2:3710775b1864
|
325
|
*
|
mcm |
2:3710775b1864
|
326
|
*
|
mcm |
2:3710775b1864
|
327
|
* @return Status of DS3231_ClearAlarmFlag.
|
mcm |
2:3710775b1864
|
328
|
*
|
mcm |
2:3710775b1864
|
329
|
*
|
mcm |
2:3710775b1864
|
330
|
* @author Manuel Caballero
|
mcm |
2:3710775b1864
|
331
|
* @date 20/December/2017
|
mcm |
2:3710775b1864
|
332
|
* @version 20/December/2017 The ORIGIN
|
mcm |
2:3710775b1864
|
333
|
* @pre NaN
|
mcm |
2:3710775b1864
|
334
|
* @warning NaN.
|
mcm |
2:3710775b1864
|
335
|
*/
|
mcm |
2:3710775b1864
|
336
|
DS3231::DS3231_status_t DS3231::DS3231_ClearAlarmFlag ( DS3231_status_alarm1_flag_t myA1F, DS3231_status_alarm2_flag_t myA2F )
|
mcm |
2:3710775b1864
|
337
|
{
|
mcm |
2:3710775b1864
|
338
|
char cmd[] = { DS3231_CONTROL_STATUS, 0 };
|
mcm |
2:3710775b1864
|
339
|
uint32_t aux = 0;
|
mcm |
2:3710775b1864
|
340
|
|
mcm |
2:3710775b1864
|
341
|
|
mcm |
2:3710775b1864
|
342
|
// It reads the status register to parse the data
|
mcm |
2:3710775b1864
|
343
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
|
mcm |
2:3710775b1864
|
344
|
aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
|
mcm |
2:3710775b1864
|
345
|
|
mcm |
2:3710775b1864
|
346
|
cmd[1] &= ~( STATUS_ALARM1_FLAG_MASK | STATUS_ALARM2_FLAG_MASK );
|
mcm |
2:3710775b1864
|
347
|
cmd[1] |= ( myA1F | myA2F );
|
mcm |
2:3710775b1864
|
348
|
|
mcm |
2:3710775b1864
|
349
|
// Update the register
|
mcm |
2:3710775b1864
|
350
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
351
|
|
mcm |
2:3710775b1864
|
352
|
|
mcm |
2:3710775b1864
|
353
|
|
mcm |
2:3710775b1864
|
354
|
|
mcm |
2:3710775b1864
|
355
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:3710775b1864
|
356
|
return DS3231_SUCCESS;
|
mcm |
2:3710775b1864
|
357
|
else
|
mcm |
2:3710775b1864
|
358
|
return DS3231_FAILURE;
|
mcm |
2:3710775b1864
|
359
|
}
|
mcm |
2:3710775b1864
|
360
|
|
mcm |
2:3710775b1864
|
361
|
|
mcm |
2:3710775b1864
|
362
|
|
mcm |
2:3710775b1864
|
363
|
/**
|
mcm |
2:3710775b1864
|
364
|
* @brief DS3231_SetAlarm1 ( DS3231_alarm1_register_t )
|
mcm |
2:3710775b1864
|
365
|
*
|
mcm |
2:3710775b1864
|
366
|
* @details It sets the alarm 1.
|
mcm |
2:3710775b1864
|
367
|
*
|
mcm |
2:3710775b1864
|
368
|
* @param[in] myAlarm1: Alarm 1 options.
|
mcm |
2:3710775b1864
|
369
|
*
|
mcm |
2:3710775b1864
|
370
|
* @param[out] NaN.
|
mcm |
2:3710775b1864
|
371
|
*
|
mcm |
2:3710775b1864
|
372
|
*
|
mcm |
2:3710775b1864
|
373
|
* @return Status of DS3231_SetAlarm1.
|
mcm |
2:3710775b1864
|
374
|
*
|
mcm |
2:3710775b1864
|
375
|
*
|
mcm |
2:3710775b1864
|
376
|
* @author Manuel Caballero
|
mcm |
2:3710775b1864
|
377
|
* @date 20/December/2017
|
mcm |
2:3710775b1864
|
378
|
* @version 20/December/2017 The ORIGIN
|
mcm |
2:3710775b1864
|
379
|
* @pre NaN
|
mcm |
2:3710775b1864
|
380
|
* @warning NaN.
|
mcm |
2:3710775b1864
|
381
|
*/
|
mcm |
2:3710775b1864
|
382
|
DS3231::DS3231_status_t DS3231::DS3231_SetAlarm1 ( DS3231_alarm1_register_t myAlarm1 )
|
mcm |
2:3710775b1864
|
383
|
{
|
mcm |
2:3710775b1864
|
384
|
char cmd[] = { 0, 0 };
|
mcm |
2:3710775b1864
|
385
|
uint32_t aux = 0;
|
mcm |
2:3710775b1864
|
386
|
uint32_t Alarm1SecondAux = 0; // A1M1
|
mcm |
2:3710775b1864
|
387
|
uint32_t Alarm1MinuteAux = 0; // A1M2
|
mcm |
2:3710775b1864
|
388
|
uint32_t Alarm1HourAux = 0; // A1M3
|
mcm |
2:3710775b1864
|
389
|
uint32_t Alarm1DayDateAux = 0; // A1M4 & DYDT
|
mcm |
2:3710775b1864
|
390
|
|
mcm |
2:3710775b1864
|
391
|
|
mcm |
2:3710775b1864
|
392
|
// Read all the registers involved in the alarm1
|
mcm |
2:3710775b1864
|
393
|
// A1M1
|
mcm |
2:3710775b1864
|
394
|
cmd[0] = DS3231_ALARM_1_SECONDS;
|
mcm |
2:3710775b1864
|
395
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
|
mcm |
2:3710775b1864
|
396
|
aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
|
mcm |
2:3710775b1864
|
397
|
|
mcm |
2:3710775b1864
|
398
|
Alarm1SecondAux = ( cmd[1] & ~ALARM1_A1M1_MASK );
|
mcm |
2:3710775b1864
|
399
|
|
mcm |
2:3710775b1864
|
400
|
// A1M2
|
mcm |
2:3710775b1864
|
401
|
cmd[0] = DS3231_ALARM_1_MINUTES;
|
mcm |
2:3710775b1864
|
402
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
|
mcm |
2:3710775b1864
|
403
|
aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
|
mcm |
2:3710775b1864
|
404
|
|
mcm |
2:3710775b1864
|
405
|
Alarm1MinuteAux = ( cmd[1] & ~ALARM1_A1M2_MASK );
|
mcm |
2:3710775b1864
|
406
|
|
mcm |
2:3710775b1864
|
407
|
// A1M3
|
mcm |
2:3710775b1864
|
408
|
cmd[0] = DS3231_ALARM_1_HOURS;
|
mcm |
2:3710775b1864
|
409
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
|
mcm |
2:3710775b1864
|
410
|
aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
|
mcm |
2:3710775b1864
|
411
|
|
mcm |
2:3710775b1864
|
412
|
Alarm1HourAux = ( cmd[1] & ~ALARM1_A1M3_MASK );
|
mcm |
2:3710775b1864
|
413
|
|
mcm |
2:3710775b1864
|
414
|
// A1M4 & DY/#DT
|
mcm |
2:3710775b1864
|
415
|
cmd[0] = DS3231_ALARM_1_DAY_DATE;
|
mcm |
2:3710775b1864
|
416
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
|
mcm |
2:3710775b1864
|
417
|
aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
|
mcm |
2:3710775b1864
|
418
|
|
mcm |
2:3710775b1864
|
419
|
Alarm1DayDateAux = ( cmd[1] & ~( ALARM1_A1M4_MASK | ALARM1_DYDT_MASK ) );
|
mcm |
2:3710775b1864
|
420
|
|
mcm |
2:3710775b1864
|
421
|
|
mcm |
2:3710775b1864
|
422
|
// Set all ( A1M1, A1M2, A1M3 A1M4 and DY/#DT ) to 0
|
mcm |
2:3710775b1864
|
423
|
cmd[0] = DS3231_ALARM_1_SECONDS;
|
mcm |
2:3710775b1864
|
424
|
cmd[1] = Alarm1SecondAux;
|
mcm |
2:3710775b1864
|
425
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
426
|
|
mcm |
2:3710775b1864
|
427
|
cmd[0] = DS3231_ALARM_1_MINUTES;
|
mcm |
2:3710775b1864
|
428
|
cmd[1] = Alarm1MinuteAux;
|
mcm |
2:3710775b1864
|
429
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
430
|
|
mcm |
2:3710775b1864
|
431
|
cmd[0] = DS3231_ALARM_1_HOURS;
|
mcm |
2:3710775b1864
|
432
|
cmd[1] = Alarm1HourAux;
|
mcm |
2:3710775b1864
|
433
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
434
|
|
mcm |
2:3710775b1864
|
435
|
cmd[0] = DS3231_ALARM_1_DAY_DATE;
|
mcm |
2:3710775b1864
|
436
|
cmd[1] = Alarm1DayDateAux;
|
mcm |
2:3710775b1864
|
437
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
438
|
|
mcm |
2:3710775b1864
|
439
|
|
mcm |
2:3710775b1864
|
440
|
// Update the Alarm 1 rate
|
mcm |
2:3710775b1864
|
441
|
switch ( myAlarm1 )
|
mcm |
2:3710775b1864
|
442
|
{
|
mcm |
2:3710775b1864
|
443
|
case ALARM1_ALARM_ONCE_PER_SECOND:
|
mcm |
2:3710775b1864
|
444
|
cmd[0] = DS3231_ALARM_1_SECONDS;
|
mcm |
2:3710775b1864
|
445
|
cmd[1] = ( Alarm1SecondAux | ALARM1_A1M1_MASK );
|
mcm |
2:3710775b1864
|
446
|
|
mcm |
2:3710775b1864
|
447
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
448
|
|
mcm |
2:3710775b1864
|
449
|
case ALARM1_WHEN_SECONDS_MATCH:
|
mcm |
2:3710775b1864
|
450
|
cmd[0] = DS3231_ALARM_1_MINUTES;
|
mcm |
2:3710775b1864
|
451
|
cmd[1] = ( Alarm1MinuteAux | ALARM1_A1M2_MASK );
|
mcm |
2:3710775b1864
|
452
|
|
mcm |
2:3710775b1864
|
453
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
454
|
|
mcm |
2:3710775b1864
|
455
|
case ALARM1_WHEN_MINUTES_AND_SECONDS_MATCH:
|
mcm |
2:3710775b1864
|
456
|
cmd[0] = DS3231_ALARM_1_HOURS;
|
mcm |
2:3710775b1864
|
457
|
cmd[1] = ( Alarm1HourAux | ALARM1_A1M3_MASK );
|
mcm |
2:3710775b1864
|
458
|
|
mcm |
2:3710775b1864
|
459
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
460
|
|
mcm |
2:3710775b1864
|
461
|
case ALARM1_WHEN_HOURS_MINUTES_AND_SECONDS_MATCH:
|
mcm |
2:3710775b1864
|
462
|
cmd[0] = DS3231_ALARM_1_DAY_DATE;
|
mcm |
2:3710775b1864
|
463
|
cmd[1] = ( Alarm1DayDateAux | ALARM1_A1M4_MASK );
|
mcm |
2:3710775b1864
|
464
|
|
mcm |
2:3710775b1864
|
465
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
466
|
break;
|
mcm |
2:3710775b1864
|
467
|
|
mcm |
2:3710775b1864
|
468
|
default:
|
mcm |
2:3710775b1864
|
469
|
case ALARM1_WHEN_DATE_HOURS_MINUTES_AND_SECONDS_MATCH:
|
mcm |
2:3710775b1864
|
470
|
break;
|
mcm |
2:3710775b1864
|
471
|
|
mcm |
2:3710775b1864
|
472
|
case ALARM1_WHEN_DAY_HOURS_MINUTES_AND_SECONDS_MATCH:
|
mcm |
2:3710775b1864
|
473
|
cmd[0] = DS3231_ALARM_1_DAY_DATE;
|
mcm |
2:3710775b1864
|
474
|
cmd[1] = ( Alarm1DayDateAux | ALARM1_DYDT_MASK );
|
mcm |
2:3710775b1864
|
475
|
|
mcm |
2:3710775b1864
|
476
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
477
|
break;
|
mcm |
2:3710775b1864
|
478
|
}
|
mcm |
2:3710775b1864
|
479
|
|
mcm |
2:3710775b1864
|
480
|
|
mcm |
2:3710775b1864
|
481
|
|
mcm |
2:3710775b1864
|
482
|
|
mcm |
2:3710775b1864
|
483
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:3710775b1864
|
484
|
return DS3231_SUCCESS;
|
mcm |
2:3710775b1864
|
485
|
else
|
mcm |
2:3710775b1864
|
486
|
return DS3231_FAILURE;
|
mcm |
2:3710775b1864
|
487
|
}
|
mcm |
2:3710775b1864
|
488
|
|
mcm |
2:3710775b1864
|
489
|
|
mcm |
2:3710775b1864
|
490
|
/**
|
mcm |
2:3710775b1864
|
491
|
* @brief DS3231_SetAlarm2 ( DS3231_alarm2_register_t )
|
mcm |
2:3710775b1864
|
492
|
*
|
mcm |
2:3710775b1864
|
493
|
* @details It sets the alarm 2.
|
mcm |
2:3710775b1864
|
494
|
*
|
mcm |
2:3710775b1864
|
495
|
* @param[in] myAlarm1: Alarm 2 options.
|
mcm |
2:3710775b1864
|
496
|
*
|
mcm |
2:3710775b1864
|
497
|
* @param[out] NaN.
|
mcm |
2:3710775b1864
|
498
|
*
|
mcm |
2:3710775b1864
|
499
|
*
|
mcm |
2:3710775b1864
|
500
|
* @return Status of DS3231_SetAlarm2.
|
mcm |
2:3710775b1864
|
501
|
*
|
mcm |
2:3710775b1864
|
502
|
*
|
mcm |
2:3710775b1864
|
503
|
* @author Manuel Caballero
|
mcm |
2:3710775b1864
|
504
|
* @date 20/December/2017
|
mcm |
2:3710775b1864
|
505
|
* @version 20/December/2017 The ORIGIN
|
mcm |
2:3710775b1864
|
506
|
* @pre NaN
|
mcm |
2:3710775b1864
|
507
|
* @warning NaN.
|
mcm |
2:3710775b1864
|
508
|
*/
|
mcm |
2:3710775b1864
|
509
|
DS3231::DS3231_status_t DS3231::DS3231_SetAlarm2 ( DS3231_alarm2_register_t myAlarm2 )
|
mcm |
2:3710775b1864
|
510
|
{
|
mcm |
2:3710775b1864
|
511
|
char cmd[] = { 0, 0 };
|
mcm |
2:3710775b1864
|
512
|
uint32_t aux = 0;
|
mcm |
2:3710775b1864
|
513
|
uint32_t Alarm2MinuteAux = 0; // A2M2
|
mcm |
2:3710775b1864
|
514
|
uint32_t Alarm2HourAux = 0; // A2M3
|
mcm |
2:3710775b1864
|
515
|
uint32_t Alarm2DayDateAux = 0; // A2M3 & DYDT
|
mcm |
2:3710775b1864
|
516
|
|
mcm |
2:3710775b1864
|
517
|
|
mcm |
2:3710775b1864
|
518
|
// Read all the registers involved in the alarm2
|
mcm |
2:3710775b1864
|
519
|
// A2M2
|
mcm |
2:3710775b1864
|
520
|
cmd[0] = DS3231_ALARM_2_MINUTES;
|
mcm |
2:3710775b1864
|
521
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
|
mcm |
2:3710775b1864
|
522
|
aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
|
mcm |
2:3710775b1864
|
523
|
|
mcm |
2:3710775b1864
|
524
|
Alarm2MinuteAux = ( cmd[1] & ~ALARM2_A2M2_MASK );
|
mcm |
2:3710775b1864
|
525
|
|
mcm |
2:3710775b1864
|
526
|
// A2M3
|
mcm |
2:3710775b1864
|
527
|
cmd[0] = DS3231_ALARM_2_HOURS;
|
mcm |
2:3710775b1864
|
528
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
|
mcm |
2:3710775b1864
|
529
|
aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
|
mcm |
2:3710775b1864
|
530
|
|
mcm |
2:3710775b1864
|
531
|
Alarm2HourAux = ( cmd[1] & ~ALARM2_A2M3_MASK );
|
mcm |
2:3710775b1864
|
532
|
|
mcm |
2:3710775b1864
|
533
|
// A2M4 & DY/#DT
|
mcm |
2:3710775b1864
|
534
|
cmd[0] = DS3231_ALARM_2_DAY_DATE;
|
mcm |
2:3710775b1864
|
535
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
|
mcm |
2:3710775b1864
|
536
|
aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
|
mcm |
2:3710775b1864
|
537
|
|
mcm |
2:3710775b1864
|
538
|
Alarm2DayDateAux = ( cmd[1] & ~( ALARM2_A2M4_MASK | ALARM2_DYDT_MASK ) );
|
mcm |
2:3710775b1864
|
539
|
|
mcm |
2:3710775b1864
|
540
|
|
mcm |
2:3710775b1864
|
541
|
// Set all ( A2M2, A2M3 A2M4 and DY/#DT ) to 0
|
mcm |
2:3710775b1864
|
542
|
cmd[0] = DS3231_ALARM_2_MINUTES;
|
mcm |
2:3710775b1864
|
543
|
cmd[1] = Alarm2MinuteAux;
|
mcm |
2:3710775b1864
|
544
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
545
|
|
mcm |
2:3710775b1864
|
546
|
cmd[0] = DS3231_ALARM_2_HOURS;
|
mcm |
2:3710775b1864
|
547
|
cmd[1] = Alarm2HourAux;
|
mcm |
2:3710775b1864
|
548
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
549
|
|
mcm |
2:3710775b1864
|
550
|
cmd[0] = DS3231_ALARM_2_DAY_DATE;
|
mcm |
2:3710775b1864
|
551
|
cmd[1] = Alarm2DayDateAux;
|
mcm |
2:3710775b1864
|
552
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
553
|
|
mcm |
2:3710775b1864
|
554
|
|
mcm |
2:3710775b1864
|
555
|
// Update the Alarm 2 rate
|
mcm |
2:3710775b1864
|
556
|
switch ( myAlarm2 )
|
mcm |
2:3710775b1864
|
557
|
{
|
mcm |
2:3710775b1864
|
558
|
case ALARM2_ALARM_ONCE_PER_MINUTE:
|
mcm |
2:3710775b1864
|
559
|
cmd[0] = DS3231_ALARM_2_MINUTES;
|
mcm |
2:3710775b1864
|
560
|
cmd[1] = ( Alarm2MinuteAux | ALARM2_A2M2_MASK );
|
mcm |
2:3710775b1864
|
561
|
|
mcm |
2:3710775b1864
|
562
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
563
|
|
mcm |
2:3710775b1864
|
564
|
case ALARM2_WHEN_MINUTES_MATCH:
|
mcm |
2:3710775b1864
|
565
|
cmd[0] = DS3231_ALARM_2_HOURS;
|
mcm |
2:3710775b1864
|
566
|
cmd[1] = ( Alarm2HourAux | ALARM2_A2M3_MASK );
|
mcm |
2:3710775b1864
|
567
|
|
mcm |
2:3710775b1864
|
568
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
569
|
|
mcm |
2:3710775b1864
|
570
|
case ALARM2_WHEN_HOURS_MINUTES_MATCH:
|
mcm |
2:3710775b1864
|
571
|
cmd[0] = DS3231_ALARM_2_DAY_DATE;
|
mcm |
2:3710775b1864
|
572
|
cmd[1] = ( Alarm2DayDateAux | ALARM2_A2M4_MASK );
|
mcm |
2:3710775b1864
|
573
|
|
mcm |
2:3710775b1864
|
574
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
575
|
break;
|
mcm |
2:3710775b1864
|
576
|
|
mcm |
2:3710775b1864
|
577
|
default:
|
mcm |
2:3710775b1864
|
578
|
case ALARM2_WHEN_DATE_HOURS_AND_MINUTES_MATCH:
|
mcm |
2:3710775b1864
|
579
|
break;
|
mcm |
2:3710775b1864
|
580
|
|
mcm |
2:3710775b1864
|
581
|
case ALARM2_WHEN_DAY_HOURS_AND_MINUTES_MATCH:
|
mcm |
2:3710775b1864
|
582
|
cmd[0] = DS3231_ALARM_2_DAY_DATE;
|
mcm |
2:3710775b1864
|
583
|
cmd[1] = ( Alarm2DayDateAux | ALARM2_DYDT_MASK );
|
mcm |
2:3710775b1864
|
584
|
|
mcm |
2:3710775b1864
|
585
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
586
|
break;
|
mcm |
2:3710775b1864
|
587
|
}
|
mcm |
2:3710775b1864
|
588
|
|
mcm |
2:3710775b1864
|
589
|
|
mcm |
2:3710775b1864
|
590
|
|
mcm |
2:3710775b1864
|
591
|
|
mcm |
2:3710775b1864
|
592
|
|
mcm |
2:3710775b1864
|
593
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:3710775b1864
|
594
|
return DS3231_SUCCESS;
|
mcm |
2:3710775b1864
|
595
|
else
|
mcm |
2:3710775b1864
|
596
|
return DS3231_FAILURE;
|
mcm |
2:3710775b1864
|
597
|
}
|
mcm |
2:3710775b1864
|
598
|
|
mcm |
2:3710775b1864
|
599
|
|
mcm |
2:3710775b1864
|
600
|
/**
|
mcm |
2:3710775b1864
|
601
|
* @brief DS3231_SetAlarmsInterrupt ( DS3231_control_status_alarm1_t , DS3231_control_status_alarm2_t )
|
mcm |
2:3710775b1864
|
602
|
*
|
mcm |
2:3710775b1864
|
603
|
* @details It enables/disable alarm interrupts.
|
mcm |
2:3710775b1864
|
604
|
*
|
mcm |
2:3710775b1864
|
605
|
* @param[in] myAlarm1: Enable/Disable Alarm1 interrupt.
|
mcm |
2:3710775b1864
|
606
|
* @param[in] myAlarm2: Enable/Disable Alarm2 interrupt.
|
mcm |
2:3710775b1864
|
607
|
*
|
mcm |
2:3710775b1864
|
608
|
* @param[out] NaN.
|
mcm |
2:3710775b1864
|
609
|
*
|
mcm |
2:3710775b1864
|
610
|
*
|
mcm |
2:3710775b1864
|
611
|
* @return Status of DS3231_SetAlarmsInterrupt.
|
mcm |
2:3710775b1864
|
612
|
*
|
mcm |
2:3710775b1864
|
613
|
*
|
mcm |
2:3710775b1864
|
614
|
* @author Manuel Caballero
|
mcm |
2:3710775b1864
|
615
|
* @date 20/December/2017
|
mcm |
2:3710775b1864
|
616
|
* @version 20/December/2017 The ORIGIN
|
mcm |
2:3710775b1864
|
617
|
* @pre NaN
|
mcm |
2:3710775b1864
|
618
|
* @warning NaN.
|
mcm |
2:3710775b1864
|
619
|
*/
|
mcm |
2:3710775b1864
|
620
|
DS3231::DS3231_status_t DS3231::DS3231_SetAlarmsInterrupt ( DS3231_control_status_alarm1_t myAlarm1, DS3231_control_status_alarm2_t myAlarm2 )
|
mcm |
2:3710775b1864
|
621
|
{
|
mcm |
2:3710775b1864
|
622
|
char cmd[] = { DS3231_CONTROL, 0 };
|
mcm |
2:3710775b1864
|
623
|
uint32_t aux = 0;
|
mcm |
2:3710775b1864
|
624
|
|
mcm |
2:3710775b1864
|
625
|
|
mcm |
2:3710775b1864
|
626
|
// Read the Control Register
|
mcm |
2:3710775b1864
|
627
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
|
mcm |
2:3710775b1864
|
628
|
aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
|
mcm |
2:3710775b1864
|
629
|
|
mcm |
2:3710775b1864
|
630
|
// Parse the data
|
mcm |
2:3710775b1864
|
631
|
cmd[1] &= ~( CONTROL_STATUS_ALARM1_MASK | CONTROL_STATUS_ALARM2_MASK );
|
mcm |
2:3710775b1864
|
632
|
cmd[1] |= ( myAlarm1 | myAlarm2 );
|
mcm |
2:3710775b1864
|
633
|
|
mcm |
2:3710775b1864
|
634
|
|
mcm |
2:3710775b1864
|
635
|
// If both alarms are off then, disables the alarm interrupts, enables them otherwise.
|
mcm |
2:3710775b1864
|
636
|
if ( ( myAlarm1 == CONTROL_STATUS_ALARM1_DISABLED ) && ( myAlarm2 == CONTROL_STATUS_ALARM2_DISABLED ) )
|
mcm |
2:3710775b1864
|
637
|
cmd[1] &= ~CONTROL_STATUS_INTERRUPT_CONTROL_MASK;
|
mcm |
2:3710775b1864
|
638
|
else
|
mcm |
2:3710775b1864
|
639
|
cmd[1] |= CONTROL_STATUS_INTERRUPT_CONTROL_INT;
|
mcm |
2:3710775b1864
|
640
|
|
mcm |
2:3710775b1864
|
641
|
|
mcm |
2:3710775b1864
|
642
|
// Update the register
|
mcm |
2:3710775b1864
|
643
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
644
|
|
mcm |
2:3710775b1864
|
645
|
|
mcm |
2:3710775b1864
|
646
|
|
mcm |
2:3710775b1864
|
647
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:3710775b1864
|
648
|
return DS3231_SUCCESS;
|
mcm |
2:3710775b1864
|
649
|
else
|
mcm |
2:3710775b1864
|
650
|
return DS3231_FAILURE;
|
mcm |
2:3710775b1864
|
651
|
}
|
mcm |
2:3710775b1864
|
652
|
|
mcm |
2:3710775b1864
|
653
|
|
mcm |
2:3710775b1864
|
654
|
/**
|
mcm |
2:3710775b1864
|
655
|
* @brief DS3231_SetSquareWaveOutput ( DS3231_control_status_rate_select_t )
|
mcm |
2:3710775b1864
|
656
|
*
|
mcm |
2:3710775b1864
|
657
|
* @details It enables/disable the square-wave output.
|
mcm |
2:3710775b1864
|
658
|
*
|
mcm |
2:3710775b1864
|
659
|
* @param[in] myRate: Square-wave output frequency.
|
mcm |
2:3710775b1864
|
660
|
*
|
mcm |
2:3710775b1864
|
661
|
* @param[out] NaN.
|
mcm |
2:3710775b1864
|
662
|
*
|
mcm |
2:3710775b1864
|
663
|
*
|
mcm |
2:3710775b1864
|
664
|
* @return Status of DS3231_SetSquareWaveOutput.
|
mcm |
2:3710775b1864
|
665
|
*
|
mcm |
2:3710775b1864
|
666
|
*
|
mcm |
2:3710775b1864
|
667
|
* @author Manuel Caballero
|
mcm |
2:3710775b1864
|
668
|
* @date 19/December/2017
|
mcm |
2:3710775b1864
|
669
|
* @version 19/December/2017 The ORIGIN
|
mcm |
2:3710775b1864
|
670
|
* @pre NaN
|
mcm |
2:3710775b1864
|
671
|
* @warning NaN.
|
mcm |
2:3710775b1864
|
672
|
*/
|
mcm |
2:3710775b1864
|
673
|
DS3231::DS3231_status_t DS3231::DS3231_SetSquareWaveOutput ( DS3231_control_status_rate_select_t myRate )
|
mcm |
2:3710775b1864
|
674
|
{
|
mcm |
2:3710775b1864
|
675
|
char cmd[] = { DS3231_CONTROL, 0 };
|
mcm |
2:3710775b1864
|
676
|
uint32_t aux = 0;
|
mcm |
2:3710775b1864
|
677
|
|
mcm |
2:3710775b1864
|
678
|
|
mcm |
2:3710775b1864
|
679
|
// Read the Control Register
|
mcm |
2:3710775b1864
|
680
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 1, true );
|
mcm |
2:3710775b1864
|
681
|
aux = _i2c.read ( _DS3231_Addr, &cmd[1], 1 );
|
mcm |
2:3710775b1864
|
682
|
|
mcm |
2:3710775b1864
|
683
|
// Parse the data
|
mcm |
2:3710775b1864
|
684
|
cmd[1] &= ~CONTROL_STATUS_RATE_SELECT_MASK;
|
mcm |
2:3710775b1864
|
685
|
cmd[1] |= myRate;
|
mcm |
2:3710775b1864
|
686
|
|
mcm |
2:3710775b1864
|
687
|
|
mcm |
2:3710775b1864
|
688
|
// Enable the square-wave output.
|
mcm |
2:3710775b1864
|
689
|
cmd[1] &= ~CONTROL_STATUS_INTERRUPT_CONTROL_MASK;
|
mcm |
2:3710775b1864
|
690
|
|
mcm |
2:3710775b1864
|
691
|
|
mcm |
2:3710775b1864
|
692
|
// Update the register
|
mcm |
2:3710775b1864
|
693
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
694
|
|
mcm |
2:3710775b1864
|
695
|
|
mcm |
2:3710775b1864
|
696
|
|
mcm |
2:3710775b1864
|
697
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:3710775b1864
|
698
|
return DS3231_SUCCESS;
|
mcm |
2:3710775b1864
|
699
|
else
|
mcm |
2:3710775b1864
|
700
|
return DS3231_FAILURE;
|
mcm |
2:3710775b1864
|
701
|
}
|
mcm |
2:3710775b1864
|
702
|
|
mcm |
2:3710775b1864
|
703
|
|
mcm |
2:3710775b1864
|
704
|
/**
|
mcm |
2:3710775b1864
|
705
|
* @brief DS3231_GetDate ( DS3231_vector_date_time_t* )
|
mcm |
2:3710775b1864
|
706
|
*
|
mcm |
2:3710775b1864
|
707
|
* @details It gets the date.
|
mcm |
2:3710775b1864
|
708
|
*
|
mcm |
2:3710775b1864
|
709
|
* @param[in] myDate: Current Date.
|
mcm |
2:3710775b1864
|
710
|
*
|
mcm |
2:3710775b1864
|
711
|
* @param[out] NaN.
|
mcm |
2:3710775b1864
|
712
|
*
|
mcm |
2:3710775b1864
|
713
|
*
|
mcm |
2:3710775b1864
|
714
|
* @return Status of DS3231_GetDate.
|
mcm |
2:3710775b1864
|
715
|
*
|
mcm |
2:3710775b1864
|
716
|
*
|
mcm |
2:3710775b1864
|
717
|
* @author Manuel Caballero
|
mcm |
2:3710775b1864
|
718
|
* @date 20/December/2017
|
mcm |
2:3710775b1864
|
719
|
* @version 20/December/2017 The ORIGIN
|
mcm |
2:3710775b1864
|
720
|
* @pre NaN
|
mcm |
2:3710775b1864
|
721
|
* @warning NaN.
|
mcm |
2:3710775b1864
|
722
|
*/
|
mcm |
2:3710775b1864
|
723
|
DS3231::DS3231_status_t DS3231::DS3231_GetDate ( DS3231_vector_date_time_t* myDate )
|
mcm |
2:3710775b1864
|
724
|
{
|
mcm |
2:3710775b1864
|
725
|
char cmd = 0;
|
mcm |
2:3710775b1864
|
726
|
uint32_t aux = 0;
|
mcm |
2:3710775b1864
|
727
|
|
mcm |
2:3710775b1864
|
728
|
|
mcm |
2:3710775b1864
|
729
|
// Read Date Register
|
mcm |
2:3710775b1864
|
730
|
cmd = DS3231_DATE;
|
mcm |
2:3710775b1864
|
731
|
aux = _i2c.write ( _DS3231_Addr, &cmd, 1, true );
|
mcm |
2:3710775b1864
|
732
|
aux = _i2c.read ( _DS3231_Addr, &cmd, 1 );
|
mcm |
2:3710775b1864
|
733
|
|
mcm |
2:3710775b1864
|
734
|
myDate->Date = _MYBCD_TO_DECIMAL( cmd );
|
mcm |
2:3710775b1864
|
735
|
|
mcm |
2:3710775b1864
|
736
|
// Read Month Register
|
mcm |
2:3710775b1864
|
737
|
cmd = DS3231_MONTH_CENTURY;
|
mcm |
2:3710775b1864
|
738
|
aux = _i2c.write ( _DS3231_Addr, &cmd, 1, true );
|
mcm |
2:3710775b1864
|
739
|
aux = _i2c.read ( _DS3231_Addr, &cmd, 1 );
|
mcm |
2:3710775b1864
|
740
|
|
mcm |
2:3710775b1864
|
741
|
myDate->Month = _MYBCD_TO_DECIMAL( cmd & MONTH_MONTH_MASK );
|
mcm |
2:3710775b1864
|
742
|
myDate->Century = _MYBCD_TO_DECIMAL( cmd & MONTH_CENTURY_MASK );
|
mcm |
2:3710775b1864
|
743
|
|
mcm |
2:3710775b1864
|
744
|
// Read Year Register
|
mcm |
2:3710775b1864
|
745
|
cmd = DS3231_YEAR;
|
mcm |
2:3710775b1864
|
746
|
aux = _i2c.write ( _DS3231_Addr, &cmd, 1, true );
|
mcm |
2:3710775b1864
|
747
|
aux = _i2c.read ( _DS3231_Addr, &cmd, 1 );
|
mcm |
2:3710775b1864
|
748
|
|
mcm |
2:3710775b1864
|
749
|
myDate->Year = _MYBCD_TO_DECIMAL( cmd );
|
mcm |
2:3710775b1864
|
750
|
|
mcm |
2:3710775b1864
|
751
|
// Read Day of the Week Register
|
mcm |
2:3710775b1864
|
752
|
cmd = DS3231_DAY;
|
mcm |
2:3710775b1864
|
753
|
aux = _i2c.write ( _DS3231_Addr, &cmd, 1, true );
|
mcm |
2:3710775b1864
|
754
|
aux = _i2c.read ( _DS3231_Addr, &cmd, 1 );
|
mcm |
2:3710775b1864
|
755
|
|
mcm |
2:3710775b1864
|
756
|
myDate->DayOfWeek = _MYBCD_TO_DECIMAL( cmd );
|
mcm |
2:3710775b1864
|
757
|
|
mcm |
2:3710775b1864
|
758
|
|
mcm |
2:3710775b1864
|
759
|
|
mcm |
2:3710775b1864
|
760
|
|
mcm |
2:3710775b1864
|
761
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:3710775b1864
|
762
|
return DS3231_SUCCESS;
|
mcm |
2:3710775b1864
|
763
|
else
|
mcm |
2:3710775b1864
|
764
|
return DS3231_FAILURE;
|
mcm |
2:3710775b1864
|
765
|
}
|
mcm |
2:3710775b1864
|
766
|
|
mcm |
2:3710775b1864
|
767
|
|
mcm |
2:3710775b1864
|
768
|
/**
|
mcm |
2:3710775b1864
|
769
|
* @brief DS3231_SetDate ( DS3231_vector_date_time_t )
|
mcm |
2:3710775b1864
|
770
|
*
|
mcm |
2:3710775b1864
|
771
|
* @details It sets the date.
|
mcm |
2:3710775b1864
|
772
|
*
|
mcm |
2:3710775b1864
|
773
|
* @param[in] myTime: Date to store.
|
mcm |
2:3710775b1864
|
774
|
*
|
mcm |
2:3710775b1864
|
775
|
* @param[out] NaN.
|
mcm |
2:3710775b1864
|
776
|
*
|
mcm |
2:3710775b1864
|
777
|
*
|
mcm |
2:3710775b1864
|
778
|
* @return Status of DS3231_SetDate.
|
mcm |
2:3710775b1864
|
779
|
*
|
mcm |
2:3710775b1864
|
780
|
*
|
mcm |
2:3710775b1864
|
781
|
* @author Manuel Caballero
|
mcm |
2:3710775b1864
|
782
|
* @date 20/December/2017
|
mcm |
2:3710775b1864
|
783
|
* @version 20/December/2017 The ORIGIN
|
mcm |
2:3710775b1864
|
784
|
* @pre NaN
|
mcm |
2:3710775b1864
|
785
|
* @warning NaN.
|
mcm |
2:3710775b1864
|
786
|
*/
|
mcm |
2:3710775b1864
|
787
|
DS3231::DS3231_status_t DS3231::DS3231_SetDate ( DS3231_vector_date_time_t myDate )
|
mcm |
2:3710775b1864
|
788
|
{
|
mcm |
2:3710775b1864
|
789
|
char cmd[] = { 0, 0 };
|
mcm |
2:3710775b1864
|
790
|
uint32_t aux = 0;
|
mcm |
2:3710775b1864
|
791
|
|
mcm |
2:3710775b1864
|
792
|
|
mcm |
2:3710775b1864
|
793
|
// Update Date Register
|
mcm |
2:3710775b1864
|
794
|
cmd[0] = DS3231_DATE;
|
mcm |
2:3710775b1864
|
795
|
cmd[1] = _MYDECIMAL_TO_BCD( myDate.Date );
|
mcm |
2:3710775b1864
|
796
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
797
|
|
mcm |
2:3710775b1864
|
798
|
// Update Month Register
|
mcm |
2:3710775b1864
|
799
|
cmd[0] = DS3231_MONTH_CENTURY;
|
mcm |
2:3710775b1864
|
800
|
cmd[1] = _MYDECIMAL_TO_BCD( myDate.Month | myDate.Century );
|
mcm |
2:3710775b1864
|
801
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
802
|
|
mcm |
2:3710775b1864
|
803
|
// Update Year Register
|
mcm |
2:3710775b1864
|
804
|
cmd[0] = DS3231_YEAR;
|
mcm |
2:3710775b1864
|
805
|
cmd[1] = _MYDECIMAL_TO_BCD( myDate.Year );
|
mcm |
2:3710775b1864
|
806
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
807
|
|
mcm |
2:3710775b1864
|
808
|
// Update Day Register
|
mcm |
2:3710775b1864
|
809
|
cmd[0] = DS3231_DAY;
|
mcm |
2:3710775b1864
|
810
|
cmd[1] = _MYDECIMAL_TO_BCD( myDate.DayOfWeek );
|
mcm |
2:3710775b1864
|
811
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
812
|
|
mcm |
2:3710775b1864
|
813
|
|
mcm |
2:3710775b1864
|
814
|
|
mcm |
2:3710775b1864
|
815
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:3710775b1864
|
816
|
return DS3231_SUCCESS;
|
mcm |
2:3710775b1864
|
817
|
else
|
mcm |
2:3710775b1864
|
818
|
return DS3231_FAILURE;
|
mcm |
2:3710775b1864
|
819
|
}
|
mcm |
2:3710775b1864
|
820
|
|
mcm |
2:3710775b1864
|
821
|
|
mcm |
2:3710775b1864
|
822
|
/**
|
mcm |
2:3710775b1864
|
823
|
* @brief DS3231_GetTime ( DS3231_vector_date_time_t* )
|
mcm |
2:3710775b1864
|
824
|
*
|
mcm |
2:3710775b1864
|
825
|
* @details It gets the time in decimal.
|
mcm |
2:3710775b1864
|
826
|
*
|
mcm |
2:3710775b1864
|
827
|
* @param[in] myTime: Current Time.
|
mcm |
2:3710775b1864
|
828
|
*
|
mcm |
2:3710775b1864
|
829
|
* @param[out] NaN.
|
mcm |
2:3710775b1864
|
830
|
*
|
mcm |
2:3710775b1864
|
831
|
*
|
mcm |
2:3710775b1864
|
832
|
* @return Status of DS3231_GetTime.
|
mcm |
2:3710775b1864
|
833
|
*
|
mcm |
2:3710775b1864
|
834
|
*
|
mcm |
2:3710775b1864
|
835
|
* @author Manuel Caballero
|
mcm |
2:3710775b1864
|
836
|
* @date 20/December/2017
|
mcm |
2:3710775b1864
|
837
|
* @version 20/December/2017 The ORIGIN
|
mcm |
2:3710775b1864
|
838
|
* @pre NaN
|
mcm |
2:3710775b1864
|
839
|
* @warning NaN.
|
mcm |
2:3710775b1864
|
840
|
*/
|
mcm |
2:3710775b1864
|
841
|
DS3231::DS3231_status_t DS3231::DS3231_GetTime ( DS3231_vector_date_time_t* myTime )
|
mcm |
2:3710775b1864
|
842
|
{
|
mcm |
2:3710775b1864
|
843
|
char cmd = 0;
|
mcm |
2:3710775b1864
|
844
|
uint32_t aux = 0;
|
mcm |
2:3710775b1864
|
845
|
|
mcm |
2:3710775b1864
|
846
|
|
mcm |
2:3710775b1864
|
847
|
// Read Hours Register
|
mcm |
2:3710775b1864
|
848
|
cmd = DS3231_HOURS;
|
mcm |
2:3710775b1864
|
849
|
aux = _i2c.write ( _DS3231_Addr, &cmd, 1, true );
|
mcm |
2:3710775b1864
|
850
|
aux = _i2c.read ( _DS3231_Addr, &cmd, 1 );
|
mcm |
2:3710775b1864
|
851
|
|
mcm |
2:3710775b1864
|
852
|
myTime->Hours = _MYBCD_TO_DECIMAL( ( cmd & ~( HOURS_nAM_PM_MASK | HOURS_12_n24_MASK ) ) );
|
mcm |
2:3710775b1864
|
853
|
myTime->Mode_nAM_PM = ( cmd & HOURS_nAM_PM_MASK );
|
mcm |
2:3710775b1864
|
854
|
myTime->Mode_12_n24 = ( cmd & HOURS_12_n24_MASK );
|
mcm |
2:3710775b1864
|
855
|
|
mcm |
2:3710775b1864
|
856
|
// Read Minutes Register
|
mcm |
2:3710775b1864
|
857
|
cmd = DS3231_MINUTES;
|
mcm |
2:3710775b1864
|
858
|
aux = _i2c.write ( _DS3231_Addr, &cmd, 1, true );
|
mcm |
2:3710775b1864
|
859
|
aux = _i2c.read ( _DS3231_Addr, &cmd, 1 );
|
mcm |
2:3710775b1864
|
860
|
|
mcm |
2:3710775b1864
|
861
|
myTime->Minutes = _MYBCD_TO_DECIMAL( cmd );
|
mcm |
2:3710775b1864
|
862
|
|
mcm |
2:3710775b1864
|
863
|
// Read Seconds Register
|
mcm |
2:3710775b1864
|
864
|
cmd = DS3231_SECONDS;
|
mcm |
2:3710775b1864
|
865
|
aux = _i2c.write ( _DS3231_Addr, &cmd, 1, true );
|
mcm |
2:3710775b1864
|
866
|
aux = _i2c.read ( _DS3231_Addr, &cmd, 1 );
|
mcm |
2:3710775b1864
|
867
|
|
mcm |
2:3710775b1864
|
868
|
myTime->Seconds = _MYBCD_TO_DECIMAL( cmd );
|
mcm |
2:3710775b1864
|
869
|
|
mcm |
2:3710775b1864
|
870
|
|
mcm |
2:3710775b1864
|
871
|
|
mcm |
2:3710775b1864
|
872
|
|
mcm |
2:3710775b1864
|
873
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:3710775b1864
|
874
|
return DS3231_SUCCESS;
|
mcm |
2:3710775b1864
|
875
|
else
|
mcm |
2:3710775b1864
|
876
|
return DS3231_FAILURE;
|
mcm |
2:3710775b1864
|
877
|
}
|
mcm |
2:3710775b1864
|
878
|
|
mcm |
2:3710775b1864
|
879
|
/**
|
mcm |
2:3710775b1864
|
880
|
* @brief DS3231_SetTime ( DS3231_vector_date_time_t )
|
mcm |
2:3710775b1864
|
881
|
*
|
mcm |
2:3710775b1864
|
882
|
* @details It sets the time in BCD.
|
mcm |
2:3710775b1864
|
883
|
*
|
mcm |
2:3710775b1864
|
884
|
* @param[in] myTime: Time to store.
|
mcm |
2:3710775b1864
|
885
|
*
|
mcm |
2:3710775b1864
|
886
|
* @param[out] NaN.
|
mcm |
2:3710775b1864
|
887
|
*
|
mcm |
2:3710775b1864
|
888
|
*
|
mcm |
2:3710775b1864
|
889
|
* @return Status of DS3231_SetTime.
|
mcm |
2:3710775b1864
|
890
|
*
|
mcm |
2:3710775b1864
|
891
|
*
|
mcm |
2:3710775b1864
|
892
|
* @author Manuel Caballero
|
mcm |
2:3710775b1864
|
893
|
* @date 20/December/2017
|
mcm |
2:3710775b1864
|
894
|
* @version 20/December/2017 The ORIGIN
|
mcm |
2:3710775b1864
|
895
|
* @pre NaN
|
mcm |
2:3710775b1864
|
896
|
* @warning NaN.
|
mcm |
2:3710775b1864
|
897
|
*/
|
mcm |
2:3710775b1864
|
898
|
DS3231::DS3231_status_t DS3231::DS3231_SetTime ( DS3231_vector_date_time_t myTime )
|
mcm |
2:3710775b1864
|
899
|
{
|
mcm |
2:3710775b1864
|
900
|
char cmd[] = { 0, 0 };
|
mcm |
2:3710775b1864
|
901
|
uint32_t aux = 0;
|
mcm |
2:3710775b1864
|
902
|
|
mcm |
2:3710775b1864
|
903
|
|
mcm |
2:3710775b1864
|
904
|
// Update Hours Register
|
mcm |
2:3710775b1864
|
905
|
cmd[0] = DS3231_HOURS;
|
mcm |
2:3710775b1864
|
906
|
cmd[1] = ( _MYDECIMAL_TO_BCD( myTime.Hours ) | myTime.Mode_12_n24 | myTime.Mode_nAM_PM );
|
mcm |
2:3710775b1864
|
907
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
908
|
|
mcm |
2:3710775b1864
|
909
|
// Update Minutes Register
|
mcm |
2:3710775b1864
|
910
|
cmd[0] = DS3231_MINUTES;
|
mcm |
2:3710775b1864
|
911
|
cmd[1] = _MYDECIMAL_TO_BCD( myTime.Minutes );
|
mcm |
2:3710775b1864
|
912
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
913
|
|
mcm |
2:3710775b1864
|
914
|
// Update Seconds Register
|
mcm |
2:3710775b1864
|
915
|
cmd[0] = DS3231_SECONDS;
|
mcm |
2:3710775b1864
|
916
|
cmd[1] = _MYDECIMAL_TO_BCD( myTime.Seconds );
|
mcm |
2:3710775b1864
|
917
|
aux = _i2c.write ( _DS3231_Addr, &cmd[0], 2, false );
|
mcm |
2:3710775b1864
|
918
|
|
mcm |
2:3710775b1864
|
919
|
|
mcm |
2:3710775b1864
|
920
|
|
mcm |
2:3710775b1864
|
921
|
|
mcm |
2:3710775b1864
|
922
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:3710775b1864
|
923
|
return DS3231_SUCCESS;
|
mcm |
2:3710775b1864
|
924
|
else
|
mcm |
2:3710775b1864
|
925
|
return DS3231_FAILURE;
|
mcm |
2:3710775b1864
|
926
|
}
|
mcm |
2:3710775b1864
|
927
|
|
mcm |
2:3710775b1864
|
928
|
|
mcm |
2:3710775b1864
|
929
|
|
mcm |
2:3710775b1864
|
930
|
/**
|
mcm |
2:3710775b1864
|
931
|
* @brief DS3231_GetControlStatusRegister ( DS3231_vector_data_t* )
|
mcm |
2:3710775b1864
|
932
|
*
|
mcm |
2:3710775b1864
|
933
|
* @details It gets the Control/Status register.
|
mcm |
2:3710775b1864
|
934
|
*
|
mcm |
2:3710775b1864
|
935
|
* @param[in] myControlStatusReg: Current value of the Register.
|
mcm |
2:3710775b1864
|
936
|
*
|
mcm |
2:3710775b1864
|
937
|
* @param[out] NaN.
|
mcm |
2:3710775b1864
|
938
|
*
|
mcm |
2:3710775b1864
|
939
|
*
|
mcm |
2:3710775b1864
|
940
|
* @return Status of DS3231_GetControlStatusRegister.
|
mcm |
2:3710775b1864
|
941
|
*
|
mcm |
2:3710775b1864
|
942
|
*
|
mcm |
2:3710775b1864
|
943
|
* @author Manuel Caballero
|
mcm |
2:3710775b1864
|
944
|
* @date 20/December/2017
|
mcm |
2:3710775b1864
|
945
|
* @version 20/December/2017 The ORIGIN
|
mcm |
2:3710775b1864
|
946
|
* @pre NaN
|
mcm |
2:3710775b1864
|
947
|
* @warning NaN.
|
mcm |
2:3710775b1864
|
948
|
*/
|
mcm |
2:3710775b1864
|
949
|
DS3231::DS3231_status_t DS3231::DS3231_GetControlStatusRegister ( DS3231_vector_data_t* myControlStatusReg )
|
mcm |
2:3710775b1864
|
950
|
{
|
mcm |
2:3710775b1864
|
951
|
char cmd = DS3231_CONTROL_STATUS;
|
mcm |
2:3710775b1864
|
952
|
uint32_t aux = 0;
|
mcm |
2:3710775b1864
|
953
|
|
mcm |
2:3710775b1864
|
954
|
|
mcm |
2:3710775b1864
|
955
|
// Read Control/Status Register
|
mcm |
2:3710775b1864
|
956
|
aux = _i2c.write ( _DS3231_Addr, &cmd, 1, true );
|
mcm |
2:3710775b1864
|
957
|
aux = _i2c.read ( _DS3231_Addr, &cmd, 1 );
|
mcm |
2:3710775b1864
|
958
|
|
mcm |
2:3710775b1864
|
959
|
myControlStatusReg->Control_Status_Register = cmd;
|
mcm |
2:3710775b1864
|
960
|
|
mcm |
2:3710775b1864
|
961
|
|
mcm |
2:3710775b1864
|
962
|
if ( aux == I2C_SUCCESS )
|
mcm |
2:3710775b1864
|
963
|
return DS3231_SUCCESS;
|
mcm |
2:3710775b1864
|
964
|
else
|
mcm |
2:3710775b1864
|
965
|
return DS3231_FAILURE;
|
mcm |
2:3710775b1864
|
966
|
}
|