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

📄 hw_pt7c4337.c

📁 瑞星微公司RK27XX系列芯片的SDK开发包
💻 C
字号:
/******************************************************************/
/*   Copyright (C) 2007 ROCK-CHIPS FUZHOU . All Rights Reserved.  */
/*******************************************************************
File :  hw_pt7c4337.c
Desc :  rtc接口函数的实现

Author : hongjinkun
Date : 2007-11-15
Notes :


*********************************************************************/
#include "hw_include.h"
#if (RTC_TYPE == PT7C4337)
#include "hw_pt7c4337.h"
#include "hwapi_interrupt.h"
#include "hw_serial.h"

#define PT7C4337SAD  0xD0

#define   RTC_SEC       0x00
#define   RTC_MIN       0x01
#define   RTC_HOUR      0x02
#define   RTC_WEEK      0x03
#define   RTC_DAY       0x04
#define   RTC_MON       0x05
#define   RTC_YEAR      0x06
#define   RTC_A1_SEC    0x07
#define   RTC_A1_MIN    0x08
#define   RTC_A1_HOUR   0x09
#define   RTC_A1_DAY    0x0A
#define   RTC_A2_MIN    0x0B
#define   RTC_A2_HOUR   0x0C
#define   RTC_A2_DAY    0x0D
#define   RTC_CTR       0x0E
#define   RTC_STA       0x0F
#define   CENTURY     0x80
#define   ETIME       0x80
#define   INTCN       0x04
#define   A2IE        0x02
#define   A1IE        0x01
#define   A2F         0x02
#define   A1F         0x01
#define   OSF         0x80

/**************************************************************************
* 函数描述: 初始化RTC
* 入口参数: 无
* 出口参数: 无
* 返回值:   TRUE -- 初始化成功
*           FALSE -- 初始化失败
***************************************************************************/
BOOL RTC_PowerOnInit(void)
{
    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(PT7C4337SAD, 200);
    I2C_Write(RTC_SEC, date, 4, NormalMode);
    I2C_Read(RTC_CTR, &rtc_ctr, 1, NormalMode);
    rtc_ctr &= (~ETIME);
    I2C_Write(RTC_CTR, &rtc_ctr, 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(PT7C4337SAD, 200);
    I2C_Write(RTC_DAY, date, 3, NormalMode);
    I2C_Read(RTC_CTR, &rtc_ctr, 1, NormalMode);
    rtc_ctr &= (~ETIME);
    I2C_Write(RTC_CTR, &rtc_ctr, 1, NormalMode);
    I2C_Deinit();
}

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

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

/**************************************************************************
* 函数描述: 设置RTC值
* 入口参数: RTC的年/月/日/时/分/秒/星期 结构数据
* 出口参数: 无
* 返回值:   0 -- 设置成功
*           非0 -- 设置失败
***************************************************************************/
int RTC_Set(rtc_date_time_t *rtc)
{
    BOOL ret;
    INT8U date[7];
    INT8U rtc_ctr;
    /*
    alarm_time_t *at;

    at->wkdy=0;
    at->hour=0;
    at->minute=0x30;
    at->sec=0;
    at->wkordy=0;
    at->day_m=1;
    at->hour_m=1;
    at->minute_m=0;
    at->sec_m=0;
    ret=ALARM_Set(at,0);
    ALARM_Open(0);
    */
    date[6] = ((((rtc->year) / 10) % 10) << 4) + ((rtc->year) % 10);
    date[5] = (((rtc->mon) / 10) << 4) + ((rtc->mon) % 10);
    date[4] = (((rtc->day) / 10) << 4) + ((rtc->day) % 10);
    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(PT7C4337SAD, 200);
    ret = I2C_Write(RTC_SEC, date, 7, NormalMode);
    if (ret == 1)
    {
        ret = I2C_Read(RTC_CTR, &rtc_ctr, 1, NormalMode);
        rtc_ctr &= (~ETIME);
        if (ret == 1)
            ret = I2C_Write(RTC_CTR, &rtc_ctr, 1, NormalMode);

    }
    I2C_Deinit();

    return ret;
}

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

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

    I2C_Init(PT7C4337SAD, 200);
    if (ch == 0)
        ret = I2C_Write(RTC_A1_SEC, date, 4, NormalMode);
    else
        ret = I2C_Write(RTC_A2_MIN, &date[1], 3, NormalMode);

    I2C_Deinit();
    return ret;
}

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

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

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

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


