打印

DS1302写保护寄存器写入0x00读出来的都是0xff不知道是不是根本

[复制链接]
4227|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wulitou|  楼主 | 2013-8-2 17:57 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include <msp430x14x.h>
//#include "DS1302.h"
#define uchar unsigned char
#define uint unsigned int

/**************宏定义***************/
#define DS_RST  BIT5        //DS_RST = P5.5
#define DS_SCL  BIT7        //DS_SCL = P5.7
#define DS_SDA  BIT6        //DS_SDA = P5.6
#define DS_RST_IN P5DIR &= ~DS_RST
#define DS_RST_OUT P5DIR |= DS_RST
#define DS_RST0 P5OUT &= ~DS_RST
#define DS_RST1 P5OUT |= DS_RST
#define DS_SCL_IN P5DIR &= ~DS_SCL
#define DS_SCL_OUT P5DIR |= DS_SCL
#define DS_SCL0 P5OUT &= ~DS_SCL
#define DS_SCL1 P5OUT |= DS_SCL
#define DS_SDA_IN P5DIR &= ~DS_SDA
#define DS_SDA_OUT P5DIR |= DS_SDA
#define DS_SDA0 P5OUT &= ~DS_SDA
#define DS_SDA1 P5OUT |= DS_SDA
#define DS_SDA_BIT P5IN & DS_SDA

/*******************************************
函数名称:delaytime
功    能:延时一段时间
参    数:time--延时长度
返回值  :无
********************************************/
void delaytime(uint time)
{
    uint i;
   // time=time*5/4;
    for(i=0;i<time;i++);     _NOP();
}

/*******************************************
函数名称:Write1Byte
功    能:对DS1302写入1个字节的数据
参    数:wdata--写入的数据
返回值  :无
********************************************/
void Write1Byte(uchar wdat)
{
    uchar i;

    DS_SDA_OUT;     //SDA对应的IO设置为输出状态

   // DS_SCL0;
    DS_RST1;        //REST=1;
    _NOP();_NOP();
    for(i=8; i>0; i--)
    {   
        //DS_SCL0;
        if(wdat&0x01)  DS_SDA1;
        else            DS_SDA0;
        DS_SCL0;
        delaytime(10);
        DS_SCL1;
        delaytime(10);
        wdat >>= 1;      
    }
    DS_SDA1;
}
/*******************************************
函数名称:Read1Byte
功    能:从DS1302读出1个字节的数据
参    数:无
返回值  :读出的一个字节数据
********************************************/
uchar Read1Byte(void)
{
    uchar i;
    uchar rdat=0X00;
    //delaytime(5);
    //DS_SDA1;
    DS_SDA_IN;  //SDA对应的IO设置为输入状态
    DS_RST1;    //REST=1;
    //DS_SCL0;
    for(i=8; i>0; i--)
    {
        DS_SCL1;
        delaytime(5);
        DS_SCL0;
       delaytime(5);
        rdat >>=1;
        if(DS_SDA_BIT)  rdat |= 0x80;         
    }   
    DS_SDA_OUT;
    return(rdat);
}
/*******************************************
函数名称:W_Data
功    能:向某个寄存器写入一个字节数据
参    数:addr--寄存器地址
          wdata--写入的数据
返回值  :无
********************************************/
void W_Data(uchar addr, uchar wdat)
{
    DS_RST0;
    DS_SCL0;
    DS_SDA1;  
    _NOP();_NOP();
    DS_RST1;
    _NOP();_NOP();
    Write1Byte(addr);   //写入地址
    //DS_SCL0;
    //delaytime(5);
    Write1Byte(wdat);  //写入数据
    DS_SDA1;
    DS_SCL1;
    //delaytime(5);
    DS_RST0;
}
/*******************************************
函数名称:R_Data
功    能:从某个寄存器读出一个字节数据
参    数:addr--寄存器地址
返回值  :读出的数据
********************************************/
uchar R_Data(uchar addr)
{
    uchar rdat;

    DS_RST0;
    DS_SCL0;
    _NOP();_NOP();
    DS_RST1;
    delaytime(5);
    Write1Byte(addr);    //写入地址
    rdat = Read1Byte();  //读出数据
    DS_SCL1;
    DS_RST0;
    DS_SDA1;

    return(rdat);
}

/*******************************************
函数名称:Set_DS1302
功    能:设置DS1302内部的时间
参    数:ptr--指向存放数据地址的指针
返回值  :无
说明    :写入数据的格式:
            秒 分 时 日 月 星期 年  【共7个字节】
********************************************/
void Set_DS1302(uchar *ptr)
{
    uchar i;
    uchar addr = 0x80;

    W_Data(0x8e,0x00);    //允许写入

    for(i =7;i>0;i--)
    {
        W_Data(addr,*ptr++);
        addr += 2;
    }
    W_Data(0x8e,0x80);      //禁止
}
/********************************************************************
*
* 名称: Get_DS1302
* 说明:
* 功能: 读取DS1302当前时间
* 调用: R_Data(uchar addr)
* 输入: ucCurtime: 保存当前时间地址。当前时间格式为: 秒 分 时 日 月 星期 年
* 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
* 返回值: 无
***********************************************************************/
/*******************************************
函数名称:Get_DS1302
功    能:读取DS1302内部的时间
参    数:ptr--指向数据存放地址的指针
返回值  :无
说明    :读出数据的格式:
            秒 分 时 日 月 星期 年  【共7个字节】
********************************************/
void Get_DS1302(uchar *ptr)
{
    uchar i;
    uchar addr=0x81;
    for(i=0;i<7;i++)
    {
        ptr[i]=R_Data(addr);
        addr+=2;
    }
}
/*******************************************
函数名称:Reset_DS1302
功    能:对DS1302进行复位操作
参    数:无
返回值  :无
********************************************/
void Reset_DS1302(void)
{

  P5SEL=0;  

   DS_RST_OUT;  //RST对应的IO设置为输出状态
    DS_SCL_OUT;  //SCLK对应的IO设置为输出状态  
    DS_SCL0;     //SCLK=0
    DS_RST0;     //RST=0
    delaytime(40);
   DS_SCL1;    //SCLK=1
    W_Data(0x8e,0x00);
    W_Data(0x80,0x00);

}

相关帖子

沙发
wulitou|  楼主 | 2013-8-2 17:58 | 只看该作者
各位大神帮忙瞅瞅!已经看了好几天了都不知道问题出在哪里了?

使用特权

评论回复
板凳
568581185| | 2013-8-2 22:36 | 只看该作者
不知道这是啥情况啊,能把问题描述更明显一点么?

使用特权

评论回复
地板
outstanding| | 2013-8-25 11:43 | 只看该作者
不清楚,帮顶

使用特权

评论回复
5
Imakey| | 2013-8-25 11:52 | 只看该作者
又是一堆代码啊~

使用特权

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

本版积分规则

1

主题

4

帖子

0

粉丝