《实现高性能的DS1302时钟芯片:基于SPI协议》

DS1302时钟芯片

DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时,且具有闰年补偿等多种功能

可以把该芯片看成一个小型的单片机,其内部的寄存器不能控制,通过协议与51进行通信

RTC(Real Time Clock):实时时钟,是一种集成电路,通常称为时钟芯片

引脚名 作用 引脚名 作用
VCC2 主电源 CE 芯片使能
VCC1 备用电源 IO 数据输入、输出
GND 电源地 SCLK 串行时钟
X1、X2 32.768kHz晶振

在哪 写入 写入什么 -> 单片机

在哪 读取 读取什么 -> 时钟芯片

寄存器地址\定义

该寄存器显示了时钟的地址信息,操作时往对应的地址写入值就行,也就是说如果想写入秒,往对应的寄存器写入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左边的地址

SPI总线概念

SPI接口的全称是“Serial Peripheral Interface”,意为串行外围接口

SPI接口主要应用在EEPROM,FLASH,实时时钟,AD转换器,还有数字信号处理器和数字信号解码器之间。

SPI接口是在CPU和外围低速器件之间进行同步串行数据传输,在主器件的移位脉冲下,数据按位传输,高位在前,低位在后,为全双工通信,数据传输速度总体来说比I2C总线要快,速度可达到几Mbps。

SPI接口是以主从方式工作的,这种模式通常有一个主器件和一个或多个从器件,其接口包括以下四种信号:

  1. MOSI – 主器件数据输出,从器件数据输入
  2. MISO – 主器件数据输入,从器件数据输出
  3. SCLK – 时钟信号,由主器件产生
  4. /CS – 从器件使能信号,由主器件控制

时序定义

要点:在时钟的上升沿,单片机往时钟芯片写入数据;在时钟的下降沿,时钟芯片往单片机输出数据

在时序图中,只有红色方框框住的是时钟芯片控制的,其余绿色圆形圈住的都是单片机控制

详细解释:

以写入操作为例:

单片机首先要将CE置高电平,IO口的第一位是命令字的最低位,就是规定本次操作是读还是写,然后SCLK给个上升沿,第一位就被发送出去了,SCLK变回低电平,接着就是下一位A0,同样是上升沿就发送出去,待第一个字节(8位)全部发送出去后,此时便确定了要操作的地址以及操作的模式,是读还是写;

第二个字节便是数据,低地址在前,同样上升沿发送,发送完后,将CE置为低电平,整个写入时序完成

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码,所以直接读取出来的话会不准确,要转为十进制来显示

可调时钟学习要点

while(1)
{
    key = key_down();
    if(key == 1)	//key1按下,进行模式选择
    {	//主要是Mode模式的选择,初始值为0,当key1按下时置1,再一次按下时再置0,便可实现一个按键无论按多少次都是两个状态
        if(Mode == 0){Mode = 1; TimeSetSelect = 0;}	
        else if(Mode == 1){Mode = 0;DS1302_SetTime();}
    }
    switch(Mode)
    {	//对模式进行判断,如果是0则执行TimeShow函数,如果是1则执行TimeSet函数,这样便可一个按键跳到不同的函数中实现不同的功			能
        case 0:TimeShow();break;
        case 1:TimeSet();break;
    }
}
物联沃分享整理
物联沃-IOTWORD物联网 » 《实现高性能的DS1302时钟芯片:基于SPI协议》

发表评论