一、为什么需要关注GX1307?

在便携设备、电池供电产品盛行的今天,实时时钟(RTC)芯片的功耗与稳定性直接决定用户体验。然而传统方案(如DS1307)存在价格高、电压范围窄等问题。国产GX1307的推出完美解决了这些痛点——它不仅100%软硬件兼容DS1307,更在功耗、电压适应性和成本上实现突破!

二、核心优势:不止于“替代”
特性 GX1307 竞品典型值
供电电压 2.0~5.5V(VBAT支持锂电) 4.5~5.5V
通信接口 100kHz I²C
时钟输出 可编程1Hz~32.768kHz
价格 降低30%+(国产化优势) 较高

📌 亮点功能

  • 闰年自动修正 + 掉电自动切换备用电源(VBAT支持锂电池)

  • 电源故障检测(VPF=1.25×VBAT),切换无感

  • 内置56字节SRAM,拓展数据存储能力

三、硬件设计“零改动”替代指南

引脚完全兼容!直接替换DS1307:

引脚

符号

说明

1

X1

X1是振荡器的输入,X2是振荡器的输出,连接到32.768kHZ石英晶体。内部振荡器电路设计X1,X2连接到12.5pF的负载电容(CL)。

2

X2

3

VBAT

标准3V锂电池或其他备用电源输入。电池电压必须保持在最小和最大限值之间才能正常工作。如果不需要备用电源,VBAT必须接地。内部电路访问RTC和用户RAM的电源故障跳闸点(VPF)电压设置为1.25 x VBAT。

4

GND

5

SDA

串行数据输入/输出。SDA是I2C串行接口的数据输入/输出。SDA引脚为漏极开路,需要外部上拉电阻。

6

SCL

串行时钟输入。SCL是I2C接口的时钟输入。SCL引脚为漏极开路,需要外部上拉电阻。

7

SQW

方波/输出驱动器。启用时,SQWE位设置为1,SQW/OUT引脚输出四个方波频率(1Hz、4kHz、8kHz、32kHz)之一。SQW/OUT引脚为漏极开路,需要外部上拉电阻。SQW/OUT在应用VCC或VBAT的情况下运行。如果不使用,此引脚可以悬空

8

VCC

主电源。当工作在正常电压范围时,设备可访问,数据可以写入和读取。当备份电源连接到设备并且VCC低于VTP时,读写被禁止。计时功能继续不受较低输入电压的影响。

设计注意

SDA/SCL/SQW需外接4.7kΩ上拉电阻。

四、实测性能对比

我们对GX1307进行多方面功能测试:

测试项 结果
32.768kHz输出精度 ±5ppm(外接12pF电容)
电源切换响应时间 <100μs
I²C通信稳定性 100kHz连续传输零错误

五、典型应用场景

GX1307是一款低功耗时钟/日历芯片,具有56字节的SRAM。时钟/日历提供秒、分钟、小时、天、日期、月份和年份信息。对于少于31天的月份,月底的日期会自动调整,包括闰年的更正。GX1307作为I2C总线上的从属设备运行,通过实现START条件并提供设备标识码和寄存器地址来获得访问,后续寄存器可以按顺序访问,直到执行STOP条件。当VCC降至1.25 x VBAT以下时,设备终止正在进行的访问并重置设备地址计数器,此时将无法识别设备的输入,以防止错误数据写入设备。当VCC降至VBAT以下时,设备将切换到低电流电池模式。通电后,当VCC大于VBAT+0.2V时,设备从电池切换到VCC,当VCC高于1.25 x VBAT时,设备识别输入。

  1. 便携医疗设备:电子体温计、血压仪(低至0.5μA电池模式电流)

  2. 智能电表:断电后依靠VBAT维持计时,数据不丢失

  3. 车载记录仪:宽电压(2.0~5.5V)适应车辆启动电压波动

  4. 手机备用时钟:主电源断开后由锂电池维持精准计时

六、工程师必看设计技巧
  1. 抗干扰设计

    • VCC引脚并联100nF陶瓷电容(文档第9章强调)

    • 晶振走线包地,远离高频信号源

  2. 省电秘籍

    • 关闭SQW输出可再降40%功耗(需时再使能)

    • 长期存储时拉低VBAT,彻底断电


