DS1302是美国DALLAS公司推出的一种高性能、低功耗的实时时钟芯片,附加31字节静态RAM,采用三线接口与CPU进行同步通信,并可采用突发方式一次传送多个字节的时钟信号和RAM数据。实时时钟可提供秒、分、时、日、星期、月和年,一个月小与31天时可以自动调整,且具有闰年补偿功能。工作电压宽达2.5~5.5V。采用双电源供电(主电源和备用电源),可设置备用电源充电方式,提供了对后背电源进行涓细电流充电的能力。DS1302的外部引脚分配如下图所示。DS1302用于数据记录,特别是对某些具有特殊意义的数据点的记录上,能实现数据与出现该数据的时间同时记录,因此广泛应用于测量系统中
各引脚的功能为:
Vcc1:主电源;
Vcc2:备份电源。当Vcc2>Vcc1+0.2V时,由Vcc2向DS1302供电,当Vcc2< Vcc1时,由Vcc1向DS1302供电。
SCLK:串行时钟,输入,控制数据的输入与输出;
I/O:三线接口时的双向数据线;
CE:输入信号,在读、写数据期间,必须为高。
外部MCU与DS1302通讯时序如下所示
1. 读取写入操作CE必须为高,写入时,应该在SCLK低电平时完成,SCLK上升沿芯片采样data引脚上的数据,读取时,芯片在下降沿之后将数据写入dat总线上,高电平是数据不变
由此,写入超过过程
SCLK低电平à延时等待电平稳定à写入数据到dataàsclk上升沿,芯片采样(0à1)à延时2usà等待芯片重新回到0à写入下一个数据
读出过程
下降沿芯片将数据放在dat总线上,低电平时读取
具体过程请查看驱动代码
#ifndef __DS1302_H #define __DS1302_H #include "stm32f10x.h" #include "delay.h" extern u8 ascii_time[7]; //保存ascii格式数据 extern u8 bcd_time[7]; //保存bcd码数据 typedef struct DS1302DATA { u8 year; //年 u8 month; //月 u8 day; //日 u8 hour; //时 u8 min; //分 u8 sec; //秒 u8 week; //周 }DS1302DATA; extern struct DS1302DATA ds1302Data; #define DS1302_RST PDout(12) #define DS1302_CLK PDout(10) #define DS1302_DATIN PDin(11) #define DS1302_DATOUT PDout(11) #define DS1302_DAT_INPUT() {GPIOD->CRH &= 0XFFFF0FFF;GPIOD->CRH|=8<<12;} #define DS1302_DAT_OUTPUT() {GPIOD->CRH &= 0XFFFF0FFF;GPIOD->CRH|=3<<12;} //芯片寄存器地址定义 定义的写地址,读需要+1 #define DS1302_SEC_REG 0x80 //秒数据地址 #define DS1302_MIN_REG 0x82 //分数据地址 #define DS1302_HR_REG 0x84 //时数据地址 #define DS1302_DATE_REG 0x86 //日数据地址 #define DS1302_MONTH_REG 0x88 //月数据地址 #define DS1302_DAY_REG 0x8a //星期几数据地址 #define DS1302_YEAR_REG 0x8c //年数据地址 #define DS1302_CONTROL_REG 0x8e //写保护寄存器地址 #define DS1302_CHARGER_REG 0x90 //涓流充电寄存器 #define DS1302_CLKBURST_REG 0xbe //脉冲串寄存器 #define DS1302_RAM_BASE 0X30 //RAM基础地址 #define CLOCKSTOP 0X80 #define CLOCKSTART 0X00 void Ds1302_Gpio_Init(void); void Ds1302_Write_Time_All(u8 start); void Ds1302_Readtime(void); #endif