一线式时钟芯片DS2417的原理与应用
扫描二维码
随时随地手机看文章
DS2417是DALLAS公司生产的带中断的、可兼容一线式MicroLAN接口的实时时钟芯片,其串行通信速率达16.3kbps,且中断时间间隔可编程;它采用32位二进制秒计数器记录时间,在25℃时,其时间准确率为±2分钟/月,可用2.5V~5.5V的电源供电。该芯片功耗很低,它仅吸收200nA的电流。可与多个DS2417或具有MicroLAN接口的一线式芯片并联使用,CPU只需一根端口线就能与诸多一线式芯片通信,因此,占用微处理器的端口较少,可节省大量的引线和逻辑电路。
1 DS2417的引脚排列和内部结构
DS2417采用6引脚TSOC封装,其引脚描述如表1所列。
表1 DS2417的引脚功能
DS2417的内部结构如图1所示。光刻ROM中的64位序列号是出厂前被刻好的,它可以看作是该DS2417的地址序列码;6位光刻ROM的排列是:开始8位(27H)为产品类型标号,接着的48位是该DS2417自身的序列号,最后8位是前面56位的循环冗余校验码(CRC=X8+X5+X4+);光刻ROM的作用是使每一个一线式器件的址都各不相同,这样就可以实现一根总线上挂接多个一线式芯片的操作。
对于一线端口,在ROM功能建立之间,时钟的读写和控制功能是无法实现的。总线控制器必须首先提供下列4个ROM功能控制命令(8位)中的一个:
(1)读ROM,命令字[33H];
(2)匹配ROM,命令字[55H];
(3)搜索ROM,命令字[F0H];
(4)跳过ROM,命令字[CCH]。
如果多个器件连接在一线上,这些命令将对每个器件的64位ROM部分进行操作,并选出一个特定器件以进行下一步读时钟[66H]和写时钟[99H]操作的时钟功能控制。而所有命令或数据的读/写均从最低位开始。
DS2417的5、6脚外接32.768MHz晶振,片内振荡器和分频器可产生1Hz的时间基准脉冲,可接入32位二进制实时时钟计数器以完成对时间的计量。时间计数值采用双缓冲结构,时钟功能控制命令仅对读/写缓冲器进行操作,这样可以防止实时时钟计数器更新时发生读写错误。
由于DS2417芯片采用32位二进制秒计数器来记录时间(溢出的记时时间长达136年),因此必须根据实际需要规定一个基准(例如将32位全0规定为2000年1月1日午夜0时0分0秒),在此基础上通过编程算依次读出32位数值以获得相应的秒、分、时以及日、月、年等信息。如果老大哥忍气吞声时间信息较多,从编程的复杂程序看,不宜选用DS2417,而应选择其他带日历的时钟芯片。
系统继电后,DS2417芯片将停止工作,如果在VDD端接入备用电流,则DS2417可看和是非易失性、独立连续工作的器件。
2 振荡器及中断控制
DS2417内部振荡器的开启/关闭、中断是否允许以及中断申请脉冲时间间隔的长短可用软件控制,其控制命令字的格式如下:
其中D1、D0为无效位,读出时始终为0;D3、D2用于控制或报告振荡器的状态,如果振荡器处于工作状态,读出该字节时两个OSC的值全为1,否则全为0,同样对OSC写入全1时振荡器开启,在OSC写入全0时可关闭振荡器;D7位IE是中断使能控制位,当IE=1时中断允许,IE=0时中断关闭;D6、D5、D4是中断申请脉冲(负脉冲,持续122μs)时间间隔控制位,时间间隔与IS2、IS1、IS0的关系如表2所列。
表2 DS2417的中断脉冲时间间隔控制
3 DS2417与单片机的典型接口设计
图2以MCS-51系列单片机为例,画出了DS2417与微处理器的典型连接电路。其中1-Wire端接AT89C51的P1.0,INT端接AT89C51的INT0,VDD采用5V电源供电。
假设单片机系统所用的晶振频率为12MHz,笔者根据DS2417的初始化时序、定悍序和读时序分别编写了三个子程序:INIT为初始化子程序、WRITE为写(命令或数据)子程序、READ为读数据子程序,所有的数据读写均由最低位开始。具体程序如下:
DAT EQU P1.0
........
INIT:CLR EA
INI10:SETB DAT
MOV R2,#200
INT11:CLR DAT
DJNZ R2, INI11
;主机发复位脉冲持续3μs×200=600μs
SETB DAT ;主机释放总线,口线改为输入
MOV R2,#30
INI12:DJNZ R2,INI12
;DS2417;等待2μs×30=60μs
CLR C
ORL C,DAT
;DS2417;数据线变低(有存在脉冲)吗?
JC INI10 ;DS2417未准备好,重新初始化
MOV R6,#80
INT13:ORL C,DAT
JC INI14;DS2417;数据线变高,初始化成功
DJNZ R6, INI13
;数据线低电平可持续3μs×80=240μs
SJMP INI10 ;初始化失败,重来
INI14:MOV R2,#240
INI15:DJNZ R2,INI15
;DS2417;应答最少2μs×240=480μs
RET
;---------------
WRITE:CLR EA ;写入的命令/数据字节在A中
MOV R3,#8 ;循环8次,写一个字节
WR11:SETB DAT
MOV R4,#8
RRC A ;写入位从A中移到CY
CLR DAT
WR12:DJNZ R4,WR12 ;等待16μs
MOV DAT,C;命令字按位依次送给DS2417
MOV R4, #20
WR13:DJNZ R4, WR13 ;保证写过程持续60μs
DJNZ R3, WR11 ;未送完一个字节继续
SETB DAT
RET
;----------------
READ:CLR EA
MOV R6,#8 ;循环8次,读一个字节
RD11:CLR DAT
MOV R4,#4
NOP ;低电平持续2μs
SETB DAT ;口线设为输入
RD12:DJNZ R4,RD12 ;等待8μs
MOV C,DAT ;主机按位依次读入DS2417的数据
RRC A ;读取的数据移入A
MOV R5,#30
RD13:DJNZ R5,RD13 ;保证读过程持续60μs
DJNZ R6,RD11 ;读完一个字节的数据,存入A中
SETB DAT
RET
;----------------
由主机控制DS2417以完成时间初始值的写入或时间值的读出必须经过三个步骤,分别是:初始化使DS2417准备好、发ROM功能命令和相应的64位光刻ROM数据、发时钟功能命令读写控制字节和四个字节的时间值。假设一线仅挂接一个芯片,则对于ROM功能命令只需发跳过ROM[CCH]即可:而对于时钟功能命令,不论是读还是写,第一个字节均为控制字,随后的四个字节为时间数据。如将读出的控制字放入30H,时间计数值从低位到高位依次放入31H~34H,那么,其子程序GETSJ如下:
GETSJ:LCALL INIT
MOV A,#0CCH
LCALL WRITE ;发跳过ROM命令
LCALL INIT
MOV A,#66H ;发读时钟命令
LCALL WRITE
MOV R0,#30H
MOV R7,#5
RDNEXT:LCALL READ
MOV @R0,A
INC R0
DJNZ R7,RDNEXT
RET
.......
如果子程序GETSJ读取的时间值放于34H~31H中,根据选择的时间基准,经过编程变换即可得到日历时间信息。如果一线上挂接多个DS2417或其它一线式接口芯片,则子程序GETSJ的编写将会复杂一些,限于篇幅,本文不再,读者可参阅相关文献。