DS2417是DALLAS公司生產(chǎn)的帶中斷的、可兼容一線式MicroLAN接口的實時時鐘芯片,其串行通信速率達16.3kbps,且中斷時間間隔可編程;它采用32位二進制秒計數(shù)器記錄時間,在25℃時,其時間準確率為±2分鐘/月,可用2.5V~5.5V的電源供電。該芯片功耗很低,它僅吸收200nA的電流。可與多個DS2417或具有MicroLAN接口的一線式芯片并聯(lián)使用,CPU只需一根端口線就能與諸多一線式芯片通信,因此,占用微處理器的端口較少,可節(jié)省大量的引線和邏輯電路。
1 DS2417的引腳排列和內(nèi)部結(jié)構(gòu)
DS2417采用6引腳TSOC封裝,其引腳描述如表1所列。
表1 DS2417的引腳功能
DS2417的內(nèi)部結(jié)構(gòu)如圖1所示。光刻ROM中的64位序列號是出廠前被刻好的,它可以看作是該DS2417的地址序列碼;6位光刻ROM的排列是:開始8位(27H)為產(chǎn)品類型標號,接著的48位是該DS2417自身的序列號,最后8位是前面56位的循環(huán)冗余校驗碼(CRC=X8+X5+X4+);光刻ROM的作用是使每一個一線式器件的址都各不相同,這樣就可以實現(xiàn)一根總線上掛接多個一線式芯片的操作。
對于一線端口,在ROM功能建立之間,時鐘的讀寫和控制功能是無法實現(xiàn)的??偩€控制器必須首先提供下列4個ROM功能控制命令(8位)中的一個:
(1)讀ROM,命令字[33H];
(2)匹配ROM,命令字[55H];
(3)搜索ROM,命令字[F0H];
(4)跳過ROM,命令字[CCH]。
如果多個器件連接在一線上,這些命令將對每個器件的64位ROM部分進行操作,并選出一個特定器件以進行下一步讀時鐘[66H]和寫時鐘[99H]操作的時鐘功能控制。而所有命令或數(shù)據(jù)的讀/寫均從最低位開始。
DS2417的5、6腳外接32.768MHz晶振,片內(nèi)振蕩器和分頻器可產(chǎn)生1Hz的時間基準脈沖,可接入32位二進制實時時鐘計數(shù)器以完成對時間的計量。時間計數(shù)值采用雙緩沖結(jié)構(gòu),時鐘功能控制命令僅對讀/寫緩沖器進行操作,這樣可以防止實時時鐘計數(shù)器更新時發(fā)生讀寫錯誤。
由于DS2417芯片采用32位二進制秒計數(shù)器來記錄時間(溢出的記時時間長達136年),因此必須根據(jù)實際需要規(guī)定一個基準(例如將32位全0規(guī)定為2000年1月1日午夜0時0分0秒),在此基礎上通過編程算依次讀出32位數(shù)值以獲得相應的秒、分、時以及日、月、年等信息。如果老大哥忍氣吞聲時間信息較多,從編程的復雜程序看,不宜選用DS2417,而應選擇其他帶日歷的時鐘芯片。
系統(tǒng)繼電后,DS2417芯片將停止工作,如果在VDD端接入備用電流,則DS2417可看和是非易失性、獨立連續(xù)工作的器件。
2 振蕩器及中斷控制
DS2417內(nèi)部振蕩器的開啟/關閉、中斷是否允許以及中斷申請脈沖時間間隔的長短可用軟件控制,其控制命令字的格式如下:
其中D1、D0為無效位,讀出時始終為0;D3、D2用于控制或報告振蕩器的狀態(tài),如果振蕩器處于工作狀態(tài),讀出該字節(jié)時兩個OSC的值全為1,否則全為0,同樣對OSC寫入全1時振蕩器開啟,在OSC寫入全0時可關閉振蕩器;D7位IE是中斷使能控制位,當IE=1時中斷允許,IE=0時中斷關閉;D6、D5、D4是中斷申請脈沖(負脈沖,持續(xù)122μs)時間間隔控制位,時間間隔與IS2、IS1、IS0的關系如表2所列。
表2 DS2417的中斷脈沖時間間隔控制
3 DS2417與單片機的典型接口設計
圖2以MCS-51系列單片機為例,畫出了DS2417與微處理器的典型連接電路。其中1-Wire端接AT89C51的P1.0,INT端接AT89C51的INT0,VDD采用5V電源供電。
假設單片機系統(tǒng)所用的晶振頻率為12MHz,筆者根據(jù)DS2417的初始化時序、定悍序和讀時序分別編寫了三個子程序:INIT為初始化子程序、WRITE為寫(命令或數(shù)據(jù))子程序、READ為讀數(shù)據(jù)子程序,所有的數(shù)據(jù)讀寫均由最低位開始。具體程序如下:
DAT EQU P1.0
........
INIT:CLR EA
INI10:SETB DAT
MOV R2,#200
INT11:CLR DAT
DJNZ R2, INI11
;主機發(fā)復位脈沖持續(xù)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;數(shù)據(jù)線變低(有存在脈沖)嗎?
JC INI10 ;DS2417未準備好,重新初始化
MOV R6,#80
INT13:ORL C,DAT
JC INI14;DS2417;數(shù)據(jù)線變高,初始化成功
DJNZ R6, INI13
;數(shù)據(jù)線低電平可持續(xù)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 ;寫入的命令/數(shù)據(jù)字節(jié)在A中
MOV R3,#8 ;循環(huán)8次,寫一個字節(jié)
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 ;保證寫過程持續(xù)60μs
DJNZ R3, WR11 ;未送完一個字節(jié)繼續(xù)
SETB DAT
RET
;----------------
READ:CLR EA
MOV R6,#8 ;循環(huán)8次,讀一個字節(jié)
RD11:CLR DAT
MOV R4,#4
NOP ;低電平持續(xù)2μs
SETB DAT ;口線設為輸入
RD12:DJNZ R4,RD12 ;等待8μs
MOV C,DAT ;主機按位依次讀入DS2417的數(shù)據(jù)
RRC A ;讀取的數(shù)據(jù)移入A
MOV R5,#30
RD13:DJNZ R5,RD13 ;保證讀過程持續(xù)60μs
DJNZ R6,RD11 ;讀完一個字節(jié)的數(shù)據(jù),存入A中
SETB DAT
RET
;----------------
由主機控制DS2417以完成時間初始值的寫入或時間值的讀出必須經(jīng)過三個步驟,分別是:初始化使DS2417準備好、發(fā)ROM功能命令和相應的64位光刻ROM數(shù)據(jù)、發(fā)時鐘功能命令讀寫控制字節(jié)和四個字節(jié)的時間值。假設一線僅掛接一個芯片,則對于ROM功能命令只需發(fā)跳過ROM[CCH]即可:而對于時鐘功能命令,不論是讀還是寫,第一個字節(jié)均為控制字,隨后的四個字節(jié)為時間數(shù)據(jù)。如將讀出的控制字放入30H,時間計數(shù)值從低位到高位依次放入31H~34H,那么,其子程序GETSJ如下:
GETSJ:LCALL INIT
MOV A,#0CCH
LCALL WRITE ;發(fā)跳過ROM命令
LCALL INIT
MOV A,#66H ;發(fā)讀時鐘命令
LCALL WRITE
MOV R0,#30H
MOV R7,#5
RDNEXT:LCALL READ
MOV @R0,A
INC R0
DJNZ R7,RDNEXT
RET
.......
如果子程序GETSJ讀取的時間值放于34H~31H中,根據(jù)選擇的時間基準,經(jīng)過編程變換即可得到日歷時間信息。如果一線上掛接多個DS2417或其它一線式接口芯片,則子程序GETSJ的編寫將會復雜一些,限于篇幅,本文不再,讀者可參閱相關文獻。