如何将STC8H开发中的I2C驱动RX8025T高精度实时时钟芯片编写成一个长尾词?

2026-04-11 05:571阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计1760个文字,预计阅读时间需要8分钟。

如何将STC8H开发中的I2C驱动RX8025T高精度实时时钟芯片编写成一个长尾词?

RX8025自建温补晶振,精度与DS3231相当,性价比较高型号。RX8025有多种衍生型号,RX-8025T与RX-8025SA/NB的Pin不兼容,寄存器也不完全相同。本文介绍RX8025T的基本信息,寄存器说明和。

RX8025 自建温补晶振, 精度与 DS3231 相当, 一个性价比非常高的型号. RX8025有多个衍生型号, RX-8025T 与 RX-8025SA/NB 的 Pin不兼容, 寄存器也不完全相同. 本文介绍RX8025T的基本信息, 寄存器说明和如何使用STC8H驱动RX8025T 目录
  • STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)
  • STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解)
  • STC8H开发(三): 基于FwLib_STC8的模数转换ADC介绍和演示用例说明
  • STC8H开发(四): FwLib_STC8 封装库的介绍和使用注意事项
  • STC8H开发(五): SPI驱动nRF24L01无线模块
  • STC8H开发(六): SPI驱动ADXL345三轴加速度检测模块
  • STC8H开发(七): I2C驱动MPU6050三轴加速度+三轴角速度检测模块
  • STC8H开发(八): NRF24L01无线传输音频(对讲机原型)
  • STC8H开发(九): STC8H8K64U模拟USB HID外设
  • STC8H开发(十): SPI驱动Nokia5110 LCD(PCD8544)
  • STC8H开发(十一): GPIO单线驱动多个DS18B20数字温度计
  • STC8H开发(十二): I2C驱动AT24C08,AT24C32系列EEPROM存储
  • STC8H开发(十三): I2C驱动DS3231高精度实时时钟芯片
  • STC8H开发(十四): I2C驱动RX8025T高精度实时时钟芯片
计时时钟芯片概览

常用的计时时钟芯片有 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 简介

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 管脚和典型电路 管脚

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. 带备用电池的电路

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 示例代码

代码下载地址

如何将STC8H开发中的I2C驱动RX8025T高精度实时时钟芯片编写成一个长尾词?

  • GitHub github.com/IOsetting/FwLib_STC8/tree/master/demo/i2c/rx8025t
  • Gitee gitee.com/iosetting/fw-lib_-stc8/tree/master/demo/i2c/rx8025t

代码会将 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); } }

本文共计1760个文字,预计阅读时间需要8分钟。

如何将STC8H开发中的I2C驱动RX8025T高精度实时时钟芯片编写成一个长尾词?

RX8025自建温补晶振,精度与DS3231相当,性价比较高型号。RX8025有多种衍生型号,RX-8025T与RX-8025SA/NB的Pin不兼容,寄存器也不完全相同。本文介绍RX8025T的基本信息,寄存器说明和。

RX8025 自建温补晶振, 精度与 DS3231 相当, 一个性价比非常高的型号. RX8025有多个衍生型号, RX-8025T 与 RX-8025SA/NB 的 Pin不兼容, 寄存器也不完全相同. 本文介绍RX8025T的基本信息, 寄存器说明和如何使用STC8H驱动RX8025T 目录
  • STC8H开发(一): 在Keil5中配置和使用FwLib_STC8封装库(图文详解)
  • STC8H开发(二): 在Linux VSCode中配置和使用FwLib_STC8封装库(图文详解)
  • STC8H开发(三): 基于FwLib_STC8的模数转换ADC介绍和演示用例说明
  • STC8H开发(四): FwLib_STC8 封装库的介绍和使用注意事项
  • STC8H开发(五): SPI驱动nRF24L01无线模块
  • STC8H开发(六): SPI驱动ADXL345三轴加速度检测模块
  • STC8H开发(七): I2C驱动MPU6050三轴加速度+三轴角速度检测模块
  • STC8H开发(八): NRF24L01无线传输音频(对讲机原型)
  • STC8H开发(九): STC8H8K64U模拟USB HID外设
  • STC8H开发(十): SPI驱动Nokia5110 LCD(PCD8544)
  • STC8H开发(十一): GPIO单线驱动多个DS18B20数字温度计
  • STC8H开发(十二): I2C驱动AT24C08,AT24C32系列EEPROM存储
  • STC8H开发(十三): I2C驱动DS3231高精度实时时钟芯片
  • STC8H开发(十四): I2C驱动RX8025T高精度实时时钟芯片
计时时钟芯片概览

常用的计时时钟芯片有 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 简介

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 管脚和典型电路 管脚

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. 带备用电池的电路

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 示例代码

代码下载地址

如何将STC8H开发中的I2C驱动RX8025T高精度实时时钟芯片编写成一个长尾词?

  • GitHub github.com/IOsetting/FwLib_STC8/tree/master/demo/i2c/rx8025t
  • Gitee gitee.com/iosetting/fw-lib_-stc8/tree/master/demo/i2c/rx8025t

代码会将 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); } }