/**************************************************************************
* 函数描述: 读闹钟IF状态
* 入口参数: 无
* 出口参数: 闹钟通道
* 返回值:   0 -- 关
*           1 -- 开
***************************************************************************/
int ALARM_GetIFSta(INT8U ch)
{
    int ret;
    INT8U rtc_sta;
    I2C_Init(PT7C4337SAD, 200);
    I2C_Read(RTC_STA, &rtc_sta, 1, NormalMode);
    if (ch == 0)
        ret = (rtc_sta & A1F) ? 1 : 0;
    else
        ret = (rtc_sta & A2F) ? 1 : 0;
    I2C_Deinit();
    return ret;
}

/**************************************************************************
* 函数描述: 读闹钟IE状态
* 入口参数: 无
* 出口参数: 闹钟通道
* 返回值:   0 -- 关
*           1 -- 开
***************************************************************************/
int ALARM_GetIESta(INT8U ch)
{
    int ret;
    INT8U rtc_sta;
    I2C_Init(PT7C4337SAD, 200);
    I2C_Read(RTC_STA, &rtc_sta, 1, NormalMode);
    if (ch == 0)
        ret = (rtc_sta & A1IE) ? 1 : 0;
    else
        ret = (rtc_sta & A2IE) ? 1 : 0;
    I2C_Deinit();
    return ret;
}
/**************************************************************************
* 函数描述: 方波输出频率设置
* 入口参数: 频率
* 出口参数: 无
* 返回值:
***************************************************************************/
void RTC_FQW_FreqSet(INT8U freq_mode)
{
    INT8U rtc_fqw_sta;
    I2C_Init(PT7C4337SAD, 200);
    I2C_Read(RTC_CTR, &rtc_fqw_sta, 1, NormalMode);
    rtc_fqw_sta = (rtc_fqw_sta & 0xe7) | (freq_mode << 3);
    I2C_Write(RTC_CTR, &rtc_fqw_sta, 1, NormalMode);
    I2C_Deinit();
}

/**************************************************************************
* 函数描述: 方波输出频率开
* 入口参数: 无
* 出口参数: 无
* 返回值:
***************************************************************************/
void RTC_FQW_Enable(void)
{
    INT8U rtc_fqw_sta;
    I2C_Init(PT7C4337SAD, 200);
    I2C_Read(RTC_CTR, &rtc_fqw_sta, 1, NormalMode);
    rtc_fqw_sta = (rtc_fqw_sta & (~INTCN));
    I2C_Write(RTC_CTR, &rtc_fqw_sta, 1, NormalMode);
    I2C_Deinit();
}

/**************************************************************************
* 函数描述: 方波输出频率关
* 入口参数: 无
* 出口参数: 无
* 返回值:
***************************************************************************/
void RTC_FQW_Disable(void)
{
    INT8U rtc_fqw_sta;
    I2C_Init(PT7C4337SAD, 200);
    I2C_Read(RTC_CTR, &rtc_fqw_sta, 1, NormalMode);
    rtc_fqw_sta = (rtc_fqw_sta & (~INTCN)) | INTCN;
    I2C_Write(RTC_CTR, &rtc_fqw_sta, 1, NormalMode);
    I2C_Deinit();
}
/**************************************************************************
* 函数描述: 检测掉点状态
* 入口参数: 无
* 出口参数: 闹钟通道
* 返回值:   0 -- 正常
*           1 -- 掉点
***************************************************************************/
int RTC_GetVL(void)
{
    RTC_Read(&RTC_datetime);
    if (RTC_datetime.year > 2099 || RTC_datetime.mon > 12 || RTC_datetime.day > 31  || RTC_datetime.hour > 23  || RTC_datetime.minute > 59)
        return 1;
    else
        return 0;
}
#endif

⌨️ 快捷键说明

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