七、封装信息
  • 封装:SOP-8(兼容DS1307焊盘)

  • 工作温度:-40℃ ~ +85℃

💡 替代提示
原有DS1307项目只需修改器件型号,无需改板/改代码!立享成本下降+性能提升双重红利!


立即点击👉 #GX1307 获取完整数据手册、参考设计
助力国产芯片崛起,从每一次设计选择开始!


#嵌入式开发 #国产芯片 #RTC #低功耗设计 #硬件替代

八、单片机驱动程序(附代码)

 STM32F103 + GX1307驱动实例

1、main.c

/******************** OLED显示函数 ********************/
#include "stm32f10x.h" // Device header
#include "Serial.h"
#include "Delay.h"
#include "GX1307.h"
#include "stdio.h"
#include "OLED.h"
 
/******************** OLED显示函数 ********************/
void OLED_ShowTime_GX1307(GX1307_Time *time)
{
	OLED_ShowString(1, 1, "GX1307");
	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:");
	OLED_ShowNum(4, 6, time->week, 1);
}
int main(void)
{
 
	OLED_Init(); // OLED初始化
	GX1307_Init();
 
	while (1)
	{
			 GX1307_Time get_GX1307_time;
			 GX1307_GetTime(&get_GX1307_time);
			 OLED_ShowTime_GX1307(&get_GX1307_time);
               
 
            /*  GX1307 设置时间 接收数据设置时间 	*/
			
				GX1307_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]};
				GX1307_Set_time(&init_time);

    }
 
}

1、GX1307.c

#include "GX1307.h"
#include "Delay.h"
#include "stdio.h" // printf用
#include "Serial.h"
#include "OLED.h"

/*引脚配置层*/

/**
 * 函    数:I2C写SCL引脚电平
 * 参    数:BitValue 协议层传入的当前需要写入SCL的电平,范围0~1
 * 返 回 值:无
 * 注意事项:此函数需要用户实现内容,当BitValue为0时,需要置SCL为低电平,当BitValue为1时,需要置SCL为高电平
 */
void GX1307_W_SCL(uint8_t BitValue)
{
	GPIO_WriteBit(GX1307_PORT, GX1307_SCL, (BitAction)BitValue); // 根据BitValue,设置SCL引脚的电平
																 //	Delay_us(2);												 // 延时10us,防止时序频率超过要求
}

/**
 * 函    数:I2C写SDA引脚电平
 * 参    数:BitValue 协议层传入的当前需要写入SDA的电平,范围0~1
 * 返 回 值:无
 * 注意事项:此函数需要用户实现内容,当BitValue为0时,需要置SDA为低电平,当BitValue为1时,需要置SDA为高电平
 */
void GX1307_W_SDA(uint8_t BitValue)
{
	GPIO_WriteBit(GX1307_PORT, GX1307_SDA, (BitAction)BitValue); // 根据BitValue,设置SDA引脚的电平,BitValue要实现非0即1的特性
																 // 延时10us,防止时序频率超过要求
}

/**
 * 函    数:I2C读SDA引脚电平
 * 参    数:无
 * 返 回 值:协议层需要得到的当前SDA的电平,范围0~1
 * 注意事项:此函数需要用户实现内容,当前SDA为低电平时,返回0,当前SDA为高电平时,返回1
 */
uint8_t GX1307_READ_SDA(void)
{
	uint8_t BitValue;

	BitValue = GPIO_ReadInputDataBit(GX1307_PORT, GX1307_SDA); // 读取SDA电平
	return BitValue;										   // 返回SDA电平
}

/**
 * 函    数:I2C初始化
 * 参    数:无
 * 返 回 值:无
 * 注意事项:此函数需要用户实现内容,实现SCL和SDA引脚的初始化
 */
void GX1307_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 = GX1307_SCL | GX1307_SDA;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GX1307_PORT, &GPIO_InitStructure);

	/*设置默认电平*/
	GPIO_SetBits(GX1307_PORT, GX1307_SCL | GX1307_SDA);
}

/*协议层*/

/**
 * 函    数:I2C起始
 * 参    数:无
 * 返 回 值:无
 */
