ZDBMS/code_drv/RTC.c

245 lines
7.3 KiB
C
Raw Permalink Normal View History

2025-02-06 07:35:32 +00:00
/********************************************************************************
Copyright (C), Sinowealth Electronic. Ltd.
Author: Sino
Version: V0.0
Date: 2020/04/26
History:
V2.0 2020/04/26 Preliminary
********************************************************************************/
#include "Main.h"
BOOL bRTCErr;
BOOL bRTCTwiRWErr;
U8 xdata ucRTCTwiRWErrDelayCnt;
RTC_VAR xdata RTC; //For External RTC
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: RTCTwiCheck
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD><EFBFBD><EFBFBD>5S<EFBFBD><EFBFBD><EFBFBD>RTC<EFBFBD><EFBFBD>I2CͨѶ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λbRTCErr=1
*************************************************************************************************/
void RTCTwiCheck(void)
{
if(bEnEEPRomBK)
{
if(bRTCTwiRWErr)
{
if(++ucRTCTwiRWErrDelayCnt >= TIME_1S_5S)
{
bRTCErr = 1;
ucRTCTwiRWErrDelayCnt = TIME_1S_5S;
}
}
else
{
ucRTCTwiRWErrDelayCnt = 0;
}
}
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: RTCWrite
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: WrAddr: <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>Length<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD>ȣ<EFBFBD>WrBuf<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><EFBFBD><EFBFBD>Buf
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: RTCд<EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*************************************************************************************************/
BOOL RTCWrite(U8 WrAddr, U8 Length, U8 xdata *WrBuf)
{
BOOL Result = 0;
U8 i;
if(!bRTCErr)
{
for(i=0; i<5; i++)
{
#ifdef TWI_Hardware_Module
if(TwiWrite(RTC_ID, WrAddr, TWI_ADDR_1B, Length, TWI_CRC_NO, WrBuf))
{
Result = 1;
break;
}
#else
if(Result = TwiWrite(RTC_ID, WrAddr, Length, WrBuf))
{
Result = 1;
break;
}
#endif
Delay1ms(1);
}
}
bRTCTwiRWErr = !Result;
return Result;
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: RTCRead
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: RdAddr: <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>Length<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD>ȣ<EFBFBD>WrBuf<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><EFBFBD><EFBFBD>Buf
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: RTC<EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*************************************************************************************************/
BOOL RTCRead(U8 RdAddr, U8 Length, U8 xdata *RdBuf)
{
BOOL Result = 0;
U8 i;
if(!bRTCErr)
{
for(i=0; i<5; i++)
{
#ifdef TWI_Hardware_Module
if(TwiRead(RTC_ID, RdAddr, TWI_ADDR_1B, Length, TWI_CRC_NO, RdBuf))
{
Result = 1;
break;
}
#else
if(TwiRead(RTC_ID, RdAddr, Length, RdBuf))
{
Result = 1;
break;
}
#endif
Delay1ms(1);
}
}
bRTCTwiRWErr = !Result;
return Result;
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: RTCReadTime
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: RdAddr: <EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ַ<EFBFBD><EFBFBD>Length<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݳ<EFBFBD><EFBFBD>ȣ<EFBFBD>WrBuf<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><EFBFBD><EFBFBD>Buf
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: RTC<EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*************************************************************************************************/
BOOL RTCReadTime(RTC_VAR xdata *RtcRdVal)
{
U8 xdata rtcbuf[9];
BOOL Result = 0;
if(RTCRead(0x00, 9, &rtcbuf)) //<2F><>RTC<54><43>ȡʱ<C8A1><CAB1>
{
if((rtcbuf[7]&0x01) == 0x00) //judge RTCF bit<69><74><EFBFBD><EFBFBD><EFBFBD>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
if( ((rtcbuf[2]&0x80) == 0) //<2F><><EFBFBD><EFBFBD>24Сʱ<D0A1><CAB1>
|| ((rtcbuf[0]&0x70) > 0x50) || ((rtcbuf[0]&0x0F) > 0x09) || ((rtcbuf[0]&0x7F) > 0x59)
|| ((rtcbuf[1]&0x70) > 0x50) || ((rtcbuf[1]&0x0F) > 0x09) || ((rtcbuf[1]&0x7F) > 0x59)
|| ((rtcbuf[2]&0x30) > 0x20) || ((rtcbuf[2]&0x0F) > 0x09) || ((rtcbuf[2]&0x2F) > 0x24)
|| ((rtcbuf[3]&0x30) > 0x30) || ((rtcbuf[3]&0x0F) > 0x09) || ((rtcbuf[3]&0x3F) > 0x31) || (!(rtcbuf[3]&0x3F))
|| ((rtcbuf[4]&0x10) > 0x10) || ((rtcbuf[4]&0x0F) > 0x09) || ((rtcbuf[4]&0x1F) > 0x12) || (!(rtcbuf[4]&0x1F))
|| ((rtcbuf[5]&0xF0) > 0x90) || ((rtcbuf[5]&0x0F) > 0x09) || ((rtcbuf[5]&0xFF) > 0x99)
|| ((rtcbuf[6]&0x07) > 0x06) ) //<2F><>Сʱ<D0A1>Ƽ<EFBFBD><C6BC><EFBFBD><EFBFBD>ݺϷ<DDBA><CFB7>Խ<EFBFBD><D4BD>м<EFBFBD><D0BC><EFBFBD>
{
rtcbuf[0] = RtcRdVal->Second; //<2F><><EFBFBD>ݲ<EFBFBD><DDB2>Ϸ<EFBFBD><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪRTCδ<43><CEB4>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
rtcbuf[1] = RtcRdVal->Minute;
rtcbuf[2] = RtcRdVal->Hour;
rtcbuf[3] = RtcRdVal->Date;
rtcbuf[4] = RtcRdVal->Month;
rtcbuf[5] = RtcRdVal->Year;
rtcbuf[6] = RtcRdVal->Week;
Result = RTCModifyTime((RTC_VAR xdata *)(&rtcbuf));
}
else
{
RtcRdVal->Second = rtcbuf[0]; //<2F><><EFBFBD>ݺϷ<DDBA><CFB7><EFBFBD><EFBFBD>򱣴<EFBFBD><F2B1A3B4><EFBFBD>RTC<54><43><EFBFBD>ص<EFBFBD>ʱ<EFBFBD><CAB1>
RtcRdVal->Minute = rtcbuf[1];
RtcRdVal->Hour = rtcbuf[2]&0x1F;
RtcRdVal->Date = rtcbuf[3];
RtcRdVal->Month = rtcbuf[4];
RtcRdVal->Year = rtcbuf[5];
RtcRdVal->Week = rtcbuf[6];
Result = 1;
}
}
else //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ΪRTC<54><43>׼<EFBFBD><D7BC>
{
Result = RTCModifyTime((RTC_VAR xdata *)RtcRdVal); //<2F><><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD><EFBFBD>E2<45>ж<EFBFBD>ȡ<EFBFBD><C8A1>ʱ<EFBFBD><EFBFBD><E4A3AC><EFBFBD>̶<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>д<EFBFBD><D0B4>RTC
}
}
return Result;
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: RTCModifyTime
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: RTC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>RTC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RTC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: RTC<EFBFBD><EFBFBD><EFBFBD>Ĵ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*************************************************************************************************/
BOOL RTCModifyTime(RTC_VAR xdata *RtcMdyVal)
{
BOOL Result = 0;
U8 xdata rtcdata;
U8 xdata rtctemp[7];
rtcdata = 0x90;
Result = RTCWrite(RTC_REG_STATUS, 1, &rtcdata);
rtctemp[0] = RtcMdyVal->Second;
rtctemp[1] = RtcMdyVal->Minute;
rtctemp[2] = RtcMdyVal->Hour|0x80; //<2F><><EFBFBD><EFBFBD>Ϊ24Сʱ<D0A1><CAB1>
rtctemp[3] = RtcMdyVal->Date;
rtctemp[4] = RtcMdyVal->Month;
rtctemp[5] = RtcMdyVal->Year;
rtctemp[6] = RtcMdyVal->Week;
Result = RTCWrite(RTC_REG_SECOND, 7, (U8 xdata *)&rtctemp);
return Result;
}
/*************************************************************************************************
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: RTCInitTime
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: RTC<EFBFBD><EFBFBD><EFBFBD><EFBFBD>RTC<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݽ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RTC<EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ: <EFBFBD><EFBFBD>
* <EFBFBD><EFBFBD> <EFBFBD><EFBFBD>: <EFBFBD><EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EEP<EFBFBD><EFBFBD>ȡ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RTCʱ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>е<EFBFBD>һ<EFBFBD>γ<EFBFBD>ʼ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>EEPû<EFBFBD>б<EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD>ϳ<EFBFBD>ʼ<EFBFBD><EFBFBD>ʱ<EFBFBD>20<EFBFBD><EFBFBD>5<EFBFBD><EFBFBD>1<EFBFBD><EFBFBD>12<EFBFBD><EFBFBD>
*************************************************************************************************/
BOOL RTCInitTime(RTC_VAR xdata *RtcInitVal)
{
BOOL Result = 0;
U8 xdata rtcbuf[9];
U8 xdata i;
U8 xdata checksum = 0;
MemorySet(rtcbuf, 0, sizeof(rtcbuf));
E2PRomRead(E2PROM_RTC_ADDR, 9, rtcbuf); //<2F><>E2<45><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>RTC<54><43><EFBFBD><EFBFBD>
for(i=0; i<7; i++)
{
checksum += rtcbuf[i];
}
if((rtcbuf[7]!=checksum) || (rtcbuf[8]!=0x5a)) //<2F><>У<EFBFBD><D0A3>ʧ<EFBFBD>ܣ<EFBFBD>˵<EFBFBD><CBB5>E2<45><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD>ɿ<EFBFBD><C9BF><EFBFBD>ֱ<EFBFBD>Ӱѳ<D3B0><D1B3><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
rtcbuf[0] = 0x00; //second
rtcbuf[1] = 0x00; //minute
rtcbuf[2] = 0x12; //hour
rtcbuf[3] = 0x01; //date
rtcbuf[4] = 0x05; //month
rtcbuf[5] = 0x20; //year
rtcbuf[6] = 0x05; //week
}
MemoryCopy(rtcbuf, (U8 xdata *)RtcInitVal, 7); //<2F><>E2<45><32><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>ȷŵ<C8B7>RTCʱ<43><CAB1><EFBFBD>Ĵ<EFBFBD><C4B4><EFBFBD><EFBFBD>д<EFBFBD><D0B4><EFBFBD><EFBFBD><EFBFBD>
Result = RTCReadTime((RTC_VAR xdata *)RtcInitVal);
return Result;
}