LPC1114控制不了RTC PCF8563
大家好啊,我用LPC1114写PCF8563,不知为何一直读不出时间来,代码呈上********************************************************/
/*内部函数,PCF8563 开始*/
void Start(void)
{
SDA_ON; //SET
delay_us(2);
SCL_ON;
delay_us(2);
SDA_OFF;
delay_us(2);
SCL_OFF;
return;
}
/*内部函数,PCF8563 结束*/
void Stop(void)
{
SDA_OFF;
SCL_OFF;
delay_us(2);
SCL_ON;
delay_us(2);
SDA_ON;
delay_us(2);
return;
}
/*内部函数,输出ACK=0*/
void WriteACK(void)
{
SDA_OFF;
delay_us(2);
SCL_ON;
delay_us(2);
SCL_OFF;
return;
}
/*内部函数,输出ACK=1*/
void writenoack(void)
{
SDA_ON;
delay_us(2);
SCL_ON;
delay_us(2);
SCL_OFF;
return;
}
// GPIO0->DIR |=(1<<9); //P0.9 (P09 28) DS_DAOUTPUT PCF8563SCLK
// GPIO0->DIR |=(1<<10); //P0.10(P010 29)DS_RST OUTPUT PCF8563SDA
/*内部函数,等待ACK*/
void WaitACK(void)
{ unsigned char errtime=20;
SDA_ON;
delay_us(2); /*读ACK*/
SCL_ON;
delay_us(2);
GPIO0->DIR&=~(1<<10);
delay_us(2);
while((GPIO0->DATA&(1<<10))==(1<<10))
{
if(errtime>0){errtime--;}
else{LED_SHOW=0X55;}
//delay_us(2);
//if(!errtime) Stop();
}
SCL_OFF;
GPIO0->DIR |=(1<<10);
delay_us(2);
return;
}
// GPIO0->DIR |=(1<<9); //P0.9 (P09 28) DS_DAOUTPUT PCF8563SCLK
// GPIO0->DIR |=(1<<10); //P0.10(P010 29)DS_RST OUTPUT PCF8563SDA
/**内部函数.输出数据字节入口:B=数据*/
void writebyte(unsigned char wdata)
{
unsigned char i;
SCL_OFF;
for(i=8;i>0;i--)
{
if(wdata&0x80!=0) {SDA_ON;}
else {SDA_OFF;}
wdata<<=1;
SCL_ON;
delay_us(2);
SCL_OFF;
}
WaitACK();
return;
}
// GPIO0->DIR |=(1<<9); //P0.9 (P09 28) DS_DAOUTPUT PCF8563SCLK
// GPIO0->DIR |=(1<<10); //P0.10(P010 29)DS_RST OUTPUT PCF8563SDA
/*内部函数.输入数据出口:B*/
unsigned char Readbyte(void)
{
unsigned char i,bytedata;
//SDA_ON;
GPIO0->DIR&=~(1<<10);
delay_us(2);
for(i=0;i<8;i++)
{
SCL_ON;
bytedata<<=1;
if((GPIO0->DATA&(1<<10))==(1<<10)) {bytedata|=0X01;}
SCL_OFF;
delay_us(2);
}
GPIO0->DIR |=(1<<10);
delay_us(2);
return(bytedata);
}
/**输出数据->pcf8563*/
void writeData(unsigned char address,unsigned char mdata)
{
Start();
writebyte(0xa2); /*写命令*/
writebyte(address); /*写地址*/
writebyte(mdata); /*写数据*/
Stop();
return;
}
/*输入数据<-pcf8563*/
unsigned char ReadData(unsigned char address) /*单字节*/
{
unsigned char rdata;
Start();
writebyte(0xa2); /*写命令*/
writebyte(address); /*写地址*/
Start();
writebyte(0xa3); /*读命令*/
rdata=Readbyte();
writenoack();
Stop();
return(rdata);
}
/*
void ReadData1(unsigned char address,unsigned char count,unsigned char *buff) //多字节
{
unsigned char i;
Start();
writebyte(0xa2); //写命令
writebyte(address); //写地址
Start();
writebyte(0xa3); //读命令
for(i=0;i<count;i++)
{
time_get=Readbyte();
if(i<count-1) WriteACK();
}
writenoack();
Stop();
return;
}
*/
void ReadData1(unsigned char address) //多字节
{
unsigned char i;
Start();
writebyte(0xa2); //写命令
writebyte(0X02); //写地址
LED_SHOW=0X01;
Start();
writebyte(0xa3); //读命令
for(i=0;i<6;i++)
{
time=Readbyte();
WriteACK();
}
time=Readbyte();
writenoack();
Stop();
return;
}
/*内部函数,读入时间到内部缓冲区*/
void P8563_Read(void)
{
ReadData1(0x02);//02-08
time_buf=time>>4&0x0F; //08H 年
time_buf=time&0x0F;
//if(time_buf==0) {time_buf=20;}
time_buf=time>>4&0x01; //07H 月
time_buf=time&0x0F;
//if(time_buf==0) {time_buf=20;}
time_buf=time&0x07; //06H 星期
time_buf=time>>4&0x03; //05H 日
time_buf=time&0x0F;
//if(time_buf==0) {time_buf=20;}
time_buf=time>>4&0x03; //04H 时
time_buf=time&0x0F;
//if(time_buf==0) {time_buf=20;}
time_buf=time>>4&0x03; //03H 分
time_buf=time&0x0F;
//if(time_buf==0) {time_buf=20;}
time_buf=time>>4&0x07; //02H 秒
time_buf=time&0x0F;
//if(time_buf==0) {time_buf=20;}
/*
time_buf=time&0x7f; //秒
time_buf=time&0x7f; //分
time_buf=time&0x3f; //小时
time_buf=time&0x07; //星期
*/
return;
}
/**写时间修改值*/
void P8563_settime(void)
{
unsigned char i;
time_buf=1;time_buf=5; //08H 年 //2015 1 1-11:59:00 星期四
time_buf=0;time_buf=1; //07H 月
time_buf=4; //06H 星期四
time_buf=0;time_buf=1; //05H 日
time_buf=1;time_buf=1; //04H 时
time_buf=5;time_buf=9; //03H 分
time_buf=0;time_buf=0; //02H 秒
i=time_buf*10+time_buf;writeData(2,i); //02H 秒
i=time_buf*10+time_buf; writeData(3,i); //03H 分
i=time_buf*10+time_buf; writeData(4,i); //04H 时
i=time_buf*10+time_buf; writeData(5,i); //05H 日
i=time_buf; writeData(6,i); //06H 星期四
i=time_buf*10+time_buf; writeData(7,i); //07H 月
i=time_buf*10+time_buf; writeData(8,i); //08H 年
return;
}
//volatile unsigned char time_buf[] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
/*0十年 年2 月4星期5 日 7 小时9分钟 11 秒*/
//writeData(ADDRESS,DATA);
//Time and date registers
//02H: VL_seconds (0-59)
//03H: Minutes (0-59)
//04H: Hours (0-23)
//05H: Days (1-31)
//06H: Weekdays (0-6)
//07H: Century_months (1-12)
//08H: Years (0-99)
/**P8563的初始化-----外部调用*/
void P8563_init(void)
{
//unsigned char i;
if((ReadData(0x0a)&0x3f)!=0x8) //检查是否第一次启动,是则初始化时间
{
P8563_settime();
}
//else
//{
//}
return;
}
最好用逻辑分析器,抓一下并分析看看。或者示波器。 建议用芯片自带的I2C控制器做,何必自己模拟{:smile:} 这个要用示波器或分析仪看看波形对不对啊,光看程序这么多行很难找出错误的
页:
[1]