SD3077、SD3078时钟芯片数据手册、例程

news/2024/12/5 9:50:43/

目录

芯片管脚设置:

管脚说明:

原理框图: 

芯片资料获取: 

部分驱动代码: 

主函数:

部分驱动函数——中断调用函数:

部分驱动函数——I2C在指定地址读/写一字节数据函数:

部分驱动函数——IRTC实时数据寄存器函数:


         我最近在项目上需要使用一款可以3.3V供电的时钟芯片,在网上找了一下发现了这款芯片SD3077(由于在淘宝上买的,店主应该是个倒手的,不提供资料和技术支持)没办法只能自己找资料了。不找不知道,一找差点要了我的老命(CSDN上面就一个技术手册就要四十多个币,文库那些就更别说了,好多网站还只要微信转账9.9就能下载)现在的资料都这么“值钱”了吗?本着白嫖的原则,找了一晚上,终于找到厂家了,在他那里下载了数据手册和例程。我解决问题之后,觉得还是把这些坑都写清楚,方便后面的初学者。 

芯片管脚设置:

管脚说明:

原理框图: 

芯片资料获取: 

浏览器搜索:http://www.whwave.com.cn/在主页面打开产品中心——>实时时钟芯片——>选择你的时钟芯片型号(单击打开),芯片介绍下面就有官方例程和数据手册。

下面是DS3077、DS3078芯片介绍界面可下载资料截图:

部分驱动代码: 

主函数:

        主函数是一个多功能调试的集合,有给RTC写入计时的初始时间、读出芯片的ID号演示、充电使能设置演示、频率中断设置演示、报警中断设置演示、倒计时中断设置演示、禁止中断演示等。

int main(void)
{	u8 i;CountDown_Def cdInit;/********* USART1 配置模式为 115200 8-N-1**********/USARTx_Config();printf("\r\n--这是一个读写RTC的演示程序-- \r\n");	/***************** I2C总线初始化 *****************/	IIC_Init();	/************* 给RTC写入计时的初始时间 ************/		RTC_WriteDate(&time_init);RTC_ReadDate(&sysTime);printf("写入的初始时间为: \r\n");printf("%02X-%02X-%02X  %02X:%02X:%02X  星期%02X\r\n\r\n", \sysTime.year, sysTime.month, sysTime.day, sysTime.hour,\sysTime.minute, sysTime.second, sysTime.week);	printf("----------------------------\r\n\r\n");	#ifdef SD30XX_25XX	
/*************** 读出芯片的ID号演示 ****************/	I2CReadSerial(RTC_Address,ID_Address,8,data_Buf);printf("芯片64bit ID号为:\r\n");for (i=0; i<8; i++)printf("0x%02X ", data_Buf[i]);printf("\r\n----------------------------\r\n\r\n");/**************** 充电使能设置演示 *****************/data_Buf[0] = Chg_enable;I2CWriteSerial(RTC_Address,Chg_MG,1,data_Buf);/************** 读出后备电池电压演示 ***************/	I2CReadSerial(RTC_Address,Bat_H8,2,VBAT_Buf);VBAT_VAL = (VBAT_Buf[0]>>7)*255 + VBAT_Buf[1];printf("VBAT脚的电池电压为:%d.%d%dV\r\n\r\n", VBAT_VAL/100, VBAT_VAL%100/10, VBAT_VAL%10);
#endif#if (INT_TYPE == FREQUENCY)
/**************** 频率中断设置演示 ****************/SetFrq(F2Hz);//输出2Hz频率方波
#elif (INT_TYPE == ALARM)
/**************** 报警中断设置演示 ****************/Set_Alarm(sec_ALM|min_ALM|hor_ALM, &Alarm_init);//报警使能:时、分、秒
#elif (INT_TYPE == COUNTDOWN)	
/*************** 倒计时中断设置演示 ***************/cdInit.IM = 1;				//设置为周期性中断cdInit.d_clk = S_1s;		//倒计时中断源选择1scdInit.init_val = 2;	//倒计时初值设置为2Set_CountDown(&cdInit);
#elif (INT_TYPE == DISABLE)	
/****************** 禁止中断演示 *****************/ClrINT(INTDE|INTAE|INTFE);
#endifwhile( 1 ){RTC_ReadDate(&sysTime);printf("%02X-%02X-%02X  %02X:%02X:%02X  星期%02X\r\n", \sysTime.year, sysTime.month, sysTime.day, sysTime.hour,\sysTime.minute, sysTime.second, sysTime.week);Delay(0x7FFFFF);//1秒延时}
}

STM32例程部分驱动函数——中断调用函数:

