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)注明“转载原因”。未经允许私自转载拍明芯城将保留追究其法律责任的权利。
拍明芯城拥有对此声明的最终解释权。