1、芯片功能及引脚
DS1337串行实时时钟是一种低功耗时钟/日历,具有两个可编程的时间报警和一个可编程方波输出。
主控芯片通过I2C总线读写DS1337芯片内部的寄存器。时钟/日历提供秒、分、小时、日、日期、月和年信息,对于少于31天的月份,将自动调整月末日期,包括对闰年的更正,有24小时或12小时格式。当VCC在1.8V~5.5V之间时,可以通过I2C读取芯片内部寄存器的数据,在1.8V以下不保证I2C正常工作,低至1.3V,时钟保持功能可保证正常工作。
DS1337引脚功能如下表所示:
引脚 | 功能 |
---|---|
X1、X2 | 标准32.768kHz石英晶体的连接。外部32.768kHz振荡器也可以驱动DS1337,在这种配置中,X1引脚连接到外部振荡器信号,X2引脚悬空。 |
INTA‘ | 启用中断输出后,当时间/日期与报警寄存器中设置的值匹配时,INTA被置位为低电平。 此引脚为开漏输出,需要一个外部上拉电阻。如果不使用,此引脚可以悬空。 |
SCL | I2C通信的串行时钟线。 |
SDA | I2C通信的双向串行数据线。 |
SQW/INTB‘ | 可编程方波或中断输出信号,此引脚为开漏输出,也需要一个外部上拉电阻如果不使用,此引脚可以悬空。 |
VCC | VCC在1.8V~5.5V之间时,主机可以通过I2C读取芯片内部寄存器的数据,在1.8V以下不保证I2C正常工作,低至1.3V,时钟保持功能可保证正常工作。 |
开发板上该芯片的原理图如下所示,中断管脚和方波编程输出引脚均悬空处理,没有使用,这是因为FPGA一般不需要中断功能。外部接入32.768KHz的晶振作为时钟参考信号,使用了I2C通信接口。
该芯片的内部功能框图如下所示,外部晶振引脚X1、X2与内部构成一个振荡电路,生成芯片所需要的参考时钟信号。1Hz信号猜测就是提供给计时器作为最基本的秒计数器的参考时钟。
右侧的模块用于生成可编程的方波输出和中断信号,左下角模块应该是I2C从机的解析模块,将接收的数据拆解出来传输给后面模块进行存储,同时也可以将需要输出的寄存器数据以I2C时序格式输出。
2、寄存器
根据该芯片的功能,大致能够猜测其内部寄存器的种类,能够记录年、月、日、时、分、秒,肯定有相关的寄存器。还能够实现报警功能,就好比闹钟一样,那是不是还应该有一组设置目标时间的寄存器呢?还应该有中断、输出方波频率相关的寄存器吧。
该芯片寄存器分布如下图所示,用七个寄存器来存储年、月、日、星期、时、分、秒,如图中黄色寄存器。
该芯片的报警方式有两种,一种根据时、分、秒进行报警,如图中蓝色寄存器用于存储报警时间。另一种根据日期报警,如图中粉色寄存器用于存储报警的年月日信息。
2.1、时间寄存器
时间和日历寄存器(黄色部分寄存器)的内容采用BCD格式,星期几寄存器在晚上0时后递增。对应于星期几的值由用户定义,但必须是连续的(如果1表示星期日,则2表示星期一,依此类推),不合逻辑的时间和日期输入会导致未定义的操作。
DS1337可以在12小时或24小时模式下运行。小时寄存器的位6定义为12小时或24小时模式选择位,高电平表示选择12小时模式。在12小时模式下,位5是AM/PM位,逻辑高电平为PM(也就是表示下午的时间段)。 如果使用24小时模式,那么就需要6位BCD码才能存下0~23的数据,此时位5也用于存储小时数据。
每当小时寄存器的位6状态翻转时,包括报警在内的所有小时寄存器的值都必须重新初始化。年份寄存器只有8位空间,能够存储的BCD码范围是[0,99],当年份寄存器溢出时,月份寄存器的第7位(称为世纪位)就会置一。
2.2、报警寄存器
DS1337包含时间/日期两个报警,时间报警可以通过写入寄存器07h–0Ah来设置,日期报警可以通过写入寄存器0Bh–0Dh来设置。报警可以编程(通过控制寄存器的INTCN位)在两种不同模式下工作——每个报警可以驱动自己单独的中断输出,或者两个报警都可以驱动一个公共中断输出。时间/日期报警寄存器的位7是屏蔽位。
当每个报警的所有屏蔽位都为低电平时,仅当计时寄存器00h–06h中的值与日期时间报警寄存器中存储的值匹配时才会报警。报警的方式于下图中的表格对应的寄存器位确定,比如当A1M4~AIM0全为1时,那么DS1337每秒就会报警一次。
上表未列出的配置会导致不合逻辑的操作,DY/DT位(报警日/日期寄存器的位6)控制该寄存器的位0–5中存储的报警值是反映星期几还是月几。如果DY/DT写入低电平,报警是与月份日期匹配的结果,否则报警表示是与星期几匹配的结果。
当RTC寄存器值与报警寄存器设置匹配时,相应的报警标志(A1F或A2F)位设为高电平,这些位将保持高电平,直到用户写入低电平。如果相应的报警中断使能(控制寄存器中的A1IE或A2IE)设置为高电平,报警条件会把中断输出(INTA或SQW/INTB)引脚拉低,从而输出中断信号。
2.3、控制和状态寄存器
DS1337有两个额外的寄存器(控制和状态),用于控制RTC、报警和方波输出。控制寄存器各位的含义如下表所示。
位 | 名称 | 含义 |
---|---|---|
bit7 | EOSC‘ | 该位低电平时启动振荡器,设为逻辑高电平时振荡器停止工作。首次通电时,该位为低电平。 |
bit 6 | 0 | 保留位 |
bit 5 | 0 | 保留位 |
bit 4 | RS2 | RS2、RS1控制方波输出的频率,首次通电时,RS2、RS1均为高电平。 |
bit 3 | RS1 | RS2、RS1控制方波输出的频率,首次通电时,RS2、RS1均为高电平。 |
bit 2 | INTCN | 中断控制位,该位控制两个报警和中断输出引脚之间的关系。当INTCN位设为高电平时,计时寄存器和报警2寄存器(ALARM1)寄存器之间的匹配会激活INTA引脚(前提是报警已使能),计时寄存器和报警2寄存器(ALARM2)之间的匹配会激活SQW/INTB引脚(前提是报警已使能)。当INTCN位设为低电平时,SQW/INTB引脚输出方波。首次上电时,该位为低电平。 |
bit 1 | A2IE | 报警2中断使能,当设置为高电平时,该位允许状态寄存器中的报警2标志(A2F)位拉低INTA引脚(当INTCN = 0时)或拉低SQW/INTB引脚(当INTCN = 1时)。当A2IE位设为低电平时,A2F位不会发出中断信号。 首次通电时,该位为低电平。 |
bit 0 | A1IE | 报警1中断使能,设置为高电平时,该位允许状态寄存器中的报警1标志(A1F)位拉低INTA引脚。当A1IE位设为低电平时,A1F位不会启动INTA信号。 首次上电时,该位为低电平。 |
其中RS2和RS1两位数据控制SQW引脚输出方波的频率,RS2、RS1的真值表如下表所示。首次上电时,这两位寄存器数据均为高电平,默认SQW引脚输出32.768KHz频率的方波。
INTCN | RS2 | RS1 | SQW | A2IE |
---|---|---|---|---|
0 | 0 | 0 | 1Hz | X |
0 | 0 | 1 | 4.096KHz | X |
0 | 1 | 0 | 8.192KHz | X |
0 | 1 | 1 | 32.768KHz | X |
1 | X | X | A2F‘ | 1 |
当INTCN位为1时,SQW/INTB引脚就作为中断引脚了,不会输出方波了,此时RS2、RS1的状态就不用关心了。
下表是状态寄存器的数据,体现芯片内部的工作状态,该寄存器各位的含义如下表所示。
位 | 名称 | 含义 |
---|---|---|
bit7 | OSF | 振荡器停止标志,振荡器停止时,该位设为高电平。这几种情况可能导致该位为高电平:芯片第一次上电、VCC上的电压不足以支持振荡、EOSC位为低电平、对晶体的外部影响(例如噪声、泄漏等)。该位保持高电平,直到写入低电平。 |
bit 6 | 0 | 保留位 |
bit 5 | 0 | 保留位 |
bit 4 | 0 | 保留位 |
bit 3 | 0 | 保留位 |
bit 2 | 0 | 保留位 |
bit 1 | A2F | 报警2标志位,高电平表示时间与报警2寄存器相匹配。根据控制寄存器中INTCN位的状态,该标志可用于在INTA或SQW/INTB上产生中断。 如果INTCN位设为低电平,A2F为高电平(A2IE位也为高电平),INTA引脚变为低电平。如果INTCN位设为高电平,A2F为高电平(A2IE位也为高电平),SQW/INTB引脚变为低电平。写入低电平时,A2F清零,该位只能写入低电平,写入高电平无效。 |
bit 0 | A1F | 报警1标志位、高电平表示时间与报警1寄存器相匹配。如果A1IE位也是高电平,INTA引脚变为低电平。 写入低电平时,A1F清零,该位只能写入低电平。 |
DS1337内部的寄存器就这么多了,也比较简单,根据功能主要就是计时和报警。计时相关寄存器采用BCD码编码,报警的时候可以分为星期报警和日期报警,根据对应寄存器设置确定。最后通过控制寄存器去控制晶体振荡器的工作、两个报警中断的使能、中断2驱动INTA还是INTB引脚。最后状态寄存器可以获取晶体振荡器的工作状态,报警中断是否触发和清零。
要注意控制寄存器很多位第一次上电是不会正常工作的,需要用户写入初始状态。在对寄存器进行读写之前,最好通过状态寄存器获取晶体振荡器的状态,或者直接向控制寄存器中写入有效数据。
如果使用FPGA控制,是不需要使用中断的,而前面原理图可知方波输出引脚也是悬空的,所以可以直接向控制寄存器写入8’h80,之后再读取状态寄存器的数据,确定是否为8’h80,确保晶体振荡器工作。
3、I2C接口
关于I2C接口时序的具体含义,可以查看前文前文对I2C时序的具体讲解,本节只对DS1337的I2C相关功能做讲解,不对I2C本身时序做过多赘述。
对于I2C的从机,最重要的就是器件地址,与人的身份证号一致,DS1337的器件地址就是7’b1101000。
手册中表示DS1337芯片支持I2C的突发读写模式,对应的时序图如下所示,前文设计的I2C驱动模块可以轻松实现,既然支持连续读写,那应该也是支持单字节数据读取的。
DS1337的I2C读写时序就上述这么多了,接下来需要知道这颗芯片对I2C的一些时间参数的取值,比如I2C时钟频率、建立时间、保持时间、两次读写之间的时间间隔有没有限制等,DS1337的I2C接口参数如下图所示。
上图中的各个时序参数可以在下表中查看具体数值。
由图可知DS1337的I2C支持快速和标准模式,串行时钟SCL频率可以位于0~400KHz。而建立时间Tsu和保持时间Thd在快速模式下都小于1us,I2C的数据都是在时钟SCL低电平中部赋值,在SCL高电平中部采集数据线状态,所以这两个时间要求一般不会违例。
这里并没有说明芯片内部对两次读写操作的最小间隔时间,但是上述表格提供了I2C接口STOP条件和START条件之间的最小间隔时间(Bus Free Time Between a STOP and START Condition)。在快速模式(Fast mode)下,这个时间是1.3微秒(μs),而在标准模式(Standard mode)下,这个时间是4.7微秒。这个时间是指在发送一个STOP条件后,到发送下一个START条件之前,总线上必须保持空闲的时间。
所以我们在读写DS1337内部寄存器数据时,必须满足这个最小值,保证稳定读写数据。
关于DS1337芯片的讲解就这么多了,通过前文也能够看出该芯片还是比较简单的,对应的寄存器就分为时间和报警、控制及状态寄存器。I2C时序也与前文介绍的一致,该芯片可以输出4种频率的方波信号,具体频率通过控制寄存器的RS2和RS1进行设置。
可以在公众号后台回复“DS1337手册“(不包括引号)获取该芯片手册,下文通过FPGA去读取DS1337的数据进行显示。
如果对文章内容理解有疑惑或者对代码不理解,可以在评论区或者后台留言,看到后均会回复!
如果本文对您有帮助,还请多多点赞👍、评论💬和收藏⭐!您的支持是我更新的最大动力!将持续更新工程!