⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hw_hym8563.c

📁 RK27驱动
💻 C
字号:
/******************************************************************/
/*   Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved.  */
/*******************************************************************
File	:  hw_hym8563.c
Desc	:  rtc接口函数的实现
		  
Author	: hongjinkun
Date	: 2007-11-15
Notes	: 


*********************************************************************/
#include "hw_include.h" 
#if (RTC_TYPE == HYM8563)
#include "hw_hym8563.h"
#include "hwapi_interrupt.h"
#include "hw_serial.h"

#define HYM8563SAD  0xA2

#define   RTC_CTR1      0x00
#define   RTC_CTR2      0x01
#define   RTC_SEC       0x02
#define   RTC_MIN       0x03
#define   RTC_HOUR      0x04
#define   RTC_DAY       0x05
#define   RTC_WEEK      0x06
#define   RTC_MON       0x07
#define   RTC_YEAR      0x08
#define   RTC_A_MIN     0x09
#define   RTC_A_HOUR    0x0A
#define   RTC_A_DAY     0x0B
#define   RTC_A_WEEK    0x0C
#define   RTC_CLKOUT    0x0D
#define   RTC_T_CTR     0x0E
#define   RTC_T_COUNT   0x0F
#define   CENTURY   0x80
#define   TI        0x10
#define   AF        0x08
#define   TF        0x04
#define   AIE       0x02
#define   TIE       0x01
#define   FE        0x80
#define   TE        0x80
#define   FD1       0x02
#define   FD0       0x01
#define   TD1       0x02
#define   TD0       0x01
#define   VL        0x80

/**************************************************************************
* 函数描述: 初始化RTC
* 入口参数: 无
* 出口参数: 无
* 返回值:   TRUE -- 初始化成功
*           FALSE -- 初始化失败
***************************************************************************/
void RTC_Enable(void)
{
   INT8U rtc_sta;
   I2C_Init(HYM8563SAD,200);
   rtc_sta = 0x08;
   I2C_Write(RTC_CTR1,&rtc_sta,1,NormalMode);
   I2C_Deinit();
}
/**************************************************************************
* 函数描述: 初始化RTC
* 入口参数: 无
* 出口参数: 无
* 返回值:   TRUE -- 初始化成功
*           FALSE -- 初始化失败
***************************************************************************/
BOOL RTC_PowerOnInit(void)
{
   RTC_Enable();
   ALARM_Clear(0);
   if(RTC_GetVL())
   {
      RTC_datetime.year = 2007;
      RTC_datetime.mon = 11;
      RTC_datetime.day = 20;
      RTC_datetime.hour = 12;
      RTC_datetime.minute = 0;
      RTC_datetime.sec = 0;
      RTC_datetime.week = 2;
      RTC_Set(&RTC_datetime);
   }
   RTC_FQW_FreqSet(1);
   RTC_FQW_Disable();
   return TRUE;
}

/**************************************************************************
* 函数描述: 设置RTC时间
* 入口参数: RTC的时间结构(/时/分/秒/星期)
* 出口参数: 无
* 返回值:   无
***************************************************************************/
void RTC_Set_Time(rtc_date_time_t *rtc)
{
   INT8U date[4];
   INT8U rtc_ctr;
   date[3] = rtc->week;
   date[2] = (((rtc->hour) / 10) << 4) + ((rtc->hour) % 10);
   date[1] = (((rtc->minute) / 10) << 4) + ((rtc->minute) % 10);
   date[0] = (((rtc->sec) / 10) << 4) + ((rtc->sec) % 10);
   I2C_Init(HYM8563SAD,200);
   I2C_Write(RTC_SEC,date,3,NormalMode);
   I2C_Write(RTC_WEEK,&date[3],1,NormalMode);
   I2C_Deinit();
}