void GX1307_Start(void)
{
	GX1307_W_SDA(1); // 释放SDA,确保SDA为高电平
	GX1307_W_SCL(1); // 释放SCL,确保SCL为高电平
	Delay_us(5);
	GX1307_W_SDA(0); // 在SCL高电平期间,拉低SDA,产生起始信号
	Delay_us(5);
	GX1307_W_SCL(0); // 起始后把SCL也拉低,即为了占用总线,也为了方便总线时序的拼接
}

/**
 * 函    数:I2C终止
 * 参    数:无
 * 返 回 值:无
 */
void GX1307_Stop(void)
{
	GX1307_W_SCL(0);
	GX1307_W_SDA(0); // 拉低SDA,确保SDA为低电平
	Delay_us(5);
	GX1307_W_SCL(1); // 释放SCL,使SCL呈现高电平
	Delay_us(5);
	GX1307_W_SDA(1); // 在SCL高电平期间,释放SDA,产生终止信号
}

/**
 * 函    数:I2C接收应答位
 * 参    数:无
 * 返 回 值:接收到的应答位,范围:0~1,0表示应答,1表示非应答
 */
uint8_t GX1307_ReceiveAck(void)
{
	uint8_t AckBit;				// 定义应答位变量
	GX1307_W_SDA(1);			// 接收前,主机先确保释放SDA,避免干扰从机的数据发送
								//	Delay_us(1);
	GX1307_W_SCL(1);			// 释放SCL,主机机在SCL高电平期间读取SDA
								//	Delay_us(1);
	AckBit = GX1307_READ_SDA(); // 将应答位存储到变量里

	if (AckBit)
	{
		printf("N0 ACK!");
		GX1307_Stop();
	}
	GX1307_W_SCL(0); // 拉低SCL,开始下一个时序模块
	return AckBit;	 // 返回定义应答位变量
}
/**
 * 函    数:I2C发送一个字节
 * 参    数:Byte 要发送的一个字节数据,范围:0x00~0xFF
 * 返 回 值:无
 */
void GX1307_SendByte(uint8_t Byte)
{
	uint8_t i;
	for (i = 0; i < 8; i++) // 循环8次,主机依次发送数据的每一位
	{
		/*两个!可以对数据进行两次逻辑取反,作用是把非0值统一转换为1,即:!!(0) = 0,!!(非0) = 1*/
		GX1307_W_SDA(!!(Byte & (0x80 >> i))); // 使用掩码的方式取出Byte的指定一位数据并写入到SDA线
		Delay_us(2);
		GX1307_W_SCL(1); // 释放SCL,从机在SCL高电平期间读取SDA
		Delay_us(3);
		GX1307_W_SCL(0); // 拉低SCL,主机开始发送下一位数据
		Delay_us(1);
	}

	GX1307_ReceiveAck();
}

/**
 * 函    数:I2C接收一个字节
 * 参    数:u8 ack
 * 返 回 值:接收到的一个字节数据,范围:0x00~0xFF
 */
uint8_t GX1307_ReceiveByte(u8 ack)
{
	uint8_t i, Byte = 0x00; // 定义接收的数据,并赋初值0x00,此处必须赋初值0x00,后面会用到
	GX1307_W_SDA(1);		// 接收前,主机先确保释放SDA,避免干扰从机的数据发送
	for (i = 0; i < 8; i++) // 循环8次,主机依次接收数据的每一位
	{
		GX1307_W_SCL(1); // 释放SCL,主机机在SCL高电平期间读取SDA
		Delay_us(3);
		if (GX1307_READ_SDA())
		{
			Byte |= (0x80 >> i);
		} // 读取SDA数据,并存储到Byte变量
		  // 当SDA为1时,置变量指定位为1,当SDA为0时,不做处理,指定位为默认的初值0
		GX1307_W_SCL(0); // 拉低SCL,从机在SCL低电平期间写入SDA
		Delay_us(4);
	}
	GX1307_SendAck(ack);
	return Byte; // 返回接收到的一个字节数据
}

/**
 * 函    数:I2C发送应答位
 * 参    数:Byte 要发送的应答位,范围:0~1,0表示应答,1表示非应答
 * 返 回 值:无
 */
void GX1307_SendAck(uint8_t AckBit)
{
	GX1307_W_SDA(AckBit); // 主机把应答位数据放到SDA线
	GX1307_W_SCL(1);	  // 释放SCL,从机在SCL高电平期间,读取应答位
						  //
	GX1307_W_SCL(0);	  // 拉低SCL,开始下一个时序模块
}

