DS17887 3V/5V實時時鐘


一、引言
DS17887是由Maxim Integrated(原Dallas Semiconductor)生產的一款高性能3V/5V實時時鐘(RTC)模塊。它集成了實時時鐘功能、非易失性存儲器(NV RAM)、電源控制電路以及多種增強特性,廣泛應用于工業控制、醫療設備、網絡接入設備、筆記本電腦等領域。本文將詳細介紹DS17887的功能、特點、引腳分配、工作原理、應用實例以及相關的驅動開發等內容。
二、DS17887概述
DS17887是DS17x87系列實時時鐘模塊中的一員,該系列還包括DS17287和DS17487。這些模塊被設計為行業標準DS12885和DS12887的后續產品,提供了更強大的功能和更高的性能。DS17887采用24引腳DIP封裝,集成了石英晶體、鋰電池以及必要的時鐘電路,構成了一個完整的、自包含的計時模塊。
產品詳情
DS17285, DS17485, DS17885, DS17287, DS17487以及DS17887實時時鐘(RTC)是工業標準的DS12885和DS12887的后續產品。DS17285,DS17485和DS17885 (下文以DS17x85代替)提供一個實時時鐘/日歷,一個定時鬧鐘,三個可屏蔽中斷(共用一個中斷輸出),可編程方波輸出和114字節的電池備份NV SRAM。DS17x85還集成了許多增強特性,例如硅序列號,電源開/關控制電路,和2K、4K或8K字節的電池備份NV SRAM。DS17287,DS17487和DS17887 (下文以DS17x87代替)在24引腳DIP模塊封裝內集成了晶振和鋰電池。DS17x85和DS17x87的電源控制電路允許系統通過外部激勵開啟電源,例如鍵盤或時間和日期(喚醒)鬧鐘。/PWR輸出引腳可被任一此類事件觸發,并可用于開啟外部電源。/PWR引腳受軟件控制,以便在某個任務完成后,能夠接著關斷系統電源。
對于所有少于31天的月份,所有器件的日期都能夠在月末自動調整,并帶有閏年補償。該器件可配置為24小時或12小時格式,并且帶有AM/PM指示。精確的溫度補償電路用于監控VCC。一旦檢測到主電源失效,器件可以自動切換到備用電源。鈕扣式鋰電池可以連接到DS17x85的VBAT輸入引腳,在主電源掉電時保持有效的時間和日期。DS17x85和DS17x87還包括了VBAUX輸入,用于電源輔助功能,例如/PWR控制。該器件通過一個復用的、字節寬度接口訪問。
應用
嵌入式系統
網絡集線器、橋接器和路由器
安全系統
電表
特性
集成了工業標準的DS12887 PC時鐘外加增強特性
RTC計算秒、分、時、星期、日期、月份和年,并且具有閏年補償,有效期至2099年
可選的+3.0V或+5.0V工作電壓
SMI恢復堆棧
64位硅序列號
電源控制電路,支持系統通過日期/時間鬧鐘或鍵盤開啟電源
晶體選擇位,允許RTC工作于6pF或12.5pF晶體
12小時或24小時時鐘,具有帶AM和PM指示的12小時模式
114字節通用、電池備份NV SRAM
擴展的電池備份NV SRAM
2048字節(DS17285/DS17287)
4096字節(DS17485/DS17487)
8192字節(DS17885/DS17887)
RAM清除功能
中斷輸出,帶6個獨立的可屏蔽中斷標志
鬧鐘可設置為每秒一次至每天一次
時鐘終止刷新周期標志
可編程方波輸出
自動電源失效檢測和切換電路
可選擇PDIP、SO或TSOP封裝(DS17285,DS17485,DS17885)
可選擇集成晶體和電池的DIP模塊封裝(DS17287,DS17487,DS17887)
可選擇工業級溫度范圍
通過UL認證
三、主要功能與特點
1. 實時時鐘功能
DS17887能夠精確計時,包括秒、分、時、日、月、年,并且具有閏年補償功能,其計時算法的有效期至2100年。這確保了時鐘在長時間運行中的準確性。
2. 多電源支持
DS17887支持+3V或+5V的工作電壓,使其能夠兼容多種不同的電源系統。此外,它還具備電源控制電路,允許系統通過外部激勵(如鍵盤輸入或時間和日期報警)來開啟電源。
3. 非易失性存儲器
該模塊內置了114字節的用戶NV RAM以及額外的8kB NV RAM,用于存儲關鍵數據。這些數據在主電源掉電時仍能保持不變,確保了數據的完整性和可靠性。
4. 增強特性
DS17887還具備多種增強特性,如64位硅序列號、SMI恢復堆棧、世紀寄存器、日期報警寄存器等。這些特性使得DS17887在復雜的應用場景中能夠發揮更大的作用。
5. 靈活的時間格式
DS17887支持12小時或24小時的時間格式,并且在12小時模式下還具備AM/PM指示功能。這為用戶提供了更加靈活的時間顯示方式。
6. 精確的溫度補償
模塊內部集成了精確的溫度補償電路,能夠監控VCC的狀態。一旦檢測到主電源失效,DS17887會自動切換到備用電源(如鋰電池),確保時鐘和數據的持續運行。
四、引腳分配與功能描述
DS17887采用24引腳DIP封裝,其引腳分配如下:
引腳號 | 引腳名稱 | 功能描述 |
---|---|---|
1 | PWR | 電源輸出引腳,用于觸發外部電源開啟 |
2 | X1 | 晶振輸入引腳 |
3 | X2 | 晶振輸出引腳 |
4-11 | AD0-AD7 | 復用的地址/數據總線引腳 |
12 | GND | 地引腳 |
13 | VCC | 主電源輸入引腳(+3V或+5V) |
14 | SQW | 方波輸出引腳,提供32kHz的方波信號 |
15 | VBAUX | 輔助電池輸入引腳,用于驅動輔助功能 |
16 | RCLR | RAM清零輸入引腳,用于清除RAM中的數據 |
17 | VBAT | 電池輸入引腳,連接鋰電池以維持時鐘和數據運行 |
18 | IRQ | 中斷請求輸出引腳,低電平有效 |
19 | KS | Kickstart輸入引腳,用于初始化時鐘 |
20 | RD | 讀數據選通引腳,低電平有效 |
21 | GND | 地引腳 |
22 | WR | 寫數據選通引腳,低電平有效 |
23 | ALE | 地址選通輸入引腳,高電平有效 |
24 | CS | 片選輸入引腳,低電平有效 |
五、工作原理
DS17887的工作原理主要基于其內部的實時時鐘電路、電源控制電路以及非易失性存儲器。以下是對其工作原理的詳細介紹:
1. 實時時鐘電路
DS17887內部的實時時鐘電路由石英晶體振蕩器、分頻器、計數器以及校準電路等組成。石英晶體振蕩器產生穩定的振蕩信號,經過分頻器分頻后得到秒、分、時等時間單位。計數器則對這些時間單位進行計數,從而得到當前的時間。校準電路用于對時鐘進行校準,確保時鐘的準確性。
2. 電源控制電路
電源控制電路負責監測主電源和備用電源的狀態,并根據需要切換電源。當主電源正常時,電源控制電路將主電源提供給模塊內部的各個電路。當主電源失效時,電源控制電路會自動切換到備用電源(如鋰電池),確保時鐘和數據的持續運行。
3. 非易失性存儲器
非易失性存儲器用于存儲關鍵數據,如時間、日期、報警設置等。這些數據在主電源掉電時仍能保持不變,因為非易失性存儲器具有掉電保持功能。當主電源恢復時,這些數據可以被重新讀取并使用。
六、應用實例
DS17887因其強大的功能和可靠性而被廣泛應用于各種領域。以下是一些典型的應用實例:
1. 工業控制
在工業控制系統中,DS17887可以用于記錄設備的工作時間、故障時間等關鍵信息。這些信息對于設備的維護和管理至關重要。同時,DS17887的電源控制電路還可以實現設備的遠程喚醒功能,提高系統的靈活性和可靠性。
2. 醫療設備
在醫療設備中,DS17887可以用于記錄患者的治療時間、用藥時間等關鍵信息。這些信息對于醫生的治療決策和患者的康復至關重要。此外,DS17887的高精度時鐘還可以確保醫療設備的精確運行。
3. 網絡接入設備
在網絡接入設備中,DS17887可以用于記錄設備的上線時間、下線時間等關鍵信息。這些信息對于網絡管理員的網絡管理和優化至關重要。同時,DS17887的實時時鐘功能還可以確保網絡接入設備的精確同步。
4. 筆記本電腦
在筆記本電腦中,DS17887可以用于記錄系統的啟動時間、關機時間等關鍵信息。這些信息對于用戶了解系統的使用情況以及進行系統維護至關重要。此外,DS17887的電源控制電路還可以實現筆記本電腦的定時開關機功能,提高用戶的使用體驗。
七、驅動開發
為了使用DS17887實時時鐘模塊,需要開發相應的驅動程序。以下是一個基于C語言的DS17887驅動開發示例:
#include <stdint.h> #include <stdbool.h>
// 定義DS17887對象類型 typedef struct Ds17887Object { uint8_t ctlReg[4]; // 控制寄存器 uint16_t dateTime[6]; // 讀取的系統時間 void (*SetCtlPin[6])(bool value); // 控制引腳操作 void (*WriteByte)(uint16_t data); // 寫一個字節 uint16_t (*ReadByte)(void); // 讀一個字節 void (*SetBusDirection)(bool direction); // 設置總線方向 void (*Delayus)(volatile uint32_t nTime); // 延時操作 } Ds17887ObjectType;
// 初始化DS17887對象 void InitDs17887(Ds17887ObjectType *ds17887) { // 初始化控制寄存器 for (int i = 0; i < 4; i++) { ds17887->ctlReg[i] = 0; } // 初始化系統時間 for (int i = 0; i < 6; i++) { ds17887->dateTime[i] = 0; } // 初始化控制引腳操作函數指針 for (int i = 0; i < 6; i++) { ds17887->SetCtlPin[i] = NULL; } // 初始化讀寫字節函數指針 ds17887->WriteByte = NULL; ds17887->ReadByte = NULL; // 初始化設置總線方向函數指針 ds17887->SetBusDirection = NULL; // 初始化延時操作函數指針 ds17887->Delayus = NULL; }
// 從DS17887讀數據 static uint16_t ReadDataFromDS17887(Ds17887ObjectType *ds17887, uint16_t address) { // 將片選信號置位,失能片選 ds17887->SetCtlPin[DS17887_CS](true); // 將RD與WR置位 ds17887->SetCtlPin[DS17887_WR](true); ds17887->SetCtlPin[DS17887_RD](true); ds17887->Delayus(2); // 置位ALE ds17887->SetCtlPin[DS17887_ALE](true); // 將地址數據總線的模式改為輸出 ds17887->SetBusDirection(true); // 寫寄存器地址 ds17887->WriteByte(address); // 將片選信號置位,使能片選 ds17887->SetCtlPin[DS17887_CS](false); ds17887->Delayus(2); // 復位ALE ds17887->SetCtlPin[DS17887_ALE](false); ds17887->Delayus(2); // 復位RD ds17887->SetCtlPin[DS17887_RD](false); ds17887->Delayus(10); // 將地址數據總線的模式改為輸入 ds17887->SetBusDirection(false); ds17887->Delayus(40); // 讀取數據 uint16_t readData = 0; readData = ds17887->ReadByte(); ds17887->Delayus(4); // 將RD置位,并將CS信號置位,失能芯片 ds17887->SetCtlPin[DS17887_RD](true); ds17887->SetCtlPin[DS17887_CS](true); ds17887->Delayus(4); return readData; }
// 向DS17887寫數據 static void WriteDataToDS17887(Ds17887ObjectType *ds17887, uint16_t address, uint16_t data) { // 將片選信號置位,失能片選 ds17887->SetCtlPin[DS17887_CS](true); // 將RD與WR置位 ds17887->SetCtlPin[DS17887_WR](true); ds17887->SetCtlPin[DS17887_RD](true); ds17887->Delayus(2); // 置位ALE ds17887->SetCtlPin[DS17887_ALE](true); // 將地址數據總線的模式改為輸出 ds17887->SetBusDirection(true); // 寫寄存器地址 ds17887->WriteByte(address); // 將片選信號置位,使能片選 ds17887->SetCtlPin[DS17887_CS](false); ds17887->Delayus(2); // 復位ALE ds17887->SetCtlPin[DS17887_ALE](false); ds17887->Delayus(2); // 寫數據 ds17887->WriteByte(data); ds17887->Delayus(40); // 將WR置位 ds17887->SetCtlPin[DS17887_WR](true); ds17887->Delayus(4); // 將CS信號置位,失能芯片 ds17887->SetCtlPin[DS17887_CS](true); ds17887->Delayus(4); }
// 獲取當前時間 void GetCurrentTime(Ds17887ObjectType *ds17887) { // 讀取時間寄存器 for (int i = 0; i < 6; i++) { ds17887->dateTime[i] = ReadDataFromDS17887(ds17887, TIME_REGISTER_BASE + i); } }
// 設置當前時間 void SetCurrentTime(Ds17887ObjectType *ds17887, uint16_t *timeData) { // 寫入時間寄存器 for (int i = 0; i < 6; i++) { WriteDataToDS17887(ds17887, TIME_REGISTER_BASE + i, timeData[i]); } }
八、總結
DS17887是一款功能強大、性能可靠的3V/5V實時時鐘模塊。它集成了實時時鐘功能、非易失性存儲器、電源控制電路以及多種增強特性,能夠滿足各種復雜應用場景的需求。通過開發相應的驅動程序,可以方便地實現對DS17887的控制和數據讀寫操作。在未來的發展中,隨著物聯網、智能家居等領域的不斷興起,DS17887等實時時鐘模塊的應用前景將更加廣闊。
責任編輯:David
【免責聲明】
1、本文內容、數據、圖表等來源于網絡引用或其他公開資料,版權歸屬原作者、原發表出處。若版權所有方對本文的引用持有異議,請聯系拍明芯城(marketing@iczoom.com),本方將及時處理。
2、本文的引用僅供讀者交流學習使用,不涉及商業目的。
3、本文內容僅代表作者觀點,拍明芯城不對內容的準確性、可靠性或完整性提供明示或暗示的保證。讀者閱讀本文后做出的決定或行為,是基于自主意愿和獨立判斷做出的,請讀者明確相關結果。
4、如需轉載本方擁有版權的文章,請聯系拍明芯城(marketing@iczoom.com)注明“轉載原因”。未經允許私自轉載拍明芯城將保留追究其法律責任的權利。
拍明芯城擁有對此聲明的最終解釋權。