/**************************************************************************
* 函数描述: 设置RTC日期
* 入口参数: RTC的日期结构(年/月/日)
* 出口参数: 无
* 返回值:   无
***************************************************************************/
void RTC_Set_Date(rtc_date_time_t *rtc)
{
   INT8U date[3];
   INT8U rtc_ctr;
   date[2] = ((((rtc->year) / 10) %10) << 4) + ((rtc->year) % 10);
   date[1] = (((rtc->mon) / 10) << 4) + ((rtc->mon) % 10);
   date[0] = (((rtc->day) / 10) << 4) + ((rtc->day) % 10);
   I2C_Init(HYM8563SAD,200);
   I2C_Write(RTC_DAY,&date[0],1,NormalMode);
   I2C_Write(RTC_MON,&date[1],1,NormalMode);
   I2C_Write(RTC_YEAR,&date[2],1,NormalMode);
   I2C_Deinit();
}

/**************************************************************************
* 函数描述: 得到RTC时间
* 入口参数: 无
* 出口参数: RTC的时间结构数据(/时/分/秒/星期)
* 返回值:   无
***************************************************************************/
void RTC_Get_Time(rtc_date_time_t *rtc)
{
   INT8U date[5];
   I2C_Init(HYM8563SAD,200);
   I2C_Read(RTC_SEC,date,5,NormalMode);
   I2C_Deinit();
   rtc->week = date[4] & 0x07;
   rtc->hour = (date[2] & 0x0f) + ((date[2]>>4) & 0x03) * 10;
   rtc->minute = (date[1] & 0x0f) + ((date[1]>>4) & 0x07) * 10;
   rtc->sec= (date[0] & 0x0f) + ((date[0]>>4) & 0x07) * 10;
}

/**************************************************************************
* 函数描述: 得到RTC日期
* 入口参数: 无
* 出口参数: RTC的日期结构数据(年/月/日)
* 返回值:   无
***************************************************************************/
void RTC_Get_Date(rtc_date_time_t *rtc)
{
   INT8U date[4];
   I2C_Init(HYM8563SAD,200);
   I2C_Read(RTC_DAY,date,4,NormalMode);
   I2C_Deinit();
   rtc->year = 2000 + (date[3] & 0x0f) + (date[3]>>4) * 10;
   rtc->mon = (date[2] & 0x0f) + ((date[2]>>4) & 0x01) * 10;
   rtc->day= (date[0] & 0x0f) + ((date[0]>>4) & 0x03) * 10;
}

/**************************************************************************
* 函数描述: 设置RTC值
* 入口参数: RTC的年/月/日/时/分/秒/星期 结构数据
* 出口参数: 无
* 返回值:   0 -- 设置成功
*           非0 -- 设置失败
***************************************************************************/
int RTC_Set(rtc_date_time_t *rtc)
{
   BOOL ret;
   INT8U date[7];
   INT8U rtc_ctr;
   date[6] = ((((rtc->year) / 10) %10) << 4) + ((rtc->year) % 10);
   if(rtc->year < 2000)
      date[5] = (((rtc->mon) / 10) << 4) + ((rtc->mon) % 10) + (1<<7);
   else
      date[5] = (((rtc->mon) / 10) << 4) + ((rtc->mon) % 10);
   date[4] = rtc->week;
   date[3] = (((rtc->day) / 10) << 4) + ((rtc->day) % 10);
   date[2] = (((rtc->hour) / 10) << 4) + ((rtc->hour) % 10);
   date[1] = (((rtc->minute) / 10) << 4) + ((rtc->minute) % 10);
   date[0] = (((rtc->sec) / 10) << 4) + ((rtc->sec) % 10);
   I2C_Init(HYM8563SAD,200);
   ret = I2C_Write(RTC_SEC,date,7,NormalMode); 
   I2C_Deinit();
   return ret;
}

