[嵌入式开发模块]DS3231时钟芯片 驱动程序

2019-11-11来源: eefocus关键字:DS3231  时钟芯片  驱动程序

刚刚写完DS3231时钟芯片的驱动程序。这里开源出来供大家使用。需要的自取。

先简单介绍下这个芯片,然后直接给驱动代码以及示例代码。


DS3231简介


简介


DS3231是一款低成本、高精度I2C实时时钟(RTC),具有集成的温补晶体振荡器(TCXO)和晶体。该器件包含电池输入端,断开主电源时认可保持精确的计时。其提供年、月、日、星期、时、分、秒信息,提供有效期到2100年的闰年补偿。


其带有两个提供不同精度的日历闹钟,可在指定时刻在引脚上产生中断信号。


支持快速(400kHz)I2C接口通讯。


时钟精度在0℃到+40℃为±2ppm,即一个月可能偏离5s多;在-40℃到+85℃为±3.5ppm。


除了时钟外,还提供精度为±3℃的数字温度传感器输出,内部会使用这个温度传感器自动进行补偿以保证时间精度。


典型工作电路

框图

寄存器


DS3231提供如下寄存器:


与DS3231的控制和交互就是通过存取这几个寄存器来实现的,驱动代码中提供了所有寄存器的结构体以及对寄存器的存取函数。


具体寄存器的意义请自己参照数据手册。


与芯片的I2C通讯


I2C通讯的基本原理可以见我的上一个文章https://blog.csdn.net/lin_strong/article/details/80259571,翻译的MC9S12XEP100的数据手册,里头有对I2C通讯的详细描述。



DS3231的主叫地址固定为0b1101000,其内部存在一个寄存器指针,指向下一次读/写的寄存器,每次读/写一次后指针都会自增1,到最后一个寄存器后再指向第一个寄存器。

进行写操作时第一个数据字节会对指针值进行修改。


驱动中提供的函数即封装了这个过程。


代码及测试


驱动代码


DS3231Driver.h


/*

*******************************************************************************************

*

*

*                                   DS3231 DRIVER MODULE

*                                  Freescale MC9S12XEP100

*                                      DS3231驱动模块

*

* File : DS3231Driver.h

* By   : Lin Shijun(http://blog.csdn.net/lin_strong)

* Date:  2018/05/14

* version: V1.0

* History: 2018/05/14  V1.0   the prototype

*********************************************************************************************

*/


#ifndef   DS3231_DRIVER_H

#define   DS3231_DRIVER_H


/*

********************************************************************************************

*                                   MISCELLANEOUS

********************************************************************************************

*/


#ifndef  FALSE

#define  FALSE    0

#endif


#ifndef  TRUE

#define  TRUE     1

#endif


/*

******************************************************************************************

*                                    CONSTANT

******************************************************************************************

*/

// address of register

typedef enum{

  RegAddr_Sec,    // Seconds              00-59

  RegAddr_Min,    // Minutes              00-59

  RegAddr_Hour,   // Hours                1–12 + AM/PM 00–23

  RegAddr_Day,    // Day                  1 - 7

  RegAddr_Date,   // Data                 01-31

  RegAddr_CMon,   // Century and month    Century + 01–12

  RegAddr_Year,   // Year                 00 - 99

  RegAddr_Sec_A1, // Alarm 1 Seconds      00-59

  RegAddr_Min_A1, // Alarm 1 Minutes      00-59

  RegAddr_Hour_A1,// Alarm 1 Hours        1–12 + AM/PM 00–23

  RegAddr_Da_A1,  // Alarm 1 Day/Date     1 - 7 / 1 – 31

  RegAddr_Min_A2, // Alarm 2 Minutes      00-59

  RegAddr_Hour_A2,// Alarm 2 Hours        1–12 + AM/PM 00–23

  RegAddr_Da_A2,  // Alarm 2 Day/Date     1 - 7 / 1 – 31

  RegAddr_Control,// Control

  RegAddr_CtlStat,// Control/Status

  RegAddr_AgOfset,// Aging offset

  RegAddr_TempMSB,// MSB of Temp

  RegAddr_TempLSB,// LSB of Temp

}DS3231REG_ADDR;

