樹莓派基礎實驗32:DS1302實時時鐘模塊實驗
現在有很多流行的串行時鐘芯片,如DS1302,DS1307,PCF8485等,由於簡單的接口,低成本和易用性,他們被廣泛應用於電話、傳真、便攜式儀器等產品領域。在本實驗中,我們將使用DS1302實時時鐘(RTC)模塊獲取當前日期和時間。
DS1302可以用於數據記錄,特別是對某些具有特殊意義的數據點的記錄,能實現數據與出現該數據的時間同時記錄。這種記錄對長時間的連續測控系統結果的分析,及對異常數據出現的原因的查找具有重要意義。
傳統的數據記錄方式是隔時采樣或定時采樣,沒有具體的時間記錄,因此,只能記錄數據而無法準確記錄其出現的時間;若采用單片機計時,壹方面需要采用計數器,占用硬件資源,另壹方面需要設置中斷、查詢等,同樣耗費單片機的資源,而且,某些測控系統可能不允許。但是,如果在系統中采用時鐘芯片DS1302,則能很好地解決這個問題。
★Raspberry Pi 3主板*1
★樹莓派電源*1
★40P軟排線*1
★DS1302實時時鐘模塊*1
★面包板*1
★跳線若幹
DS1302是DALLAS(達拉斯)公司出的壹款涓流充電時鐘芯片,2001年DALLAS被MAXIM(美信)收購。
DS1302實時時鐘芯片廣泛應用於電話、傳真、便攜式儀器等產品領域,他的主要性能指標如下:
1、DS1302是壹個實時時鐘芯片,可以提供秒、分、小時、日期、月、年等信息,並且還有軟年自動調整的能力,可以通過配置AM/PM來決定采用24小時格式還是12小時格式。
2、擁有31字節數據存儲RAM。
3、串行I/O通信方式,相對並行來說比較節省IO口的使用。
4、DS1302的工作電壓比較寬,大概是2.0V~5.5V都可以正常工作。
5、DS1302這種時鐘芯片功耗壹般都很低,它在工作電壓2.0V的時候,工作電流小於300nA。
6、DS1302***有8個引腳,有兩種封裝形式,壹種是DIP-8封裝,芯片寬度(不含引腳)是300mil,壹種是SOP-8封裝,有兩 種寬度,壹種是150mil,壹種是208mil。我們看壹下DS1302的引腳封裝圖:
7、當供電電壓是5V的時候,兼容標準的TTL電平標準,這裏的意思是,可以完美的和單片機進行通信。
8、由於DS1302是DS1202的升級版本,所以所有的功能都兼容DS1202。此外DS1302有兩個電源輸入,壹個是主電源, 另外壹個是備用電源,比如可以用電池或者大電容,這樣是為了保證系統掉電的情況下,我們的時鐘還會繼續走。如果使用的是充電電池,還可以在正常工作時,設置充電功能,給我們的備用電池進行充電。
DS1302的特點第二條“擁有31字節數據存儲RAM”,這是DS1302額外存在的資源。這31字節的RAM相當於壹個存儲器壹樣,我們編寫單片機程序的時候,可以把我們想存儲的數據存儲在DS1302裏邊,需要的時候讀出來,這塊功能和EEPROM有點類似,相當於壹個掉電丟失數據的“EEPROM”,如果我們的時鐘電路加上備用電池,那麽這31個字節的RAM就可以替代EEPROM的功能了。
DS1302壹***有8個引腳,下邊要根據引腳分布圖和典型電路圖來介紹壹下每個引腳的功能:
DS1302的電路壹個重點就是時鐘電路,它所使用的晶振是壹個32.768k的晶振,晶振外部也不需要額外添加其他的電容或者電阻電路了。時鐘的精度,首先取決於晶振的精度以及晶振的引腳負載電容。如果晶振不準或者負載電容過大過小,都會導致時鐘誤差過大。在這壹切都搞定後,最終壹個考慮因素是晶振的溫漂。隨著溫度的變化,晶振往往精度會發生變化,因此,在實際的系統中,其中壹種方法就是經常校對。比如我們所用的電腦的時鐘,通常我們會設置壹個選項“將計算機設置於internet時間同步”。選中這個選項後,壹般可以過壹段時間,我們的計算機就會和internet時間校準同步壹次。
對DS1302的操作就是對其內部寄存器的操作,DS1302內部***有12個寄存器,其中有7個寄存器與日歷、時鐘相關,存放的數據位為BCD碼形式。此外,DS1302還有年份寄存器、控制寄存器、充電寄存器、時鐘突發寄存器及與RAM相關的寄存器等。時鐘突發寄存器可壹次性順序讀/寫除充電寄存器以外的寄存器。
DS1302的壹條指令壹個字節8位,其中第7位(即最高位)是固定1,這壹位如果是0的話,那寫進去是無效的。第6位是選擇RAM還是CLOCK的,這裏主要講CLOCK時鐘的使用,它的RAM功能我們不用,所以如果選擇CLOCK功能,第6位是0,如果要用RAM,那第6位就是1。從第5到第1位,決定了寄存器的5位地址,而第0位是讀寫位,如果要寫,這壹位就是0,如果要讀,這壹位就是1。
DS1302時鐘的寄存器,其中8個和時鐘有關的,5位地址分別是00000壹直到00111這8個地址,還有壹個寄存器的地址是01000,這是涓流充電所用的寄存器,我們這裏不講。在DS1302的數據手冊裏的地址,直接把第7位、第6位和第0位值給出來了,所以指令就成了80H、81H那些了,最低位是1,那麽表示讀,最低位是0表示寫。
寄存器壹:最高位CH是壹個時鐘停止標誌位。如果我們的時鐘電路有備用電源部分,上電後,我們要先檢測壹下這壹位,如果這壹位是0,那說明我們的時鐘在系統掉電後,由於備用電源的供給,時鐘是持續正常運行的;如果這壹位是1,那麽說明我們的時鐘在系統掉電後,時鐘部分不工作了。若我們的Vcc1懸空或者是電池沒電了,當我們下次重新上電時,讀取這壹位,那這壹位就是1,我們可以通過這壹位判斷時鐘在單片機系統掉電後是否持續運行。剩下的7位高3位是秒的十位,低4位是秒的個位,這裏註意再提壹次,DS1302內部是BCD碼,而秒的十位最大是5,所以3個二進制位就夠了。
寄存器二: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是壹個保護位,如果這壹位是1,那麽是禁止給任何其他的寄存器或者那31個字節的RAM寫數據的。因此在寫數據之前,這壹位必須先寫成0。
物理上,DS1302的通信接口由3個口線組成,即RST,SCLK,I/O。其中RST從低電平變成高電平啟動壹次數據傳輸過程,SCLK是時鐘線,I/O是數據線。這個DS1302的通信線定義和SPI很像,事實上,DS1302的通信是SPI的變異種類,它用了SPI的通信時序,但是通信的時候沒有完全按照SPI的規則來,下面我們介紹DS1302的變異SPI通信方式。
請註意數據是對時鐘信號敏感的,而且壹般數據是在下降沿寫入,上升沿讀出。平時SCLK保持低電平,當需要寫命令或者寫數據時,在時鐘輸出變為高電平之前先輸出數據;當需要讀數據時,在時鐘輸出變為高電平之前采樣讀取數據。
第1步: 連接電路。
第2步: DS1302的Python程序比較復雜,我們先編寫壹個模塊ds1302.py,在裏面創建壹個類DS1302(),在裏面編寫讀取時鐘信息等方法。
第3步: 編寫實際控制程序,導入上面的模塊ds1302。運行本文件,不斷循環讀取並打印時鐘信息。
實驗結果示例: