一.引脚端口
![](https://i-blog.csdnimg.cn/blog_migrate/34b034d878305f48883830f7316baa7b.png)
PIN | Name | I/O | 说明 |
1 | N.C | I | 他的引脚没有连接到内部IC |
2 | SCL | I | I2C串行时钟同步 |
3 | FOUT | I/O | C-MOS 输出, 由 FOE 控制. 当 FOE 为高电平时, 输出 32.768 kHz 信号, 当停止输出时, FOUT pin 表现为高阻态 (high impedance) |
4 | N.C. | ||
5 | TEST | Input | 厂商测试 (不连接) |
6 | VDD | 供电正电压 | |
7 | FOE | Input | 用于控制 FOUT pin 的输出. 当此pin为高电平时, FOUT pin 为输出模式, 低电平时 FOUT pin 停止输出. |
8 | N.C. | ||
9 | N.C. | ||
10 | /INTA | O | 这个中断输出A引脚是N-ch开漏输出。 输出告警中断(Alarm_D)和周期中断。 |
11 | GND | 接地 | |
12 | /INTB | O | 这个中断输出B引脚是N-ch开漏输出。 输出告警中断(Alarm_W) |
13 | SDA | I/O | I2C的数据输入输出, 输出时为 N-ch开漏输出, 需要上拉电阻. |
14 | N.C. |
RX8025 是高精度I2C实时时钟芯片, I2C总线地址为固定的0x64
RX8025T 与 RX8025SA/NB 的区别
注意, RX-8025T 与 RX-8025SA/NB 只是部分相同, Pin不兼容, 寄存器也不完
、全相同
-
RX-8025SA/NB 晶振不带温度补偿, 但是可以微调走时精度
-
PIN: RX8025T 只有一个 /INT, RX8025SA 有两个 /INTA和/INTB
-
寄存器0x07:RX8025T 为 RAM 可以读写, RX8025SA 为 Digital Offset 用于调节 32.768 kHz 晶振精度
-
闹钟定义: RX8025T 为 0X08,0x09,0x0A, RX8025SA 为 周[0x08,0x09,0x0A], 日[0x0B,0x0C]
-
定时器: RX8025T 带一个双字节(12bit)计数器, RX8025SA 没有
-
小时格式: RX8025T 只支持24H, RX8025SA 区分12H和24H
二.RX8025寄存器定义
/******************************* RX8025寄存器定义 ***************************/
#define RX_SECONDS 0x00 // 秒寄存器地址
#define RX_MINUTES 0x01 // 分寄存器地址
#define RX_HOURS 0x02 // 时寄存器地址
#define RX_WEEKDYS 0x03 // 星期寄存器地址,bit0~bit7对应日、一、二、三、四、五、六,对应值为0x01,0x02,0x04,0x08,0x10,0x20,0x40,不可出现2位为1的情况。
#define RX_DAYS 0x04 // 日寄存器地址
#define RX_MONTHS 0x05 // 月寄存器地址
#define RX_YEARS 0x06 // 年寄存器地址
#define RX_OFFSET 0x07 // 精度调整寄存器地址
#define RX_AWMINUTE 0x08 // 闹钟分寄存器地址,中断INTB引脚上
#define RX_AWHOUR 0x09 // 闹钟时寄存器地址,中断INTB引脚上
#define RX_AWWEEK 0x0A // 闹钟周寄存器地址,中断INTB引脚上
#define RX_ADMINUTE 0x0B // 闹钟分寄存器地址,中断INTA引脚上
#define RX_ADHOUR 0x0C // 闹钟时寄存器地址,中断INTA引脚上
#define RX_EXT_REG 0x0D //扩展寄存器,bit7-TEST=工厂测试,总应该写0;bit6-WADA=星期或日历报警选择位;bit5-USEL=选择秒或分钟更新触发更新中断,0=秒更新,1=分钟更新;
//bit4-TE=周期定时使能;bit3\2-FSEL1\0=芯片FOUT引脚输出频率选择位;bit1\0-TSEL1\0=用来设定固定周期的内部时钟源。
#define RX_CONTROL1 0x0E // 控制寄存器1地址
#define RX_CONTROL2 0x0F // 控制寄存器2地址
![](https://i-blog.csdnimg.cn/blog_migrate/c132e4518591f540b89c8a36b0fa2d48.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b286c6bd26d13c0cbee072e0d9d20e91.png)
三.RX8025 读写操作
![](https://i-blog.csdnimg.cn/blog_migrate/af68d89e0f0b1000ae6c0395e7d71fed.png)
1) Write via I2C bus
![](https://i-blog.csdnimg.cn/blog_migrate/5711a1e3b350678a37ce33817bdb31a8.png)
-
发送起始信号
-
写从机地址 0x64
-
应答信号
-
地址+传输模式规范(高四位地址+低四位)
-
应答信号
-
写数据
-
应答信号+停止信号
/*******************************************************************************
Function: bsp_simi2c_write
Description: I2C 通信写数据
Input: device_addr 设备地址
len 写入的数据长度
pBuffer 写入数据
Output: 无
Return: {true,false} true 写入成功, false 写入失败
*******************************************************************************/
uint8_t bsp_simi2c_write(uint8_t device_addr, uint8_t *pBuffer, uint8_t len)
{
uint8_t i;
bsp_simi2c_start();
I2C_Send_Byte(0x64); //写操作指令
if (iic_wait_ack() == false)
{
bsp_simi2c_stop();
return false;
}
I2C_Send_Byte(device_addrs);//IIC_Send_Byte(addr<<4); 地址在高四位
//I2C_Send_Byte(device_addrs|0x01);
if(iic_wait_ack() == false)
{
bsp_simi2c_stop();
return false;
}
for (i = 0; i < len; i++)
{
I2C_Send_Byte(*( pBuffer + i));//数组形式 I2C_Send_Byte(pBuffer[i])
if (iic_wait_ack() == false)
{
bsp_simi2c_stop();
return false;
}
}
bsp_simi2c_stop(s_iic[hi2c]);
return true;
}
2) Read via I2C bus
![](https://i-blog.csdnimg.cn/blog_migrate/ee0da4647505519214ff1c0d6757800e.png)
-
发送起始信号
-
写从机地址 0x64
-
应答信号
-
地址+传输模式规范(高四位地址+低四位)
-
应答信号
-
发送Restart命令
-
从机地址+读规范(0x65)
-
应答信号
-
读数据
-
应答信号
-
读数据(地址+1 连读)
-
非应答信号+停止信
/*******************************************************************************
* 函数名: 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)
{
unsigned char 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;
}
四.RX8025SA获取时间
/*******************************************************************************
Function: get_rx8025_time
Description: I2C RX8025SA获取时间
Input: device_addr 设备地址
len 读取的数据长度
pBuffer 读取数据
Output: 无
Return: {true,false} true 读取成功, false 读取失败
*******************************************************************************/
uint8_t get_rx8025_time(void)
{
uint8_t rtc_str[7];
if(bsp_simi2c_read(RX_SECONDS,rtc_str,7)) //if(bsp_simi2c_read(RX_SECONDS,rtc_str,sizeof(rtc_str)))获取日期与时间
{
return 1; //读取出错
}
RTCBuff[0] = ((rtc_str[0]>>4)*10) + (rtc_str[0] & 0x0f); //second
if(RTCBuff[0]>=60)
{
RTCBuff[0]=0;
}
RTCBuff[1] = ((rtc_str[1]>>4)*10) + (rtc_str[1] & 0x0f); //minute
if(RTCBuff[1]>=60)
{
RTCBuff[1]=0;
}
RTCBuff[2] = ((rtc_str[2]>>4)*10) + (rtc_str[2] & 0x0f); //hour
if(RTCBuff[2]>=24)
{
RTCBuff[2]=0;
}
RTCBuff[3] = ((rtc_str[4]>>4)*10) + (rtc_str[4] & 0x0f); //day
if(RTCBuff[3]>31)
{
RTCBuff[3]=1;
}
RTCBuff[4] = ((rtc_str[5]>>4)*10) + (rtc_str[5] & 0x0f); //month
if(RTCBuff[4]>12)
{
RTCBuff[4]=1;
}
RTCBuff[5] = ((rtc_str[6]>>4)*10) + (rtc_str[6] & 0x0f); //year
if(RTCBuff[5]>99)
{
RTCBuff[5]=20;
}
RTCBuff[6] = 20;
return 0;
}
RTCBuff[0] = ((rtc_str[0]>>4)*10) + (rtc_str[0] & 0x0f); //second
typedef struct // _TIME
{
u8 second;
u8 minute;
u8 hour;
u8 week;
u8 day;
u8 month;
u16 year;
}TIME;
/*******************************************************************************
* 函数名: 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;
}