搞了几天的PCF8563时钟芯片。。求助。。

2019-07-21 07:07发布

I2C有应答,但是不管写什么数据进去,读出来都是为0。有应答,应该可以说时序没有问题吧?、不知道为什么??晶振起振了。。换了几片的8563都不行。。写数据是按手册来写的。。望搞过的大侠求求助。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
18条回答
冰是睡着的水
1楼-- · 2019-07-21 10:32
网上对照了几个程序,都试过了。。原子哥的模拟I2C也试过了。。还是读出来为0,。。越简单的问题就越难。。
正点原子
2楼-- · 2019-07-21 13:36
 精彩回答 2  元偷偷看……
mvip
3楼-- · 2019-07-21 19:08
给你一直在用的代码

#include "CF8563.h"

// 读取时间 
uchar ReadDateTime(DATETIME  *dt)
{
  uchar xdata i, buf[7];
  
  IIC_BitStart();
  if(!IIC_SendByte(PCF8563_WR)) return 0;  // 写地址 0x02
  if(!IIC_SendByte(0x02)) return 0;
  
  IIC_BitStart();            // 写读控制字
  if(!IIC_SendByte(PCF8563_RD)) return 0;
  for(i=0; i<7; i++)
  {
      buf = IIC_RcvByte();
      if(i<7)
      {
        SDA = 0;
        IIC_Clock();
      }
      else
      {
        SDA = 1;
        IIC_Clock();
        IIC_BitStop();
      }
  }
  
  dt->year   = ((buf[6]>>4)*10) + (buf[6] & 0x0F);
  dt->month  = (((buf[5]>>4) & 0x01)*10) + (buf[5] & 0x0F);
  dt->day    = (((buf[3]>>4) & 0x03)*10) + (buf[3] & 0x0F);
  dt->hour   = (((buf[2]>>4) & 0x03)*10) + (buf[2] & 0x0F);
  dt->minute = (((buf[1]>>4) & 0x07)*10) + (buf[1] & 0x0F);
  dt->second = (((buf[0]>>4) & 0x07)*10) + (buf[0] & 0x0F);
  
  return 1;
}

// 启动时钟
uchar StartDateTime(void)
{
  uchar xdata i, buf[2];
  
  buf[0] = 0;
  buf[1] = 0;
  
  IIC_BitStart();
  if(!IIC_SendByte(PCF8563_WR)) return 0;
  if(!IIC_SendByte(0x00)) return 0;      //address
  for(i=0; i<2; i++)
  {
    if(!IIC_SendByte(buf)) return 0;
  }
  IIC_BitStop();  
  
  return 1;
}

// 设置时间
uchar SetDateTime(DATETIME *dt)
{
  uchar xdata i, buf[7];
  
  buf[0] = ((dt->second/10) << 4) + (dt->second%10);
  buf[1] = ((dt->minute/10) << 4) + (dt->minute%10);
  buf[2] = ((dt->hour/10) << 4) + (dt->hour%10);
  buf[3] = ((dt->day/10) << 4) + (dt->day%10);
  buf[4] = 1;
  buf[5] = ((dt->month/10) << 4) + (dt->month%10);
  buf[6] = ((dt->year/10) << 4) + (dt->year%10);

  IIC_BitStart();
  if(!IIC_SendByte(PCF8563_WR)) return 0;
  if(!IIC_SendByte(0x02)) return 0;      //address
  for(i=0; i<7; i++)
  {
    if(!IIC_SendByte(buf)) return 0;
  }
  IIC_BitStop();  
  
  return 1;
}

// 判断时间
bit IsDateTime(void)
{
  DATETIME xdata dt;
  ReadDateTime(&dt);
  
  if((dt.year > 99) || (dt.year < 0)) return 0;
  if((dt.month > 12) || (dt.month <= 0)) return 0;
  if((dt.day > 31) || (dt.day <= 0)) return 0;
  if((dt.hour > 23) || (dt.hour < 0)) return 0;
  if((dt.minute > 59) || (dt.minute < 0)) return 0;
  if((dt.second > 59) || (dt.second < 0)) return 0;
  
  return 1;
}
冰是睡着的水
4楼-- · 2019-07-21 23:11
回复【4楼】mvip:
---------------------------------
谢谢。昨天已经解决了。一个低级错误搞得我3天。。不该啊。。
冰是睡着的水
5楼-- · 2019-07-22 00:57
回复【4楼】mvip:
---------------------------------
问一下,,这个芯片不可以输出10ms级别的吧。。我想要输出这样的时间,难道真的要用定时器来搞。。
liuquanjuren
6楼-- · 2019-07-22 03:41
回复【5楼】冰是睡着的水:
---------------------------------
请问楼主是怎么解决的?我刚坐pcf8563,和你遇到的问题一样。。

一周热门 更多>