Fix DS3231 init sequence

This commit is contained in:
Theo Arends 2022-02-26 13:38:01 +01:00
parent 30ca2f6426
commit bea7e67363
1 changed files with 25 additions and 24 deletions

View File

@ -90,8 +90,7 @@ struct NTP_t {
/*----------------------------------------------------------------------* /*----------------------------------------------------------------------*
Detect the DS3231 Chip Detect the DS3231 Chip
----------------------------------------------------------------------*/ ----------------------------------------------------------------------*/
void DS3231Detect(void) void DS3231Detect(void) {
{
if (!I2cSetDevice(USE_RTC_ADDR)) { return; } if (!I2cSetDevice(USE_RTC_ADDR)) { return; }
if (I2cValidRead(USE_RTC_ADDR, RTC_STATUS, 1)) { if (I2cValidRead(USE_RTC_ADDR, RTC_STATUS, 1)) {
@ -103,24 +102,21 @@ void DS3231Detect(void)
/*----------------------------------------------------------------------* /*----------------------------------------------------------------------*
BCD-to-Decimal conversion BCD-to-Decimal conversion
----------------------------------------------------------------------*/ ----------------------------------------------------------------------*/
uint8_t bcd2dec(uint8_t n) uint8_t bcd2dec(uint8_t n) {
{
return n - 6 * (n >> 4); return n - 6 * (n >> 4);
} }
/*----------------------------------------------------------------------* /*----------------------------------------------------------------------*
Decimal-to-BCD conversion Decimal-to-BCD conversion
----------------------------------------------------------------------*/ ----------------------------------------------------------------------*/
uint8_t dec2bcd(uint8_t n) uint8_t dec2bcd(uint8_t n) {
{
return n + 6 * (n / 10); return n + 6 * (n / 10);
} }
/*----------------------------------------------------------------------* /*----------------------------------------------------------------------*
Read time from DS3231 and return the epoch time (second since 1-1-1970 00:00) Read time from DS3231 and return the epoch time (second since 1-1-1970 00:00)
----------------------------------------------------------------------*/ ----------------------------------------------------------------------*/
uint32_t ReadFromDS3231(void) uint32_t ReadFromDS3231(void) {
{
TIME_T tm; TIME_T tm;
tm.second = bcd2dec(I2cRead8(USE_RTC_ADDR, RTC_SECONDS)); tm.second = bcd2dec(I2cRead8(USE_RTC_ADDR, RTC_SECONDS));
tm.minute = bcd2dec(I2cRead8(USE_RTC_ADDR, RTC_MINUTES)); tm.minute = bcd2dec(I2cRead8(USE_RTC_ADDR, RTC_MINUTES));
@ -147,10 +143,10 @@ void SetDS3231Time (uint32_t epoch_time) {
I2cWrite8(USE_RTC_ADDR, RTC_STATUS, I2cRead8(USE_RTC_ADDR, RTC_STATUS) & ~_BV(OSF)); //clear the Oscillator Stop Flag I2cWrite8(USE_RTC_ADDR, RTC_STATUS, I2cRead8(USE_RTC_ADDR, RTC_STATUS) & ~_BV(OSF)); //clear the Oscillator Stop Flag
} }
void DS3231EverySecond(void) void DS3231EverySecond(void) {
{ if (!ds3231ReadStatus && (Rtc.utc_time < START_VALID_TIME)) { // We still did not sync with NTP (time not valid) , so, read time from DS3231
/*
TIME_T tmpTime; TIME_T tmpTime;
if (!ds3231ReadStatus && Rtc.utc_time < START_VALID_TIME ) { // We still did not sync with NTP (time not valid) , so, read time from DS3231
TasmotaGlobal.ntp_force_sync = true; //force to sync with ntp TasmotaGlobal.ntp_force_sync = true; //force to sync with ntp
Rtc.utc_time = ReadFromDS3231(); //we read UTC TIME from DS3231 Rtc.utc_time = ReadFromDS3231(); //we read UTC TIME from DS3231
// from this line, we just copy the function from "void RtcSecond()" at the support.ino ,line 2143 and above // from this line, we just copy the function from "void RtcSecond()" at the support.ino ,line 2143 and above
@ -169,11 +165,19 @@ void DS3231EverySecond(void)
} else { } else {
TasmotaGlobal.rules_flag.time_set = 1; TasmotaGlobal.rules_flag.time_set = 1;
} }
*/
uint32_t ds3231_time = ReadFromDS3231(); // Read UTC TIME from DS3231
if (ds3231_time > START_VALID_TIME) {
Rtc.utc_time = ds3231_time;
RtcSync();
AddLog(LOG_LEVEL_DEBUG_MORE, PSTR("DS3: Synched"));
ds3231ReadStatus = true; // if time in DS3231 is valid, do not update again
} }
else if (!ds3231WriteStatus && Rtc.utc_time > START_VALID_TIME && abs((int32_t)(Rtc.utc_time - ReadFromDS3231())) > 10) { // If time is valid and has drifted from RTC more than 10 seconds }
AddLog(LOG_LEVEL_INFO, PSTR("Write Time TO DS3231 from NTP (" D_UTC_TIME ") %s, (" D_DST_TIME ") %s, (" D_STD_TIME ") %s"), else if (!ds3231WriteStatus && (Rtc.utc_time > START_VALID_TIME) && (abs((int32_t)(Rtc.utc_time - ReadFromDS3231())) > 10)) { // If time is valid and has drifted from RTC more than 10 seconds
GetDateAndTime(DT_UTC).c_str(), GetDateAndTime(DT_DST).c_str(), GetDateAndTime(DT_STD).c_str()); AddLog(LOG_LEVEL_INFO, PSTR("DS3: Write Time from NTP (" D_UTC_TIME ") %s"), GetDateAndTime(DT_UTC).c_str());
SetDS3231Time (Rtc.utc_time); //update the DS3231 time SetDS3231Time(Rtc.utc_time); // Update the DS3231 time
ds3231WriteStatus = true; ds3231WriteStatus = true;
} }
if (NTP.mode.runningNTP) { if (NTP.mode.runningNTP) {
@ -185,9 +189,8 @@ void DS3231EverySecond(void)
NTP functions NTP functions
\*********************************************************************************************/ \*********************************************************************************************/
void NTPSelectMode(uint16_t mode) void NTPSelectMode(uint16_t mode) {
{ DEBUG_SENSOR_LOG(PSTR("DS3: NTP status %u"),mode);
DEBUG_SENSOR_LOG(PSTR("RTC: NTP status %u"),mode);
switch(mode){ switch(mode){
case 0: case 0:
NTP.mode.runningNTP = false; NTP.mode.runningNTP = false;
@ -201,8 +204,7 @@ void NTPSelectMode(uint16_t mode)
} }
} }
bool NTPCmd(void) bool NTPCmd(void) {
{
bool serviced = true; bool serviced = true;
if (XdrvMailbox.data_len > 0) { if (XdrvMailbox.data_len > 0) {
NTPSelectMode(XdrvMailbox.payload); NTPSelectMode(XdrvMailbox.payload);
@ -215,8 +217,7 @@ bool NTPCmd(void)
Interface Interface
\*********************************************************************************************/ \*********************************************************************************************/
bool Xsns33(uint8_t function) bool Xsns33(uint8_t function) {
{
if (!I2cEnabled(XI2C_26)) { return false; } if (!I2cEnabled(XI2C_26)) { return false; }
bool result = false; bool result = false;