PCF8563芯片时序程序.docx
《PCF8563芯片时序程序.docx》由会员分享,可在线阅读,更多相关《PCF8563芯片时序程序.docx(20页珍藏版)》请在冰点文库上搜索。
![PCF8563芯片时序程序.docx](https://file1.bingdoc.com/fileroot1/2023-7/10/7e039e24-9689-4b7f-8702-67125bed3f88/7e039e24-9689-4b7f-8702-67125bed3f881.gif)
PCF8563芯片时序程序
PCF8563芯片时序程序
实时时钟,日历芯片PCF8563的驱动方
实时时钟,日历芯片PCF8563的驱动方法
PCF8563是低功耗的CMOS实时时钟,日历芯片,它提供一个可编程时钟输出,一个中断输出和掉电检测器,所有的地址和数据通过I2C总线接口串行传递。
最大总线速度为400Kbits/s,每次读写数据后,内嵌的字地址寄存器会自动产生增量。
它在实际的开发中有着广泛的应用,如移动电话、便携仪器、传真机、电池电源产品等。
其特性如下:
1、低工作电流:
典型值为0.25μA(VDD=3.0V,Tamb=25?
时)。
2、世纪标志
3、大工作电压范围:
1.0,5.5
4、低休眠电流;典型值为0.25μA(VDD=3.0V,Tamb=25?
)
5、400KHz的I2C总线接口(VDD=1.8,5.5V时)。
6、可编程时钟输出频率为:
32.768KHz,1024Hz,32Hz,1Hz。
7、报警和定时器。
8、掉电检测器。
9、内部集成的振荡器电容。
10、片内电源复位功能。
11、I2C总线从地址:
读,0A3H;写,0A2H。
12、开漏中断引脚。
PCF8563的引脚配置图:
引脚功能详述如下:
名称引脚编号功能描述
OSCI1振荡器输入
OSCO2振荡器输出
/INT3中断输出(开漏;低电平有效)
VSS4地
SDA5串行数据I/O
SCL6串行时钟输入
CLKOUT7时钟输出(开漏)
VDD8正电源
PCF8563的功能框图:
功能描述:
PCF8563有16个,位寄存器:
一个可自动增量的地址寄存器,一个内置32.768KHz的振荡器(带有一个内部集成的电容),一个分频器(用于给实时时钟RTC提供源时钟),一个可编程时钟输出,一个定时器,一个报警器,一个掉电检测器和一个400KHzI2C总线接口。
所有16个寄存器设计成可寻址的8位并行寄存器,但不是所有位都有用。
前两个寄存器(内存地址00H,01H)用于控制寄存器和状态寄存器,内存地址02H,08H用于时钟计数器(秒~年计数器),地址09H,0CH用于报警寄存器(定义报警条件),地址0DH控制CLKOUT管脚的输出频率,地址0EH和0FH分别用于定时器控制寄存器和定时器寄存器。
秒、分钟、小时、日、月、年、分钟报警、小时报警、日报警寄存器,编码格式为BCD,星期和星期报警寄存器不以BCD格式编码。
当一个RTC寄存器被读时,所有计数器的内容被锁存,因此,在传送条件下,可以禁止对时钟,日历芯片的错读。
1)报警功能模式
一个或多个报警寄存器MSB(AE=AlarmEnable报警使能位)清0时,相应的报警条件有效,这样,一个报警将在每分钟至每星期范围内产生一次。
设置报警标志位AF(控制,状态寄存器2的位3)用于产生中断,AF只可以用软件清除。
2)定时器
8位的倒计数器(地址0FH)由定时器控制寄存器(地址0EH)控制,定时器控制寄存器用于设定定时器的频率(4096,64,1,或1/60Hz),以及设定定时器有效或无效。
定时器从软件设置的8位二进制数倒计数,每次倒计数结束,定时器设置标志位TF,定时器标志位TF只可以用软件清除,TF用于产生一个中断(/INT),每个倒计数周期产生一个脉冲作为中断信号。
TI/TP控制中断产生的条件。
当读定时器时,返回当前倒计数的数值。
3)CLKOUT输出
管脚CLKOUT可以输出可编程的方波。
CLKOUT频率寄存器(地址0DH)决定方波的频率,CLKOUT可以输出32.768KHz(缺省值),1024,32,1Hz的方波。
CLKOUT为开漏输出管脚,通电时有效,无效时为高阻抗。
4)复位
PCF8563包含一个片内复位电路,当振荡器停止工作时,复位电路开始工作。
在复位状态下,I2C总线初始化,寄存器TF、VL、TD1、TD0、TESTC、AE被置逻辑,,其它的寄存器和地址指针被清,。
5)掉电检测器和时钟监控
PCF8563内嵌掉电检测器,当VDD低于Vlow时,位VL(VoltageLow,秒寄存器的位7)被置,,用于指明可能产生不准确的时钟,日历信息,VL标志位只可以用软件清除(当VDD慢速降低(例如以电池供电)达到Vlow时,标志位VL被设置,这时可能会产生中断。
6)寄存器结构
寄存器概况如下:
D7D6D5D4D3D2D1D0地址寄存器名称
00HTEST0STOP0TESTC000控制,状态寄存器1
01H000TI/TPAFTFAIETIE控制,状态寄存器2
0DHFE-----FD1FD0CLKOUT频率寄存器
0EHTE-----TD1FD1定时器控制寄存器
0FH定时器倒计数数值寄存定时器倒计数数值
器
BCD格式寄存器概况如下:
D7D6D5D4D3D2D1D0地址寄存器名称
02HVL秒00~59BCD码格式数
03H分钟,00~59BCD码格式数
04H小时,,00~59BCD码格式数
05H日,,01~31BCD码格式数
06H0~6星期,,,,,
07HC月,世纪,,01~12BCD码格式数
08H年00~99BCD码格式数
09HAE分钟报警00~59BCD码格式数
0AHAE小时报警,00~23BCD码格式数
0BHAE日报警,01~31BCD码格式数
0CHAE0~6星期报警,,,,
1.控制,状态寄存器1
控制,状态寄存器1位描述(地址00H)
位符号描述
7TEST1TEST1=0普通模式
TEST1=1EXT_CLK测试模式
5STOPSTOP=0芯片时钟运行
STOP=1所有芯片分频器异步置逻辑0
芯片时钟停止运行
(CLKOUT在32768Hz时可用)3TESTCTESTC=0电源复位功能失效
(普通模式时置逻辑0)
TESTC=1电源复位功能有效
6,4,2,1,00缺省值置逻辑0
2.控制,状态寄存器2
控制,状态寄存器2位描述(地址01H)
位符号描述
7,6,50缺省值置逻辑0
4TI/TFTI/TP=0:
当TF有效时INT有效(取决于TIE的状态)
TI/TP=1:
INT脉冲有效(取决于TIE的状态)
注意:
若AF和AIE都有效时,则INT一直有效3AF当报警发生时,AF被置逻辑1;在定时器倒计数结束时,
TF被置逻辑1,它们在被软件重写前一直保持原有值,2TF
若定时器和报警中断都请求时,中断源由AF和TF决定,
若要使清除一个标志位而防止另一标志位被重写,应运
用逻辑指令AND。
1AIE标志位AIE和TIE决定一个中断的请求有效或无效,当
AF或TF中一个为“1”时中断是AIE和TIE都置“1”0TIE
时的逻辑或。
AE=0:
报警中断无效;AIE=1:
报警中断有效
TIE=0:
定时器中断无效;TIE=1:
定时器中断有效
/INT操作(位TI/TP=1)
源时钟/INT周期
(Hz)n=1n>1
40961/81921/4096
641/1281/6411/641/641/601/641/64
注1.TF与/INT同时有效
注2.n为倒计数定时器的数值,当n=0时定时器停止工作。
AF与TF值描述
R/W位:
AF位:
TF
值描述值描述
00Read读报警标志无效定时器标志无效
11报警标志有效定时器标志有效
00Write写报警标志被清除定时器标志被清除
11报警标志保持不变定时器标志保持不变
3.秒、分钟与小时寄存器
秒,VL寄存器位描述(地址02H)
位符号描述
7VLVL=0:
保证准确的时钟,日历数据
VL=1:
不保证准确的时钟,日历数据
6,0<秒>代表BCD格式的当前秒数值,值为00,59
例如:
<秒>=1011001,代码59秒
分钟寄存器位描述(地址03H)
位符号描述
7,无效
6,0<分钟>代表BCD格式的当前分钟数值,
值为00,59
小时寄存器位描述(地址04H)
位符号描述
7,6,无效
5,0<小时>代表BCD格式的当前小时数值,
值为00,23
4.日、星期、月,世纪与年寄存器
日寄存器位描述(地址05H)
位符号描述
7,6,无效
5,0<日>代表BCD格式的当前日数值,值为01,31。
当年计数器的值是闰年时,PCF8563自动给
二月增加一个值,使其成为29天
星期寄存器位描述(地址06H)
位符号描述
7,6,无效
5,0<日>代表BCD格式的当前日数值,值为01,31。
当年计数器的值是闰年时,PCF8563自动给
二月增加一个值,使其成为29天
星期分配表
日(day)位2位1位0
000星期日
001星期一
010星期二
011星期三
100星期四
101星期五
110星期六
月,世纪寄存器位描述(地址07H)
位符号描述
7C世纪位:
C=0指定世纪数为20××,C=1指定
世纪数为19××,“××”为年寄存器中的值,参
见表18。
当年寄存器中的值由99变为00时,
世纪位会改变。
6,5,无用
4,0<月>代码BCD格式的当前月份,值为01,12
月分配表:
月份位4位3位2位1位0
00001一月
00010二月
00011三月
00100四月
00101五月
00110六月
00111七月
01000八月
01001九月
10000十月
10001十一月
10010十二月
年寄存器位描述(地址08H)
位符号描述
7,0<年>代表BCD格式的当前年数值,值为00,99。
5.报警寄存器
当一个或多个报警寄存器写入合法的分钟、小时、日或星期数值并且它们相应的AE(AlarmEnable)位为逻辑,,以及这些数值与当前的分钟、小时、日或星期数值相等,标志位AF(AlarmFlag)被设置,AF保存设置值直到被软件清除为止,AF被清除后,只有在时间增量与报警条件再次相匹配时才可再被设置。
报警寄存器在它们相应位AE置为逻辑,时将被忽略。
分钟报警寄存器位描述(地址09H)
位符号描述
7AEAE=0,分钟报警有效;
AE=1,分钟报警无效
6,0<分钟报警>代表BCD格式的分钟报警数值,
值为00,59
小时报警寄存器位描述(地址0AH)
位符号描述
7AEAE=0AE=0:
小时报警有效,AE=1:
报警无效
6,0<小时报警>代表BCD格式的小时报警数值,
值为00,23
日报警寄存器位描述(地址0BH)
位符号描述
7AEAE=0:
日报警有效。
AE=1:
日报警无效。
6,0<日报警>代表BCD格式的日报警数值,
值为00,31
星期报警寄存器位描述(地址0CH)
位符号描述
7AEAE=0;星期报警有效。
AE=1;无效
6,0<星期报警>代表BCD格式的星期报警数值,
值为0,6
6.CLKOUT频率寄存器
CLKOUT频率寄存器位描述(地址0DH)
位符号描述
7FEFE=0:
CLKOUT输出被禁止并设成高阻抗。
FE=1:
CLKOUT输出有效。
6,2,无效
1FD1用于控制CLKOUT的频率输出管脚0FD0(fCLKOUT)CLKOUT频率选择表
FD1FD0fCLKOUT
0032768Hz
011024Hz
1032Hz111Hz
7.倒计数定时器寄存器
定时器寄存器是一个8位字节的倒计数定时器,它由定时器控制器中位TE决定有效或无效,定时器的时钟也可以由定时器控制器选择,其它定时器功能,如中断产生,由控制,状态寄存器2控制。
为了能精确读回倒计数的数值,I2C总线时钟SCL的频率应至少为所选定定时器时钟频率的两倍。
定时器控制器寄存器位描述(地址OEH)
位符号描述
7TETE=0:
定时器无效。
TE=1:
定时器有效。
6,2,无用
1TD1定时器时钟频率选择位,决定倒计数定时器的
时钟频率,参见表26,不用时TD1和TD0应0TD0
设为“11”(1/60Hz),以降低电源损耗。
定时器时钟频率选择
TD1TD0定时器时钟频率(Hz)
004096
0164
101111/60
定时器倒计数数值寄存器位描述(地址OFH)
位符号描述
7,0<定时器倒计数数值>倒计数数值“n”,倒计数周期=n/
时钟频率
7)EXT_CLK测试模式
测试模式用于在线测试、建立测试模式和控制RTC的操作。
测试模式由控制,状态寄存器,的位TEST1设定,这时CLKOUT管脚成为输入管脚。
在测试模式状态下,通过CLKOUT管脚输入的频率信号代替片内的64Hz频率信号,每64个上升沿将产生,秒的时间增量。
注意:
进入EXT_CLK测试模式时时钟不与片内64Hz始终时钟同步,也确定不出预分频的状态。
1.操作举例
、进入EXT_CLK测试模式:
设置控制,状态寄存器,的位7(TEST=1)。
、设置控制,状态寄存器,的位5(STOP=1)。
、清除控制,状态寄存器,的位5(STOP=0)。
、设置时间寄存器(秒、分钟、小时、日、星期、月,世纪和年)为期望值。
、提供32个时钟脉冲给CLKOUT。
、读时间寄存器观察第一次变化。
、提供64个时钟脉冲给CLKOUT。
8)电源复位(POR)失败模式
POR的持续时间直接与振荡器的起动时间有关。
一种内嵌的长时间起动的电路可使POR失效,这样可使设备测试加速。
这种模式的设定要求I2C总线管脚SDA和SCL的信号波形如下图所示,图中所有的时间值为所需的最小值。
当进入失败模式时,芯片立即停止复位,操作通过I2C总线进入EXT_CLK测试模式。
设置位TESTC逻辑0可消除失败模式,再次进入失败模式只有在设置TESTC为逻辑,后进行。
在普通模式时设置TESTC为逻辑0没有意义,除非想阻止进入POR失败模式。
PCF8563的驱动程序如下:
/*------------------------------------PCF8563I2C总线从地址:
读:
0A3H;写:
0A2H;
寄存器
(地址00H,01H)用于控制寄存器和状态寄存器
(地址02H,08H)用于时钟计数器(秒~年计数器)
(地址09H,0CH)用于报警寄存器(定义报警条件)
(地址0DH)控制CLKOUT管脚的输出频率
(地址0EH和0FH)分别用于定时器控制寄存器和定时器寄存器。
秒、分钟、小时、日、月、年、分钟报警、小时报警、日报警寄存器,编码格式为BCD,星期和星期报警寄存器不以BCD格式编码。
5:
BCD格式寄存器概况
标明“,”的位无效
地址寄存器名称Bit7Bit6Bit5Bit4Bit3Bit2Bit1Bit0
02h秒VL00,59BCD码格式数
03h分钟-00,59BCD码格式数
04h小时--00,59BCD码格式数
05h日--01,31BCD码格式数
06h星期-----0,6
07h月/世纪C--01,12BCD码格式数
08h年00,99BCD码格式数
09h分钟报警AE00,59BCD码格式数
0Ah小时报警AE-00,23BCD码格式数
0BH日报警AE-01,31BCD码格式数
0CH星期报警AE----0,6
------------------------------------*/
voidTime_putnum(unsignedchardatax){
unsignedchartemp;
temp=datax;
Store[0]=(temp>>4)&0x0f;/*十位*/
Store[1]=temp&0x0f;/*个位*/
}
/********************************************
内部函数,I2C开始
********************************************/
voidStart()
{
//EA=0;
SDA=1;
SCL=1;
delay
(2);
SDA=0;
delay
(2);
SCL=0;
}
/********************************************
内部函数,I2C结束
********************************************/
voidStop()
{
SDA=0;
SCL=0;
delay
(2);
SCL=1;
delay
(2);
SDA=1;
delay
(2);
//EA=1;
}
/**************************************************************************
内部函数,输出ACK,每个字节传输完成,输出ack=0,结束读书据,ack=1;***************************************************************************/
voidWriteACK(unsignedcharack){
SDA=ack;
delay
(2);
SCL=1;
delay
(2);
SCL=0;
}
/********************************************
内部函数,等待ACK
********************************************/
voidWaitACK()
{
unsignedcharerrtime=20;
SDA=1;
delay
(2);/*读ACK*/
SCL=1;
delay
(2);
while(SDA)
{
errtime--;
if(!
errtime)Stop();
}
SCL=0;
delay
(2);
}
/********************************************
内部函数.输出数据字节
入口:
B=数据
********************************************/
voidwritebyte(unsignedcharwdata){
unsignedchari;
for(i=0;i<8;i++)
{
if(wdata&0x80)SDA=1;
elseSDA=0;
wdata<<=1;
SCL=1;
delay
(2);
SCL=0;
}
WaitACK();//I2C器件或通讯出错,将会退出I2C通讯
}
/********************************************
内部函数.输入数据
出口:
B
********************************************/
unsignedcharReadbyte()
{
unsignedchari,bytedata;
SDA=1;
for(i=0;i<8;i++)
{
SCL=1;
bytedata<<=1;
bytedata|=SDA;
SCL=0;
delay
(2);
}
return(bytedata);
}
/********************************************
输出数据->pcf8563
********************************************/
voidwriteData(unsignedcharaddress,unsignedcharmdata)
{
Start();
writebyte(0xa2);/*写命令*/
writebyte(address);/*写地址*/
writebyte(mdata);/*写数据*/
Stop();
}
/********************************************
输入数据<-pcf8563
********************************************/
unsignedcharReadData(unsignedcharaddress)/*单字节*/{
unsignedcharrdata;
Start();
writebyte(0xa2);/*写命令*/
writebyte(address);/*写地址*/
Start();
writebyte(0xa3);/*读命令*/
rdata=Readbyte();
WriteACK
(1);
Stop();
return(rdata);
}
voidReadData1(unsignedcharaddress,unsignedcharcount,unsignedchar*buff)/*多字节*/
{
unsignedchari;
Start();
writebyte(0xa2);/*写命令*/
writebyte(address);/*写地址*/
Start();
writebyte(0xa3);/*读命令*/
for(i=0;i{
buff[i]=Readbyte();
if(i