/********************************************** 函数名:Set_CountDown* 描  述:设置倒计时中断* 输  入:CountDown_Init 倒计时中断结构体指针 * 输  出:无********************************************/
void Set_CountDown(CountDown_Def *CountDown_Init)					
{u8 buf[6];u8 tem=0xF0;buf[0] = (CountDown_Init->IM<<6)|0xB4;							//10Hbuf[1] = CountDown_Init->d_clk<<4;									//11Hbuf[2] = 0;																					//12Hbuf[3] = CountDown_Init->init_val & 0x0000FF;				//13Hbuf[4] = (CountDown_Init->init_val & 0x00FF00) >> 8;//14Hbuf[5] = (CountDown_Init->init_val & 0xFF0000) >> 16;//15HI2CWriteSerial(RTC_Address,CTR2,1,&tem);I2CWriteSerial(RTC_Address,CTR2,6,buf);
}/********************************************** 函数名:Set_Alarm* 描  述:设置报警中断(闹钟功能)* Enable_config:使能设置  * psRTC:报警时间的时间结构体指针* 输  出:无********************************************/
void Set_Alarm(u8 Enable_config, Time_Def *psRTC)					
{u8 buf[10];buf[0] = psRTC->second;buf[1] = psRTC->minute;buf[2] = psRTC->hour;buf[3] = 0;buf[4] = psRTC->day;buf[5] = psRTC->month;buf[6] = psRTC->year;buf[7] = Enable_config;buf[8] = 0xFF;buf[9] = 0x92;	I2CWriteSerial(RTC_Address,Alarm_SC,10,buf);
}

 STM32例程中RTC.H文件(SD3077相关寄存器定义、时钟数据管脚定义及声明等)

#ifndef __RTC_H__
#define __RTC_H__#include "stm32f10x.h"#define  SCL_H         GPIOB->BSRR = GPIO_Pin_6 
#define  SCL_L         GPIOB->BRR  = GPIO_Pin_6 #define  SDA_H         GPIOB->BSRR = GPIO_Pin_7
#define  SDA_L         GPIOB->BRR  = GPIO_Pin_7#define SDA_read        (GPIOB->IDR  & GPIO_Pin_7)enum Freq{F_0Hz, F32KHz, F4096Hz, F1024Hz, F64Hz, F32Hz, F16Hz, F8Hz, \F4Hz, F2Hz, F1Hz, F1_2Hz, F1_4Hz, F1_8Hz, F1_16Hz, F_1s};enum clk_Souce{S_4096Hz, S_1024Hz, S_1s, S_1min};/*此结构体定义了时间信息包括年、月、日、星期、时、分、秒*/
typedef	struct
{u8	second;u8	minute;u8	hour;u8	week;u8	day;u8	month;u8	year;
} Time_Def;/*此结构体定义了倒计时中断可供配置的频率源、IM和初值主要参数*/
typedef	struct
{enum clk_Souce d_clk;u8   IM;	//IM=1:周期性中断u32  init_val;
} CountDown_Def;/** 通过宏定义选择使用的RTC型号* SD30XX_25XX -> 使用SD30或SD25系列* SD20XX_24XX -> 使用SD20或SD24系列*/
#define		SD30XX_25XX
#undef		SD20XX_24XX/********************************************************/
#define		TRUE            1
#define		FALSE           0
#define		H               1
#define		L               0
#define		Chg_enable			0x82
#define		Chg_disable			0/******************** Device Address ********************/
#define		RTC_Address     0x64 /******************** Alarm register ********************/
#define		Alarm_SC				0x07
#define		Alarm_MN				0x08
#define		Alarm_HR				0x09
#define		Alarm_WK				0x0A
#define		Alarm_DY				0x0B
#define		Alarm_MO				0x0C
#define		Alarm_YR				0x0D
#define		Alarm_EN				0x0E/******************** Control Register *******************/
#define		CTR1            0x0F
#define		CTR2            0x10
#define		CTR3            0x11/***************** Timer Counter Register ****************/
#define		Timer_Counter1	0x13
#define		Timer_Counter2	0x14
#define		Timer_Counter3	0x15/******************** Battery Register ********************/
#define		Chg_MG          0x18		//充电管理寄存器地址
#define		Bat_H8          0x1A		//电量最高位寄存器地址
#define		Bat_L8          0x1B		//电量低八位寄存器地址/*********************** ID Register **********************/
#define		ID_Address			0x72		//ID号起始地址/********************** 报警中断宏定义 *********************/
#define		sec_ALM					0x01
#define		min_ALM					0x02
#define		hor_ALM					0x04
#define		wek_ALM					0x08
#define		day_ALM					0x10
#define		mon_ALM					0x20
#define		yar_ALM					0x40/********************** 中断使能宏定义 **********************/
#define		INTDE						0x04		//倒计时中断
#define		INTAE						0x02		//报警中断
#define		INTFE						0x01		//频率中断/********************** 中断演示宏定义 **********************/
#define 	FREQUENCY				0				//频率中断
#define 	ALARM						1				//报警中断
#define 	COUNTDOWN				2				//倒计时中断
#define 	DISABLE					3				//禁止中断/*************** 中断输出类型选择,请自行选择 ****************/
#define 	INT_TYPE			COUNTDOWN //定义中断输出类型/***********读写时间函数*************/
u8 RTC_WriteDate(Time_Def	*psRTC);
u8 RTC_ReadDate(Time_Def	*psRTC);/*******I2C多字节连续读写函数********/
u8 I2CWriteSerial(u8 DeviceAddress,u8 Address,u8 length,u8 *ps);
u8 I2CReadSerial(u8 DeviceAddress,u8 Address,u8 length,u8 *ps);/*********I2C端口初始化函数*********/
void IIC_Init(void);/*********RTC中断配置函数*********/
void Set_CountDown(CountDown_Def *CountDown_Init);
void Set_Alarm(u8 Enable_config, Time_Def *psRTC);
void SetFrq(enum Freq F_Out);
void ClrINT(u8 int_EN);#endif /* __RTC_H */

 STM8例程中RTC.H文件(SD3077相关寄存器定义、时钟数据管脚定义及声明等)

