GX8025T-实时时钟芯片替代RX8025T:内置温度补偿全温5ppm以内,室温3.8ppm以内(含驱动示例)
本文详细介绍了中科银河芯GX8025T高精度实时时钟芯片的技术特性和应用方法。该芯片内置32.768KHz数字温度补偿晶体振荡器,支持I2C总线400KHz高速模式,具有定时闹钟、固定周期中断、闰年自动调整等功能。文章从芯片结构、中断配置、I2C通信协议三个方面展开说明,重点解析了寄存器配置、中断触发流程及典型应用场景,并提供了STM32F103的驱动代码实例。该芯片具有1.6-5.5V宽电压范围
·
● 内置高稳定度 32,768KHzDTCXO (数字温度补偿晶体振荡器)
● 支持 I2C 总线高速模式 (400KHz)
● 定时闹钟功能 (可设定:日期,星期,小时,分)
● 固定周期定时中断功能
● 时钟更新中断功能 (秒,分)
● 带使能的 32.768KHz 时钟输出 (FOE 和 FOUT 管脚)
● 闰年自动调整功能 (从 2000 到 2099 年)
● 宽接口电压范围: ( 1.6V-5.5V)
● 宽时间保持电压范围: (1.2V-5.5V)
● 低电流功耗: 𝟎. 𝟖𝛍𝐀/𝟑V(典型值)
本文基于中科银河芯GX8025T技术手册,全面解析这款高精度实时时钟模块的核心特性、寄存器配置及实战应用技巧。
一、概述
GX8025T 是一款内置 32.768KHz DTCXO 的高精度实时时钟芯片,兼容标准 I2C 接口。除了可以提供日历功能 (年,月,日,星期,小时,分,秒)和时钟计数功能外,该芯片还提供诸如闹钟功能,固定周期计时器,超时中断,32.768KHz 时钟输出等附加功能。该芯片采用 CMOS 工艺以降低芯片功耗,提高电池寿命。
二、芯片结构
2.1 结构框图

2.2 管脚描述

2.3 管脚功能

2.4 寄存器表

三、中断配置
3.1 固定周期定时中断
配置寄存器:
-
定时计数器0(0x0B):低8位计数值
-
定时计数器1(0x0C):高4位计数值
-
扩展寄存器(0x0D):TSEL[1:0]选择时钟源
| TSEL[1:0] | 时钟源 | 最小周期 |
|---|---|---|
| 00 | 4096Hz | 244.14μs |
| 01 | 64Hz | 15.625ms |
| 10 | 1Hz | 1s |
| 11 | 1/60Hz | 1min |
中断触发流程:

3.2 闹钟中断
关键配置:
闹钟中断功能用于产生设置了日期,天,小时,分钟的闹钟设置的闹钟中断事件。
当中断时间发生时,AF 位被置 1 并且/INT 管脚变成低电平表明一次中断时间的发生。

典型场景配置:
-
工作日7:00响铃:WADA=0,星期寄存器=0x3E(00111110b),小时=07,分钟=00
-
每月15日12:00:WADA=1,日寄存器=15,小时=12,分钟=003. 时钟输出控制
四、I²C通信协议
4.1 设备通信地址
-
写地址:0x64(01100100b)
-
读地址:0x65(01100101b)

4.2 典型应用

4.3 I2C总线协议
在以下描述中,假定 CPU 是主器件、GX8025T 是从器件。
a. 指定地址的写时序
GX8025T 包含地址自动加功能,一旦指定开始地址,GX8025T 在每次数据传输之后会自动(按字节)增加 地址。
(1)CPU 发送开始状态[S]。
(2)CPU 发送 GX8025T 的“从地址”,并将读写位设置为“写”模式。
(3)检查 GX8025T 发送的确认信号。
(4)CPU 传送“写地址”到 GX8025T。
(5)检查 GX8025T 发送的确认信号。
(6)CPU 发送“数据”到(4)中指定的地址。
(7)检查 GX8025T 发送的确认信号。
(8)按需要重复(6)和(7),地址会自动加。
(9)CPU 发送结束状态[P]
b. 指定地址的读时序
通过写模式设置要读的地址,然后进入读模式开始读数据
(1)CPU 发送开始状态[S]。
(2)CPU 发送 GX8025T 的“从地址”,并将读写位设置为“写”模式。
(3)检查 GX8025T 发送的确认信号。
(4)CPU 传送“读地址”到 GX8025T。
(5)检查 GX8025T 发送的确认信号。
(6)CPU 发送重启状态[Sr]。(注意,CPU 不发送结束状态[P])
(7)CPU 发送 GX8025T 的“从地址”,并将读写位设置为“读”模式。
(8)检查 GX8025T 发送的确认信号。(从现在开始,CPU 是接收端,GX8025T 是发送端)
(9)GX8025T 发送(4)中指定地址对应的“数据”。
(10)CPU 传送读地址到 GX8025T。
(11)按需要重复(9)和(10),地址会自动加。
(12)CPU 发送 ACK 信号”1”。(用于从器件结束发送)
(13)CPU 发送结束状态[P]。