#define DS3231REG_ADDR_MAX  RegAddr_TempLSB

/*

*******************************************************************************************

*                               CONFIGURE 主配置

*******************************************************************************************

*/

#define DS3231_CALLADDR     0b1101000       // DS32331的主叫地址


/*

****************************************************************************************

*                                  ERROR CODES

****************************************************************************************

*/


#define DS3231_ERR_NULL   0      // if success

#define DS3231_ERR_COMM   1      // any error in communication

#define DS3231_ERR_REG    2      // wrong register 

#define DS3231_ERR_ARG    3      // if wrong argument



/*

******************************************************************************************

*                                  TYPE DEFINE

******************************************************************************************

*/


// struct of DS3231 register 

typedef struct {

  unsigned int sec_sd: 4; // ones digit of second  秒的个位

  unsigned int sec_td: 3; // tens digit of second  秒的十位

  unsigned int       : 1;

} REG_SEC;


typedef struct {

  unsigned int min_sd: 4; // ones digit of minute 分的个位

  unsigned int min_td: 3; // tens digit of minute   分的十位

  unsigned int       : 1;

} REG_MIN;


typedef union {

  struct{

    unsigned int hour_sd:4; // ones digit of hour 分的个位

    unsigned int hour_td:1; // tens digit of hour 分的个位

    unsigned int isPM   :1; // whether is pm

    unsigned int is12sys:1; // whether is 12 hours system. 

    unsigned int        :1;

  }SYS12;

  struct{

    unsigned int hour_sd:4; // ones digit of hour 分的个位

    unsigned int hour_td:2; // tens digit of hour   分的个位

    unsigned int is12sys:1; // whether is 12 hours system. 

    unsigned int        :1;

  }SYS24;

} REG_HOUR;


typedef struct {

  unsigned int day    : 3; // the day of the week 

  unsigned int        : 5;

} REG_DAY;


typedef struct {

  unsigned int date_sd: 4; // ones digit of second  秒的个位

  unsigned int date_td: 2; // tens digit of second  秒的十位

  unsigned int        : 2;

} REG_DATE;


typedef struct {

  unsigned int mon_sd: 4; // ones digit of month 月的个位

  unsigned int mon_td: 1; // tens digit of month 月的个位

  unsigned int       : 2; 

  unsigned int century:1; // hundreds digit of year

} REG_CMON;


typedef struct {

  unsigned int year_sd: 4; // ones digit of year 月的个位

  unsigned int year_td: 4; // tens digit of year 月的个位

} REG_YEAR;



typedef struct {

  unsigned int sec_sd: 4; // ones digit of second  秒的个位

  unsigned int sec_td: 3; // tens digit of second  秒的十位

  unsigned int A1M1  : 1;

} REG_SEC_A1;


typedef struct {

  unsigned int min_sd: 4; // ones digit of minute 分的个位

  unsigned int min_td: 3; // tens digit of minute   分的十位

  unsigned int A1M2  : 1;

} REG_MIN_A1;


typedef union {

  struct{

    unsigned int hour_sd:4; // ones digit of hour 分的个位

    unsigned int hour_td:1; // tens digit of hour 分的个位

    unsigned int isPM   :1; // whether is pm

    unsigned int is12sys:1; // whether is 12 hours system. 

    unsigned int A1M3   :1;

  }SYS12;

  struct{

    unsigned int hour_sd:4; // ones digit of hour 分的个位

    unsigned int hour_td:2; // tens digit of hour 分的个位

    unsigned int is12sys:1; // whether is 12 hours system. 

    unsigned int A1M3   :1;

  }SYS24;

} REG_HOUR_A1;


