一、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;
}
四、完整工程下载
完整工程请点击