求助: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();
}
}
C6有换用过12P,没反应;
晶振有更换过,没反应;
芯片有换过,没反应;
上拉电阻换过1K/10K,没反应;
测量PCF8563的PIN1,电压0.6V,应该是已经起振
代码是原来测试OK的,现在拿过来,结果无法应用,怀疑是硬件问题,但是硬件电路(原理图)原来也是测试OK的。
求助诸位前辈,会是什么问题呢? 假的吧。 那个max更高端一款rtc芯片就有国产假冒的,能用但是经常有问题的那种气死你
————————————————————————————————————————————
在中国入职工程师的第一步:知道哪些芯片有国产的,这种芯片要非常小心
比如在下刚入行的时候就被国产的线性电源芯片和dc-dc电源坑死了 代码没有读
建议你连接IIC到逻辑分析仪上,首先看IIC通信是否正确(比如主机的时序对不对,起始停止位对不对,速率合不合适),同时可以看到是否从机回ACK之类的,可以间接判断出iic器件是不是工作了。
时序全队以后,如果还是读的不对,就看看是不是器件有些特殊指令之类的了
你上这么长代码,没有谁会一字一句去读的,很难直接解决你的问题 ziruo2002ab 发表于 2019-3-8 15:18
假的吧。 那个max更高端一款rtc芯片就有国产假冒的,能用但是经常有问题的那种气死你
—————————— ...
换用的芯片是不同厂家的,总不至于都是坏的吧,应该可以排除此问题的吧? 墨逸、 发表于 2019-3-8 15:26
换用的芯片是不同厂家的,总不至于都是坏的吧,应该可以排除此问题的吧? ...
你要确认芯片来源没问题就当我没说{:titter:} 。调试期间嘛,千万不要省着么点钱。 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
墨逸、 发表于 2019-3-8 16:00
现在怀疑芯片问题了
刚刚又换了一块芯片,结果其读出的数据疑似是随机的
我觉得你还是该查下iic的时序
页:
[1]