STM32F407软件模拟IIC驱动RX8025程序加原理图

一、RX8025T介绍
RX8025-T是一款拥有I2C接口和温度补偿功能的新型实时时钟芯片,内部集成32.768KHz温度补偿晶体振荡器,可用于各种需要高精度时钟的场合。通过设置相应补偿的控制位,可以实现不同间隔的温度补偿功能,从而大大提高了时钟的精度。芯片可设置四种不同的时段进行温度补偿,默认设置是2S补偿。该芯片采用C-MOS工艺生产,具有极低的功能消耗,可长期使用电池供电。

二、原理图
在这里插入图片描述
三、参考程序

u8 r8025_init(void)
{
    
    
	uint8_t val[3]={
    
    0x00,0x00,0x60};  //0x0D、0x0E、0x0F、三个寄存器的值,设置时间更新为“秒”更新,关闭所有闹钟,温补时间为2秒,打开时间更新中断,关闭其他中断。

	iic_init();  //iic接口初始化

	if(rx8025_write_data(RX8025T_EXT_REG,val,3))
		return 1;		
	return 0;
}
/*******************************************************************************
* 函数名: u8 rx8025_write_data(u8 addr, u8 *buf, u8 len)
* 描述  : 写RX8025T寄存器
* 参数  : addr寄存器地址,*buf写入的数据,len写入的长度
* 返回值: 1=操作失败,0=操作成功
*******************************************************************************/
u8 rx8025_write_data(u8 addr, u8 *buf, u8 len)
{
    
    
	uint8_t i;
	iic_start();
	iic_send_byte(0x64); //写操作指令
	if(iic_wait_ack())   //检测ACK信号
	{
    
    
		iic_stop();	 //发送IIC停止信号
		return 1;	
	}
	iic_send_byte(addr); //写寄存器存储地址
	if(iic_wait_ack()) 
	{
    
    
		iic_stop();
		return 1;	
	}	
	for(i=0; i<len; i++) //连续写
	{
    
    
		iic_send_byte(buf[i]);
		if(iic_wait_ack()) 
		{
    
    
			iic_stop();
			return 1;	
		}		
	}
	iic_stop();
	return 0;
}

/*******************************************************************************
* 函数名: u8 rx8025_read_data(u8 addr,u8 *buf,u8 len)
* 描述  : 读RX8025T寄存器
* 参数  : addr寄存器地址,*buf存储位置,len读取的长度
* 返回值: 1=操作失败,0=操作成功
*******************************************************************************/
u8 rx8025_read_data(u8 addr,u8 *buf,u8 len)
{
    
    
	u8 i;
	iic_start();
	iic_send_byte(0x64);  //写操作指令
	if(iic_wait_ack()) 
	{
    
    
		iic_stop();
		return 1;	
	}	
	iic_send_byte(addr);  //发送寄存器地址
	if(iic_wait_ack()) 
	{
    
    
		iic_stop();
		return 1;	
	}		
	iic_start();          //Sr条件,RESTART
	iic_send_byte(0x65);  //读操作指令
	if(iic_wait_ack()) 
	{
    
    
		iic_stop();
		return 1;	
	}	
	for(i=0; i<len; i++) //连续读
	{
    
    
		buf[i] =iic_read_byte(1);  //读取数据并发送ACK信号
	}
	//	iic_nack();         //发送一个‘1’
	iic_stop();
	return 0;
}

/*******************************************************************************
* 函数名: u8 get_rx8025_time(TIME* t)
* 描述  : 从RX8025T获取时间 
* 参数  : 存储时间的结构体
* 返回值: 0成功,1失败。
*******************************************************************************/
u8 get_rx8025_time(TIME *t)
{
    
    
	u8 rtc_str[7];

	if(rx8025_read_data(RX8025T_SEC_REG,rtc_str,7))  //获取日期与时间
		return 1;  //读取出错

	t->second = ((rtc_str[0]>>4)*10) + (rtc_str[0] & 0x0f);
	t->minute = ((rtc_str[1]>>4)*10) + (rtc_str[1] & 0x0f);
	t->hour   = ((rtc_str[2]>>4)*10) + (rtc_str[2] & 0x0f);
	t->week		= rtc_str[3];	
	t->day    = ((rtc_str[4]>>4)*10) + (rtc_str[4] & 0x0f);
	t->month  = ((rtc_str[5]>>4)*10) + (rtc_str[5] & 0x0f);
	t->year   = ((rtc_str[6]>>4)*10) + (rtc_str[6] & 0x0f);
	t->year+=2000;
	return 0;

}
/*******************************************************************************
* 函数名: u8 set_rx8025_time(TIME* t)
* 描述  : 设置RX8025T时间 
* 参数  : 存储时间的结构体
* 返回值: 0成功,1失败。
*******************************************************************************/
u8 set_rx8025_time(u16 year,u8 month,u8 day,u8 week,u8 hour,u8 minute,u8 second)
{
    
    
	u8 rtc_str[7];
	year-=2000;
	rtc_str[0] = ((second/10)<<4) | (second%10);
	rtc_str[1] = ((minute/10)<<4) | (minute%10);
	rtc_str[2] = ((hour/10)<<4) | (hour%10);
	rtc_str[3] = week;
	rtc_str[4] = ((day/10)<<4) | (day%10);
	rtc_str[5] = ((month/10)<<4) | (month%10);
	rtc_str[6] = ((year/10)<<4) | (year%10);

	if(rx8025_write_data(RX8025T_SEC_REG,rtc_str,7))	//写入日期与时间
		return 1; 
	else 
		return 0;
}

四、完整工程下载
完整工程请点击

猜你喜欢

转载自blog.csdn.net/qq_15181569/article/details/108781109