OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 9155|回复: 10

求助,实时时钟r8025ac

[复制链接]

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2014-4-17
在线时间
3 小时
发表于 2014-12-9 22:31:39 | 显示全部楼层 |阅读模式
5金钱
最近在做这个时钟的一个程序,不知道什么原因寄存器的值一直读不出来,看到阿莫上有关于这个芯片的DATASHEET,想下下来,哪位大神有阿莫的账号,帮我下一下啊!不胜感激啊!http://www.amobbs.com/thread-5528525-1-1.html,这个地址。主要是因为网上根本找不到R8025AC的datasheet,所以才来求救啊!各位帮帮忙啊!

最佳答案

查看完整内容[请看2#楼]

http://wenku.baidu.com/link?url=dzerIwXlV3KsuHMUcLdPLtiOSaOaHskYBy8pC-LsHuNcTGl3Tb53aeZR2L--e7baXA598eednHj1eO2Bt4FOXyzXpoAVL8C75F6nbBZZkDa
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-9 22:31:40 | 显示全部楼层
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2014-4-17
在线时间
3 小时
 楼主| 发表于 2014-12-9 22:56:31 | 显示全部楼层
这个我看到了,还想问就是:rx8025sa和r8025ac属于同一个型号吗?可以直接参考来做吗?
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-9 23:08:22 | 显示全部楼层
回复【3楼】邛于:
---------------------------------
没用过这个芯片。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
72
金钱
72
注册时间
2014-4-17
在线时间
3 小时
 楼主| 发表于 2014-12-10 15:28:21 | 显示全部楼层
感谢原子大哥!今天写完了一个R8025AC的驱动程序,对着是原子大哥提供datasheet,整体来说测试通过没问题。注意的问题是:读写数据时按照数据基本传输格式来写,就没问题。有不懂的多看几遍datasheet就可以了。原版上读数据的过程中有错的注释,下面红色标记的已作修改,放心使用。

回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-10 21:24:23 | 显示全部楼层
回复【5楼】邛于:
---------------------------------
谢谢分享
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

48

主题

537

帖子

2

精华

金牌会员

Rank: 6Rank: 6

积分
1369
金钱
1369
注册时间
2014-2-13
在线时间
169 小时
发表于 2015-1-8 09:35:37 | 显示全部楼层
楼主用的硬件IIC还是软件模拟的,可否发上来参考下。
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2015-12-29 09:15:51 | 显示全部楼层
楼主用的硬件IIC还是软件模拟的,可否发上来参考下。
小小蜗牛
回复

使用道具 举报

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1876
金钱
1876
注册时间
2014-9-10
在线时间
208 小时
发表于 2015-12-29 15:03:10 | 显示全部楼层
这个年月日都设置好了,星期几还要自己手动输入才有效?不应该自己匹配吗
小小蜗牛
回复

使用道具 举报

6

主题

33

帖子

0

精华

初级会员

Rank: 2

积分
146
金钱
146
注册时间
2012-12-21
在线时间
23 小时
发表于 2015-12-30 14:01:44 | 显示全部楼层
[mw_shl_code=c,true]
uint8_t RX8025_BCD2DEC(uint8_t val)
{
    uint8_t i;

    i = val&0x0f;           //按位与,i得到低四位数。
    val >>= 4;              //右移四位,将高四位移到低四位的位置,得到高四位码值。
    val &= 0x0f;            //防止移位时高位补进1,只保留高四位码值
    val *= 10;              //高位码值乘以10
    i += val;               //然后与第四位码值相加。
    return i;               //将得到的十进制数返回
}

/**
* @brief RX8025_DEC2BCD  十进制转BCD码
* @param val      BCD码
* @return
*/
uint8_t RX8025_DEC2BCD(uint8_t val)
{
    uint8_t i;

    i = val/10;            //取得十位
    val %= 10;             //取得个位
    i <<= 4;               //左移4位
    i += val;

    return i;
}

void Rx8025_WriteCTFG(void)
{
        uint8_t temp;

        temp = RX8025_ReadReg(REG_CONTROL2);
        temp &= 0xFB;                        //Write CTFG;
        RX8025_WriteReg(REG_CONTROL2,temp);
}

/****************************************************
* Function Name  :
* Description    :   初始化RX8025
* Input          :
* Return         :   返回非0值代表初始化通过
* Note           :
*****************************************************/
uint8_t RX8025_Init(void)
{
    uint8_t temp,temp1;

    RX8025GpioInit();
    temp = RX8025_ReadReg(REG_CONTROL1);
    /*******  RX8025上电默认选择12小时制  **********/
#if USING_T12_T24==1    //24小时制
    RX8025_WriteReg(REG_CONTROL1,temp|REGBIT_12_24);
#elif USING_T12_T24==0  //12小时制
    RX8025_WriteReg(REG_CONTROL1,temp&(~REGBIT_12_24));
#endif
    /* INTA管脚输出模式 */
    temp = RX8025_ReadReg(REG_CONTROL1);
    temp &= 0xF8;  //清空低3位
    //temp |= 0x00;//INTA管脚不输出
    //temp |= 0x01;//INTA管脚输出固定低电平
    //temp |= 0x02;//INTA管脚输出占空比50%、2HZ的脉冲
    temp |= 0x03;//INTA管脚输出占空比50%、1HZ的脉冲
    //temp |= 0x04;//INTA管脚输出电平模式,1秒1次
    //temp |= 0x05;//INTA管脚输出电平模式,1分钟1次
    //temp |= 0x06;//INTA管脚输出电平模式,1小时1次
    //temp |= 0x07;//INTA管脚输出电平模式,1月1次
    RX8025_WriteReg(REG_CONTROL1,temp);
    temp1 = RX8025_ReadReg(REG_CONTROL1);
    if(temp == temp1)  //读写是否正常
        temp1 = 0;
    else
        temp1 = 1;

    /* 低电压检测功能 */
    /* 振动停止检测功能 */
    temp = RX8025_ReadReg(REG_CONTROL1);
    RX8025_WriteReg(REG_CONTROL1,temp|REGBIT_XST); //启动低电压检测
    /* 电源复位检测功能 */
    temp = RX8025_ReadReg(REG_CONTROL1);
    RX8025_WriteReg(REG_CONTROL1,temp&(~REGBIT_PON)); //清除标志位,为下次做准备
    /* INTB管脚输出 */
    temp = RX8025_ReadReg(REG_CONTROL2);
    RX8025_WriteReg(REG_CONTROL2,temp&(~REGBIT_WAFG)); //关闭ALARM_W引起的INTB管脚的输出
    temp = RX8025_ReadReg(REG_CONTROL2);
    RX8025_WriteReg(REG_CONTROL2,temp&(~REGBIT_DAFG)); //关闭ALARM_D引起的INTB管脚的输出
    /* 日历计数器 */
    temp = RX8025_ReadReg(REG_MONTH);
    RX8025_WriteReg(REG_MONTH,temp&(~0x80));  //规定:先写零再使用

    return temp1;
}

/*
        读取RTC
        method=0时采用阻塞方式读,method=1时采用状态机+非阻塞方式
*/
void ReadRTCBlock(struct tm *rtc)
{       

    Rx8025RTC.tm_sec = RX8025_BCD2DEC(RX8025_ReadReg(0)&0x7f);
    Rx8025RTC.tm_min = RX8025_BCD2DEC(RX8025_ReadReg(1)&0x7f);
    Rx8025RTC.tm_hour = RX8025_BCD2DEC(RX8025_ReadReg(2)&0x7f);
    //----星期
    Rx8025RTC.tm_wday= RX8025_BCD2DEC(RX8025_ReadReg(3)&0x07);
    //----一个月中的日期
    Rx8025RTC.tm_mday = RX8025_BCD2DEC(RX8025_ReadReg(4)&0x3f);
    Rx8025RTC.tm_mon = RX8025_BCD2DEC(RX8025_ReadReg(5)&0x1f);
    Rx8025RTC.tm_year = RX8025_BCD2DEC(RX8025_ReadReg(6)&0xff);
    Rx8025RTC.tm_year += 2000;

    (*rtc).tm_sec = Rx8025RTC.tm_sec;
    (*rtc).tm_min = Rx8025RTC.tm_min;
    (*rtc).tm_hour = Rx8025RTC.tm_hour;
    //----星期
    (*rtc).tm_wday= Rx8025RTC.tm_wday;
    //----一个月中的日期
    (*rtc).tm_mday = Rx8025RTC.tm_mday;
    (*rtc).tm_mon = Rx8025RTC.tm_mon;
    (*rtc).tm_year = Rx8025RTC.tm_year;
}

void ReadRTCNoBlock(struct tm *rtc)
{
    (*rtc).tm_sec = Rx8025RTC.tm_sec;
    (*rtc).tm_min = Rx8025RTC.tm_min;
    (*rtc).tm_hour = Rx8025RTC.tm_hour;
    //----星期
    (*rtc).tm_wday= Rx8025RTC.tm_wday;
    //----一个月中的日期
    (*rtc).tm_mday = Rx8025RTC.tm_mday;
    (*rtc).tm_mon = Rx8025RTC.tm_mon;
    (*rtc).tm_year = Rx8025RTC.tm_year;
}

/****************************************************
* Function Name  :
* Description    :
* Input          :
* Return         :
* Note           :  采用阻塞方式写,耗时75ms
*****************************************************/
uint8_t WriteRTCBlock(struct tm rtc)
{   

    Rx8025RTC.tm_sec = rtc.tm_sec;
    Rx8025RTC.tm_min = rtc.tm_min;
    Rx8025RTC.tm_hour = rtc.tm_hour;
    //----星期
    Rx8025RTC.tm_wday = rtc.tm_wday;
    //----一个月中的日期
    Rx8025RTC.tm_mday = rtc.tm_mday;
    Rx8025RTC.tm_mon = rtc.tm_mon;
    Rx8025RTC.tm_year = rtc.tm_year;

    /* 每次写入耗时0.97ms */
    RX8025_WriteReg(0,RX8025_DEC2BCD(Rx8025RTC.tm_sec));
    RX8025_WriteReg(1,RX8025_DEC2BCD(Rx8025RTC.tm_min));
    RX8025_WriteReg(2,RX8025_DEC2BCD(Rx8025RTC.tm_hour));
    RX8025_WriteReg(3,RX8025_DEC2BCD(Rx8025RTC.tm_wday));
    RX8025_WriteReg(4,RX8025_DEC2BCD(Rx8025RTC.tm_mday));
    RX8025_WriteReg(5,RX8025_DEC2BCD(Rx8025RTC.tm_mon));
    RX8025_WriteReg(6,RX8025_DEC2BCD(Rx8025RTC.tm_year-2000));
    return 1;       
}

/**************************************
功能描述:   发送读取时间命令
参数说明:
返回说明:
调用方式:   1s调用一次
全局变量:
读写时间:
注意事项:
日期    :
**************************************/
void Rx8025ReadRTCTask(void)
{
    rx8025_status = READ_RTC;
}

/**************************************
功能描述:   周期性轮询任务
参数说明:
返回说明:
调用方式:   100ms调用一次
全局变量:
读写时间:
注意事项:
日期    :
**************************************/
void Rx8025Task(void)
{
    static uint8_t step=0;

    switch(rx8025_status)
    {
        case IDLE_RTC:
            break;
        case READ_RTC:
            switch(step)
            {
                case 0:
                    Rx8025RTC.tm_sec = RX8025_BCD2DEC(RX8025_ReadReg(0)&0x7f);
                    step++;
                    break;
                case 1:
                    Rx8025RTC.tm_min = RX8025_BCD2DEC(RX8025_ReadReg(1)&0x7f);
                    step++;
                    break;   
                case 2:
                    Rx8025RTC.tm_hour = RX8025_BCD2DEC(RX8025_ReadReg(2)&0x7f);
                    step++;
                    break;
                case 3:
                    Rx8025RTC.tm_wday= RX8025_BCD2DEC(RX8025_ReadReg(3)&0x07);
                    step++;
                    break;                            
                case 4:
                    Rx8025RTC.tm_mday = RX8025_BCD2DEC(RX8025_ReadReg(4)&0x3f);
                    step++;
                    break;
                case 5:
                    Rx8025RTC.tm_mon = RX8025_BCD2DEC(RX8025_ReadReg(5)&0x1f);
                    step++;
                    break;   
                case 6:
                    Rx8025RTC.tm_year = RX8025_BCD2DEC(RX8025_ReadReg(6)&0xff);
                    Rx8025RTC.tm_year += 2000;
                    step = 0;
                    rx8025_status = IDLE_RTC;
                    break;                 
            }
            break;                  
        default:
            break;
    }
}
[/mw_shl_code]
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4480
金钱
4480
注册时间
2013-4-22
在线时间
337 小时
发表于 2015-12-30 15:25:53 | 显示全部楼层
8025和8025T的时序是不一样的,所以驱动也是不同的,仔细看手册
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 19:41

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表