/*******************************************************
功能:GX1307_IIC写寄存器首地址
描述:连续写时,写首地址之后,读或者写:数据1-数据n
参数:8位寄存器地址
返回值:无
*********************************************************/
void GX1307_IIC_Write_PrimaryAddress(u8 Add)
{
	GX1307_Start();
	GX1307_SendByte(GX1307_ARR | Write);
	GX1307_SendByte(Add);
}
/*******************************************************
功能:GX1307_IIC写1个寄存器
描述:写一个寄存器地址和数据;		对应寄存器写入对应数据
参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void GX1307_IIC_Write_Register(u8 Add, u8 data)
{
	GX1307_Start();
	GX1307_SendByte(GX1307_ARR | Write);
	GX1307_SendByte(Add);

	GX1307_SendByte(data);
	GX1307_Stop();
}
/*******************************************************
功能:GX1307_IIC读寄存器首地址
描述:连续写时,写首地址之后,读或者写:数据1-数据n
参数:8位寄存器地址
返回值:无
*********************************************************/
void GX1307_IIC_Read_PrimaryAddress(u8 Add)
{
	GX1307_Start();
	GX1307_SendByte(GX1307_ARR | Write);
	GX1307_SendByte(Add);
	GX1307_Stop();

	// 读数据
	GX1307_Start();
	GX1307_SendByte(GX1307_ARR | Read);
}

/*******************************************************
功能:GX1307读1个寄存器
描述:读一个寄存器数据
参数:8位寄存器地址
返回值:16位寄存器数据
*********************************************************/
u8 GX1307_IIC_Read_Register(u8 Add)
{
	u8 data;
	GX1307_Start();
	GX1307_SendByte(GX1307_ARR | Write);
	GX1307_SendByte(Add);
	GX1307_Stop();
	// 读数据
	GX1307_Start();
	GX1307_SendByte(GX1307_ARR | Read);
	data = GX1307_ReceiveByte(1);

	GX1307_Stop();
	return data;
}
/*******************************************************
功能:GX1307_IIC写 	连续写多个寄存器
描述:连续写
参数:8位寄存器首地址,8位data(data[ ])
返回值:无
*********************************************************/
void GX1307_IIC_Write_Arr_Register(u8 Add, u8 data[])
{
	u8 i;
	// 计算数组的长度
	int length = sizeof(*data) / sizeof(data[0]);
	GX1307_Start();
	// Control Byte
	GX1307_SendByte(GX1307_ARR | Write);
	GX1307_SendByte(Add);
	for (i = 0; i < length; i++)
	{
		GX1307_SendByte(data[i]);
	}
	GX1307_Stop();
}
/*******************************************************
功能:GX1307_IIC写 	连续写多个寄存器写相同数据
描述:连续写
参数:8位寄存器首地址,8位寄存器个数,8位data(data)
返回值:无
*********************************************************/
void GX1307_Write_Register(u8 Add, u8 num, u8 data)
{
	u8 i;

	GX1307_Start();
	// Control Byte
	GX1307_SendByte(GX1307_ARR | Write);
	GX1307_SendByte(Add);
	for (i = 0; i < num; i++)
	{
		GX1307_SendByte(data);
	}
	GX1307_Stop();
}
/*******************************************************
功能:GX1307读OX00-0X06寄存器
描述:无
参数:8位寄存器首地址 ,读取寄存器个数
返回值:位寄存器数据
*********************************************************/
void GX1307_IIC_Read_Arr_Register(u8 Add, u8 num)
{
	u8 data[num];
	u8 i;
	GX1307_Start();
	GX1307_SendByte(GX1307_ARR | Write);
	GX1307_SendByte(Add);
	GX1307_Start();
	GX1307_SendByte(GX1307_ARR | Read);
	for (i = 0; i < num; i++)
	{

		if (i < (num - 1))
		{
			data[i] = GX1307_ReceiveByte(0);
		}
		else
		{
			data[i] = GX1307_ReceiveByte(1);
		}
		printf("Reg%02X: %02X \r\n", i + Add, data[i]);
	}

	GX1307_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);
}
/*******************************************************
功能:GX1307 时间输出
描述:读出芯片当前时间

参数:无
返回值:无
*********************************************************/
void GX1307_GetTime(GX1307_Time *time)
{
	uint8_t hour;
	// 写读寄存器首地址
	GX1307_IIC_Read_PrimaryAddress(0X00);

	time->sec = bcd_to_dec(GX1307_ReceiveByte(0) & 0x7F);	// 读取秒
	time->min = bcd_to_dec(GX1307_ReceiveByte(0) & 0x7F);	// 读取分钟
	hour = GX1307_ReceiveByte(0) & 0x7F;					// 读取小时
	time->week = bcd_to_dec(GX1307_ReceiveByte(0) & 0x07);	// 读取周数
	time->date = bcd_to_dec(GX1307_ReceiveByte(0) & 0x3F);	// 读取天
	time->month = bcd_to_dec(GX1307_ReceiveByte(0) & 0x1F); // 读取月
	time->year = bcd_to_dec(GX1307_ReceiveByte(1) & 0xFF);	// 读取年

	GX1307_Stop();
	if (hour & 0X40) // 十二进制
	{

		if (hour & 0X20)
		{
			time->hour = bcd_to_dec(hour & 0X1F);
			/* PM */
			//			time->hour += 12; // PM
			printf("20%02d年%02d月%02d日%02d时%02d分%02d秒PM", time->year, time->month, time->date, time->hour, time->min, time->sec);
		}
		else
		{
			time->hour = bcd_to_dec(hour & 0X1F);
			/* AM */
			printf("20%02d年%02d月%02d日%02d时%02d分%02d秒AM", time->year, time->month, time->date, time->hour, time->min, time->sec);
		}
	}
	else
	{
		time->hour = bcd_to_dec(hour & 0x3F);

		printf("20%02d年%02d月%02d日%02d时%02d分%02d秒", time->year, time->month, time->date, time->hour, time->min, time->sec);
	}

	printf("\r\n");
}

