5925|13

71

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

1302遭遇异灵事件,求助个位,是不是1302有很多版本? [复制链接]

各位高手,小弟写了一个1302的驱动程序,在有的ds1302上面能正确运行,有的ds1302上无法运行,搞到现在没有搞明白,请教一下大家。

本人写的ds1302的驱动贴在下面,大家帮忙看看有没有什么错误的地方。

奇怪的事情在这,本人买了2个ds1302,字是白色的印刷上去的,用指甲一弄就掉,上面印的是ds1302 0722A4 +107AA。

这个ds1302用我写的驱动读写正常,显示也完全正常,就是不走时,也就是不走秒,但是奇怪的是我拔掉晶振用手捏住接晶振的两端的时候,开始走秒,但是走的比较快,运行也比较正常,就是手一松就停止了,有时候不装晶振他也走时,就是很慢走的。不知道什么原因,请教大家。

由于上面的ds1302太古怪,所以我又去买了3个新的ds1302,不在同一家买的,这次的ds1302是灼刻在芯片表面的,也就是用手擦不掉的,铭牌是 ds1302 ba38hj  ,用下面写的驱动也能正常驱动,就是读数不正确,比如读秒显示的是 :00,01,00,03,00,02,07,10,08,13,09,十分混了。

但是自己能自动走,更加不可思议的是我拔掉晶振他居然也在走,而且频率和没拔的时候一样。。。

至今没有调试出来,郁闷啊啊。。。ds1302有鬼啊啊。。。。

请大家指教,下面是我的驱动程序。大家看看是不是时序问题。谢谢大家了!



void write_ds1302(unsigned char Writeaddr,unsigned char Writedata)
{
unsigned char i;
TIMERST=0;
TIMECLK=0;
  TIMERST=1;
  for(i=8;i>0;i--)
  {
  TIMECLK=0;
    TIMEDATA=Writeaddr&0x01;
  _nop_();
    TIMECLK=1;
  Writeaddr=Writeaddr>>1;
   
  }

  for(i=8;i>0;i--)
  {
  TIMECLK=0;
  TIMEDATA=Writedata&0x01;
  _nop_();   //
    TIMECLK=1;
   Writedata=Writedata>>1;
  }

TIMERST=0;
_nop_();
TIMECLK=0;
_nop_();

}

/****************************************************************************
从DS1302读出一个字节的数据
****************************************************************************/
unsigned char Read_Ds1302(unsigned char Readaddr)
{
unsigned char i;
unsigned char value=0;
uchar value1=0;

TIMERST=0;
TIMECLK=0;
TIMERST=1;

for(i=8;i>0;i--)
  {
  TIMECLK=0;         //0   
  TIMEDATA=Readaddr&0x01;
  _nop_();          //
  TIMECLK=1;
  Readaddr=Readaddr>>1;
}
   for(i=8;i>0;i--)
  {
  if(TIMEDATA==1)
    {
      value=value|0x80;
    }
  value=value>>1;
  TIMECLK=0;
  TIMECLK=1;
    _nop_();
  }



  TIMERST=0;
_nop_();
  TIMECLK=0;
_nop_();
value1=value&0xf0;
value=value&0x0f;
value1>>=4;
value=value+value1*10;
  return value;
}

/****************************************************************************
DS1302初始化
****************************************************************************/
void init_1302(void)
{
while(Read_Ds1302(0xcd)!=0x01)
{
  TIMECLK=0;
  TIMERST=1;
  write_ds1302(0x8e,0x00);

  write_ds1302(0x82,0x01);
  write_ds1302(0x84,0x02);
  write_ds1302(0x86,0x03);
  write_ds1302(0x88,0x04);
  write_ds1302(0x8a,0x05);
  write_ds1302(0x8c,0x06);

  write_ds1302(0x90,0x00);
  write_ds1302(0xcc,0x01);
  write_ds1302(0x80,0x01);
  write_ds1302(0x8e,0x80);
  if(keyboard(0)) break;

  }
}

