PCF8563时钟芯片驱动程序.docx

上传人:b****3 文档编号:6979276 上传时间:2023-05-10 格式:DOCX 页数:12 大小:21.83KB
下载 相关 举报
PCF8563时钟芯片驱动程序.docx_第1页
第1页 / 共12页
PCF8563时钟芯片驱动程序.docx_第2页
第2页 / 共12页
PCF8563时钟芯片驱动程序.docx_第3页
第3页 / 共12页
PCF8563时钟芯片驱动程序.docx_第4页
第4页 / 共12页
PCF8563时钟芯片驱动程序.docx_第5页
第5页 / 共12页
PCF8563时钟芯片驱动程序.docx_第6页
第6页 / 共12页
PCF8563时钟芯片驱动程序.docx_第7页
第7页 / 共12页
PCF8563时钟芯片驱动程序.docx_第8页
第8页 / 共12页
PCF8563时钟芯片驱动程序.docx_第9页
第9页 / 共12页
PCF8563时钟芯片驱动程序.docx_第10页
第10页 / 共12页
PCF8563时钟芯片驱动程序.docx_第11页
第11页 / 共12页
PCF8563时钟芯片驱动程序.docx_第12页
第12页 / 共12页
亲,该文档总共12页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

PCF8563时钟芯片驱动程序.docx

《PCF8563时钟芯片驱动程序.docx》由会员分享,可在线阅读,更多相关《PCF8563时钟芯片驱动程序.docx(12页珍藏版)》请在冰点文库上搜索。

PCF8563时钟芯片驱动程序.docx

PCF8563时钟芯片驱动程序

PCF8563时钟芯片驱动详解

1概述

 

PCF8563是PHILIPS公司推出的一款工业级内含I2C总线接口功能的具有极低功耗的多功能时钟/日历芯片。

PCF8563的多种报警功能、定时器功能、时钟输出功能以及中断输出功能能完成各种复杂的定时服务,甚至可为单片机提供看门狗功能。

内部时钟电路、内部振荡电路、内部低电压检测电路(1.0V)以及两线制I2C总线通讯方式,不但使外围电路及其简洁,而且也增加了芯片的可靠性。

同时每次读写数据后,内嵌的字地址寄存器会自动产生增量。

当然作为时钟芯片,PCF8563亦解决了2000年问题。

因而,PCF8563是一款性价比极高的时钟芯片,它已被广泛用于电表、水表、气表、电话、传真机、便携式仪器以及电池供电的仪器仪表等产品领域。

2原理图

38563源代码

//******************************************************

//define

//*****************************************************

#definePCF8563_ADDR0xa2//PCF8563设备地址

#definePCF8563_ENABLE0x00//设置

#definePCF8563_SUBADDR0x02//时间地址

#definePCF8563_NUMB0x07//时间个数

#definePCF8563_LOOPTIME0x02//循环次数

#definePCF8563_SECMASK0x7f//second

#definePCF8563_MINMASK0x7f//minute

#definePCF8563_HRMASK0x3f//hour

#definePCF8563_DAYMASK0x3f//day

#definePCF8563_WKMASK0x07//week

#definePCF8563_MOMASK0x1f//month

#definePCF8563_YRMASK0xff//year

/*

voidDELAY_US(Uint16i)

{Uint16m,n;

for(m=0;m

{

for(n=0;n<5;n++)

{

_nop_();

}

}

}

*/

/********************************************************

**函数名称:

voidDELAY_MS(Uint16i)

**功能描述:

延时函数

**输入:

延时毫秒数

**输出:

********************************************************/

//延时函数单位ms

voidDELAY_MS(Uint16i)

