/*
|
|
ds3231 support module
|
|
|
|
Copyright (C) 2018 by Pavel Chauzov <poulch at mail dot ru>
|
|
|
|
*/
|
|
|
|
#pragma once
|
|
|
|
#include <TimeLib.h>
|
|
|
|
#define DS3231ADDR 0x68
|
|
|
|
#define _bcdToDec(val) ((uint8_t) ((val / 16 * 10) + (val % 16)))
|
|
#define _decToBcd(val) ((uint8_t) ((val / 10 * 16) + (val % 10)))
|
|
|
|
time_t rtcGetTime() {
|
|
uint8_t data[7];
|
|
tmElements_t tm;
|
|
|
|
i2c_write_uint8(DS3231ADDR,0);
|
|
i2c_read_buffer(DS3231ADDR, data, 7);
|
|
tm.Second = _bcdToDec(data[0]);
|
|
tm.Minute = _bcdToDec(data[1]);
|
|
tm.Hour = _bcdToDec(data[2]);
|
|
tm.Wday = _bcdToDec(data[3]);
|
|
tm.Day = _bcdToDec(data[4]);
|
|
tm.Month = _bcdToDec(data[5]);
|
|
tm.Year = y2kYearToTm(_bcdToDec(data[6]));
|
|
|
|
return makeTime(tm);
|
|
}
|
|
|
|
uint8_t rtcSetTime(time_t nt) {
|
|
uint8_t data[8];
|
|
tmElements_t ct;
|
|
breakTime(nt, ct);
|
|
|
|
data[0] = 0;
|
|
data[1] = _decToBcd(ct.Second);
|
|
data[2] = _decToBcd(ct.Minute);
|
|
data[3] = _decToBcd(ct.Hour);
|
|
data[4] = _decToBcd(ct.Wday);
|
|
data[5] = _decToBcd(ct.Day);
|
|
data[6] = _decToBcd(ct.Month);
|
|
data[7] = _decToBcd(tmYearToY2k(ct.Year));
|
|
uint8_t s = i2c_write_buffer(DS3231ADDR, data, 8);
|
|
return s;
|
|
}
|