typedef union {

  struct{

    unsigned int day    : 4; // the day of the week 

    unsigned int        : 2;

unsigned int isDY   : 1; // day selected

unsigned int A1M4   : 1;

  }DAY;

  struct{

    unsigned int date_sd: 4; // ones digit of date

    unsigned int date_td: 2; // tens digit of date

unsigned int isDY   : 1; // day selected

unsigned int A1M4   : 1;

  }DATE;

} REG_DA_A1;


typedef struct {

  unsigned int min_sd: 4; // ones digit of minute 分的个位

  unsigned int min_td: 3; // tens digit of minute   分的十位

  unsigned int A2M2  : 1;

} REG_MIN_A2;


typedef union {

  struct{

[1] [2] [3] [4]
关键字:DS3231  时钟芯片  驱动程序 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479610.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM8 I/O口模拟I2C
下一篇:STM8S103之IO复用

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

ICC-AVR DS1821S温度报警程序
用DS1821的测温报警输出功能,已经过实测,可以用的,已批量用于产品。//ICC-AVR application builder : 2015-10-8 14:15:46// Target : M8// Crystal: 8.0000Mhz/*新片烧录程序,电容加热温度高低设置成0x14,0x13;化雪板设置成0X02,0X00*/#include <iom8v.h>#include <macros.h>#define uchar         unsigned char #define uint        
发表于 2019-11-14
ds18b20 温度模块串口显示简单代码
今天晚上没事干编了一个极简的一个小程序,虽然简单但是还是很稳定的,连接也很简单,用最小系统板p0.0口接上ds18b20模块就可以了#include <reg51.h>#include <intrins.h>#include <stdio.h>#include "DS18B20.h"#define OSC 11059200            //晶振频率#define BAUDRATE 9600    //波特率void main(void){   
发表于 2019-11-14
ds18b20 温度模块串口显示简单代码
51单片机DS18B20温度传感四位数码管显示报警
;       //定义DS18B20总线I/O        bit shanshuo_st;                            //闪烁间隔标志bit beep_st;                                  
发表于 2019-11-12
51单片机DS18B20温度传感四位数码管显示报警
基于51单片机的DS18B20温控系统设计
数字温度传感器DS18B20,因其内部集成了A/D转换器,使得电路结构更加简单,而且减少了温度测量转换时的精度损失,使得测量温度更加精确。数字温度传感器DS18B20只用一个引脚即可与单片机进行通信,大大减少了接线的麻烦,使得单片机更加具有扩展性。由于DS18B20芯片的小型化,更加可以通过单跳数据线就可以和主电路连接,故可以把数字温度传感器DS18B20做成探头,探入到狭小的地方,增加了实用性。更能串接多个数字温度传感器DS18B20进行范围的温度检测。1.2 温度控制系统的目的温度控制在日常生活及工业领域应用相当广泛,比如温室、水池、发酵缸、电源等场所的温度控制。而以往温度控制是由人工完成的而且不够重视,其实在很多场所
发表于 2019-11-11
基于51单片机的DS18B20温控系统设计
dsPIC30F6014 CAN总线发送功能+DS18B20温度采集
1。DS18B20定时采集温度2。温度采集时间间隔用T1定时器控制3。采集到的温度通过CAN总线送另一主机处理#include <p30f6014.h>             //dsPIC30F6014标准头文件  _FOSC(0x0ffe5);                 //4倍频晶振,Failsafe 时钟关闭  _FWDT(WDT_OFF);              
发表于 2019-11-09
PCF8563 时钟芯片驱动程序 (STM8S/STM8L)
模拟I2C读取时钟芯片PCF8563中的日期时间 #define SCLK_Clr() GPIO_ResetBits(GPIOD, GPIO_PIN_1)//SDA IIC接口的时钟信号#define SCLK_Set() GPIO_SetBits(GPIOD, GPIO_PIN_1)#define SDIN_Clr() GPIO_ResetBits(GPIOD, GPIO_PIN_2)//SCL IIC接口的数据信号#define SDIN_Set() GPIO_SetBits(GPIOD, GPIO_PIN_2)u8 buf[7];void SDA_IN(u8 in) {  if(in) 
发表于 2019-11-13
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved