墨逸、 发表于 2019-3-8 15:08:11

求助:PCF8563无法读出数据

本帖最后由 墨逸、 于 2019-3-8 15:09 编辑

如题,读出的数据一直是 2045-25-4545:45:45
板子上的参数和原理图完全一致

#include "mcu.h"

u8        Time_data={0X00,0X44,0X13,0X08,0X05,0X03,0X19};//初始化数组

//===================================================
void iic_delay(unsigned int t)
{
   unsigned int a;

   for(a=1;a<=t;a++);       
           
}       
                  
//===================================================
void iic_clock(void)
{
   iic_scl=0;
   iic_delay(3);               
   iic_scl=1;
   iic_delay(3);
   iic_scl=0;
   iic_delay(3);
}

//===================================================
// void waitask()
// {
//    iic_sda=1;
//    iic_scl=1;
//    iic_delay(3);
//    wait:
//    if(iic_sda==1)goto wait;
//    iic_scl=0;
// }

//===================================================
// void noask()
// {
//    iic_sda=1;                //无应答产生
//    iic_clock();
// }

//===================================================
//启动器件子程序
//*******************************************/
void start_iic()
{   
    iic_sda=1;
        iic_scl=1;
        iic_sda=0;
    iic_delay(3);
        iic_scl=0;
        iic_delay(3);
}
///*******************************************
//停止器件子程序
//*******************************************/
void stop_iic()
{
    iic_scl=0;
    iic_sda=0;       
        iic_scl=1;
        iic_delay(3);
        iic_sda=1;         
}
///*******************************************
//主机发送一个字节数据
//*******************************************/
void iic_SendByte(unsigned char bytedata)
{
   unsigned char i;
      
   for(i=0;i<8;i++)
   {                     
                if(bytedata & 0x80)iic_sda=1;
                else               iic_sda=0;
                iic_clock();
                bytedata<<=1;
       }   
}
///**************************************************
//主机接收一个字节数据子程序
//***************************************************/
unsigned char iic_ReceiveByte(void)
{
   char i,bytedata=0;

   iic_sda=1;
   for(i=0;i<8;i++)
      {                  
                bytedata<<=1;
                if(iic_sda) bytedata |= 0x01;
                iic_clock();                           
                }                        
   return bytedata;
}

//================================================================
void Wrbyte(unsigned char dat)//写一个字节
{
iic_SendByte(dat);
iic_sda=1;   //写完一个字节后释放总线
iic_scl=1;   //加上脉冲, 相当于应答信号
iic_scl=0;
}
//================================================================
unsigned char Rebyte(void)           //读一个字节
{
   unsigned char a;

   a=iic_ReceiveByte();
   iic_sda=1;           //写完一个字节后释放总线
   iic_scl=0;           //加上脉冲, 相当于应答信号
   return(a);
}


//==========读取时间==========
void Read_8563(uchar * Time_tmp)
{
        uchar i;

        for(i=0;i<7;i++)
        {
                start_iic();
                Wrbyte(Wr_8563);   //写操作器件地址
                Wrbyte(i+0x02);    //写入单元地址
                start_iic();
                Wrbyte(Re_8563);   //读操作器件地址
                switch(i)
                {
               case 0: Time_tmp=(Rebyte())&0x7f;break;//获取秒数据
               case 1: Time_tmp=(Rebyte())&0x7f;break;//获取分钟
               case 2: Time_tmp=(Rebyte())&0x3f;break;//获取小时
               case 3: Time_tmp=(Rebyte())&0x3f;break;//获取日
               case 4: Time_tmp=(Rebyte())&0x07;if(Time_tmp==0)Time_tmp=7;break;//获取星期
               case 5: Time_tmp=(Rebyte())&0x1f;break;//获取月
               case 6: Time_tmp=(Rebyte())&0x7f;break;//获取年                          
               default:break;       
                }
                stop_iic();
        }
        for(i=0;i<7;i++)
                Time_tmp=Time_tmp/16*10+Time_tmp%16;//BCD码转换成16进制
}

//==================================================================
void set_8563(uchar * Time_tmp)
{
        unsigned char i;
        for(i=0;i<7;i++)
        {
                Time_tmp=Time_tmp/10*16+Time_tmp%10;
                start_iic();
                Wrbyte(Wr_8563);//选择器件
                Wrbyte(0x02+i);//选择单元地址
                Wrbyte(Time_tmp);//写入数据
                stop_iic();
        }
}


墨逸、 发表于 2019-3-8 15:12:04

C6有换用过12P,没反应;
晶振有更换过,没反应;
芯片有换过,没反应;
上拉电阻换过1K/10K,没反应;
测量PCF8563的PIN1,电压0.6V,应该是已经起振
代码是原来测试OK的,现在拿过来,结果无法应用,怀疑是硬件问题,但是硬件电路(原理图)原来也是测试OK的。
求助诸位前辈,会是什么问题呢?

ziruo2002ab 发表于 2019-3-8 15:18:31

假的吧。 那个max更高端一款rtc芯片就有国产假冒的,能用但是经常有问题的那种气死你
————————————————————————————————————————————
在中国入职工程师的第一步:知道哪些芯片有国产的,这种芯片要非常小心
比如在下刚入行的时候就被国产的线性电源芯片和dc-dc电源坑死了

go2deathward 发表于 2019-3-8 15:21:47

代码没有读
建议你连接IIC到逻辑分析仪上,首先看IIC通信是否正确(比如主机的时序对不对,起始停止位对不对,速率合不合适),同时可以看到是否从机回ACK之类的,可以间接判断出iic器件是不是工作了。
时序全队以后,如果还是读的不对,就看看是不是器件有些特殊指令之类的了
你上这么长代码,没有谁会一字一句去读的,很难直接解决你的问题

墨逸、 发表于 2019-3-8 15:26:23

ziruo2002ab 发表于 2019-3-8 15:18
假的吧。 那个max更高端一款rtc芯片就有国产假冒的,能用但是经常有问题的那种气死你
—————————— ...

换用的芯片是不同厂家的,总不至于都是坏的吧,应该可以排除此问题的吧?

ziruo2002ab 发表于 2019-3-8 15:29:39

墨逸、 发表于 2019-3-8 15:26
换用的芯片是不同厂家的,总不至于都是坏的吧,应该可以排除此问题的吧? ...

你要确认芯片来源没问题就当我没说{:titter:} 。调试期间嘛,千万不要省着么点钱。

墨逸、 发表于 2019-3-8 16:00:40

ziruo2002ab 发表于 2019-3-8 15:29
你要确认芯片来源没问题就当我没说 。调试期间嘛,千万不要省着么点钱。 ...

现在怀疑芯片问题了

刚刚又换了一块芯片,结果其读出的数据疑似是随机的

2008-10-0014:48:51
2002-11-3130:60:60
2050-00-0811:40:04
2052-11-2020:08:50
2054-08-0004:02:13
2070-00-0810:50:40
2052-00-0213:52:71
2060-08-1000:54:48
2004-02-1231:70:60
2050-10-1408:53:40
2013-12-3020:60:08
2040-14-1400:04:02
2071-10-2008:50:54

go2deathward 发表于 2019-3-8 16:27:01

墨逸、 发表于 2019-3-8 16:00
现在怀疑芯片问题了

刚刚又换了一块芯片,结果其读出的数据疑似是随机的


我觉得你还是该查下iic的时序
页: [1]
查看完整版本: 求助:PCF8563无法读出数据