245 lines
7.3 KiB
C
245 lines
7.3 KiB
C
|
/********************************************************************************
|
|||
|
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;
|
|||
|
}
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|
|||
|
|