c. 不指定地址的读时序
一旦开始设定了读模式,就可以立刻读出数据。这种情况下,读操作的地址是上次访问地址+1。
(1)CPU 发送开始状态[S]。
(2)CPU 发送 GX8025T 的“从地址”,并将读写位设置为“读”模式。
(3)检查 GX8025T 发送的确认信号。(从现在开始,CPU 是接收端,GX8025T 是发送端)
(4)GX8025T 接着上次访问地址开始发送“数据”。
(5)CPU 传送读地址到 GX8025T。
(6)按需要重复(4)和(5),地址会自动加。
(7)CPU 发送 ACK 信号”1”。(用于从器件结束发送)
(8)CPU 发送结束状态[P]。

4.4 与微控制器的连接方式

电路说明:
-
主电源与电池通过二极管并联
-
SDA/SCL/INT外接4.7kΩ上拉电阻
-
FOE引脚直接使能或MCU控制
单片机驱动程序
STM32F103 + GX8025T驱动实例
1、main.c
/******************** OLED显示函数 ********************/
#include "stm32f10x.h" // Device header
#include "Serial.h"
#include "Delay.h"
#include "GX8025T.h"
#include "stdio.h"
#include "OLED.h"
void OLED_ShowTime_GX8025T(GX8025T_Time *time)
{
OLED_ShowString(1, 1, "GX8025T_37k_34");
OLED_ShowNum(2, 1, 2000 + time->year, 4);
OLED_ShowString(2, 5, "-");
OLED_ShowNum(2, 6, time->month, 2);
OLED_ShowString(2, 8, "-");
OLED_ShowNum(2, 9, time->date, 2);
OLED_ShowNum(3, 1, time->hour, 2);
OLED_ShowString(3, 3, ":");
OLED_ShowNum(3, 4, time->min, 2);
OLED_ShowString(3, 6, ":");
OLED_ShowNum(3, 7, time->sec, 2);
OLED_ShowString(4, 1, "week:");
switch (time->week){
case 0X01: OLED_ShowNum(4, 6, 7, 1); break;
case 0X02: OLED_ShowNum(4, 6, 1, 1); break;
case 0X04: OLED_ShowNum(4, 6, 2, 1); break;
case 0X08: OLED_ShowNum(4, 6, 3, 1); break;
case 0X10: OLED_ShowNum(4, 6, 4, 1); break;
case 0X20: OLED_ShowNum(4, 6, 5, 1); break;
case 0X40: OLED_ShowNum(4, 6, 6, 1); break;
default: break;
}
int main(void)
{
OLED_Init(); // OLED初始化
GX8025T_Init();
while (1)
{
GX8025T_Time get_GX8025T_time;
GX8025T_GetTime(&get_GX8025T_time);
OLED_ShowTime_GX8025T(&get_GX8025T_time);
/* GX8025T 设置时间 接收数据设置时间 */
GX8025T_Time init_time = {
.year = RX_Buff[1], .month = RX_Buff[2], .date = RX_Buff[3],
.hour = RX_Buff[4], .min = RX_Buff[5], .sec = RX_Buff[6],
.week = RX_Buff[7]};
GX8025T_Set_time_L(&init_time);
Serial_SendByte(0xF4);
Serial_Start(); // UART开启接收
}
}
2、GX8025T.c
#include "GX8025T.h"
#include "Delay.h"
#include "stdio.h" // printf用
#include "Serial.h"
#include "OLED.h"
typedef enum {
SUNDAY = 0x01,
MONDAY = 0x02,
TUESDAY = 0x03,
WEDNESDAY = 0x04,
THURSDAY = 0x05,
FRIDAY = 0x06,
SATURDAY = 0x07
} Weekday_t;
// BCD转十进制
uint8_t bcd_to_dec(uint8_t val)
{
return ((val >> 4) * 10) + (val & 0x0F);
}
// 十进制转BCD
uint8_t dec_to_bcd(uint8_t val)
{
return ((val / 10) << 4) | (val % 10);
}
/**
* @brief 获取星期的字符串表示
* @param weekday 星期值
* @return 星期的字符串表示
*/
const char* GX8025T_GetWeekdayString(Weekday_t weekday) {
static const char *weekdayStr[] = {
"Invalid", "Sunday", "Monday", "Tuesday",
"Wednesday", "Thursday", "Friday", "Saturday"
};
if (weekday >= SUNDAY && weekday <= SATURDAY) {
return weekdayStr[weekday];
}
return weekdayStr[0];
}
/*引脚配置层*/
/**
* 函 数:I2C写SCL引脚电平
* 参 数:BitValue 协议层传入的当前需要写入SCL的电平,范围0~1
* 返 回 值:无
* 注意事项:此函数需要用户实现内容,当BitValue为0时,需要置SCL为低电平,当BitValue为1时,需要置SCL为高电平
*/
void GX8025T_W_SCL(uint8_t BitValue)
{
GPIO_WriteBit(GX8025T_PORT, GX8025T_SCL, (BitAction)BitValue); // 根据BitValue,设置SCL引脚的电平
Delay_us(4); // 延时10us,防止时序频率超过要求
}
/**
* 函 数:I2C写SDA引脚电平
* 参 数:BitValue 协议层传入的当前需要写入SDA的电平,范围0~1
* 返 回 值:无
* 注意事项:此函数需要用户实现内容,当BitValue为0时,需要置SDA为低电平,当BitValue为1时,需要置SDA为高电平
*/
void GX8025T_W_SDA(uint8_t BitValue)
{
GPIO_WriteBit(GX8025T_PORT, GX8025T_SDA, (BitAction)BitValue); // 根据BitValue,设置SDA引脚的电平,BitValue要实现非0即1的特性
Delay_us(5); // 延时10us,防止时序频率超过要求
}
/**
* 函 数:I2C读SDA引脚电平
* 参 数:无
* 返 回 值:协议层需要得到的当前SDA的电平,范围0~1
* 注意事项:此函数需要用户实现内容,当前SDA为低电平时,返回0,当前SDA为高电平时,返回1
*/
uint8_t GX8025T_READ_SDA(void)
{
uint8_t BitValue;
BitValue = GPIO_ReadInputDataBit(GX8025T_PORT, GX8025T_SDA); // 读取SDA电平
// Delay_us(5); // 延时10us,防止时序频率超过要求
return BitValue; // 返回SDA电平
}
/**
* 函 数:I2C初始化
* 参 数:无
* 返 回 值:无
* 注意事项:此函数需要用户实现内容,实现SCL和SDA引脚的初始化
*/
void GX8025T_Init(void)
{
/*开启时钟*/
// PB3,PB4,PA15这三个IO变为普通io,必须要进行如下的配置
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // 使能端口复用时钟
// GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); // 失能JTAG
/*GPIO初始化*/
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Pin = GX8025T_SCL | GX8025T_SDA;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GX8025T_PORT, &GPIO_InitStructure);
/*设置默认电平*/
GPIO_SetBits(GX8025T_PORT, GX8025T_SCL | GX8025T_SDA);
}
/*协议层*/
/**
* 函 数:I2C起始
* 参 数:无
* 返 回 值:无
*/
void GX8025T_Start(void)
{
GX8025T_W_SDA(1); // 释放SDA,确保SDA为高电平
GX8025T_W_SCL(1); // 释放SCL,确保SCL为高电平
Delay_us(2);
GX8025T_W_SDA(0); // 在SCL高电平期间,拉低SDA,产生起始信号
Delay_us(2);
GX8025T_W_SCL(0); // 起始后把SCL也拉低,即为了占用总线,也为了方便总线时序的拼接
}
/**
* 函 数:I2C终止
* 参 数:无
* 返 回 值:无
*/
void GX8025T_Stop(void)
{
GX8025T_W_SCL(0);
GX8025T_W_SDA(0); // 拉低SDA,确保SDA为低电平
Delay_us(2);
GX8025T_W_SCL(1); // 释放SCL,使SCL呈现高电平
Delay_us(2);
GX8025T_W_SDA(1); // 在SCL高电平期间,释放SDA,产生终止信号
}
/**
* 函 数:I2C接收应答位
* 参 数:无
* 返 回 值:接收到的应答位,范围:0~1,0表示应答,1表示非应答
*/
uint8_t GX8025T_ReceiveAck(void)
{
uint8_t AckBit; // 定义应答位变量
GX8025T_W_SDA(1); // 接收前,主机先确保释放SDA,避免干扰从机的数据发送
GX8025T_W_SCL(1); // 释放SCL,主机机在SCL高电平期间读取SDA
//
AckBit = GX8025T_READ_SDA(); // 将应答位存储到变量里
if (AckBit)
{
printf("N0 ACK!");
printf("\r\n");
}
GX8025T_W_SCL(0); // 拉低SCL,开始下一个时序模块
return AckBit; // 返回定义应答位变量
}
/**
* 函 数:I2C发送一个字节
* 参 数:Byte 要发送的一个字节数据,范围:0x00~0xFF
* 返 回 值:无
*/
void GX8025T_SendByte(uint8_t Byte)
{
uint8_t i;
for (i = 0; i < 8; i++) // 循环8次,主机依次发送数据的每一位
{
/*两个!可以对数据进行两次逻辑取反,作用是把非0值统一转换为1,即:!!(0) = 0,!!(非0) = 1*/
GX8025T_W_SDA(!!(Byte & (0x80 >> i))); // 使用掩码的方式取出Byte的指定一位数据并写入到SDA线
//
GX8025T_W_SCL(1); // 释放SCL,从机在SCL高电平期间读取SDA
//
GX8025T_W_SCL(0); // 拉低SCL,主机开始发送下一位数据
Delay_us(8);
}
GX8025T_ReceiveAck();
}
/**
* 函 数:I2C接收一个字节
* 参 数:u8 ack
* 返 回 值:接收到的一个字节数据,范围:0x00~0xFF
*/
uint8_t GX8025T_ReceiveByte(u8 ack)
{
uint8_t i, Byte = 0x00; // 定义接收的数据,并赋初值0x00,此处必须赋初值0x00,后面会用到
GX8025T_W_SDA(1); // 接收前,主机先确保释放SDA,避免干扰从机的数据发送
for (i = 0; i < 8; i++) // 循环8次,主机依次接收数据的每一位
{
GX8025T_W_SCL(1); // 释放SCL,主机机在SCL高电平期间读取SDA
//
if (GX8025T_READ_SDA())
{
Byte |= (0x80 >> i);
} // 读取SDA数据,并存储到Byte变量
// 当SDA为1时,置变量指定位为1,当SDA为0时,不做处理,指定位为默认的初值0
GX8025T_W_SCL(0); // 拉低SCL,从机在SCL低电平期间写入SDA
Delay_us(8);
//
}
GX8025T_SendAck(ack);
return Byte; // 返回接收到的一个字节数据
}
/**
* 函 数:I2C发送应答位
* 参 数:Byte 要发送的应答位,范围:0~1,0表示应答,1表示非应答
* 返 回 值:无
*/
void GX8025T_SendAck(uint8_t AckBit)
{
GX8025T_W_SDA(AckBit); // 主机把应答位数据放到SDA线
GX8025T_W_SCL(1); // 释放SCL,从机在SCL高电平期间,读取应答位
//
GX8025T_W_SCL(0); // 拉低SCL,开始下一个时序模块
}
/*******************************************************
功能:GX8025T_IIC写寄存器首地址
描述:连续写时,写首地址之后,读或者写:数据1-数据n
参数:8位寄存器地址
返回值:无
*********************************************************/
void GX8025T_IIC_Write_PrimaryAddress(u8 Add)
{
GX8025T_Start();
GX8025T_SendByte(GX8025T_ARR | 0X00);
GX8025T_SendByte(Add);
}
/*******************************************************
功能:GX8025T_IIC写1个寄存器
描述:写一个寄存器地址和数据; 对应寄存器写入对应数据
参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void GX8025T_IIC_Write_Register(u8 Add, u8 data)
{
GX8025T_Start();
GX8025T_SendByte(GX8025T_ARR | 0X00);
GX8025T_SendByte(Add);
GX8025T_SendByte(data);
GX8025T_Stop();
}
/*******************************************************
功能:GX8025T_IIC读寄存器首地址
描述:连续写时,写首地址之后,读或者写:数据1-数据n
参数:8位寄存器地址
返回值:无
*********************************************************/
void GX8025T_IIC_Read_PrimaryAddress(u8 Add)
{
GX8025T_Start();
GX8025T_SendByte(GX8025T_ARR | 0X00);
GX8025T_SendByte(Add);
GX8025T_Stop();
// 读数据
GX8025T_Start();
GX8025T_SendByte(GX8025T_ARR | 0X01);
}
/*******************************************************
功能:GX8025T读1个寄存器
描述:读一个寄存器数据
参数:8位寄存器地址
返回值:16位寄存器数据
*********************************************************/
u8 GX8025T_IIC_Read_Register(u8 Add)
{
u8 data;
GX8025T_Start();
GX8025T_SendByte(GX8025T_ARR | 0X00);
GX8025T_SendByte(Add);
GX8025T_Stop();
// 读数据
GX8025T_Start();
GX8025T_SendByte(GX8025T_ARR | 0X01);
data = GX8025T_ReceiveByte(1);
GX8025T_Stop();
return data;
}
/*******************************************************
功能:GX8025T_IIC写 连续写多个寄存器
描述:连续写
参数:8位寄存器首地址,8位data(data[ ])
返回值:无
*********************************************************/
void GX8025T_IIC_Write_Arr_Register(u8 Add, u8 data[])
{
u8 i;
// 计算数组的长度
int length = sizeof(*data) / sizeof(data[0]);
GX8025T_Start();
// Control Byte
GX8025T_SendByte(GX8025T_ARR | 0X00);
GX8025T_SendByte(Add);
for (i = 0; i < length; i++)
{
GX8025T_SendByte(data[i]);
}
GX8025T_Stop();
}
/*******************************************************
功能:GX8025T_IIC写 连续写多个寄存器写相同数据
描述:连续写
参数:8位寄存器首地址,8位寄存器个数,8位data(data)
返回值:无
*********************************************************/
void GX8025T_Write_Register(u8 Add, u8 num, u8 data)
{
u8 i;
GX8025T_Start();
// Control Byte
GX8025T_SendByte(GX8025T_ARR | 0X00);
GX8025T_SendByte(Add);
for (i = 0; i < num; i++)
{
GX8025T_SendByte(data);
}
GX8025T_Stop();
}
/*******************************************************
功能:GX8025T读OX00-0X06寄存器
描述:无
参数:8位寄存器首地址 ,读取寄存器个数
返回值:位寄存器数据
*********************************************************/
void GX8025T_IIC_Read_Arr_Register(u8 Add, u8 num)
{
u8 data[num];
u8 i;
GX8025T_Start();
GX8025T_SendByte(GX8025T_ARR | 0X00);
GX8025T_SendByte(Add);
GX8025T_Start();
GX8025T_SendByte(GX8025T_ARR | 0X01);
GX8025T_ReceiveAck();
for (i = 0; i < num; i++)
{
if (i < (num - 1))
{
data[i] = GX8025T_ReceiveByte(0);
}
else
{
data[i] = GX8025T_ReceiveByte(1);
}
printf("Reg%02X: %02X \r\n", i + Add, data[i]);
}
GX8025T_Stop();
// return data;
}
//// BCD转十进制
//uint8_t bcd_to_dec(uint8_t val)
//{
// return ((val >> 4) * 10) + (val & 0x0F);
//}
//// 十进制转BCD
//uint8_t dec_to_bcd(uint8_t val)
//{
// return ((val / 10) << 4) | (val % 10);
//}
/*******************************************************
功能:GX8025T 时间输出
描述:读出芯片当前时间
参数:无
返回值:无
*********************************************************/
void GX8025T_GetTime(GX8025T_Time *time)
{
// 写读寄存器首地址
GX8025T_IIC_Read_PrimaryAddress(0X00);
time->sec = bcd_to_dec(GX8025T_ReceiveByte(0) & 0x7F); // 读取秒
time->min = bcd_to_dec(GX8025T_ReceiveByte(0) & 0x7F); // 读取分钟
time->hour = bcd_to_dec(GX8025T_ReceiveByte(0) & 0x3F); // 读取小时
time->week =GX8025T_ReceiveByte(0) & 0x7F; // 读取周数
time->date = bcd_to_dec(GX8025T_ReceiveByte(0) & 0x3F); // 读取天
time->month = bcd_to_dec(GX8025T_ReceiveByte(0) & 0x1F); // 读取月
time->year = bcd_to_dec(GX8025T_ReceiveByte(1) & 0xFF); // 读取年
GX8025T_Stop();
printf("20%02d年%02d月%02d日%02d时%02d分%02d秒", time->year, time->month, time->date, time->hour, time->min, time->sec);
printf("\r\n");
}
/*******************************************************
功能:GX8025T 读所有寄存器
描述:一个一个读
参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void Read_All_GX8025T_Reg(void) // one by one read
{
u8 tempdat[64], j;
for (j = 0; j < 64; j++)
{
tempdat[j] = GX8025T_IIC_Read_Register(j);
printf("Reg%02X: %02X \r\n", j, tempdat[j]);
Delay_us(2);
}
}
/*******************************************************
功能:GX8025T 设置时间
描述:sec,min,hour,day,moom,year,week
参数:7个8位data
返回值:所有寄存器读数
*********************************************************/
// sec,min,hour,day,moom,year,week
void GX8025T_Set_time(GX8025T_Time *time)
{
GX8025T_IIC_Write_Register(0x00, time->sec); // Sec
GX8025T_IIC_Write_Register(0x01, time->min); // Min
GX8025T_IIC_Write_Register(0x02, time->hour); // Hour
switch (time->week) {
case 7: time->week = 0X01; break;
case 1: time->week = 0X02; break;
case 2: time->week = 0X04; break;
case 3: time->week = 0X08; break;
case 4: time->week = 0X10; break;
case 5: time->week = 0X20; break;
case 6: time->week = 0X40; break;
default: break;
}
GX8025T_IIC_Write_Register(0x03, time->week); // Week
GX8025T_IIC_Write_Register(0x04, time->date); // Day
GX8025T_IIC_Write_Register(0x05, time->month); // Mon
GX8025T_IIC_Write_Register(0x06, time->year); // Year
}
void GX8025T_Set_time_L(GX8025T_Time *time)
{
GX8025T_Start();
GX8025T_SendByte(GX8025T_ARR | 0X00);
GX8025T_SendByte(0X00);
GX8025T_SendByte(time->sec);
GX8025T_SendByte(time->min);
GX8025T_SendByte(time->hour);
switch (time->week) {
case 7: time->week = 0X01; break;
case 1: time->week = 0X02; break;
case 2: time->week = 0X04; break;
case 3: time->week = 0X08; break;
case 4: time->week = 0X10; break;
case 5: time->week = 0X20; break;
case 6: time->week = 0X40; break;
default: break;
}
GX8025T_SendByte(time->week);
GX8025T_SendByte(time->date);
GX8025T_SendByte(time->month);
GX8025T_SendByte(time->year);
GX8025T_Stop();
// GX8025T_IIC_Write_Register(0x00, time->sec); // Sec
// GX8025T_IIC_Write_Register(0x01, time->min); // Min
// GX8025T_IIC_Write_Register(0x02, time->hour); // Hour
// switch (time->week) {
// case 7: time->week = 0X01; break;
// case 1: time->week = 0X02; break;
// case 2: time->week = 0X04; break;
// case 3: time->week = 0X08; break;
// case 4: time->week = 0X10; break;
// case 5: time->week = 0X20; break;
// case 6: time->week = 0X40; break;
// default: break;
// }
// GX8025T_IIC_Write_Register(0x03, time->week); // Week
// GX8025T_IIC_Write_Register(0x04, time->date); // Day
// GX8025T_IIC_Write_Register(0x05, time->month); // Mon
// GX8025T_IIC_Write_Register(0x06, time->year); // Year
}
/*******************************************************
功能:GX8025T 时间计时测试
描述:sec,min,hour,day,moom,year,week
参数:7个8位data
返回值:所有寄存器读数
*********************************************************/
// sec,min,hour,day,moom,year,week
void GX8025T_Set_time_test(GX8025T_Time *time)
{
GX8025T_IIC_Write_Register(0x00, time->sec); // Sec
GX8025T_IIC_Write_Register(0x01, time->min); // Min
GX8025T_IIC_Write_Register(0x02, time->hour); // Hour
GX8025T_IIC_Write_Register(0x03, time->week); // Week
GX8025T_IIC_Write_Register(0x04, time->date); // Day
GX8025T_IIC_Write_Register(0x05, time->month); // Mon
GX8025T_IIC_Write_Register(0x06, time->year); // Year
// 读取时间
GX8025T_Time get_time;
GX8025T_GetTime(&get_time);
printf("等待2s延时");
printf("\r\n");
Delay_ms(1000);
Delay_ms(1000);
// 读取时间
GX8025T_GetTime(&get_time);
printf("\r\n");
}
/*******************************************************
功能:GX8025T方波输出
描述:通过控制寄存器(地址 0x07)可以设置 SQW/OUT 引脚的方波输出频率
bit7=0;bit4=1;
参数:8位data
返回值:无
RS1 RS0 输出频率
0 0 1Hz
0 1 4.096kHz
1 0 8.192kHz
1 1 32.768kHz
*********************************************************/
/*******************************************************
功能:GX8025T OUT输出
描述:通过控制寄存器(地址 0x07)可以设置 SQW/OUT 引脚的方波输出到高低电平
bit4需为0,控制bit7为0-1
参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void GX8025T_IIC_Out(u8 data)
{
if ((GX8025T_IIC_Read_Register(0X00)) >> 7 == 0X01)
{
/* /如果未初始化,执行初始化时间 */
GX8025T_IIC_Write_Register(0X00, 0X00);
printf("开始计时完成,flag=%d\r\n", GX8025T_IIC_Read_Register(0X00));
}
else
{
printf("时间已开始计时,flag=%d\r\n", GX8025T_IIC_Read_Register(0X00));
}
GX8025T_IIC_Write_Register(0X07, data);
}
3、GX8025T.h
#ifndef __GX8025T_H
#define __GX8025T_H
#include "stm32f10x.h"
#include "GX8025T.h"
#include "Delay.h"
#include "stdio.h" // printf用
#include "Serial.h"
#define GX8025T_SCL GPIO_Pin_6
#define GX8025T_SDA GPIO_Pin_7
#define GX8025T_PORT GPIOB // IIC端口
#define GX8025T_ARR 0X64 // IIC地址
#include "GX8025T.h"
#include "Delay.h"
#include "stdio.h" // printf用
#include "Serial.h"
#include "OLED.h"
/* 时间结构体 */
typedef struct
{
uint8_t year;
uint8_t month;
uint8_t date;
uint8_t hour;
uint8_t min;
uint8_t sec;
uint8_t week;
} GX8025T_Time;
/*引脚配置层*/
/**
* 函 数:I2C写SCL引脚电平
* 参 数:BitValue 协议层传入的当前需要写入SCL的电平,范围0~1
* 返 回 值:无
* 注意事项:此函数需要用户实现内容,当BitValue为0时,需要置SCL为低电平,当BitValue为1时,需要置SCL为高电平
*/
void GX8025T_W_SCL(uint8_t BitValue);
/**
* 函 数:I2C写SDA引脚电平
* 参 数:BitValue 协议层传入的当前需要写入SDA的电平,范围0~1
* 返 回 值:无
* 注意事项:此函数需要用户实现内容,当BitValue为0时,需要置SDA为低电平,当BitValue为1时,需要置SDA为高电平
*/
void GX8025T_W_SDA(uint8_t BitValue);
/**
* 函 数:I2C读SDA引脚电平
* 参 数:无
* 返 回 值:协议层需要得到的当前SDA的电平,范围0~1
* 注意事项:此函数需要用户实现内容,当前SDA为低电平时,返回0,当前SDA为高电平时,返回1
*/
uint8_t GX8025T_READ_SDA(void);
/**
* 函 数:I2C初始化
* 参 数:无
* 返 回 值:无
* 注意事项:此函数需要用户实现内容,实现SCL和SDA引脚的初始化
*/
void GX8025T_Init(void);
/*协议层*/
/**
* 函 数:I2C起始
* 参 数:无
* 返 回 值:无
*/
void GX8025T_Start(void);
/**
* 函 数:I2C终止
* 参 数:无
* 返 回 值:无
*/
void GX8025T_Stop(void);
/**
* 函 数:I2C接收应答位
* 参 数:无
* 返 回 值:接收到的应答位,范围:0~1,0表示应答,1表示非应答
*/
uint8_t GX8025T_ReceiveAck(void);
/**
* 函 数:I2C发送一个字节
* 参 数:Byte 要发送的一个字节数据,范围:0x00~0xFF
* 返 回 值:无
*/
void GX8025T_SendByte(uint8_t Byte);
/**
* 函 数:I2C接收一个字节
* 参 数:u8 ack
* 返 回 值:接收到的一个字节数据,范围:0x00~0xFF
*/
uint8_t GX8025T_ReceiveByte(u8 ack);
/**
* 函 数:I2C发送应答位
* 参 数:Byte 要发送的应答位,范围:0~1,0表示应答,1表示非应答
* 返 回 值:无
*/
void GX8025T_SendAck(uint8_t AckBit);
/*******************************************************
功能:GX8025T_IIC写寄存器首地址
描述:连续写时,写首地址之后,读或者写:数据1-数据n
参数:8位寄存器地址
返回值:无
*********************************************************/
void GX8025T_IIC_Write_PrimaryAddress(u8 Add);
/*******************************************************
功能:GX8025T_IIC写1个寄存器
描述:写一个寄存器地址和数据; 对应寄存器写入对应数据
参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void GX8025T_IIC_Write_Register(u8 Add, u8 data);
/*******************************************************
功能:GX8025T_IIC读寄存器首地址
描述:连续写时,写首地址之后,读或者写:数据1-数据n
参数:8位寄存器地址
返回值:无
*********************************************************/
void GX8025T_IIC_Read_PrimaryAddress(u8 Add);
/*******************************************************
功能:GX8025T读1个寄存器
描述:读一个寄存器数据
参数:8位寄存器地址
返回值:16位寄存器数据
*********************************************************/
u8 GX8025T_IIC_Read_Register(u8 Add);
/*******************************************************
功能:GX8025T_IIC写 连续写多个寄存器
描述:连续写
参数:8位寄存器首地址,8位data(data[ ])
返回值:无
*********************************************************/
void GX8025T_IIC_Write_Arr_Register(u8 Add, u8 data[]);
/*******************************************************
功能:GX8025T_IIC写 连续写多个寄存器写相同数据
描述:连续写
参数:8位寄存器首地址,8位寄存器个数,8位data(data)
返回值:无
*********************************************************/
void GX8025T_Write_Register(u8 Add, u8 num, u8 data);
/*******************************************************
功能:GX8025T读OX00-0X06寄存器
描述:无
参数:8位寄存器首地址 ,读取寄存器个数
返回值:位寄存器数据
*********************************************************/
void GX8025T_IIC_Read_Arr_Register(u8 Add, u8 num);
/*******************************************************
功能:GX8025T 时间输出
描述:读出芯片当前时间
参数:无
返回值:无
*********************************************************/
void GX8025T_GetTime(GX8025T_Time *time);
/*******************************************************
功能:GX8025T 读所有寄存器
描述:一个一个读
参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void Read_All_GX8025T_Reg(void);
/*******************************************************
功能:GX8025T 设置时间,并读出时间
描述:sec,min,hour,day,moom,year,week
参数:7个8位data
返回值:所有寄存器读数
*********************************************************/
/*******************************************************
功能:GX8025T 时间计时测试
描述:sec,min,hour,day,moom,year,week
参数:7个8位data
返回值:所有寄存器读数
*********************************************************/
// sec,min,hour,day,moom,year,week
void GX8025T_Set_time_test(GX8025T_Time *time);
// sec,min,hour,day,moom,year,week
void GX8025T_Set_time(GX8025T_Time *time);
void GX8025T_Set_time_L(GX8025T_Time *time);
/*******************************************************
功能:GX8025T方波输出
描述:通过控制寄存器(地址 0x07)可以设置 SQW/OUT 引脚的方波输出频率
bit7=0;bit4=1;
参数:8位data
返回值:无
RS1 RS0 输出频率
0 0 1Hz
0 1 4.096kHz
1 0 8.192kHz
1 1 32.768kHz
*********************************************************/
/*******************************************************
功能:GX8025T OUT输出
描述:通过控制寄存器(地址 0x07)可以设置 SQW/OUT 引脚的方波输出到高低电平
bit4需为0,控制bit7为0-1
参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void GX8025T_IIC_Out(u8 data);
#endif
友情提示:
欢迎各位伙伴咨询、测试有任何问题可随时交流沟通。
TEL : 15134034823 !!! 欢迎骚扰,哈哈^_^。
更多推荐




所有评论(0)