ATY_LIB V2_102_230218
ATY_LIB for general devices or ALGO
 
Loading...
Searching...
No Matches
ds3231.c File Reference
#include "ds3231.h"

Go to the source code of this file.

Functions

uint8_t DS3231_Write (uint8_t reg, uint8_t dat)
 
uint8_t DS3231_Hex2Bcd (uint8_t hex)
 
uint8_t DS3231_Bcd2Hex (uint8_t bcd)
 
uint8_t DS3231_GetStatus (void)
 
uint8_t DS3231_GetTime (uint8_t *t)
 
uint8_t DS3231_SetTime (uint8_t *t)
 
uint8_t DS3231_GetPin (DS3231_PinType_t *pin)
 
uint8_t DS3231_SetPin (DS3231_PinType_t *pin)
 
uint8_t ds3231_GetSquareOutputState (HAL_State_t *state)
 
uint8_t DS3231_SetSquareOutputState (HAL_State_t state)
 
uint8_t DS3231_GetAlarmInterrupt (DS3231_Alarm_t alarm, HAL_State_t *state)
 
uint8_t DS3231_SetAlarmInterrupt (DS3231_Alarm_t alarm, HAL_State_t state)
 
uint8_t DS3231_GetAlarm1 (uint8_t *t, DS3231_Alarm1Mode_t *mode)
 
uint8_t DS3231_SetAlarm1 (uint8_t *t, DS3231_Alarm1Mode_t mode)
 
uint8_t DS3231_GetAlarm2 (uint8_t *t, DS3231_Alarm2Mode_t *mode)
 
uint8_t DS3231_SetAlarm2 (uint8_t *t, DS3231_Alarm2Mode_t mode)
 
uint8_t DS3231_ClearAlarm (DS3231_Alarm_t alarm)
 

Variables

__XDATA uint8_t buff [7]
 

Function Documentation

◆ DS3231_Bcd2Hex()

uint8_t DS3231_Bcd2Hex ( uint8_t  bcd)

Definition at line 29 of file ds3231.c.

30{
31 return (bcd >> 4) * 10 + (bcd & 0x0F);
32}

◆ DS3231_ClearAlarm()

uint8_t DS3231_ClearAlarm ( DS3231_Alarm_t  alarm)

Definition at line 346 of file ds3231.c.

347{
348 uint8_t res;
349
351 if (res != HAL_OK) return res;
352
353 buff[0] &= ~(1 << alarm);
355}
uint16_t res
__XDATA uint8_t buff[7]
Definition: ds3231.c:17
uint8_t DS3231_Write(uint8_t reg, uint8_t dat)
Definition: ds3231.c:19
#define DS3231_I2C_ADDR
Definition: ds3231.h:21
#define DS3231_REG_STATUS
Definition: ds3231.h:38
uint8_t I2C_Read(uint8_t devAddr, uint8_t memAddr, uint8_t *buf, uint16_t size)
Definition: fw_i2c.c:36
@ HAL_OK
Definition: fw_types.h:76
unsigned char uint8_t
Definition: fw_types.h:18

◆ DS3231_GetAlarm1()

uint8_t DS3231_GetAlarm1 ( uint8_t t,
DS3231_Alarm1Mode_t mode 
)

Definition at line 201 of file ds3231.c.

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}
uint8_t DS3231_Bcd2Hex(uint8_t bcd)
Definition: ds3231.c:29
@ DS3231_FORMAT_12H
Definition: ds3231.h:64
DS3231_Alarm1Mode_t
Definition: ds3231.h:75
#define DS3231_REG_ALARM1_SECOND
Definition: ds3231.h:30

◆ DS3231_GetAlarm2()

uint8_t DS3231_GetAlarm2 ( uint8_t t,
DS3231_Alarm2Mode_t mode 
)

Definition at line 274 of file ds3231.c.

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}
#define DS3231_REG_ALARM2_MINUTE
Definition: ds3231.h:34
DS3231_Alarm2Mode_t
Definition: ds3231.h:85

◆ DS3231_GetAlarmInterrupt()

uint8_t DS3231_GetAlarmInterrupt ( DS3231_Alarm_t  alarm,
HAL_State_t state 
)

Definition at line 182 of file ds3231.c.

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}
#define DS3231_REG_CONTROL
Definition: ds3231.h:37
HAL_State_t
Definition: fw_types.h:69

◆ DS3231_GetPin()

uint8_t DS3231_GetPin ( DS3231_PinType_t pin)

Definition at line 143 of file ds3231.c.

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}
DS3231_PinType_t
Definition: ds3231.h:57

◆ ds3231_GetSquareOutputState()

uint8_t ds3231_GetSquareOutputState ( HAL_State_t state)