#ifndef __RTC_H__
#define __RTC_H__
#include "type.h"#define SCL(tmp)tmp?(PB_ODR |= 0x10):(PB_ODR&=0xef)
#define SDA(tmp)tmp?(PB_ODR |= 0x20):(PB_ODR&=0xdf)
#define SDAin() {PB_DDR&=0xdf;PB_CR1&=0xdf;} /*浮空输入(外部加上拉电阻)*/
#define SDAout(){PB_DDR|=0x20;PB_CR1&=0xdf;}  /*开漏输出(外部加上拉电阻),使用推挽可能会有问题*//** 通过宏定义选择使用的RTC型号* SD30XX_25XX -> 使用SD30或SD25系列* SD20XX_24XX -> 使用SD20或SD24系列*/
#define         SD30XX_25XX
#undef          SD20XX_24XXenum Freq{F_0Hz, F32KHz, F4096Hz, F1024Hz, F64Hz, F32Hz, F16Hz, F8Hz, \F4Hz, F2Hz, F1Hz, F1_2Hz, F1_4Hz, F1_8Hz, F1_16Hz, F_1s};enum clk_Souce{S_4096Hz, S_1024Hz, S_1s, S_1min};typedef struct
{u8 second;u8 minute;u8 hour;u8 week;u8 day;u8 month;u8 year;
}Time_Def;/*此结构体定义了倒计时中断可供配置的频率源、IM和初值主要参数*/
typedef struct
{enum clk_Souce d_clk;u8   IM;	//IM=1:周期性中断u32  init_val;
} CountDown_Def;#define         TRUE            1
#define         FALSE           0
#define         H               1
#define         L               0
#define         Chg_enable      0x82
#define         Chg_disable     0/******************** Device Address ********************/
#define         RTC_Address     0x64 /******************** Alarm register ********************/
#define		Alarm_SC	0x07
#define		Alarm_MN	0x08
#define		Alarm_HR	0x09
#define		Alarm_WK	0x0A
#define		Alarm_DY	0x0B
#define		Alarm_MO	0x0C
#define		Alarm_YR	0x0D
#define		Alarm_EN	0x0E/******************** Control register ********************/
#define		CTR1            0x0F
#define		CTR2            0x10
#define		CTR3            0x11/***************** Timer Counter Register ***********************/
#define		Timer_Counter1	0x13
#define		Timer_Counter2	0x14
#define		Timer_Counter3	0x15/******************** Battery register ********************/
#define		Chg_MG          0x18		//充电管理寄存器地址
#define		Bat_H8          0x1A		//电量最高位寄存器地址
#define		Bat_L8          0x1B		//电量低八位寄存器地址/**********************************************************/
#define         ID_Address       0x72           //ID号起始地址/********************** 报警中断宏定义 *********************/
#define		sec_ALM					0x01
#define		min_ALM					0x02
#define		hor_ALM					0x04
#define		wek_ALM					0x08
#define		day_ALM					0x10
#define		mon_ALM					0x20
#define		yar_ALM					0x40/********************** 中断使能宏定义 **********************/
#define		INTDE					0x04		//倒计时中断
#define		INTAE					0x02		//报警中断
#define		INTFE					0x01		//频率中断/********************** 中断演示宏定义 **********************/
#define 	FREQUENCY				0		//频率中断
#define 	ALARM					1		//报警中断
#define 	COUNTDOWN				2		//倒计时中断
#define 	DISABLE					3		//禁止中断/*************** 中断输出类型选择,请自行选择 ****************/
#define 	INT_TYPE			COUNTDOWN //定义中断输出类型/********** I2C端口初始化函数 *********/
void IIC_Init(void);/********** RTC读写时间函数 *********/
void I2CWriteDate(Time_Def *SetRTC);
void I2CReadDate(Time_Def *psRTC);/****** I2C连续读写多字节函数 *******/
u8 I2CWriteSerial(u8 DeviceAddress, u8 Address, u8 length,u8 *ps);//I2C连续写多个字节
u8 I2CReadSerial(u8 DeviceAddress, u8 Address, u8 length,u8 *ps);//I2C连续读多个字节/*********RTC中断配置函数*********/
void Set_CountDown(CountDown_Def *CountDown_Init);
void Set_Alarm(u8 Enable_config, Time_Def *psRTC);
void SetFrq(enum Freq F_Out);
void ClrINT(u8 int_EN);#endif

 后期会对这款芯片做一个实际的测试,驱动代码以及使用注意都会详细写出来。