/*******************************************************
功能:GX1307 设置时间
描述:sec,min,hour,day,moom,year,week
参数:7个8位data
返回值:所有寄存器读数
*********************************************************/
// sec,min,hour,day,moom,year,week
void GX1307_Set_time(GX1307_Time *time)
{

	// 初始化开始计时执行一次
	if ((GX1307_IIC_Read_Register(0X00) & 0X80) == 0X01)
	{
		GX1307_IIC_Write_Register(0x00, 0x00); // 开始计时
											   //		printf("时间初始化完成,flag=%d\r\n", GX1307_IIC_Read_Register(0X00));
	}
	else
	{
		//		printf("时间已初始化,flag=%d\r\n", GX1307_IIC_Read_Register(0X00));
	}

	Delay_ms(1);

	GX1307_IIC_Write_Register(0x00, time->sec);	  // Sec
	GX1307_IIC_Write_Register(0x01, time->min);	  // Min
	GX1307_IIC_Write_Register(0x02, time->hour);  // Hour
	GX1307_IIC_Write_Register(0x03, time->week);  // Week
	GX1307_IIC_Write_Register(0x04, time->date);  // Day
	GX1307_IIC_Write_Register(0x05, time->month); // Mon
	GX1307_IIC_Write_Register(0x06, time->year);  // Year
}
/*******************************************************
功能:GX1307 读所有寄存器
描述:一个一个读

参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void Read_All_GX1307_Reg(void) // one by one read
{
	u8 tempdat[64], j;

	for (j = 0; j < 64; j++)
	{
		tempdat[j] = GX1307_IIC_Read_Register(j);
		printf("Reg%02X: %02X \r\n", j, tempdat[j]);
		Delay_us(2);
	}
}
/*******************************************************
功能:GX1307 时间计时测试
描述:sec,min,hour,day,moom,year,week
参数:7个8位data
返回值:所有寄存器读数
*********************************************************/
// sec,min,hour,day,moom,year,week
void GX1307_Set_time_test(GX1307_Time *time)
{

	// 初始化开始计时执行一次
	if ((GX1307_IIC_Read_Register(0X00) & 0X80) == 0X01)
	{
		GX1307_IIC_Write_Register(0x00, 0x00); // 开始计时
		printf("时间初始化完成,flag=%d\r\n", GX1307_IIC_Read_Register(0X00));
	}
	else
	{
		printf("时间已初始化,flag=%d\r\n", GX1307_IIC_Read_Register(0X00));
	}

	GX1307_IIC_Write_Register(0x00, time->sec);	  // Sec
	GX1307_IIC_Write_Register(0x01, time->min);	  // Min
	GX1307_IIC_Write_Register(0x02, time->hour);  // Hour
	GX1307_IIC_Write_Register(0x03, time->week);  // Week
	GX1307_IIC_Write_Register(0x04, time->date);  // Day
	GX1307_IIC_Write_Register(0x05, time->month); // Mon
	GX1307_IIC_Write_Register(0x06, time->year);  // Year

	// 读取时间
	GX1307_Time get_time;
	GX1307_GetTime(&get_time);
	printf("等待2s延时");
	printf("\r\n");

	Delay_ms(1000);
	Delay_ms(1000);
	// 读取时间
	GX1307_GetTime(&get_time);
	printf("\r\n");
}
/*******************************************************
功能:GX1307方波输出
描述:通过控制寄存器(地址 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
*********************************************************/
/*******************************************************
功能:GX1307  OUT输出
描述:通过控制寄存器(地址 0x07)可以设置 SQW/OUT 引脚的方波输出到高低电平
bit4需为0,控制bit7为0-1
参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void GX1307_IIC_Out(u8 data)
{
	if ((GX1307_IIC_Read_Register(0X00)) >> 7 == 0X01)
	{
		/* /如果未初始化,执行初始化时间 */
		GX1307_IIC_Write_Register(0X00, 0X00);
		printf("开始计时完成,flag=%d\r\n", GX1307_IIC_Read_Register(0X00));
	}
	else
	{
		printf("时间已开始计时,flag=%d\r\n", GX1307_IIC_Read_Register(0X00));
	}

	GX1307_IIC_Write_Register(0X07, data);
}