/**************************************************************************
* 函数描述: 读取RTC值
* 入口参数: 无
* 出口参数: RTC的年/月/日/时/分/秒/星期 结构数据
* 返回值:   1 -- 读取成功
*           0 -- 读取失败
***************************************************************************/
int RTC_Read(rtc_date_time_t *rtc)
{
   BOOL ret;
   INT8U date[7];
   I2C_Init(HYM8563SAD,200);
   ret = I2C_Read(RTC_SEC,date,7,NormalMode);
   I2C_Deinit();
   if(date[5] & 0x80)
      rtc->year = 1900 + (date[6] & 0x0f) + (date[6]>>4) * 10;
   else
      rtc->year = 2000 + (date[6] & 0x0f) + (date[6]>>4) * 10;
   rtc->mon = (date[5] & 0x0f) + ((date[5]>>4) & 0x01) * 10;
   rtc->week = date[4] & 0x07;
   rtc->day= (date[3] & 0x0f) + ((date[3]>>4) & 0x03) * 10;
   rtc->hour = (date[2] & 0x0f) + ((date[2]>>4) & 0x03) * 10;
   rtc->minute = (date[1] & 0x0f) + ((date[1]>>4) & 0x07) * 10;
   rtc->sec= (date[0] & 0x0f) + ((date[0]>>4) & 0x07) * 10;
   return ret;
}

/**************************************************************************
* 函数描述: 设置闹钟
* 入口参数: 无
* 出口参数: 闹钟的星期或日/时/分/星期或日选择 结构数据,闹钟通道
* 返回值:   1 -- 成功
*           0 -- 失败
***************************************************************************/
int ALARM_Set(alarm_time_t * tm,INT8U ch)
{
   BOOL ret;
   INT8U date[4];
   date[3] = (tm->week) | (tm->week_m << 7);
   date[2] = (tm->day) | (tm->day_m << 7);
   date[1] = (tm->hour) | (tm->hour_m << 7);
   date[0] = (tm->minute) | (tm->minute_m << 7);
   I2C_Init(HYM8563SAD,200);
     ret = I2C_Write(RTC_A_MIN,date,4,NormalMode);
   I2C_Deinit();
   return ret;
}

/**************************************************************************
* 函数描述: 读取闹钟
* 入口参数: 无
* 出口参数: 闹钟的星期或日/时/分/星期或日选择 结构数据,闹钟通道
* 返回值:   1 -- 读取成功
*           0 -- 读取失败
***************************************************************************/
int ALARM_Get(alarm_time_t * tm,INT8U ch)
{
   BOOL ret;
   INT8U date[4];
   I2C_Init(HYM8563SAD,200);
   ret = I2C_Read(RTC_A_MIN,date,4,NormalMode);
   I2C_Deinit();
   tm->week_m = (date[3] >> 6) & 1;
   tm->day_m = (date[2] >> 7) & 1;
   tm->hour_m = (date[1] >> 7) & 1;
   tm->minute_m = (date[0] >> 7) & 1;
   tm->week = date[3] & 0x7f;
   tm->day = date[2] & 0x7f;
   tm->hour = date[1] & 0x7f;
   tm->minute = date[0] & 0x7f;
   return ret;
}

/**************************************************************************
* 函数描述: 打开闹钟
* 入口参数: 无
* 出口参数: 闹钟通道
* 返回值:   1 -- 成功
*           0 -- 失败
***************************************************************************/
int ALARM_Open(INT8U ch)
{
   BOOL ret;
   INT8U rtc_ctr;
   I2C_Init(HYM8563SAD,200);
   I2C_Read(RTC_CTR2,&rtc_ctr,1,NormalMode);
   rtc_ctr |= AIE;
   ret = I2C_Write(RTC_CTR2,&rtc_ctr,1,NormalMode);
   I2C_Deinit();
   return ret;
}

/**************************************************************************
* 函数描述: 关闭闹钟
* 入口参数: 无
* 出口参数: 闹钟通道
* 返回值:   1 -- 成功
*           0 -- 失败
***************************************************************************/
int ALARM_Close(INT8U ch)
{
   BOOL ret;
   INT8U rtc_ctr;
   I2C_Init(HYM8563SAD,200);
   I2C_Read(RTC_CTR2,&rtc_ctr,1,NormalMode);
   rtc_ctr &= (~AIE);
   ret = I2C_Write(RTC_CTR2,&rtc_ctr,1,NormalMode);
   I2C_Deinit();
   return ret;
}