Definition at line 163 of file ds3231.c.

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}

◆ DS3231_GetStatus()

uint8_t DS3231_GetStatus ( void  )

Definition at line 34 of file ds3231.c.

35{
37 return buff[0];
38}

◆ DS3231_GetTime()

uint8_t DS3231_GetTime ( uint8_t t)
Parameters
tformat uint8_t year; uint8_t month; uint8_t week; uint8_t date; uint8_t hour; uint8_t minute; uint8_t second; DS3231_HourFormat_t format; DS3231_AmPm_t am_pm;
Returns
uint8_t

Definition at line 40 of file ds3231.c.

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}
#define DS3231_REG_SECOND
Definition: ds3231.h:23

◆ DS3231_Hex2Bcd()

uint8_t DS3231_Hex2Bcd ( uint8_t  hex)

Definition at line 24 of file ds3231.c.

25{
26 return (hex % 10) + ((hex / 10) << 4);
27}

◆ DS3231_SetAlarm1()

uint8_t DS3231_SetAlarm1 ( uint8_t t,
DS3231_Alarm1Mode_t  mode 
)

Definition at line 241 of file ds3231.c.

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}
uint8_t DS3231_Hex2Bcd(uint8_t hex)
Definition: ds3231.c:24
#define DS3231_REG_ALARM1_MINUTE
Definition: ds3231.h:31
@ DS3231_ALARM1_MODE_WEEK_HOUR_MINUTE_SECOND_MATCH
Definition: ds3231.h:81
#define DS3231_REG_ALARM1_HOUR
Definition: ds3231.h:32
#define DS3231_REG_ALARM1_WEEK
Definition: ds3231.h:33

◆ DS3231_SetAlarm2()

uint8_t DS3231_SetAlarm2 ( uint8_t t,
DS3231_Alarm2Mode_t  mode 
)

Definition at line 316 of file ds3231.c.

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}
#define DS3231_REG_ALARM2_WEEK
Definition: ds3231.h:36
@ DS3231_ALARM2_MODE_WEEK_HOUR_MINUTE_MATCH
Definition: ds3231.h:90
#define DS3231_REG_ALARM2_HOUR
Definition: ds3231.h:35

◆ DS3231_SetAlarmInterrupt()

uint8_t DS3231_SetAlarmInterrupt ( DS3231_Alarm_t  alarm,
HAL_State_t  state 
)

Definition at line 191 of file ds3231.c.

192{
193 uint8_t res;
195 if (res != HAL_OK) return res;
196 buff[0] &= ~(1 << alarm);
197 buff[0] |= state << alarm;
199}

◆ DS3231_SetPin()

uint8_t DS3231_SetPin ( DS3231_PinType_t pin)

Definition at line 153 of file ds3231.c.

154{
155 uint8_t res;
157 if (res != HAL_OK) return res;
158 buff[0] &= ~(1 << 2);
159 buff[0] |= (*pin) << 2;
161}

◆ DS3231_SetSquareOutputState()

uint8_t DS3231_SetSquareOutputState ( HAL_State_t  state)

Definition at line 172 of file ds3231.c.

173{
174 uint8_t res;
176 if (res != HAL_OK) return res;
177 buff[0] &= ~(1 << 6);
178 buff[0] |= state << 6;
180}

◆ DS3231_SetTime()

uint8_t DS3231_SetTime ( uint8_t t)

uint8_t year; uint8_t month; uint8_t week; uint8_t date; uint8_t hour; uint8_t minute; uint8_t second; DS3231_HourFormat_t format; DS3231_AmPm_t am_pm;

Definition at line 78 of file ds3231.c.

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}
#define DS3231_REG_MINUTE
Definition: ds3231.h:24
#define DS3231_REG_YEAR
Definition: ds3231.h:29
#define DS3231_REG_DATE
Definition: ds3231.h:27
#define DS3231_REG_HOUR
Definition: ds3231.h:25
@ DS3231_FORMAT_24H
Definition: ds3231.h:65
#define DS3231_REG_MONTH
Definition: ds3231.h:28
#define DS3231_REG_WEEK
Definition: ds3231.h:26

◆ DS3231_Write()

uint8_t DS3231_Write ( uint8_t  reg,
uint8_t  dat 
)

Definition at line 19 of file ds3231.c.

20{
21 return I2C_Write(DS3231_I2C_ADDR, reg, &dat, 1);
22}
__CODE int8_t dat[20]
uint8_t I2C_Write(uint8_t devAddr, uint8_t memAddr, uint8_t *dat, uint16_t size)
Definition: fw_i2c.c:18

Variable Documentation

◆ buff

__XDATA uint8_t buff[7]

Definition at line 17 of file ds3231.c.