RSS

低成本,低功耗实时时钟ISL1208原理和应用

来源:网络 作者:佚名 时间:2008-09-26 Tag:低成本   低功耗   时钟   ISL1208   原理   点击:

INTERSIL公司推出的ISL1208是一种I2C接口、低成本、低功耗实时时钟,它带有定时与晶体补偿、时钟/日历、电源失效指示器、周期或轮询报警、智能后备电池切换和后备电池供电的SRAM等功能。振荡器采用外部低成本32.768KHz晶振,日历可精确到2099年,闰年自动修正。其强大的报警功能,可被设置成任意时间点报警或固定频率输出。若采用3.0V/3.6V锂电池供电,供电电流仅为400nA,最多可持续供电长达10年。另外,后备电源输入引脚Vbat还允许断电时使用大容量后备电容供电以保证正常工作几个月左右。

2. ISL1208简介

    ISL1208引脚如图1所示:

1  ISL1208引脚示意图

其中:引脚X1、X2接外部晶振输入端,可直接以32. 768kHz的晶体源驱动;Vbat接后备电源/电容,该引脚不用时接地;SDA为串行数据输入输出端;SCL为串行时钟输入端;IRQ/Fout为中断/频率输出端,可用作中断/频率输出;Vdd和GND为电源和接地端。


3. ISL1208内部结构及其工作原理

    ISL1208内部结构框图如图2。由图可知,ISL1208主要包括:I2C接口控制单元、实时时钟控制逻辑、时钟分频器、电源管理单元和寄存器单元。其中寄存器单元被分成四段:实时时钟、控制与状态、报警寄存器和用户SRAM;这四段寄存器各自含有不同的功能:实时时钟和报警寄存器用于写入/读出时间值和报警值,其写入形式为BCD码;控制与状态寄存器可完成对其他寄存器读写控制、报警与频率输出控制、模拟与数字微调控制等功能,其存储映射图如表1。

2  ISL1208内部结构框图   

寄存器存储映射图

 

ADDR

 

SECTION

REG

NAME

BIT

7

6

5

4

3

2

1

0

07h

 

Control

and

Status

SR

ASRT

XTOSCB

Reserved

WRTC

Reserved

ALM

BAT

RTCF

08h

INT

IM

ALME

LPMODE

FOBATB

FO3

FO2

FO1

FO0

09h

Reserved

0Ah

ATR

BMATR1

BMATR0

ATR5

ATR4

ATR3

ATR2

ATR1

ATR0

0Bh

DTR

Reserved

 

 

 

 

DTR2

DTR1

DTR0