/**************************************************************************
* 函数描述: 清除闹钟中断
* 入口参数: 无
* 出口参数: 闹钟通道
* 返回值:   1 -- 成功
*           0 -- 失败
***************************************************************************/
int ALARM_Clear(INT8U ch)
{
   BOOL ret;
   INT8U rtc_sta;
   I2C_Init(HYM8563SAD,200);
   rtc_sta &= (~AF);
   ret = I2C_Write(RTC_CTR2,&rtc_sta,1,NormalMode);
   I2C_Deinit();
   return ret;
}


/**************************************************************************
* 函数描述: 读闹钟IF状态
* 入口参数: 无
* 出口参数: 闹钟通道
* 返回值:   0 -- 关
*           1 -- 开
***************************************************************************/
int ALARM_GetIFSta(INT8U ch)
{
   int ret;
   INT8U rtc_sta;
   I2C_Init(HYM8563SAD,200);
   I2C_Read(RTC_CTR2,&rtc_sta,1,NormalMode);
   ret = (rtc_sta & AF)?1:0;
   I2C_Deinit();
   return ret;
}
/**************************************************************************
* 函数描述: 读闹钟IE状态
* 入口参数: 无
* 出口参数: 闹钟通道
* 返回值:   0 -- 关
*           1 -- 开
***************************************************************************/
int ALARM_GetIESta(INT8U ch)
{
   int ret;
   INT8U rtc_sta;
   I2C_Init(HYM8563SAD,200);
   I2C_Read(RTC_CTR2,&rtc_sta,1,NormalMode);
   ret = (rtc_sta & AIE)?1:0;
   I2C_Deinit();
   return ret;
}
/**************************************************************************
* 函数描述: 方波输出频率设置
* 入口参数: 无
* 出口参数: 闹钟通道
* 返回值:   
*           
***************************************************************************/
void RTC_FQW_FreqSet(INT8U freq_mode)
{
   INT8U rtc_fqw_sta;
   I2C_Init(HYM8563SAD,200);
   I2C_Read(RTC_CLKOUT,&rtc_fqw_sta,1,NormalMode);
   rtc_fqw_sta = (rtc_fqw_sta & 0x80) | (freq_mode & 0x03);
   I2C_Write(RTC_CLKOUT,&rtc_fqw_sta,1,NormalMode);
   I2C_Deinit();
}
/**************************************************************************
* 函数描述: 方波输出频率开
* 入口参数: 无
* 出口参数: 无
* 返回值:   
***************************************************************************/
void RTC_FQW_Enable(void)
{
   INT8U rtc_fqw_sta;
   I2C_Init(HYM8563SAD,200);
   I2C_Read(RTC_CLKOUT,&rtc_fqw_sta,1,NormalMode);
   rtc_fqw_sta = (rtc_fqw_sta & 0x03) | 0x80;
   I2C_Write(RTC_CLKOUT,&rtc_fqw_sta,1,NormalMode);
   I2C_Deinit();
}

/**************************************************************************
* 函数描述: 方波输出频率关
* 入口参数: 无
* 出口参数: 无
* 返回值:   
***************************************************************************/
void RTC_FQW_Disable(void)
{
   INT8U rtc_fqw_sta;
   I2C_Init(HYM8563SAD,200);
   I2C_Read(RTC_CLKOUT,&rtc_fqw_sta,1,NormalMode);
   rtc_fqw_sta = (rtc_fqw_sta & 0x03);
   I2C_Write(RTC_CLKOUT,&rtc_fqw_sta,1,NormalMode);
   I2C_Deinit();
}
/**************************************************************************
* 函数描述: 检测掉点状态
* 入口参数: 无
* 出口参数: 闹钟通道
* 返回值:   0 -- 正常
*           1 -- 掉点
***************************************************************************/
int RTC_GetVL(void)
{
   int ret;
   INT8U rtc_sta;
   I2C_Init(HYM8563SAD,200);
   I2C_Read(RTC_SEC,&rtc_sta,1,NormalMode);
   ret = (rtc_sta & VL)?1:0;
   I2C_Deinit();
   return ret;  
}
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -