8

STC8H开发(十四): I2C驱动RX8025T高精度实时时钟芯片 - Milton

 2 years ago
source link: https://www.cnblogs.com/milton/p/16479296.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

计时时钟芯片概览

常用的计时时钟芯片有 DS12C887, DS1302, DS1307, DS3231, RX8025, 各型号还有衍生型号. 可以看到到大部分是Dallas生产的芯片, RX8025的厂商是Epson. 其中

  • DS1302 和 DS1307 可以看成是同一芯片的不同协议版本(SPI和I2C), 需要外接晶振, 如果晶振不带温补, 计时误差受温度影响较大.
  • DS12C887是内建晶振的DS12C885, 在出厂时已经经过校准, 在+25°C时误差为±1分钟/月. DS12C887使用并口, 比较浪费IO资源, 另外体积也较大, 现在大都用于DIY用途.
  • DS3231 自带温补晶振, 精度很高, 在[-40°C, 85°C]范围内误差 ±0.432秒/天(±13秒/月). 是当之无愧的明星型号, 市面上有成品模块, 有Arduino lib, 用起来相当方便.
  • RX8025 也自建温补晶振, 精度与 DS3231 相当, 但是在市面上少见得多. 作为一个性价比非常高的型号, 有必要单独介绍一下.

RX8025T 简介

650273-20220716103503044-898031593.jpg

RX8025T 是高精度I2C实时时钟芯片, I2C总线地址为固定的0x64

  • 400 kHz I2C接口
  • 内置 32.768 kHz 温度补偿晶振(DTCXO), 计时精度很高
  • 计时包含秒, 分, 时, 日, (周)日, 月, 年, 没有世纪. 对年份2000至2099有闰年补偿
  • 1个可编程闹钟, 支持按天及按周天循环
  • 方波输出, 定时器输出
  • 贮存温度[-55°C, 125°C], 工作温度[-40°C, 85°C]
  • 误差(3.0V电压)
    • 温度范围[ 0°C, 50°C], 误差 ±10秒/月
    • 温度范围[-40°C, 85°C], 误差 ±13秒/月
  • 工作电压 1.6V - 5.5V (typical: 3.0V), 电压低于2.2V时, 温度补偿停止工作
  • 时钟保持电压 1.2V - 5.5V
  • 工作电流 0.8μA - 20 μA, 温补工作峰值电流900μA

RX8025T 与 RX8025SA/NB 的区别

注意, RX-8025T 与 RX-8025SA/NB 只是部分相同, Pin不兼容, 寄存器也不完全相同

  • 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

RX8025T 与 DS3231 相比

二者精度都很高, 误差接近

  • DS3231 有备用电池pin, RX8025T 没有
  • DS3231 有两组闹钟, RX8025T 只有一组闹钟
  • DS3231 没有定时器, RX8025T 有定时器

RX8025T 管脚和典型电路

650273-20220716103101587-972273942.png
PIN Name I/O 说明
1 T1(CE) Input 厂商测试 (不连接)
2 SCL Input I2C的时钟
3 FOUT Output 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 /INT Output 这个 pin 用于输出闹钟信号, 定时器信号, 时钟更新信号等, 这个pin为开漏输出.
11 GND 接地
12 T2(VPP) 厂商测试 (不连接)
13 SDA I/O I2C的数据输入输出, 输出时为 N-ch open drain, 需要上拉电阻.
14 N.C.

带备用电池的电路

650273-20220716103145929-59967279.png

RX8025T 的寄存器

