OpenEdv-开源电子网

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

DS1302只能读不是写

[复制链接]

1

主题

31

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
212
金钱
212
注册时间
2015-10-4
在线时间
35 小时
发表于 2016-9-23 12:06:09 | 显示全部楼层 |阅读模式
1金钱
本帖最后由 ql1000 于 2016-9-23 12:05 编辑

请哪位师傅指导一下,我的程序在直插芯片DS1302正常运行,在贴片只能读,不能写!
//DS1302地址定义
#define ds1302_sec_add                  0x80                //秒数据地址
#define ds1302_min_add                  0x82                //分数据地址
#define ds1302_hr_add                    0x84                //时数据地址
#define ds1302_date_add                  0x86                //日数据地址
#define ds1302_month_add                0x88                //月数据地址
#define ds1302_day_add                  0x8a                //星期数据地址
#define ds1302_year_add                  0x8c                //年数据地址
#define ds1302_control_add  0x8e                //控制数据地址
#define ds1302_charger_add  0x90                 //充电功能                         
#define ds1302_clkburst_add 0xbe
/*
#define WRITE_SECOND        0x80
#define WRITE_MINUTE        0x82
#define WRITE_HOUR          0x84
#define READ_SECOND         0x81
#define READ_MINUTE         0x83
#define READ_HOUR           0x85
#define WRITE_PROTECT       0x8E
*/
//初始时间定义
uchar time_buf[8];// = {0x20,0x10,0x09,0x14,0x23,0x59,0x50,0x02};//初始时间2010年6月1号23点59分55秒 星期二
uchar hour,minute;
uchar readtime[14];//当前时间
uchar sec_buf=0;  //秒缓存
uchar sec_flag=0; //秒标志位
//功能:延时1毫秒
void Delay_xms(uint x)
{
  uint i,j;
  for(i=0;i<x;i++)
   for(j=0;j<112;j++);
}
void u1(uchar a)
{ uchar i;i=a;
  for( ;i>0;i--);
}
//DS1302初始化函数
void ds1302_init(void)
{
DS1302_CE_L;           //RST脚置低
DS1302_CLK_L;  //SCK脚置低
}

//向DS1302写入一字节数据
void ds1302_write_byte(uchar addr, uchar d)
{
        uchar i;
       
        DS1302_CE_H;                                          //启动DS1302总线       
        //写入目标地址:addr
        addr = addr & 0xfe;   //最低位置零,寄存器0位为0时写,为1时读
        for (i = 0; i < 8; i ++) {
                if (addr & 0x01) {
                        DS1302_IO_H;
                        }
                else {
                        DS1302_IO_L;
                        }
                DS1302_CLK_H; u1(1);     //产生时钟
                DS1302_CLK_L; u1(1);
                addr = addr >> 1;
                }       
        //写入数据:d
        for (i = 0; i < 8; i ++) {
                if (d & 0x01) {
                        DS1302_IO_H;
                        }
                else {
                        DS1302_IO_L;
                        }
                DS1302_CLK_H;  u1(1);    //产生时钟
                DS1302_CLK_L;  u1(1);
                d = d >> 1;
                }
        DS1302_CE_L;  u1(200); //停止DS1302总线
}

//从DS1302读出一字节数据
uchar ds1302_read_byte(uchar addr)
{ uchar i,temp;
  DS1302_CE_H;                                        //启动DS1302总线
       
        addr = addr | 0x01;    ////写入目标地址:addr最低位置高,寄存器0位为0时写,为1时读
        for (i = 0; i < 8; i ++)
        {
                if (addr & 0x01) { DS1302_IO_H; }
                else { DS1302_IO_L; }
                DS1302_CLK_H;      //产生时钟
                DS1302_CLK_L;
                addr = addr >> 1;
                }       
       
        //输出数据:temp
  DS1302_IO_in;       
        for (i = 0; i < 8; i ++)
                {
                temp = temp >> 1;
                if (DS1302_IO) { temp |= 0x80; }
                else { temp &= 0x7F; }
                DS1302_CLK_H;      //产生时钟
                DS1302_CLK_L;
                }
  DS1302_IO_out;       
        DS1302_CE_L;                                        //停止DS1302总线
        return temp;
}

//向DS1302写入时钟数据
void ds1302_write_time(void)
{   
        ds1302_write_byte(ds1302_control_add,0x00);     //关闭写保护
        //ds1302_write_byte(ds1302_sec_add,0x80);                //暂停时钟
       
        //ds1302_write_byte(ds1302_charger_add,0xa9);   //涓流充电
        //ds1302_write_byte(ds1302_year_add, time_buf[1]); //年
        //ds1302_write_byte(ds1302_month_add,time_buf[2]);//月
        //ds1302_write_byte(ds1302_date_add, time_buf[3]); //日
        ds1302_write_byte(ds1302_hr_add,   time_buf[4]);   //时
        ds1302_write_byte(ds1302_min_add,  time_buf[5]);  //分
        //ds1302_write_byte(ds1302_sec_add,  time_buf[6]);  //秒
        //ds1302_write_byte(ds1302_day_add,  time_buf[7]);  //周
        //WriteSet1302(0x90,0xa5);                //打开充电功能 选择2K电阻充电方式
        ds1302_write_byte(ds1302_control_add,0x80);     //打开写保护   
               
}
void time_reset(void)
{time_buf[0]=0x20; time_buf[1]=0x10; time_buf[2]=0x09; time_buf[3]=0x14;
time_buf[4]=0x23; time_buf[5]=0x59; time_buf[6]=0x50; time_buf[7]=0x02;
ds1302_write_time();
}
//从DS1302读出时钟数据
void ds1302_read_time(void)  
{
        //time_buf[1]=ds1302_read_byte (ds1302_year_add);  //年
        //time_buf[2]=ds1302_read_byte (ds1302_month_add); //月
        //time_buf[3]=ds1302_read_byte (ds1302_date_add);  //日
        time_buf[4]=ds1302_read_byte (ds1302_hr_add);    //时
        time_buf[5]=ds1302_read_byte (ds1302_min_add);   //分
        //time_buf[6]=(ds1302_read_byte(ds1302_sec_add))&0x7f;//秒,屏蔽秒的第7位,避免超出59
        //time_buf[7]= ds1302_read_byte (ds1302_day_add);                //周
  //minute=((time_buf[5]&0x70)>>4)*10 + (time_buf[5]&0x0F);        
       
}

void  ds1302(void)
{
  ds1302_read_time();  //读取时间
  readtime[0]=(time_buf[0]>>4);   //分离出年千位
  readtime[1]=(time_buf[0]&0x0F); //分离出年百位
  readtime[2]=(time_buf[1]>>4);   //分离出年十位
  readtime[3]=(time_buf[1]&0x0F); //分离出年个位

  readtime[4]=(time_buf[2]>>4);   //分离出月十位
  readtime[5]=(time_buf[2]&0x0F); //分离出月个位

  readtime[6]=(time_buf[3]>>4);   //分离出日十位
  readtime[7]=(time_buf[3]&0x0F); //分离出日个位

  readtime[8]=(time_buf[4]>>4);   //分离出小时十位
  readtime[9]=(time_buf[4]&0x0F); //分离出小时个位
  readtime[10]=(time_buf[5]>>4);   //分离出分钟十位
  readtime[11]=(time_buf[5]&0x0F); //分离出分钟个位
  readtime[12]=(time_buf[6]>>4);   //分离出秒钟十位
  readtime[13]=(time_buf[6]&0x0F); //分离出秒钟个位   

}

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-29 03:28

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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