http://www.ppmy.cn/news/338102.html

相关文章

时钟传感器—DS3231

时钟传感器—DS3231 DS3231概述DS3231引脚DS3231寄存器DS3231 操作 DS3231概述 DS3231是一款高精度I2C实时时钟器件内部带温度补偿、闰年补偿提供两个可编程日历闹钟提供秒、分、时、星期、日期、月、年等信息。RST 引脚提供外部按钮输入功能&#xff0c;并可用于指示电源故障…

DS3231SN

Maxim Integrated新型实时时钟(RTC) DS3231,内部集成了TCXO、RTC和32.768kHz晶体,并采用低成本、标准型、16引脚SOIC封装DS3231是低成本、高精度IC实时时钟(RTC)&#xff0c;具有集成的温补晶振(TCXO)和晶体。该器件包含电池输入端&#xff0c;断开主电源时仍可保持精确的计时。…

PVE7.1虚拟机安装黑群晖教程

本教程基于Proxmox VE&#xff08;PVE&#xff09;7.1虚拟机环境下安装群晖&#xff0c;兼容这块简单说明:Intel酷睿四代以下或者志强处理器建议安装Ds3615-3617-3266等版本&#xff0c;四代以上可以安装918-920等版本&#xff0c;如果你啥都不知道&#xff0c;安装Ds3615就对了…

旧电脑安装黑群晖(5.1-5022)

家里旧电脑闲来没用&#xff0c;安装家庭NAS黑群晖 1.下载黑群晖安装工具包&#xff1a;https://pan.baidu.com/s/12CeLJmc5iC4XdRdzzqMGoQ 2.使用ChipEasy检查并记录U盘的VID PID对应文件目录为&#xff1a;\黑群晖\相关软件\1)ChipEasy芯片无忧_V1.6_Beta3\ChipEasy芯片无忧…

黑群晖6.x安装教程

黑群晖6.x安装教程 黑群晖6.x安装教程产品知识常用黑群晖型号DS3615xs、DS916、DS3617xs、DS918 4个的区别黑群没洗白、洗半白、洗全白的区别 安装教程&#xff08;主要&#xff09;群晖6.2.3安装教程前提工作1、U盘&#xff08;8g&#xff09;2、引导文件系统文件相关操作工具…

51单片机 (十四)DS1302

1.DS1302介绍 DS1302是由美国DALLAS公司推出的具有涓细电流充电能力的低功耗实时时钟芯片。它可以对年、月、日、周、时、分、秒进行计时&#xff0c;且具有闰年补偿等多种功能RTC(Real Time Clock)&#xff1a;实时时钟&#xff0c;是一种集成电路&#xff0c;通常称为时钟芯…

虚拟机ESXi6.7安装黑群晖教程

目录 1.下载ESXi安装包并制作ESXi安装优盘 2.在ESXi中配置SATA控制器直通 3.下载黑群晖引导文件 4.修改引导文件 5转换引导文件 6.创建黑群晖虚拟机 7.安装黑群晖系统 8.小结 1-下载ESXi安装包并制作ESXi安装优盘 首先去[VMWARE](https://www.vmware.com/cn.html)官网下…

51单片机——DS1302时钟

目录 1.前言 1.1 实验现象 2. DS1302的介绍 2.1 DS1302的引脚定义以及应用电路 2.2 DS1302内部结构 2.21 DS1302内部特殊寄存器 2.22 时序 2.3 BCD码 3.源码 3.1 main.c 3.2 DS1302.c 3.3 DS1302.h 3.4 LCD1602.c 3.5 Delay.c 3.6 Delay.h 1.前言 之前我们已经…