打印
[STC单片机]

读ds12c887数据有问题

[复制链接]
2928|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
最近在做万年历,用的51和ds12c887,但是单片机读取时钟芯片的时候出现了问题,就是单片机读取ds12c887的任意一个寄存器,比如秒或者分或时或date或年,读出来的数据都是一直在变化的。请教各位,碰到过这类情况吗,谢谢了

相关帖子

沙发
lnulibin| | 2014-5-5 17:11 | 只看该作者
网上下一个好用的877芯片的驱动,下到51里边试试好用不。

使用特权

评论回复
板凳
人民币的幻想|  楼主 | 2014-5-6 15:31 | 只看该作者
lnulibin 发表于 2014-5-5 17:11
网上下一个好用的877芯片的驱动,下到51里边试试好用不。

:L,不好用,不管读哪个寄存器都是从0到60的一个数,但是能读能写

使用特权

评论回复
地板
ayb_ice| | 2014-5-6 15:50 | 只看该作者
仔细检查时序

使用特权

评论回复
5
人民币的幻想|  楼主 | 2014-5-6 17:09 | 只看该作者
ayb_ice 发表于 2014-5-6 15:50
仔细检查时序

uint8_t RTC_Read(uint8_t addr)
{
  uint8_t dat;
  RTC_CS=0;
  RTC_RW=1;
  RTC_DS=1;
  RTC_AS=1;
  RTC_DATA=addr;
  RTC_AS=0;
  RTC_DS=0;
  RTC_DATA=0xff; //端口读数之前先写1
  dat=RTC_DATA;
  RTC_DS=1;
  RTC_AS=1;
  RTC_CS=1;
  return dat;
}
void  RTC_Write(uint8_t addr,uint8_t dat)
{
    RTC_CS=0;          //片选
        RTC_DS=1;          //在intel总线中,DS等价于RD(Read)         
        RTC_RW=1;          //等待最少20ns 但51执行1条指令就1us
        RTC_AS=1;          //AS下降沿写入地址信息
        RTC_DATA=addr;//先写地址
        RTC_AS=0;
        RTC_RW=0;
        RTC_DATA=dat;//再写数据
        RTC_RW=1;
        RTC_AS=1;
        RTC_CS=1;                       
}

使用特权

评论回复
6
人民币的幻想|  楼主 | 2014-5-6 17:09 | 只看该作者
ayb_ice 发表于 2014-5-6 15:50
仔细检查时序

:lol帮忙看下吧

使用特权

评论回复
7
NE5532| | 2014-5-6 17:21 | 只看该作者
楼主可能得仔细看一下时序图,一个基本的认识,地址信号应该在锁存信号之前上线,你写出来的刚好是反的。

使用特权

评论回复
8
人民币的幻想|  楼主 | 2014-5-6 22:02 | 只看该作者
NE5532 发表于 2014-5-6 17:21
楼主可能得仔细看一下时序图,一个基本的认识,地址信号应该在锁存信号之前上线,你写出来的刚好是反的。 ...

void  RTC_Write(uint8_t addr,uint8_t dat)
{
    RTC_CS=0;          //片选
        RTC_AS=1;          //AS下降沿写入地址信息
        RTC_DS=1;          //在intel总线中,DS等价于RD(Read)         
        RTC_RW=1;          //等待最少20ns 但51执行1条指令就1us
        RTC_DATA=addr;//先写地址
        RTC_AS=0;
        RTC_RW=0;
        RTC_DATA=dat;//再写数据
        RTC_RW=1;
        RTC_AS=1;
        RTC_CS=1;                       
}

uint8_t RTC_Read(uint8_t addr)
{
  uint8_t dat;
  RTC_CS=0;
  RTC_AS=1;
  RTC_DS=1;
  RTC_RW=1;
  RTC_DATA=addr;
  RTC_AS=0;
  RTC_DS=0;
  RTC_DATA=0xff; //端口读数之前先写1
  dat=RTC_DATA;
  RTC_DS=1;
  RTC_AS=1;
  RTC_CS=1;
  return dat;
}

改过来了,但是还是老毛病,不管读哪个寄存器,读出来的数据从00-59,然后清0,再循环:'(

使用特权

评论回复
9
cjseng| | 2014-5-6 22:16 | 只看该作者
这个不难的,再仔细看看Datasheet吧,照着上边的时序要求写程序,绝对能用。

使用特权

评论回复
10
NE5532| | 2014-5-6 22:41 | 只看该作者
那只能说明你的时序还有问题,永远都是在读秒寄存器。

使用特权

评论回复
11
ayb_ice| | 2014-5-7 09:36 | 只看该作者
没有时序图,谁知道你程序对否

如果CS低有效,感觉你这时序问题大

使用特权

评论回复
12
人民币的幻想|  楼主 | 2014-5-10 16:40 | 只看该作者
NE5532 发表于 2014-5-6 22:41
那只能说明你的时序还有问题,永远都是在读秒寄存器。

问题解决,非时序问题,换了一块单片机,直接就好使。:lol

使用特权

评论回复
13
人民币的幻想|  楼主 | 2014-5-10 16:41 | 只看该作者
ayb_ice 发表于 2014-5-7 09:36
没有时序图,谁知道你程序对否

如果CS低有效,感觉你这时序问题大

非时序问题,不过我照着写了一遍,也算是收获吧:lol

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

18

主题

375

帖子

3

粉丝