{Uint16m,n;

for(m=0;m

{

for(n=0;n<1000;n++)

{

_nop_();

}

}

}

/********************************************************

**函数名称:

InitCrt()

**功能描述:

SD2405的初始化

**输入:

**输出:

********************************************************/

voidInitCrt()

{

//设备地址

I2cDeviceAdd=PCF8563_ADDR;

}

/********************************************************

**函数名称:

CrtGetDateTime(structSYSTEM_TIME*Time)

**功能描述:

读取时间

**说明:

将从PCF8563中读取的时间放入Time指向的结构中

**输入:

**输出:

********************************************************/

voidCrtGetDateTime(structSYSTEM_TIME*Time)

{

Uint8buf[8];

//设备地址

I2cDeviceAdd=PCF8563_ADDR;

SM_Receive(PCF8563_SUBADDR,buf,PCF8563_NUMB);

Time->time.ucSecond=buf[0];//秒

Time->time.ucMinute=buf[1];//分

Time->time.ucHour=buf[2];//时屏蔽最高位

Time->date.ucDay=buf[3];//日

Time->Week=buf[4];//星期

Time->date.ucMonth=buf[5];//月

Time->date.ucYear=buf[6];//年

}

/********************************************************

**函数名称:

CrtSetDateTime(structSYSTEM_TIME*Time)

**功能描述:

设置时间

**说明:

将Time指向的结构中日期时间参数设置到sd24.5中

**输入:

**输出:

********************************************************/

voidCrtSetDateTime(structSYSTEM_TIME*Time)

{

Uint8buf[8];

//设备地址

I2cDeviceAdd=PCF8563_ADDR;

//写入设置(时钟工作、关闭复位、关闭测试模式)

buf[0]=PCF8563_ENABLE;

SM_Send(0,buf,0);

//写入日期时间

buf[0]=Time->time.ucSecond;//秒

buf[1]=Time->time.ucMinute;//分

buf[2]=Time->time.ucHour|0x80;//时置为24小时格式

buf[3]=Time->date.ucDay;//日

buf[4]=Time->Week;//星期

buf[5]=Time->date.ucMonth;//月

buf[6]=Time->date.ucYear;//年

SM_Send(PCF8563_SUBADDR,buf,PCF8563_NUMB);

}

4新华龙C8051F022的IIC驱动程序

//-----------------------------------------------------------------------------

//Includes

//-----------------------------------------------------------------------------

#include//SFRdeclarations

#include

#include

#include

#include

#defineSMB_FREQUENCY10000L//TargetSCLclockrate

/******************************************************************************

**函数名称:

voidSPI0_Init()

**功能描述:

I2C初始化程序

**说明:

1.置下降沿有效

2.置工作时钟2MHz

3.

**输入:

**输出:

*******************************************************************************/

voidI2C_Init()

{

SMB0CN=0x44;//EnableSMBuswithACKsonacknowledgecycle

SMB0CR=-80;//257-(SYSCLK/(2*SMB_FREQUENCY));

EIE1|=2;//SMBusinterruptenable

//EA=1;//Globalinterruptenable

I2cSM_BUSY=0;//FreeSMBusforfirsttransfer.

}

/******************************************************************************

**函数名称:

voidSM_Send(Uint8byte_address,Uint8*SendBuf,Uint8count)

**功能描述:

I2C写入程序

**说明:

1.等待空闲

2.写入数据

3.等待结束

**输入:

地址byte_address、写入数据缓冲区*SendBuf、数量count

**输出:

*******************************************************************************/

voidSM_Send(Uint8byte_address,Uint8*SendBuf,Uint8count)

{

ET0=0;//禁止中断

ET2=0;//禁止中断

while(I2cSM_BUSY);//等待空闲

I2cSM_BUSY=1;//置忙

SMB0CN=0x44;//SMBusenabled,ACKonacknowledgecycle

I2cSendCount=count;//置写入数量

I2cRecCount=0;//读出数量清零

I2cSendDPTR=SendBuf;//SMBusenabled,ACKonacknowledgecycle

I2CWRITE;//Chipselect+WRITE

I2cMemAdd=byte_address;

STO=0;

STA=1;//启动传输

FeedWatchdog();

while(I2cSM_BUSY);//等待空闲

ET0=1;//允许中断

ET2=1;//允许中断

}

/******************************************************************************

**函数名称:

voidSM_Receive(Uint8byte_address,Uint8*ReadBuf,Uint8count)

**功能描述:

I2C读取程序

**说明:

1.等待空闲

2.置地址

3.读取数据

3.等待结束

**输入:

地址byte_address、读取数据缓冲区*SendBuf、数量count

**输出:

*******************************************************************************/

voidSM_Receive(Uint8byte_address,Uint8*ReadBuf,Uint8count)

{

ET0=0;//禁止中断

ET2=0;//禁止中断

while(I2cSM_BUSY);//等待空闲

I2cSM_BUSY=1;//置忙

SMB0CN=0x44;//SMBusenabled,ACKonacknowledgecycle

I2cSendCount=0;//置写入数量

I2CWRITE;//Chipselect+WRITE

I2cMemAdd=byte_address;//值地址偏移

I2cRecCount=count;//要接收的数据个数

I2cRecDPTR=ReadBuf;//指向要接收的数据区

STO=0;

STA=1;//Starttransfer

FeedWatchdog();

while(I2cSM_BUSY);//等待空闲

ET0=1;//允许中断

ET2=1;//允许中断

}

/******************************************************************************

**函数名称:

voidSMBUS_ISR(void)interrupt7

**功能描述:

I2C中断服务程序

**说明:

1.选择器件地址

2.置读写地址

3.读取或写入数据

3.置结束标志

**输入:

**输出:

*******************************************************************************/

voidSMBUS_ISR(void)interrupt7

{

switch(SMB0STA)//StatuscodefortheSMBus(SMB0STAregister)

{

//主发送器/接收器:

起始条件已发送

//在该状态发送的COMMAND字的R/W位总是为0(W),

//因为对于读和写操作来说都必须先写存储器地址。

caseSMB_START:

SMB0DAT=I2cCOMMAND;//写入含读写指令的设备地址

STA=0;//清除启动标志

break;

//主发送器/接收器:

重复起始条件已发送。

//该状态只应在读操作期间出现,在存储器地址已发送并得到确认之后

caseSMB_RP_START:

I2CREAD;//置设备读

SMB0DAT=I2cCOMMAND;//写入含读写指令的设备地址

STA=0;

break;

//主发送器设备地址+(W/R)已发出。

收到ACK。

caseSMB_MTADDACK:

SMB0DAT=I2cMemAdd;//发送要写入的字节地址

break;

//主发送器从地址+W已发出。

收到NACK。

caseSMB_MTADDNACK:

/*if(I2cSendCount)//传输结束

{

SMB0DAT=*I2cSendDPTR;//传送数据

I2cSendDPTR++;

I2cSendCount--;

}

else

{

if(I2cRecCount)

{

STO=0;

STA=1;

}

else

{

STO=1;

I2cSM_BUSY=0;//发送停止,释放总线

}

}*/

STO=1;

STA=1;

break;

//数据字节已经发出,收到ACK

caseSMB_MTDBACK:

if(I2cSendCount)//传输结束

{

SMB0DAT=*I2cSendDPTR;//传送数据

I2cSendDPTR++;

I2cSendCount--;

}

else

{

if(I2cRecCount)

{

STO=0;

STA=1;

}

else

{

STO=1;

I2cSM_BUSY=0;//发送停止,释放总线

}

}

break;

//数据字节已经发出,收到NACK

caseSMB_MTDBNACK:

STO=1;

STA=1;

break;

//主发送器竞争失败

caseSMB_MTARBLOST:

STO=1;

STA=1;

break;

//从地址+R已经发出,收到ACK

caseSMB_MRADDACK:

SysBuff[500]=8;

//if(counter==1)//只接收一个字节时要设置接收后就NACK

//{

//AA=0;//NACKsentonacknowledgecycle.

//}

break;

//从地址+R已经发出,收到NACK

caseSMB_MRADDNACK:

STO=0;

STA=1;

break;

//数据字节收到,ACK已经发出

caseSMB_MRDBACK:

if(I2cRecCount==1)

{

AA=0;//收到最后一个字节前准备设置最后一个字节不应答

}

I2cRecCount--;

*I2cRecDPTR=SMB0DAT;

I2cRecDPTR++;

break;

//数据字节收到,NACK已经发出

caseSMB_MRDBNACK:

*I2cRecDPTR=SMB0DAT;

STO=1;

I2cSM_BUSY=0;//FreeSMBus

break;

//未知状态或总线错误

default:

STO=1;//Resetcommunication.

I2cSM_BUSY=0;

break;

}

SI=0;//clearinterruptflag

}

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2