控制与状态寄存器(Control and Status

控制与状态寄存器包括状态寄存器、中断与报警寄存器、模拟微调与数字微调寄存器。

状态寄存器(SR):用来控制RTC失效、电池模式、报警触发、时钟计数器写保护、晶体振荡器使能以及状态位的自动复位或者提供相应的状态信息。在时钟上电时,需将写RTC使能位WRTC置“1”,以便启动时钟计数。

中断控制寄存器(INT):主要用于控制时钟的周期性和单事件报警。其中频率输出控制位FO3-FO0使能/禁止频率输出功能,并选择IRQ/FOUT引脚的输出频率(2-5Hz-215Hz)。在频率模式被激活时它将覆盖IRQ/FOUT引脚上的报警模式。报警使能位ALME使能/禁止报警功能,中断/报警模式位IM使能单周期定时事件(IM=0)/周期定时事件(IM=1)。

模拟微调寄存器(ATR):ATR0至ATR5为六位模拟微调位,可调整片内负载电容(CX1、CX2)的值,这一电容值用于RTC的频率补偿,其每一位都有不同的电容调节比重。有效的片内串联负载电容CLOAD 的范围从4.5pF至20.25pF,中间值为12.5pF(默认)。CLOAD可通过X1/X2引脚之间两个数字控制电容器CX1和CX2调节。

数字微调寄存器(DTR):数字微调位DTR0、DTR1和DTR2用来调整每秒钟的平均计数值和平均误差以获取更好的精度。其中DTR2为符号位(DTR2=0频率补偿>0,DTR2=1频率补偿<0),DTR1和DTR0为刻度位:DTR1提供40ppm调整,DTR0提供20ppm调整。用以上三位可以表示-60ppm至+60ppm的补偿范围。

4. 应用举例

4.1 硬件结构

ISL1208具有I2C接口,使其便于与各类处理器连接且硬件结构十分简单,传输速率最高可达400Hz。硬件结构如图3。其中时钟输入口SCL、数据输入输出口SDA分别与AT89C51的P1.6、P1.7腿相连,中断输出口IRQ/Fout接外部中断INT0。AT89C51通过RS232口与计算机相连,通过计算机对实时时钟产生控制。Vbat引脚接后备电容器。

3  ISL1208AT89C52连接图

4.2 软件设计

    由于ISL1208为I2C接口,因此其接口协议也满足I2C规范,这里不再累述。需要提到一点是:在每次访问寄存器时,应先输入一个有效的辨识字节。该字节高7位(1101111)为器件辨识符。辨识字节的最后一位定义进行读/写操作,当其为“1”时选择读,为“0”时选择写。图4为ISL1208读/写时序图。

图4  /ISL1208

对于ISL1208来说,由于其内部结构设计,可以很容易的实现2nHz中断输出和每分、每天至每年一次报警,但要求具体几分钟、几小时报警一次还需在程序的编制上要比较注意。以下程序为通过计算机、单片机来控制ISL1208每5秒钟产生一次中断程序,上位机程序由MATLAB编写[4],单片机程序由C语言编写,由于篇幅有限仅列出部分单片机程序:


 

#include <reg51.h>

 #define  ISLwr   0xde  /*写辨识字节*/

 #define  ISLrd   0xdf  /*读辨识字节*/

/*--------ISL1208管脚配置---------*/

 sbit ISLSCL=P1^6;               /*时钟*/

 sbit ISLSDA=P1^7;              /*数据*/

void  sdelay();                  /*短延时*/

 void  ISLstart();                 /*I2C起始位*/

 void  ISLstop();                 /*I2C停止位*/

 void  GetACK();             /*主机等待应答(GACK)*/

 void  OutACK();             /*主机应答(OACK)*/

/*--------读/写ISL1208函数--------*/

 unsigned char  readISL1208();  

 void  writeISL1208(unsigned char datas);

/*-----------读/写寄存器-------------*/

 void  writeREG(unsigned char adds,unsigned char datas);

 unsigned char  readREG(unsigned char adds);

 bit  flag=0;                /*启动时钟报警标志位*/

 unsigned char alarm=0;               /*报警时间参数*/

 main()

{    ………………..     /*初始化*/

      for(;;)           /*等待上位机发送命令*/

    {  if(flag = =1)

         break;   }

/*写状态寄存器,写RTC使能,报警自动复位*/

  writeREG(0x07,0x90);

/*写中断寄存器,单事件报警,中断使能*/

    writeREG(0x08,0x60);

/*写报警寄存器,报警使能*/

    writeREG(0x0c,0x81);

/*写时钟寄存器,启动RTC*/

    writeREG(0x00,0x00);

for(;;);           /*等待*/        }

void writeREG(unsigned char adds,unsigned char datas)

{    ISLstart();

    writeISL1208(ISLwr);

    GetACK();

    writeISL1208(adds);                /*写地址*/

    GetACK();

    writeISL1208(datas);        /*写命令/数据*/

    GetACK();

    ISLstop();         }

 unsigned char  readREG(unsigned char adds)

{   unsigned char reg;

    ISLstart();

    writeISL1208(ISLwr);

    GetACK();

    writeISL1208(adds);            /*写地址*/

    GetACK();

    ISLstart();

    writeISL1208(ISLrd);

    GetACK();

    reg=readISL1208();         /*读就寄存器值*/

    OutACK();

    ISLstop();

    return (reg);             }

 unsigned char  readISL1208()

{   unsigned char i,k=0;

    ISLSDA=1;

    for(i=0;i<8;i++)

    {   ISLSCL=1;

        k=k*2;

        if(ISLSDA==1)

            k=k+1;

        ISLSCL=0;   }

     return (k);              }

 void  writeISL1208(unsigned char datas)

{   unsigned char data i;

    ISLSCL=0;

    for(i=0;i<8;i++)

    {   ISLSDA=(bit)(datas&0x80);

        datas=datas<<1;

        sdelay();

        ISLSCL=1;

        sdelay();

        ISLSCL=0;    }      }

 void int0() interrupt 0 using 1       /*外部中断0处理函数*/

{   unsigned char temp=0,reg;

/*单报警模式,5秒/次报警时间算法*/

    alarm=(alarm+5)%60;

    temp=alarm/10;

    temp<<=4;

    temp=(temp+alarm%10)|0x80;

/*读状态寄存器清除报警标志*/

    reg=readREG(0x07);

/*写报警寄存器,确定下次报警时间*/

    writeREG(0x0c,temp);


 

    }


 

4.3 后背电容器的使用

    具体电路结构如图3。电容器的大小通过计算得出:若后背电容供电时间为两个月且Vcc=5.0V,Vbat电压从4.7V下降到1.8V(时钟最低工作电压)。假定二极管漏电流ILKG很小并可忽略。则电容充电/放电方程为:IBAT=CBAT*dV/dT,整理后得后备供电时间:dT=CBAT*dV/ IBAT。由于IBAT随VBAT基本上呈线性变化,这样IBAT可近似取两点之间的平均值。IBAT与VBAT之间的典型线性关系方程式为:IBAT=1.031E-7* VBAT +1.036E-7  A

若已给出两点电压,则平均电流IBATAVG=5.155E-8*(VBAT2+VBAT1)+1.036E-7   A

结合以上方程整理后得后备供电时间TBACKUP=CBAT*(VBAT2 -VBAT1)/IBATAVG      s

将上述方程改写为:CBAT=TBACKUP* IBATAVG /(VBAT2 -VBAT1)

其中:TBACKUP=60天*86400秒/天=5.18E6 s,IBATAVG=4.387E -7 A,VBAT2=4.7V,VBAT1=1.8V.则CBAT=5.18E6* 4.387E-7 / 2.9 =0.784 F,如果要包括30%的容度,则最坏情况下的电容值应为CBAT=1.3*0.784=1.02 F.

5. 小结

    ISL1208是一种小巧(SOIC封装)、低功耗、低成本的实时时钟芯片,集时钟、日历、RAM、电源故障检测、报警功能由于一身,硬件结构简单、编成简便、精度高,在多功能电表、HVAC设备、音频/视频元件、寻呼机/PDA、家用电器及其它工业/医疗/汽车电子产品中都有十分广泛的应用前景。

参考文献

1. INTERSIL I2C Real Time Clock/Calendar ISL1208 Data Sheet. October 292004.

2.徐爱钧,彭秀华. 单片机高级语言C51应用程序设计. 电子工业出版社,1998年6月.

3.张道明,郝继飞. 基于MATLAB的MCU串行通信. 信息技术与信息化,2004(5).


1.部分资源来自网络,经ET电子归类整理,旨在服务电子爱好者并无商业目的,不保证正确性与完整性.
2.如果您觉得本站资源对您有用,请告知您的好友,用搜索引擎搜"ET电子"即可.


最新评论共有 0 位网友发表了评论
发表评论
评论内容:不能超过250字,需审核,请自觉遵守互联网相关政策法规。
用户名: 密码:
匿名?
注册
教程下载