DS1337串列實時時鐘晶片是一種低功耗、全部採用BCD碼的時鐘日曆晶片,它帶有兩個可程式的定時鬧鐘和一個可程式的方波輸出。其地址和數據可通過I2C匯流排串列傳輸,能提供秒、分、時、日、星期、月和年等信息。在月末天數小於31天的情況下,它也能自動調整月份,包括對閏年的校正。時鐘可以以24小時模式工作也可以以12小時模式工作。晶片的工業溫度範圍為-40~+85攝氏度,提供有8引腳的DIP和SOIC封裝。
DS1337實時時鐘晶片
引腳功能
DS1337的引腳排列示意圖如圖1所示。各引腳的功能如下:
VCC,GND:直流電源和接地端,VCC的輸入範圍在1.8~5.5V之間。X1,X2:標準的32.768kHz的石英晶振接入端,內部晶振電路設計要求晶振特定電容負載為6pF。另外,這兩個引腳還可以有其它接法,即:X1腳連線外部振盪信號源,而將X2腳懸空。
圖1
圖1 DS1337引腳示意圖
SCL:串列時鐘輸入,用來在匯流排上同步數據傳輸。
SDA:串列數據輸入輸出,SDA是I2C匯流排接口的數據輸入輸出引腳,開漏輸出,使用時要求接一個上拉電阻。
SQW/INTB\:方波/中斷輸出,可通過對DS1337的內部控制暫存器進行編程來控制這個引腳是輸出方波還是輸出中斷信號。該引腳是開漏輸出,使用時要接一個外部的上拉電阻。
INTA\:中斷輸出端,使能時,如果鬧鐘暫存器的設定值與當前時間匹配,該腳會輸出一個低電平。該引腳也是開漏輸出,要接上拉電阻。
內部地址分配
DS1337的內部暫存器地址分配方式如圖2所示。在多位元組存取過程中,當地址指針到達0FH,即暫存器空間的最後一個單元時,下一個操作地址將翻卷到00H。在I2C匯流排的開始、停止、或在地址指針增加到00H位置時,當前時間會傳送給一組二級暫存器,在這期間,時鐘照常運轉。這樣就不必在讀取當前時間期間,在主暫存器更新的情況下再次讀取主暫存器中的數據,從而防止發生錯誤。
時鐘和日曆
讀取適當的暫存器可以獲得正確的時間和日曆信息。實時時鐘暫存器的地址如表1所列。設定和初始化時間和日曆可通過寫相應的暫存器欄位來實現,暫存器的數據格式以BCD碼錶示。對於不符合邏輯的時間和日期格式數據,寫入時都會導致未定義的操作。
DS1337既可以工作在12小時模式下,也可以工作在24小時模式下。小時暫存器的位6被定義為12小時模式或24小時模式選擇位,該位為1時,選擇12小時模式。在12小時模式時,位5是AM/PM標誌位,該位為1時表示PM。當在24小時模式時,位5是第二個十位(表示20到23小時)。月暫存器的第7位是世紀位,當年暫存器從0到99溢出時,該位發生變化。
鬧鐘
DS1337有兩個定時鬧鐘。鬧鐘1的定時時間由07H到0AH的暫存器設定,而從0BH到0DH的暫存器則設定鬧鐘2的定時時間。通過設定控制暫存器的INTCN位可以控制鬧鐘的兩種操作模式:一是兩個鬧鐘具有各自獨立的中斷輸出信號,二是兩個鬧鐘共同使用一個公共的中斷輸出信號。每個定時暫存器的第7位是禁止位,每個定時鬧鐘的所有禁止位都為0且鬧鐘的定時時間和00H到06H暫存器中的值匹配時,發生鬧鈴。鬧鐘還可以通過編程設定在每秒、每分鐘、每小時、一個星期的某天、一個月的某日重複產生鬧鐘中斷,其配置如表2所示。但表中未列出的配置可能會導致不合理的操作。
DS1337的地址分配圖
Day/Date暫存器的第6位是DY/DT位。該位為1時,表示該暫存器中位0到位5中的值是一個星期的一天;它為0時,表示該暫存器的位0到位5中的值是一個月中的一天。
控制暫存器和狀態暫存器
DS1337中有一個控制暫存器和一個狀態暫存器,可用於控制實時時鐘、鬧鐘和方波的輸出。控制暫存器各位定義如表3所列。其中:
EOSC\:振盪器使能位。該位為0,振盪器起振;為1,振盪器停振。剛上電時,該位為0;RS1,RS2:方波輸出頻率選擇位。RS1和RS2共有四種組合,分別對應的方波輸出頻率為1Hz,4.096kHz,8.192kHz,32.768kHz。在剛加電時,方波輸出頻率設定是32.768kHz。
INTCN:中斷控制位。用於控制兩個鬧鐘與中斷輸出腳之間的關係。為1時,兩個鬧鐘在滿足定時條件時,各自有獨立的中斷輸出。為0時,兩個鬧鐘共用一個中斷輸出腳INTA\,而腳SQW/INTB\為方波輸出端。開始上電時,該位為0。
A1IE:鬧鐘1中斷使能位。為1時,允許狀態暫存器的A1F位輸出到腳INTA\。上電時該位為0,此時不能用A1F位初始化INTA\信號。
A2IE:鬧鐘2中斷使能位,該位的作用與A1IE位相同。
DS1337的狀態暫存器各位定義如表4所列,
各位的作用如下:OSF:振盪器停止標誌。該位為1,表示振盪器已停止。有四種情況能產生這樣的結果:一是晶片剛上電,二是Vcc引腳電壓不足,三是EOSC\位為1,四是晶振受到外部影響(如噪聲等)。A1F,A2F:鬧鐘標誌位。為1時,表示鬧鐘設定時間與當前時間匹配,並產生中斷輸出。
驅動程式設計
對DS1337時鐘信息的設定和讀取,以及對鬧鐘的設定都需要編寫軟體來實現。本系統運行在Linux作業系統下,DS1337作為系統的一個硬體設備,系統對它的操作都是通過Linux作業系統內的驅動程式來完成的。
在Linux系統中,設備分為字元設備和塊設備兩種。DS1337屬於字元設備,用戶模式的程式對這類設備可以像對普通檔案一樣對它進行操作,因而字元設備類的驅動程式至少要實現Open(),Close(),Read()和Write()四個系統調用函式。這四個系統調用函式是核心數據結構file_operations內部各項的其中四項。另外,一個設備驅動程式還和兩個數據結構有關,它們是inode結構和file結構。但直接相關的數據結構是file_operations。編寫一個Linux系統驅動程式並對它進行測試主要有以下步驟:
(1)編寫各個檔案操作函式,即Open(),Close(),Read(),Write()等系統調用函式;
(2)聲明file_operations結構,給結構成員賦值;
(3)編寫初始化函式和清除函式,並用兩個宏module_init和module_exit定義這兩個函式;
(4)創建一個字元設備入口點,即使用mknod/dev/ds1337cxxx0命令來建立設備檔案節點其中,c代表字元設備,如果是塊設備,這個位置應該是b;參數xxx代表該設備的主設備號,0代表該設備的次設備號;
(5)編寫測試應用程式;
(6)使用insmodds1337.o命令載入驅動程式;
(7)運行測試程式對驅動程式進行測試;
(8)使用rmmodds1337.o命令卸載驅動程式;
實際上,在測試過程中,如果發現有問題,還要再修改各個檔案操作函式,然後再從第1步重新開始上面的過程,直到最後形成最終的完善的驅動程式。
DS1337的IC匯流排上的數據傳輸速率在標準模式下是100Kbit,在高速模式下為400Kbit。對於IC匯流排上的START條件和STOP條件以及數據位的傳輸時序,由於在EP9315中沒有更多的硬體控制電路,因此需要編程實現。需要注意的是,在IC匯流排上,數據的變化發生在SCL信號線為低電平的時刻;在SCL信號為高電平時,數據線SDA上的數據信號應該保持穩定。START條件是在SCL信號為高電平時,SDA產生一個由高變低的電平變化,此後開始一個數據傳輸過程。
STOP條件是在SCL信號為高電平時,SDA產生一個由低變高的電平變化,並在之後的幾個時鐘周期匯流排被釋放,變成“閒”狀態。在Linux系統中,可以利用短延時函式udelay(unsignedlongusecs)來實現IC匯流排上的延時功能。具體的驅動程式在此不再給出。
結束語
DS1337晶片是一種非常實用的串列接口實時時鐘晶片,可廣泛套用在GPS、POS終端機、MP3播放器等各種手持設備,消費電子設備,辦公電子設備,醫藥電子設備和通信設備等各種需要實時時鐘的系統中。該晶片通過IC接口與控制處理器晶片通信,具有體積小,引線少等特點。實際上,即使沒有專門的IC接口來控制處理器晶片,只要有兩條I/O口引腳,也可以通過軟體來模擬IC匯流排時序,以完成晶片間的通信,因而特別適用於各種嵌入式設備使用