3、GX1307.h

#ifndef __GX1307_H
#define __GX1307_H 
  
#include "stm32f10x.h"
#include "GX1307.h"
#include "Delay.h"
#include "stdio.h" // printf用
#include "Serial.h"

#define GX1307_SCL GPIO_Pin_6
#define GX1307_SDA GPIO_Pin_7

#define GX1307_PORT GPIOB // IIC端口

#define GX1307_ARR 0XD0	  // IIC地址
#define	Write 0X00
#define	Read 0X01
// BCD转十进制
uint8_t bcd_to_dec(uint8_t val);
/* 时间结构体 */
typedef struct
{
	uint8_t year;
	uint8_t month;
	uint8_t date;
	uint8_t hour;
	uint8_t min;
	uint8_t sec;
	uint8_t week;
} GX1307_Time;

/*引脚配置层*/

/**
 * 函    数:I2C写SCL引脚电平
 * 参    数:BitValue 协议层传入的当前需要写入SCL的电平,范围0~1
 * 返 回 值:无
 * 注意事项:此函数需要用户实现内容,当BitValue为0时,需要置SCL为低电平,当BitValue为1时,需要置SCL为高电平
 */
void GX1307_W_SCL(uint8_t BitValue);
/**
 * 函    数:I2C写SDA引脚电平
 * 参    数:BitValue 协议层传入的当前需要写入SDA的电平,范围0~1
 * 返 回 值:无
 * 注意事项:此函数需要用户实现内容,当BitValue为0时,需要置SDA为低电平,当BitValue为1时,需要置SDA为高电平
 */
void GX1307_W_SDA(uint8_t BitValue);
/**
 * 函    数:I2C读SDA引脚电平
 * 参    数:无
 * 返 回 值:协议层需要得到的当前SDA的电平,范围0~1
 * 注意事项:此函数需要用户实现内容,当前SDA为低电平时,返回0,当前SDA为高电平时,返回1
 */
uint8_t GX1307_READ_SDA(void);
/**
 * 函    数:I2C初始化
 * 参    数:无
 * 返 回 值:无
 * 注意事项:此函数需要用户实现内容,实现SCL和SDA引脚的初始化
 */
void GX1307_Init(void);
/*协议层*/

/**
 * 函    数:I2C起始
 * 参    数:无
 * 返 回 值:无
 */
void GX1307_Start(void);
/**
 * 函    数:I2C终止
 * 参    数:无
 * 返 回 值:无
 */