最新回复

一来就看到好消息,恭喜恭喜! 怎么样,经过一番辛苦之后得到的成果,特别香甜吧。 祝贺!  详情 回复 发表于 2008-7-17 09:12
点赞 关注

回复
举报

78

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
不是同一批的就是有区别的
 
 

回复

72

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
请问区别在哪呢?时序上有很大区别吗?谢谢了!
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

4
 
在Write和Read里面都反复看到
TIMERST=0
TIMERST=1

RESET脚是复位芯片的,你这样做就将其复位了。只有在初始化时才需要复位一次。
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

5
 
ls朋友谢谢您的帮助。
你提出的问题很好,但是在1302这个芯片里面,官方的引脚定义,RST角是作为使能角来用的,也就是CE,不知道官方为何将其命名RST,
很多网上的程序都是定义成CE的,我按照官方的定义的,可能引起误解了。
每次读写都要将RST拉高,这样代表选择。

再次感谢楼上兄弟!
 
 
 

回复

79

帖子

0

TA的资源

一粒金砂(初级)

6
 
这个是我弄错了,谢谢你的指出。RST的确是使能作用。

DS1302是非常常用的一个芯片,所以有很多做其兼容品的,包括国内的一些小厂。有些不好做自己品牌的,就会直接刷DS1302的标志,反正也不会被人查到。这类芯片,在功能上不会比正品DS1302差,只是在一些极限性能会不如了,比如极限温度、极限干扰,时间精度等。

你说的情况我再看看程序。

用的晶振准吗?用示波器看过吗?谐振电容用的多少pF的?
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

7
 
先参考一个
http://www.guangdongdz.com/special_column/techarticle/20065/3113182026196.html
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

8
 
谢谢您的帮助!
是啊。正是应为ds1302是一个很常用的芯片所以我才比较郁闷为啥我的做不出来。。。
我是学生,做这个是用51做家庭安防系统的一个部分,准备参加江苏电子竞赛用的,现在整个项目就是因为这个停下来了。所以很郁闷。
自己没有示波器,也无法得知是否启震,我贴上所有1302的代码,麻烦各位朋友帮助看下。实在谢谢大家了。

另外电路上我有一点疑问,ds1302的CLK,IO,RST引脚到底要不要接上拉/下拉电阻?我的没有接,很多人说要接上拉,也有很多说要下拉,更多人说不用。
晶振是32768的,官方说不要接电容了,我就没有接,但是网上很多朋友说要接30pf的电容。我接了试试发现效果还是一样。恳请大家帮助。谢谢大家了。


/////////////////////主函数功能描述//////////////////////
/*
  函数名称:ds1302
  函数功能:ds1302时钟函数
  入口参数:无
  出口参数:无
  异常记录:无
*/
///////////////////////////////////////////////////////////




#include
#include
#define  uchar unsigned char
#define  uint  unsigned int
uchar keyboard(uchar c_break);
uchar temp1302[13]={0,0,0,0,0,0,0,0,0,0,0,0,0};
sbit TIMEDATA=P3^2;
sbit TIMECLK=P3^1;
sbit TIMERST=P3^3;


void write_ds1302(unsigned char Writeaddr,unsigned char Writedata)
{
        unsigned char i;
        TIMERST=0;
        TIMECLK=0;
        TIMERST=1;
        for(i=8;i>0;i--)
        {
                CY=0;
                Writeaddr=Writeaddr>>1;
                TIMEDATA=CY;
                _nop_();
                TIMECLK=1;
                  TIMECLK=0;
               
                 
        }

        for(i=8;i>0;i--)
        {
                Writedata=Writedata>>1;
                TIMEDATA=Writedata&0x01;
                TIMECLK=1;
               
                _nop_();   //
                  TIMECLK=0;
               
        }

        TIMERST=0;
        _nop_();
        TIMECLK=0;
        _nop_();

}

