實時時鐘芯片DS1302
本節(jié)課的DS1302是個實時時鐘芯片,我們可以用單片機(jī)寫入時間或者讀取當(dāng)前的時間數(shù)據(jù),我也會帶著大家通過閱讀這個芯片的數(shù)據(jù)手冊來學(xué)習(xí)和掌握這個器件。
由于IT技術(shù)國際化比較強,因此數(shù)據(jù)手冊絕大多數(shù)都是英文的,導(dǎo)致很多英語基礎(chǔ)不好的同學(xué)看到英文手冊頭就大了。這里我要告訴大家的是,只要精神不退縮,方法總比困難多,很多英語水平不高的,看數(shù)據(jù)手冊照樣完全沒問題,因為我們的專業(yè)詞匯也就那么幾個,多看幾次就認(rèn)識了。我們現(xiàn)在不是考試,因此大家可以充分利用一些英文翻譯軟件,翻譯過來的中文意思有時候可能不是那么準(zhǔn)確,那你就把翻譯的內(nèi)容和英文手冊里的一些圖表比較參考學(xué)習(xí)。此外數(shù)據(jù)手冊除了介紹性的說明外,一般還會配相關(guān)的圖形或者表格,結(jié)合起來看也有利于理解手冊所表達(dá)的意思。這節(jié)課我會把DS1302的英文資料盡可能的用比較便于理解的方式給大家表達(dá)出來,同學(xué)們可以把我的表達(dá)和英文手冊多做一下對比,盡可能快的慢慢開始學(xué)會了解英文手冊。
1、DS1302的特點
DS1302是DALLAS(達(dá)拉斯)公司出的一款涓流充電時鐘芯片,2001年DALLAS被MAXIM(美信)收購,因此我們看到的DS1302的數(shù)據(jù)手冊既有DALLAS的標(biāo)志,又有MAXIM的標(biāo)志,大家了解即可。
DS1302實時時鐘芯片廣泛應(yīng)用于電話、傳真、便攜式儀器等產(chǎn)品領(lǐng)域,他的主要性能指標(biāo)如下:
1、DS1302是一個實時時鐘芯片,可以提供秒、分、小時、日期、月、年等信息,并且還有軟件自動調(diào)整的能力,可以通過配置AM/PM來決定采用24小時格式還是12小時格式。
2、擁有31字節(jié)數(shù)據(jù)存儲RAM。
3、串行I/O通信方式,相對并行來說比較節(jié)省IO口的使用。
4、DS1302的工作電壓比較寬,大概是2.0V~5.5V都可以正常工作。
5、DS1302這種時鐘芯片功耗一般都很低,它在工作電壓2.0V的時候,工作電流小于300nA。
6、DS1302共有8個引腳,有兩種封裝形式,一種是DIP-8封裝,芯片寬度(不含引腳)是300mil,一種是SOP-8封裝,有兩種寬度,一種是150mil,一種是208mil。我們看一下DS1302的引腳封裝圖,如圖1所示。
圖1 DS1302封裝圖所謂的DIP封裝Dual In-line Package,也叫做雙列直插式封裝技術(shù),就如同我們開發(fā)板上的STC89C52RC單片機(jī),就是個典型的DIP封裝,當(dāng)然這個STC89C52RC還有其他的封裝,為了方便學(xué)習(xí)使用,我們采用的是DIP封裝。而74HC245、74HC138、24C02、DS1302我們用的都是SOP封裝Small Out-Line Package,是一種芯片兩側(cè)引出L形引腳的封裝技術(shù),大家可以看看開發(fā)板上的芯片,了解一下這些常識性知識。
7、當(dāng)供電電壓是5V的時候,兼容標(biāo)準(zhǔn)的TTL電平標(biāo)準(zhǔn),這里的意思是,可以完美的和單片機(jī)進(jìn)行通信。
8、由于DS1302是DS1202的升級版本,所以所有的功能都兼容DS1202。此外DS1302有兩個電源輸入,一個是主電源,另外一個是備用電源,比如可以用電池或者大電容,這樣是為了保證系統(tǒng)掉電的情況下,我們的時鐘還會繼續(xù)走。如果使用的是充電電池,還可以在正常工作時,設(shè)置充電功能,給我們的備用電池進(jìn)行充電。
DS1302的特點第二條“擁有31字節(jié)數(shù)據(jù)存儲RAM”,這是DS1302額外存在的資源。這31字節(jié)的RAM相當(dāng)于一個存儲器一樣,我們編寫單片機(jī)程序的時候,可以把我們想存儲的數(shù)據(jù)存儲在DS1302里邊,需要的時候讀出來,這塊功能和EEPROM有點類似,相當(dāng)于一個掉電丟失數(shù)據(jù)的“EEPROM”,如果我們的時鐘電路加上備用電池,那么這31個字節(jié)的RAM就可以替代EEPROM的功能了。這31字節(jié)的RAM功能使用很少,所以在這里我不講了,大家了解即可。
2、DS1302的硬件信息
我們平時所用的不管是單片機(jī),還是其他一些電子器件,根據(jù)使用條件的約束,可以分為商業(yè)級和工業(yè)級,DS1302的購買信息如下圖2所示。
圖2 DS1302訂購信息
我們在訂購DS1302的時候,就可以根據(jù)圖15-4所標(biāo)識的來跟銷售廠家溝通,商業(yè)級的工作電壓略窄,是0到70度,而工業(yè)級可以工作在零下40度到85度。TOP MARK就是指在芯片上印的字。
DS1302一共有8個引腳,下邊要根據(jù)引腳分布圖和典型電路圖來介紹一下每個引腳的功能,如圖3和圖4所示。
圖3 DS1302引腳圖
圖4 DS1302典型電路
1腳VCC2是主電源正極的引腳,2腳X1和3腳X2是晶振輸入和輸出引腳,4腳GND是負(fù)極,5腳CE是使能引腳,接單片機(jī)的IO口,6腳I/O是數(shù)據(jù)傳輸引腳,接單片機(jī)的IO口,7腳SCLK是通信時鐘引腳,接單片機(jī)的IO口,8腳VCC1是備用電源引腳?紤]到KST-51開發(fā)板是一套以學(xué)習(xí)為目的的板子,加上備用電池對航空運輸和攜帶不方便,所以8腳可以直接懸空,斷電后不需要DS1302再運行了,或者是在8腳接一個10uF的電容,經(jīng)過試驗可以運行1分鐘左右的時間,如果大家想運行時間再長,可以加大電容的容量,如圖5和圖6所示。
圖5 DS1302無備用電源
圖6 DS1302電容作備用電源
涓流充電功能,課程也不講了,大家也作為選學(xué)即可,我們使用的時候直接用5V電源接一個二極管,在有主電源的情況下給電容充電,在主電源掉電的情況下,這個電容可以給DS1302大約供電1分鐘左右,這種電路的最大用處是在電池供電系統(tǒng)中更換主電池的時候保持實時時鐘的運行不中斷,1分鐘的時間對于更換電池足夠了。此外,通過我們的使用經(jīng)驗,在DS1302的主電源引腳串聯(lián)一個1K電阻可以有效的防止電源對DS1302的沖擊,R6就是,而R9,R26,R32都是上拉電阻。
我們把8個引腳功能分別介紹,如表1所示。
表1 DS1302引腳功能圖
引腳編號 | 引腳名稱 | 引腳功能 |
1 | Vcc2 | 主電源引腳,當(dāng)Vcc2比Vcc1高0.2V以上時,DS1302由VCC2供電,當(dāng)Vcc2低于Vcc1時,由Vcc1供電。 |
2 | X1 | 這兩個引腳需要接一個32.768K的晶振,給DS1302提供一個基準(zhǔn)。特別注意,要求這個晶振的引腳負(fù)載電容必須是6pF,而不是要加6pF的電容。如果使用有源晶振的話,接到X1上即可,X2懸空。 |
3 | X2 | |
4 | GND | 接地。 |
5 | CE | DS1302的輸入引腳。當(dāng)讀寫DS1302的時候,這個引腳必須是高電平,DS1302這個引腳內(nèi)部有一個40k的下拉電阻。 |
6 | I/O | 這個引腳是一個雙向通信引腳,讀寫數(shù)據(jù)都是通過這個引腳完成。DS1302這個引腳的內(nèi)部含有一個40k的下拉電阻。 |
7 | SCLK | 輸入引腳。SCLK是用來作為通信的時鐘信號。DS1302這個引腳的內(nèi)部含有一個40k的下拉電阻。 |
8 | Vcc1 | 備用電源引腳。 |
DS1302的電路一個重點就是時鐘電路,它所使用的晶振是一個32.768k的晶振,晶振外部也不需要額外添加其他的電容或者電阻電路了。時鐘的精度,首先取決于晶振的精度以及晶振的引腳負(fù)載電容。如果晶振不準(zhǔn)或者負(fù)載電容過大過小,都會導(dǎo)致時鐘誤差過大。在這一切都搞定后,最終一個考慮因素是晶振的溫漂。隨著溫度的變化,晶振往往精度會發(fā)生變化,因此,在實際的系統(tǒng)中,其中一種方法就是經(jīng)常校對。比如我們所用的電腦的時鐘,通常我們會設(shè)置一個選項“將計算機(jī)設(shè)置于internet時間同步”。選中這個選項后,一般可以過一段時間,我們的計算機(jī)就會和internet時間校準(zhǔn)同步一次。
3、DS1302寄存器介紹
DS1302的一條指令一個字節(jié)8位,其中第七位(即最高位)是固定1,這一位如果是0的話,那寫進(jìn)去是無效的。第六位是選擇RAM還是CLOCK的,我前邊說過,我們這里主要講CLOCK時鐘的使用,它的RAM功能我們不用,所以如果選擇CLOCK功能,第六位是0,如果要用RAM,那第六位就是1。從第五到第一位,決定了寄存器的5位地址,而第零位是讀寫位,如果要寫,這一位就是0,如果要讀,這一位就是1,如圖7所示。
圖7 DS1302命令字節(jié)
DS1302時鐘的寄存器,其中8個和時鐘有關(guān)的,5位地址分別是00000一直到00111這8個地址,還有一個寄存器的地址是01000,這是涓流充電所用的寄存器,我們這里不講。在DS1302的數(shù)據(jù)手冊里的地址,直接把第七位、第六位和第零位值給出來了,所以指令就成了80H、81H那些了,最低位是1,那么表示讀,最低位是0表示寫,如圖8所示。
圖8 DS1302的時鐘寄存器
寄存器一:最高位CH是一個時鐘停止標(biāo)志位。如果我們的時鐘電路有備用電源部分,上電后,我們要先檢測一下這一位,如果這一位是0,那說明我們的時鐘在系統(tǒng)掉電后,由于備用電源的供給,時鐘是持續(xù)正常運行的;如果這一位是1,那么說明我們的時鐘在系統(tǒng)掉電后,時鐘部分不工作了。若我們的Vcc1懸空或者是電池沒電了,當(dāng)我們下次重新上電時,讀取這一位,那這一位就是1,我們可以通過這一位判斷時鐘在單片機(jī)系統(tǒng)掉電后是否持續(xù)運行。剩下的7位高3位是秒的十位,低4位是秒的個位,這里注意再提一次,DS1302內(nèi)部是BCD碼,而秒的十位最大是5,所以3個二進(jìn)制位就夠了。
寄存器二:bit7沒意義,剩下的7位高3位是分鐘的十位,低4位是分鐘的個位。
寄存器三:bit7是1的話代表是12小時制,是0的話代表是24小時制,bit6固定是0,bit5在12小時制下0代表的是上午,1代表的是下午,在24小時制下和bit4一起代表了小時的十位,低4位代表的是小時的個位。
寄存器四:高2位固定是0,bit5和bit4是日期的十位,低4位是日期的個位。
寄存器五:高3位固定是0,bit4是月的十位,低4位是月的個位。
寄存器六:高5位固定是0,低3位代表了星期。
寄存器七:高4位代表了年的十位,低4位代表了年的個位。這里特別注意,這里的00到99年指的是2000年到2099年。
寄存器八:bit7是一個保護(hù)位,如果這一位是1,那么是禁止給任何其他的寄存器或者那31個字節(jié)的RAM寫數(shù)據(jù)的。因此在寫數(shù)據(jù)之前,這一位必須先寫成0。
4、DS1302通信時序介紹
DS1302我們前邊也有提起過,是三根線,分別是CE、I/O和SCLK,其中CE是使能線,SCLK是時鐘線,I/O是數(shù)據(jù)線。前邊我們學(xué)過SPI通信,同學(xué)們發(fā)現(xiàn)沒發(fā)現(xiàn),這個DS1302的通信線定義和SPI怎么這么像呢?
事實上,DS1302的通信是SPI的變異種類,它用了SPI的通信時序,但是通信的時候沒有完全按照SPI的規(guī)則來,下面我們一點點解剖一下DS1302的變異SPI通信方式。
先看一下單字節(jié)寫入操作,如圖9所示。
圖9 DS1302單字節(jié)寫操作
然后我們在對比一下再對比一下CPOL=0并且CPHA=0的情況下的SPI的操作時序,如圖10所示。
圖10 CPOL=0/CPHA=0通信時序
圖9和圖10的通信時序,其中CE和SSEL的使能控制是反的,對于通信寫數(shù)據(jù),都是在SCK的上升沿,從機(jī)進(jìn)行采樣,下降沿的時候,主機(jī)發(fā)送數(shù)據(jù)。DS1302的時序里,單片機(jī)要預(yù)先寫一個字節(jié)指令,指明要寫入的寄存器的地址以及后續(xù)的操作是寫操作,然后再寫入一個字節(jié)的數(shù)據(jù)。
對于單字節(jié)讀操作,我就不做對比了,把DS1302的時序圖貼出來給大家看一下,如圖11所示。
圖11 DS1302單字節(jié)讀操作
讀操作有兩處特別注意的地方。第一,DS1302的時序圖上的箭頭都是針對DS1302來說的,因此讀操作的時候,先寫第一個字節(jié)指令,上升沿的時候DS1302來鎖存數(shù)據(jù),下降沿我們用單片機(jī)發(fā)送數(shù)據(jù)。到了第二個字?jǐn)?shù)據(jù),由于我們這個時序過程相當(dāng)于CPOL=0/CPHA=0,前沿發(fā)送數(shù)據(jù),后沿讀取數(shù)據(jù),第二個字節(jié)是DS1302下降沿輸出數(shù)據(jù),我們的單片機(jī)上升沿來讀取,因此箭頭從DS1302角度來說,出現(xiàn)在了下降沿。
第二個需要注意的地方就是,我們的單片機(jī)沒有標(biāo)準(zhǔn)的SPI接口,和I2C一樣需要用IO口來模擬通信過程。在讀DS1302的時候,理論上SPI是上升沿讀取,但是我們的程序是用IO口模擬的,所以數(shù)據(jù)的讀取和時鐘沿的變化不可能同時了,必然就有一個先后順序。通過實驗發(fā)現(xiàn),如果先讀取IO線上的數(shù)據(jù),再拉高SCLK產(chǎn)生上升沿,那么讀到的數(shù)據(jù)一定是正確的,而顛倒順序后數(shù)據(jù)就有可能出錯。這個問題產(chǎn)生的原因還是在于DS1302的通信協(xié)議與標(biāo)準(zhǔn)SPI協(xié)議存在的差異造成的,如果是標(biāo)準(zhǔn)SPI的數(shù)據(jù)線,數(shù)據(jù)會一直保持到下一個周期的下降沿才會變化,所以讀取數(shù)據(jù)和上升沿的先后順序就無所謂了;但DS1302的IO線會在時鐘上升沿后被DS1302釋放,也就是撤銷強推挽輸出變?yōu)槿跸吕瓲顟B(tài),而此時在51單片機(jī)引腳內(nèi)部上拉的作用下,IO線上的實際電平會慢慢上升,從而導(dǎo)致在上升沿產(chǎn)生后再讀取IO數(shù)據(jù)的話就可能出錯。因此這里的程序我們按照先讀取IO數(shù)據(jù),再拉高SCLK產(chǎn)生上升沿的順序。
下面我們就寫一個程序,先將2013年10月8號星期二12點30分00秒這個時間寫到DS1302內(nèi)部,讓DS1302正常運行,然后在不停的讀取DS1302的當(dāng)前時間,并顯示在我們的液晶屏上。
編輯:admin 最后修改時間:2018-05-16