一、实物图
二、原理图
编号 | 名称 | 功能 |
1 | VCC2 | 双供电配置中的主电源供应引脚。DS1302工作于 VCC1和VCC2中较大者.当VCC2比VCC1高0.2V 时,VCC2 给 DS1302供电。当VCC1比VCC2高时, VCC1给DS1302供电 |
2 | X1 | 32.768kHz晶振引脚 |
3 | X2 | |
4 | GND | 电源地 |
5 | CE | 使能引脚。输入信号,在读、写数据期间,必须为高。该引脚有两个功能:第一,CE开始控制字访问移位寄存器的控制逻辑;其次,CE提供结束单字节或多字节数据传输的方法 |
6 | I/O | 数据输入/输出引脚。三线接口时的双向数据线 |
7 | SCLK | 串行时钟引脚, 用来同步串行接口上的数据动作 |
8 | VCC1 | 备用电源引脚。在使用涓流充电的系统中,这个管脚连接到可再充能量源 |
电路图中一些电阻电容作用:
VCC2引脚的电容主要用于滤波,而串联一个电阻可以有效防止电源对芯片的冲击。
晶振两端的电容主要用于起振的,如果不接,会导致时间快几秒,但是时间的精确性主要取决于晶振频率。
VCC1接的是一个纽扣电池,当VCC2的电源断电时,VCC1给芯片供电,这样时钟就会继续运行。
三个上拉电阻作用:
DS1302的数据脚(I/O)是双向的,如果只用单片机弱上拉,双向通讯不成功,可能是因为弱上拉时端口电平翻转慢,造成读数不准。
CE脚和SCLK脚是单向的,可以不用接上拉电阻,单片机弱上拉是可以的。
晶振为什么选取32.768kHz:
时钟系统中,秒是一个重要的时间单位,1秒正是1Hz,如果要提高时间精度,那这个1Hz必须要准确。我们知道,在数字世界里,只有0和1两种可能,下面看一个计算:2^15 = 32768 = 32.768K
2的15次方正好等于32768,反过来讲,如果要把32.768K的时钟频率经过15次分频的话,得到的频率正好是1Hz。所以时钟芯片内部经过15次分频就得到了1Hz,即1s。
三、简介
DS1302 是美国DALLAS公司推出的一种高性能、低功耗、带RAM的实时时钟电路,它可以对年、月、日、周、时、分、秒进行计时,具有闰年补偿功能,工作电压为2.0V~5.5V。采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号或RAM数据。DS1302内部有一个31×8的用于临时性存放数据的RAM寄存器。DS1302是DS1202的升级产品,与DS1202兼容,但增加了主电源/后备电源双电源引脚,同时提供了对后备电源进行涓细电流充电的能力。
四、内部框图
五、通信协议
DS1302的通信是SPI的变异种类,它用了 SPI 的通信时序,但是通信的时候没有完全按照 SPI 的规则来。SPI接口是以主从方式工作的,这种模式通常有一个主器件和一个或多个从器件,其接口包括以下四种信号:
1、MOSI – 主器件数据输出,从器件数据输入
2、MISO – 主器件数据输入,从器件数据输出
3、SCLK – 时钟信号,由主器件产生
4、/CS – 从器件使能信号,由主器件控制
而DS1302是三种信号,其中I/O替代了MOSI和MISO,利用1根数据线进行数据输入和输出。
六、寄存器地址定义
该寄存器显示了时钟的地址信息,操作时往对应的地址写入值就行,也就是说如果想写入秒,往对应的寄存器写入0x80;表示小时的地址的第7位可选为12小时制还是24小时制,WP是写保护位
时钟暂停标志(CH):
秒寄存器的位7被定义为时钟暂停标志,当此位置1时,时钟振荡器暂停,DS1302进入漏电流小于100nA的低功耗备用模式;当此为置0时时钟开始,初始加电状态未定义。
写保护位(WP):
控制寄存器的位7是写保护位,前7位(位0至位6被强制为0且读取时总是读0,在任何对时钟或RAM的写操作以前,位7必须为0;当为高时,写保护位禁止任何寄存器的写操作,初始加电状态未定义;因此,在试图写器件之前应该清除WP位。
命令字:
命令字启动每一次数据传输时需要配置,第7位固定为1,如果是0则禁止对DS1302的写入,第6位写1则是读取或写入RAM区,写0则读取或写入时钟,第1~5位是地址,即要操作的地址,秒的地址是从0开始;第0位置1是read,对地址进行读取,置0是write,对地址进行写入
例如要读取月信息,则往命令字寄存器写0x89,如要写入月信息,则往命令字寄存器写0x88,对应了RTC左边的地址。
七、时序解析
CE输入驱动高启动所有的数据传输。CE输入有两个功能。首先,CE打开控制逻辑,允许访问的移位寄存器的地址/命令序列。其次,CE提供了一个终止单字节或多字节数据传输方法。
一个时钟周期是由一个下降沿之后的上升沿序列。对于数据传输而言,数据必须在有效的时钟的上升沿输入,在时钟的下降沿输出。如果CE为低,数据传输终止。
对于数据输入︰
开始的8个SCLK周期,输入写命令字节,数据字节在后8个SCLK周期的上升沿输入。数据输入位0开始。
代码如下:
void Ds1302_Write_Byte(uchar addr, uchar dat)
{
uchar i;
DS1302_CE = 1; //启动DS1302总线
//写入目标地址:addr
addr = addr & 0xFE; //最低位置0,寄存器0位为0时写,为1时读
for(i = 0; i < 8; i++)
{
DS1302_IO = addr & (0x01 << i);
DS1302_SCLK = 1;
DS1302_SCLK = 0;
}
//写入数据:dat
for(i = 0; i < 8; i++)
{
DS1302_IO = dat & (0x01 << i);
DS1302_SCLK = 1;
DS1302_SCLK = 0;
}
DS1302_CE = 0; //停止DS1302总线
}
对于数据输出︰
开始的8个SCLK周期,输入一个读命令字节,数据字节在后8个SCLK周期的下降沿输出。注意,第一个数据字节的第一个下降沿发生后,命令字的最后一位被写入。当CE仍为高时。如果还有额外的SCLK周期,DS1302将重新发送数据字节,这使DS1302具有连续突发读取的能力。
代码如下:
uchar Ds1302_Read_Byte(uchar addr)
{
uchar i,dat = 0x00;
DS1302_CE = 1; //启动DS1302总线
//写入目标地址:addr
addr = addr | 0x01; //最低位置1,寄存器0位为0时写,为1时读
for(i = 0; i < 8; i++)
{
DS1302_IO = addr & (0x01 << i);
DS1302_SCLK = 0;
DS1302_SCLK = 1;
}
//输出数据:dat
for(i = 0; i < 8; i++)
{
DS1302_SCLK = 1;
DS1302_SCLK = 0;
if(DS1302_IO)
dat |= (0x01 << i);
}
DS1302_CE = 0; //停止DS1302总线
DS1302_IO = 0; //读取后将IO设置为0,否则读出的数据会出错
return dat;
}
八、BCD码
BCD码(Binary Coded Decimal),用4位二进制数来表示1位十进制数
例:0001 0011表示13,1000 0101表示85,0001 1010不合法
在十六进制中的体现:0x13表示13,0x85表示85,0x1A不合法
BCD码转十进制:DEC=BCD/16 * 10+BCD%16; (2位BCD)
十进制转BCD码:BCD=DEC/10 * 16+DEC%10; (2位BCD)
因为时钟芯片内存放的是BCD码,所以直接读取出来的话会不准确,要转为十进制来显示。
九、流程设计
首先初始化引脚,然后初始化DS1302,设置CE为高,设置是读操作还是写操作,然后写入8位目标地址,接下来如果是写操作,则写入数据,如果是读操作,则读取数据,最后设置CE为低,结束操作。