/****************************************************************************
从DS1302读出一个字节的数据
****************************************************************************/
unsigned char Read_Ds1302(unsigned char Readaddr)
{
        unsigned char i;
        unsigned char value=0;
        uchar value1=0;

        TIMERST=0;
        TIMECLK=0;
        TIMERST=1;

        for(i=8;i>0;i--)
        {
                TIMECLK=0;         //0   
                TIMEDATA=Readaddr&0x01;
                _nop_();          //
                TIMECLK=1;
                Readaddr=Readaddr>>1;
        }
        for(i=8;i>0;i--)
        {
                  if(TIMEDATA==1)
                  {
                           value=value|0x80;
                  }
                value=value|0x00;
                value=value>>1;\
                TIMECLK=0;
                TIMECLK=1;
        }

        TIMERST=0;
        _nop_();
        TIMECLK=0;
        _nop_();
        value1=value&0xf0;
        value=value&0x0f;
        value1>>=4;
        value=value+value1*10;
        return value;
}

/****************************************************************************
DS1302初始化
****************************************************************************/
void init_1302(void)
{
        while(Read_Ds1302(0xcd)!=0x01)
        {
                TIMECLK=0;
                TIMERST=1;
                write_ds1302(0x8e,0x00);
       
                write_ds1302(0x82,0x01);
                write_ds1302(0x84,0x02);
                write_ds1302(0x86,0x03);
                write_ds1302(0x88,0x04);
                write_ds1302(0x8a,0x05);
                write_ds1302(0x8c,0x06);
       
                write_ds1302(0x90,0x00);
                write_ds1302(0xcc,0x01);
                write_ds1302(0x80,0x01);
                write_ds1302(0x8e,0x80);
                if(keyboard(0)) break;

         }
}


void ds1302()
{
        temp1302[0]=Read_Ds1302(0x81)/10;
        temp1302[1]=Read_Ds1302(0x81)%10;
        temp1302[2]=Read_Ds1302(0x83)/10;
        temp1302[3]=Read_Ds1302(0x83)%10;
        temp1302[4]=Read_Ds1302(0x85)/10;
        temp1302[5]=Read_Ds1302(0x85)%10;
        temp1302[6]=Read_Ds1302(0x87)/10;  
        temp1302[7]=Read_Ds1302(0x87)%10;
        temp1302[8]=Read_Ds1302(0x89)/10;  
        temp1302[9]=Read_Ds1302(0x89)%10;
        temp1302[10]=Read_Ds1302(0x8d)/10;
        temp1302[11]=Read_Ds1302(0x8d)%10;
}
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(初级)

9
 
CLK/DATA/RST最好接K级上拉电阻,这个接口类似I2C,需要上拉来提供额外驱动力的。还有也防止这个接口有浮动不确定电平。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

10
 

如果觉得有问题,可直接上网上申请样品,肯定正宗,还可以申请一个高品质晶振。
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

11
 
看了代码,有点混乱,建议修改一下。
你在Write1302里面实现了写地址、写数据,但是同样的操作用到的语句方法却不一样,写地址用了CY,写数据没用。
而且Write和Read里面同样都是写地址的操作,竟然也不一样。

将写地址和写数据都提炼成一个函数:WriteOneByte(unsigned char value);
然后调用 WriteOneByte(addr); // 写地址
         WriteOneByte(data); // 写数据

Read里面也只要调用WriteOneByte(addr); // 写地址

还是找个示波器看一下晶振是否正常,毕竟不能确保买到的1302是正品,对其驱动能力不确信。
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

12
 
还没解决。。。再试试,不行打算改用其他时钟芯片。。。谢谢大家。。。
尤其是shuiyan兄弟的帮助!谢谢!
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

13
 
按照shuiyan兄弟的意见更改了程序,更换了晶振,现在一切正常!
非常感谢shuiyan兄弟全程无私的帮助。谢谢您!
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

14
 
一来就看到好消息,恭喜恭喜!
怎么样,经过一番辛苦之后得到的成果,特别香甜吧。

祝贺!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表