ATY_LIB V2_102_230218
ATY_LIB for general devices or ALGO
 
Loading...
Searching...
No Matches
ds3231.c
Go to the documentation of this file.
1// Copyright 2021 IOsetting <iosetting(at)outlook.com>
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#include "ds3231.h"
16
17__XDATA uint8_t buff[7];
18
20{
21 return I2C_Write(DS3231_I2C_ADDR, reg, &dat, 1);
22}
23
25{
26 return (hex % 10) + ((hex / 10) << 4);
27}
28
30{
31 return (bcd >> 4) * 10 + (bcd & 0x0F);
32}
33
35{
37 return buff[0];
38}
39
41{
44 if (res != HAL_OK)
45 {
46 return res;
47 }
48 t[0] = DS3231_Bcd2Hex(buff[6]) + ((buff[5] >> 7) & 0x01) * 100; // year
49 t[1] = DS3231_Bcd2Hex(buff[5] & 0x1F); // month
50 t[2] = DS3231_Bcd2Hex(buff[3]); // week
51 t[3] = DS3231_Bcd2Hex(buff[4]); // date
52 t[7] = (buff[2] >> 6) & 0x01; // 12h/24h
53 t[8] = (buff[2] >> 5) & 0x01; // am/pm
54 if (t[7] == DS3231_FORMAT_12H)
55 {
56 t[4] = DS3231_Bcd2Hex(buff[2] & 0x1F); // hour
57 }
58 else
59 {
60 t[4] = DS3231_Bcd2Hex(buff[2] & 0x3F); // hour
61 }
62 t[5] = DS3231_Bcd2Hex(buff[1]); // minute
63 t[6] = DS3231_Bcd2Hex(buff[0]); // second
64 return HAL_OK;
65}
66
79{
80 uint8_t res, reg;
81
82 // Time validation
83 if (t[0] > 200) t[0] = 200; // year
84
85 if (t[1] == 0) t[1] = 1; // month
86 else if (t[1] > 12) t[1] = 12;
87
88 if (t[2] == 0) t[2] = 1; // week
89 else if (t[2] > 7) t[2] = 7;
90
91 if (t[3] == 0) t[3] = 1; // date
92 else if (t[3] > 31) t[3] = 31;
93
94 if (t[7] == DS3231_FORMAT_12H)
95 {
96 if (t[4] > 12) t[4] = 12; // hour
97 }
98 else if (t[7] == DS3231_FORMAT_24H)
99 {
100 if (t[4] > 23) t[4] = 23; // hour
101 }
102
103 if (t[5] > 59) t[5] = 59; // minute
104 if (t[6] > 59) t[6] = 59; // second
105
107 if (res != HAL_OK) return res;
108
110 if (res != HAL_OK) return res;
111
112 if (t[7] == DS3231_FORMAT_12H)
113 {
114 reg = (uint8_t)((1 << 6) | (t[8] << 5) | DS3231_Hex2Bcd(t[4]));
115 }
116 else
117 {
118 reg = (0 << 6) | DS3231_Hex2Bcd(t[4]);
119 }
121 if (res != HAL_OK) return res;
122
124 if (res != HAL_OK) return res;
125
127 if (res != HAL_OK) return res;
128
129 if (t[0] >= 100)
130 {
131 res = DS3231_Write(DS3231_REG_MONTH, DS3231_Hex2Bcd(t[1]) | (1 << 7));
132 if (res != HAL_OK) return res;
133 return DS3231_Write(DS3231_REG_YEAR, DS3231_Hex2Bcd(t[0] - 100));
134 }
135 else
136 {
138 if (res != HAL_OK) return res;
140 }
141}
142
144{
145 uint8_t res;
147 if (res != HAL_OK) return res;
148
149 *pin = (DS3231_PinType_t)((buff[0] >> 2) & 0x01);
150 return HAL_OK;
151}
152
154{
155 uint8_t res;
157 if (res != HAL_OK) return res;
158 buff[0] &= ~(1 << 2);
159 buff[0] |= (*pin) << 2;
161}
162
164{
165 uint8_t res;
167 if (res != HAL_OK) return res;
168 *state = (HAL_State_t)((buff[0] >> 6) & 0x01);
169 return HAL_OK;
170}
171
173{
174 uint8_t res;
176 if (res != HAL_OK) return res;
177 buff[0] &= ~(1 << 6);
178 buff[0] |= state << 6;
180}
181
183{
184 uint8_t res;
186 if (res != HAL_OK) return res;
187 *state = (HAL_State_t)((buff[0] >> alarm) & 0x01);
188 return HAL_OK;
189}
190
192{
193 uint8_t res;
195 if (res != HAL_OK) return res;
196 buff[0] &= ~(1 << alarm);
197 buff[0] |= state << alarm;
199}
200
202{
203 uint8_t res;
204
206 if (res != HAL_OK) return res;
207 t[0] = 0; // year
208 t[1] = 0; // month
209 if (((buff[3] >> 6) & 0x01) != 0) // if week
210 {
211 t[2] = DS3231_Bcd2Hex(buff[3] & 0x0F); // week
212 t[3] = 0; // date
213 }
214 else // if date
215 {
216 t[2] = 0; // week
217 t[3] = DS3231_Bcd2Hex(buff[3] & 0x3F); // date
218 }
219 t[8] = ((buff[2] >> 5) & 0x01); // am/pm
220 t[7] = ((buff[2] >> 6) & 0x01); // 12h/24h
221 if (t[7] == DS3231_FORMAT_12H)
222 {
223 t[4] = DS3231_Bcd2Hex(buff[2]&0x1F);
224 }
225 else
226 {
227 t[4] = DS3231_Bcd2Hex(buff[2]&0x3F);
228 }
229 t[5] = DS3231_Bcd2Hex(buff[1] & 0x7F);
230 t[6] = DS3231_Bcd2Hex(buff[0] & 0x7F);
231 *mode = (DS3231_Alarm1Mode_t)(
232 ((buff[0]>>7)&0x01)<<0 |
233 ((buff[1]>>7)&0x01)<<1 |
234 ((buff[2]>>7)&0x01)<<2 |
235 ((buff[3]>>7)&0x01)<<3 |
236 ((buff[3]>>6)&0x01)<<4
237 );
238 return HAL_OK;
239}
240
242{
243 uint8_t res;
244 uint8_t reg;
245
246 res = DS3231_Write(DS3231_REG_ALARM1_SECOND, DS3231_Hex2Bcd(t[6]) | ((mode & 0x01) << 7));
247 if (res != HAL_OK) return res;
248
249 res = DS3231_Write(DS3231_REG_ALARM1_MINUTE, DS3231_Hex2Bcd(t[5]) | (((mode >> 1) & 0x01) << 7));
250 if (res != HAL_OK) return res;
251
252 if (t[7] == DS3231_FORMAT_12H)
253 {
254 reg = (uint8_t)((((mode >> 2) & 0x01) << 7) | (1 << 6) | (t[8] << 5) | DS3231_Hex2Bcd(t[4]));
255 }
256 else
257 {
258 reg = (((mode >> 2) & 0x01) << 7) | DS3231_Hex2Bcd(t[4]);
259 }
261 if (res != HAL_OK) return res;
262
264 {
265 reg = (((mode >> 3) & 0x01) << 7) | (1 << 6) | DS3231_Hex2Bcd(t[2]);
266 }
267 else
268 {
269 reg = (((mode >> 3) & 0x01) << 7) | DS3231_Hex2Bcd(t[3]);
270 }
272}
273
275{
276 uint8_t res;
277
279 if (res != HAL_OK) return res;
280 t[0] = 0; // year
281 t[1] = 0; // month
282 if (((buff[2] >> 6) & 0x01) != 0) // if week
283 {
284 t[2] = DS3231_Bcd2Hex(buff[2] & 0x0F);
285 t[3] = 0;
286 }
287 else // if date
288 {
289 t[2] = 0;
290 t[3] = DS3231_Bcd2Hex(buff[2] & 0x3F);
291 }
292 t[8] = ((buff[1] >> 5) & 0x01); // am/pm
293 t[7] = ((buff[1] >> 6) & 0x01); // 12h/24h
294
295
296 if (t[7] == DS3231_FORMAT_12H)
297 {
298 t[4] = DS3231_Bcd2Hex(buff[1]&0x1F);
299 }
300 else
301 {
302 t[4] = DS3231_Bcd2Hex(buff[1]&0x3F);
303 }
304 t[5] = DS3231_Bcd2Hex(buff[0] & 0x7F);
305 t[6] = 0;
306
307 *mode = (DS3231_Alarm2Mode_t)(
308 ((buff[0]>>7)&0x01)<<0 |
309 ((buff[1]>>7)&0x01)<<1 |
310 ((buff[2]>>7)&0x01)<<2 |
311 ((buff[2]>>6)&0x01)<<4
312 );
313 return HAL_OK;
314}
315
317{
318 uint8_t res;
319 uint8_t reg;
320
321 res = DS3231_Write(DS3231_REG_ALARM2_MINUTE, DS3231_Hex2Bcd(t[5]) | (((mode >> 0) & 0x01) << 7));
322 if (res != HAL_OK) return res;
323
324 if (t[7] == DS3231_FORMAT_12H)
325 {
326 reg = (uint8_t)((((mode >> 1) & 0x01) << 7) | (1 << 6) | (t[8] << 5) | DS3231_Hex2Bcd(t[4]));
327 }
328 else
329 {
330 reg = (((mode >> 1) & 0x01) << 7) | DS3231_Hex2Bcd(t[4]);
331 }
333 if (res != HAL_OK) return res;
334
336 {
337 reg = (((mode >> 2) & 0x01) << 7) | (1 << 6) | DS3231_Hex2Bcd(t[2]);
338 }
339 else
340 {
341 reg = (((mode >> 2) & 0x01) << 7) | DS3231_Hex2Bcd(t[3]);
342 }
344}
345
347{
348 uint8_t res;
349
351 if (res != HAL_OK) return res;
352
353 buff[0] &= ~(1 << alarm);
355}
uint16_t res
__CODE int8_t dat[20]
uint8_t DS3231_SetAlarmInterrupt(DS3231_Alarm_t alarm, HAL_State_t state)
Definition: ds3231.c:191
uint8_t DS3231_SetAlarm1(uint8_t *t, DS3231_Alarm1Mode_t mode)
Definition: ds3231.c:241
uint8_t DS3231_GetPin(DS3231_PinType_t *pin)
Definition: ds3231.c:143
uint8_t DS3231_Hex2Bcd(uint8_t hex)
Definition: ds3231.c:24
uint8_t DS3231_SetAlarm2(uint8_t *t, DS3231_Alarm2Mode_t mode)
Definition: ds3231.c:316
uint8_t DS3231_SetSquareOutputState(HAL_State_t state)
Definition: ds3231.c:172
uint8_t DS3231_GetStatus(void)
Definition: ds3231.c:34
uint8_t ds3231_GetSquareOutputState(HAL_State_t *state)
Definition: ds3231.c:163
uint8_t DS3231_SetPin(DS3231_PinType_t *pin)
Definition: ds3231.c:153
uint8_t DS3231_GetAlarm2(uint8_t *t, DS3231_Alarm2Mode_t *mode)
Definition: ds3231.c:274
uint8_t DS3231_Bcd2Hex(uint8_t bcd)
Definition: ds3231.c:29
uint8_t DS3231_ClearAlarm(DS3231_Alarm_t alarm)
Definition: ds3231.c:346
__XDATA uint8_t buff[7]
Definition: ds3231.c:17
uint8_t DS3231_SetTime(uint8_t *t)
Definition: ds3231.c:78
uint8_t DS3231_GetAlarm1(uint8_t *t, DS3231_Alarm1Mode_t *mode)
Definition: ds3231.c:201
uint8_t DS3231_Write(uint8_t reg, uint8_t dat)
Definition: ds3231.c:19
uint8_t DS3231_GetAlarmInterrupt(DS3231_Alarm_t alarm, HAL_State_t *state)
Definition: ds3231.c:182
uint8_t DS3231_GetTime(uint8_t *t)
Definition: ds3231.c:40
DS3231_PinType_t
Definition: ds3231.h:57
#define DS3231_REG_MINUTE
Definition: ds3231.h:24
#define DS3231_REG_YEAR
Definition: ds3231.h:29
#define DS3231_REG_CONTROL
Definition: ds3231.h:37
#define DS3231_I2C_ADDR
Definition: ds3231.h:21
#define DS3231_REG_DATE
Definition: ds3231.h:27
#define DS3231_REG_ALARM2_MINUTE
Definition: ds3231.h:34
#define DS3231_REG_ALARM2_WEEK
Definition: ds3231.h:36
#define DS3231_REG_HOUR
Definition: ds3231.h:25
@ DS3231_FORMAT_24H
Definition: ds3231.h:65
@ DS3231_FORMAT_12H
Definition: ds3231.h:64
DS3231_Alarm2Mode_t
Definition: ds3231.h:85
@ DS3231_ALARM2_MODE_WEEK_HOUR_MINUTE_MATCH
Definition: ds3231.h:90
#define DS3231_REG_ALARM1_MINUTE
Definition: ds3231.h:31
#define DS3231_REG_ALARM2_HOUR
Definition: ds3231.h:35
#define DS3231_REG_SECOND
Definition: ds3231.h:23
DS3231_Alarm1Mode_t
Definition: ds3231.h:75
@ DS3231_ALARM1_MODE_WEEK_HOUR_MINUTE_SECOND_MATCH
Definition: ds3231.h:81
#define DS3231_REG_MONTH
Definition: ds3231.h:28
#define DS3231_REG_ALARM1_HOUR
Definition: ds3231.h:32
#define DS3231_REG_ALARM1_SECOND
Definition: ds3231.h:30
#define DS3231_REG_ALARM1_WEEK
Definition: ds3231.h:33
DS3231_Alarm_t
Definition: ds3231.h:45
#define DS3231_REG_STATUS
Definition: ds3231.h:38
#define DS3231_REG_WEEK
Definition: ds3231.h:26
uint8_t I2C_Read(uint8_t devAddr, uint8_t memAddr, uint8_t *buf, uint16_t size)
Definition: fw_i2c.c:36
uint8_t I2C_Write(uint8_t devAddr, uint8_t memAddr, uint8_t *dat, uint16_t size)
Definition: fw_i2c.c:18
@ HAL_OK
Definition: fw_types.h:76
HAL_State_t
Definition: fw_types.h:69
unsigned char uint8_t
Definition: fw_types.h:18