void GX1307_Stop(void);
/**
 * 函    数:I2C接收应答位
 * 参    数:无
 * 返 回 值:接收到的应答位,范围:0~1,0表示应答,1表示非应答
 */
uint8_t GX1307_ReceiveAck(void);
/**
 * 函    数:I2C发送一个字节
 * 参    数:Byte 要发送的一个字节数据,范围:0x00~0xFF
 * 返 回 值:无
 */
void GX1307_SendByte(uint8_t Byte);
/**
 * 函    数:I2C接收一个字节
 * 参    数:u8 ack
 * 返 回 值:接收到的一个字节数据,范围:0x00~0xFF
 */
uint8_t GX1307_ReceiveByte(u8 ack);
/**
 * 函    数:I2C发送应答位
 * 参    数:Byte 要发送的应答位,范围:0~1,0表示应答,1表示非应答
 * 返 回 值:无
 */
void GX1307_SendAck(uint8_t AckBit);
/*******************************************************
功能:GX1307_IIC写寄存器首地址
描述:连续写时,写首地址之后,读或者写:数据1-数据n
参数:8位寄存器地址
返回值:无
*********************************************************/
void GX1307_IIC_Write_PrimaryAddress(u8 Add);
/*******************************************************
功能:GX1307_IIC写1个寄存器
描述:写一个寄存器地址和数据;		对应寄存器写入对应数据
参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void GX1307_IIC_Write_Register(u8 Add, u8 data);
/*******************************************************
功能:GX1307_IIC读寄存器首地址
描述:连续写时,写首地址之后,读或者写:数据1-数据n
参数:8位寄存器地址
返回值:无
*********************************************************/
void GX1307_IIC_Read_PrimaryAddress(u8 Add);
/*******************************************************
功能:GX1307读1个寄存器
描述:读一个寄存器数据
参数:8位寄存器地址
返回值:16位寄存器数据
*********************************************************/
u8 GX1307_IIC_Read_Register(u8 Add);
/*******************************************************
功能:GX1307_IIC写 	连续写多个寄存器
描述:连续写
参数:8位寄存器首地址,8位data(data[ ])
返回值:无
*********************************************************/
void GX1307_IIC_Write_Arr_Register(u8 Add, u8 data[]);
/*******************************************************
功能:GX1307_IIC写 	连续写多个寄存器写相同数据
描述:连续写
参数:8位寄存器首地址,8位寄存器个数,8位data(data)
返回值:无
*********************************************************/
void GX1307_Write_Register(u8 Add, u8 num, u8 data);
/*******************************************************
功能:GX1307读OX00-0X06寄存器
描述:无
参数:8位寄存器首地址 ,读取寄存器个数
返回值:位寄存器数据
*********************************************************/
void GX1307_IIC_Read_Arr_Register(u8 Add, u8 num);
/*******************************************************
功能:GX1307 时间输出
描述:读出芯片当前时间

参数:无
返回值:无
*********************************************************/
void GX1307_GetTime(GX1307_Time *time);
/*******************************************************
功能:GX1307 读所有寄存器
描述:一个一个读

参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void Read_All_GX1307_Reg(void);
/*******************************************************
功能:GX1307 设置时间,并读出时间
描述:sec,min,hour,day,moom,year,week
参数:7个8位data
返回值:所有寄存器读数
*********************************************************/
/*******************************************************
功能:GX1307 时间计时测试
描述:sec,min,hour,day,moom,year,week
参数:7个8位data
返回值:所有寄存器读数
*********************************************************/
// sec,min,hour,day,moom,year,week
void GX1307_Set_time_test(GX1307_Time *time);
// sec,min,hour,day,moom,year,week
void GX1307_Set_time(GX1307_Time *time);
/*******************************************************
功能:GX1307方波输出
描述:通过控制寄存器(地址 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
*********************************************************/
/*******************************************************
功能:GX1307  OUT输出
描述:通过控制寄存器(地址 0x07)可以设置 SQW/OUT 引脚的方波输出到高低电平
bit4需为0,控制bit7为0-1
参数:8位寄存器地址,8位data
返回值:无
*********************************************************/
void GX1307_IIC_Out(u8 data);
#endif
友情提示:
欢迎各位伙伴咨询、测试有任何问题可随时交流沟通。
TEL : 15134034823 !!! 欢迎骚扰,哈哈^_^。
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