[51单片机] ds1302问题 (标红色字体)

[复制链接]
2283|11
 楼主| mcu_hello 发表于 2014-2-6 17:51 | 显示全部楼层 |阅读模式
单字节读DS1302    只要缺少了 红色字体的那代码就出现问题 DSIO=0;自己看资料 没找到相关信息.
uchar Ds1302Read(uchar addr)
{
        uchar n,dat,dat1;
        RST = 0;
        _nop_();

        SCLK = 0;//先将SCLK置低电平。
        _nop_();
        RST = 1;//然后将RST(CE)置高电平。
        _nop_();

        for(n=0; n<8; n++)//开始传送八位地址命令
        {
                DSIO = addr & 0x01;//数据从低位开始传送
                addr >>= 1;
                SCLK = 1;//数据在上升沿时,DS1302读取数据
                _nop_();
                SCLK = 0;//DS1302下降沿时,放置数据
                _nop_();
        }
        _nop_();
        for(n=0; n<8; n++)//读取8位数据
        {
                dat1 = DSIO;//从最低位开始接收
                dat = (dat>>1) | (dat1<<7);
                SCLK = 1;
                _nop_();
                SCLK = 0;//DS1302下降沿时,放置数据
                _nop_();
        }

        RST = 0;
        _nop_();        //以下为DS1302复位的稳定时间,必须的。
        SCLK = 1;
        _nop_();
        DSIO = 0;
        _nop_();
        DSIO = 1;
        _nop_();
        return dat;       
}
xyz549040622 发表于 2014-2-6 19:54 | 显示全部楼层
  1.          _nop_();
  2.         DSIO = 0;
  3.         _nop_();
  4.         DSIO = 1;
  5.         _nop_();
把这个都去掉,为什么要把数据拉低又拉高呢
 楼主| mcu_hello 发表于 2014-2-9 16:56 | 显示全部楼层
xyz549040622 发表于 2014-2-6 19:54
把这个都去掉,为什么要把数据拉低又拉高呢

_nop_();

        DSIO = 0;

        _nop_();

        DSIO = 1;

        _nop_();


去掉DSIO=0,就 不行  其他的去掉没问题
wangch_sh 发表于 2014-2-9 17:06 | 显示全部楼层
这几句不需要,可能其他地方有问题。
我的函数是这样,没问题:
/*-------------------------------------------------------------------
从ds1302中读出一字节数据
-------------------------------------------------------------------*/
u8 readbyte_ds1302(u8 addr)
{
        unsigned char i,temp;
        rst_1302_l;
        delay_nus(1);
        clk_1302_l;
        delay_nus(1);                            
        rst_1302_h;
        delay_nus(1);  
        addr|=0x01;
        DrvGPIO_Open(E_GPA,6,E_IO_OUTPUT);                                         
        for(i=0;i<8;i++)
        {
                clk_1302_l;
                delay_nus(1);  
                if(addr&0x01)        DrvGPIO_SetBit(E_GPA,6);
                else                         DrvGPIO_ClrBit(E_GPA,6);
                 delay_nus(1);
                clk_1302_h;       
                 delay_nus(1);
                addr>>=1;       
        }
        for(i=0;i<8;i++)
        {
                temp>>=1;
                clk_1302_l;
                 delay_nus(1);
                if(ds1302_dat_read())temp|=0x80;
                else   temp&=0x7f;       
                 delay_nus(1);        
                clk_1302_h;
                 delay_nus(1);        
        }
        rst_1302_l;
        delay_nus(1);  
        clk_1302_l;
        return(temp);
}
 楼主| mcu_hello 发表于 2014-2-10 14:57 | 显示全部楼层
wangch_sh 发表于 2014-2-9 17:06
这几句不需要,可能其他地方有问题。
我的函数是这样,没问题:
/*-------------------------------------- ...

可以给我全部的代码吗?
wangch_sh 发表于 2014-2-10 16:12 | 显示全部楼层
不行,公司有保密协议。你可以在网上搜,很多的。
 楼主| mcu_hello 发表于 2014-2-10 21:05 | 显示全部楼层
wangch_sh 发表于 2014-2-10 16:12
不行,公司有保密协议。你可以在网上搜,很多的。

好的 我在去弄弄 不用硬件  用protues仿真试试  
 楼主| mcu_hello 发表于 2014-2-10 21:57 | 显示全部楼层
wangch_sh 发表于 2014-2-10 16:12
不行,公司有保密协议。你可以在网上搜,很多的。

在仿真中没有问题 去掉
     _nop_();

        DSIO = 0;

        _nop_();

        DSIO = 1;

        _nop_();
这些可以,,应该是硬件问题,是不是因为是国产芯片的原故呢? 谢谢解答
 楼主| mcu_hello 发表于 2014-2-10 21:59 | 显示全部楼层
在仿真中没问题
去掉_nop_();

        DSIO = 0;

        _nop_();

        DSIO = 1;

        _nop_();
这些都可以,是不是硬件是国产的原因呢?谢谢你们的回答!
wangch_sh 发表于 2014-2-10 22:03 | 显示全部楼层
你这个问题太奇怪啦。加上这几句就可以吗?
 楼主| mcu_hello 发表于 2014-2-10 22:15 | 显示全部楼层
wangch_sh 发表于 2014-2-10 22:03
你这个问题太奇怪啦。加上这几句就可以吗?

困扰了我好久  是再淘宝买的学习资料
  _nop_();        //以下为DS1302复位的稳定时间,必须的。
        SCLK = 1;
        _nop_();
        DSIO = 0;
        _nop_();
        DSIO = 1;
        _nop_();
在硬件上运行一定要有这几句,,应该是一定要DSIO=0,这句,,,

我自己做了个仿真 结果
那几句代码不要都可以包括不要DSIO=0,都能正常运行  
逗逗比 发表于 2016-9-9 19:38 | 显示全部楼层
楼主,我的问题跟你一样,什么原因?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

7

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部