PCF8563时钟芯片驱动程序.docx
- 文档编号:5428167
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:12
- 大小:21.83KB
PCF8563时钟芯片驱动程序.docx
《PCF8563时钟芯片驱动程序.docx》由会员分享,可在线阅读,更多相关《PCF8563时钟芯片驱动程序.docx(12页珍藏版)》请在冰豆网上搜索。
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
#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
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- PCF8563 时钟 芯片 驱动程序