Addr Name 说明
0x00 SEC 计时秒, BCD码[0, 59], 前六位有效
0x01 MIN 计时分钟, BCD码[0, 59], 前六位有效
0x02 HOUR 计时小时, BCD码[0, 23], 24小时制, 前五位有效
0x03 WEEK 计时日(周天), 每一个bit代表一天, 从bit0至bit6依次为周日, 周一, ..., 周六
0x04 DAY 计时日, BCD码[1, 31], 前五位有效
0x05 MONTH 计时月, BCD码[1, 12], 前四位有效
0x06 YEAR 计时年, BCD码[0, 99], 全八位有效
0x07 RAM 非功能, 可读写区域
0x08 MIN Alarm 闹钟分钟, BCD码[0, 59], 前六位有效. 第七位AE标识是否忽略(不参与比较), 0:否, 1:是
0x09 HOUR Alarm 闹钟小时, BCD码[0, 23], 前五位有效. 第七位AE标识是否忽略
0x0A WEEK Alarm / DAY Alarm 闹钟日(周天/日), 由 WADA 寄存器控制
闹钟周天, 每一个bit代表一天, 从bit0至bit6依次为周日至周六, 第七位AE标识是否忽略
闹钟日, BCD码[1, 31], 前五位有效, 第七位AE标识是否忽略
0x0B Timer Counter 0 计数器的低8位, HEX码(正常数值)
0x0C Timer Counter 1 计数器的高4位, HEX码(正常数值)
0x0D Extension Register 扩展功能寄存器
0x0E Flag Register 标志位寄存器
0x0F Control Register 控制位寄存器

STC8H 驱动 RX8025T

P32   -> SCL
P33   -> SDA
GND   -> GND
3.3V  -> VCC

代码下载地址

代码会将 RX8025T 时间设置为 2022-07-16 10:10:10, 然后每隔一秒显示一次时间, 数值为十六进制

10-10-10-40-16-07-22-01-00-04-00-00-00-00-00-40-
11-10-10-40-16-07-22-01-00-04-00-00-00-00-20-40-
12-10-10-40-16-07-22-01-00-04-00-00-00-00-20-40-
13-10-10-40-16-07-22-01-00-04-00-00-00-00-20-40-
14-10-10-40-16-07-22-01-00-04-00-00-00-00-20-40-
15-10-10-40-16-07-22-01-00-04-00-00-00-00-20-40-

读写时间的方法


__XDATA uint8_t buff[7];

uint8_t RX8025T_Write(uint8_t reg, uint8_t dat)
{
    return I2C_Write(RX8025T_I2C_ADDR, reg, &dat, 1);
}

// 初始化, 清除标志位, 关闭中断
uint8_t RX8025T_Init(void)
{
    // Reset all flags
    RX8025T_Write(RX8025T_REG_FLAG, 0x00);
    // Default , turn off all interrupts
    RX8025T_Write(RX8025T_REG_CONTROL, 0x40);
    return HAL_OK;
}

// 读取时间
uint8_t RX8025T_GetTime(uint8_t *t)
{
    I2C_Read(RX8025T_I2C_ADDR, RX8025T_REG_SECOND, t, 16);
    return HAL_OK;
}

// 设置时间
uint8_t RX8025T_SetTime(uint8_t *t)
{
    RX8025T_Write(RX8025T_REG_SECOND, t[0]);
    RX8025T_Write(RX8025T_REG_MINUTE, t[1]);
    RX8025T_Write(RX8025T_REG_HOUR, t[2]);
    
    RX8025T_Write(RX8025T_REG_WEEKDAY, t[3]);
    RX8025T_Write(RX8025T_REG_DAY, t[4]);
    RX8025T_Write(RX8025T_REG_MONTH, t[5]);
    RX8025T_Write(RX8025T_REG_YEAR, t[6]);
    return HAL_OK;
}

main方法示例

int main(void)
{
    uint8_t i;
    SYS_SetClock();
    // UART1 configuration: baud 115200 with Timer2, 1T mode, no interrupt
    UART1_Config8bitUart(UART1_BaudSource_Timer2, HAL_State_ON, 115200);

    GPIO_Init();
    I2C_Init();
    RX8025T_Init();
    time[0] = 0x10; // second
    time[1] = 0x10; // minute
    time[2] = 0x10; // hour
    time[3] = 0x40; // week day
    time[4] = 0x16; // day
    time[5] = 0x07; // month
    time[6] = 0x22; // year
    RX8025T_SetTime(time);

    while(1)
    {
        RX8025T_GetTime(time);
        for (i = 0; i < BUFF_SIZE; i++)
        {
            UART1_TxHex(time[i]);
            UART1_TxChar('-');
        }
        UART1_TxString("\r\n");
        SYS_Delay(1000);
    }
}

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK