PCF8563's second/minute/hour/day/weekday/month/year registers are contiguous (0x02-0x08), so PCF8563_ReadDateTime() bursts all 7 bytes in one transaction. PCF8563_ReadTime() becomes a thin wrapper that discards the date fields. WriteTime() is kept as its own 3-byte-only implementation (writing only sec/min/hour) rather than routed through the new WriteDateTime(), since forcing it through a 7-byte write would require synthesizing date values and risk corrupting the stored date; WriteDateTime() is added as a separate full 7-byte write for callers that actually have real date+weekday values to persist.
85 lines
2.9 KiB
C
85 lines
2.9 KiB
C
#ifndef __PCF8563_H__
|
||
#define __PCF8563_H__
|
||
|
||
#include "../App/config.h"
|
||
|
||
/* ====== PCF8563 器件地址与寄存器定义 ====== */
|
||
#define PCF8563_ADDR_READ 0xA3 // PCF8563 读地址 (0xA2 | 0x01)
|
||
#define PCF8563_ADDR_WRITE 0xA2 // PCF8563 写地址 (0xA2)
|
||
|
||
#define REG_CTRL_STATUS1 0x00 // 控制/状态寄存器 1
|
||
#define REG_CTRL_STATUS2 0x01 // 控制/状态寄存器 2
|
||
#define REG_VL_SECONDS 0x02 // 秒寄存器 (bit7 为 VL 保证标志)
|
||
#define REG_MINUTES 0x03 // 分钟寄存器
|
||
#define REG_HOURS 0x04 // 小时寄存器
|
||
#define REG_DAYS 0x05 // 日寄存器
|
||
#define REG_WEEKDAYS 0x06 // 星期寄存器
|
||
#define REG_MONTHS 0x07 // 月份寄存器 (bit7 为 C 世纪位)
|
||
#define REG_YEARS 0x08 // 年份寄存器
|
||
|
||
/**
|
||
* @brief 初始化 PCF8563 RTC 芯片
|
||
* @details 初始化 I2C 管脚高电平,并检测芯片启动状态
|
||
* @return bit 1: 芯片响应正常, 0: 通讯异常
|
||
*/
|
||
bit PCF8563_Init(void);
|
||
|
||
/**
|
||
* @brief 从 PCF8563 芯片读取当前时间 (时、分、秒)
|
||
* @param hour 小时指针 (0~23)
|
||
* @param min 分钟指针 (0~59)
|
||
* @param sec 秒钟指针 (0~59)
|
||
* @return bit 1: 读取成功, 0: 通讯失败
|
||
*/
|
||
bit PCF8563_ReadTime(u8 *hour, u8 *min, u8 *sec);
|
||
|
||
/**
|
||
* @brief 将指定的时间 (时、分、秒) 写入 PCF8563 芯片
|
||
* @param hour 小时 (0~23)
|
||
* @param min 分钟 (0~59)
|
||
* @param sec 秒钟 (0~59)
|
||
* @return bit 1: 写入成功, 0: 通讯失败
|
||
*/
|
||
bit PCF8563_WriteTime(u8 hour, u8 min, u8 sec);
|
||
|
||
/**
|
||
* @brief 从 PCF8563 芯片连续读取时间与日期 (时/分/秒/日/月/年)
|
||
* @param hour 小时指针 (0~23)
|
||
* @param min 分钟指针 (0~59)
|
||
* @param sec 秒钟指针 (0~59)
|
||
* @param day 日指针 (1~31)
|
||
* @param month 月指针 (1~12)
|
||
* @param year 年指针 (0~99,代表 2000~2099,不处理世纪位)
|
||
* @return bit 1: 读取成功, 0: 通讯失败
|
||
*/
|
||
bit PCF8563_ReadDateTime(u8 *hour, u8 *min, u8 *sec, u8 *day, u8 *month, u8 *year);
|
||
|
||
/**
|
||
* @brief 将指定的时间与日期一次性连续写入 PCF8563 芯片
|
||
* @param hour 小时 (0~23)
|
||
* @param min 分钟 (0~59)
|
||
* @param sec 秒钟 (0~59)
|
||
* @param day 日 (1~31)
|
||
* @param month 月 (1~12)
|
||
* @param year 年 (0~99,代表 2000~2099)
|
||
* @param weekday 星期 (0~6,需与软件侧约定的星期数值一致,芯片本身不做校验)
|
||
* @return bit 1: 写入成功, 0: 通讯失败
|
||
*/
|
||
bit PCF8563_WriteDateTime(u8 hour, u8 min, u8 sec, u8 day, u8 month, u8 year, u8 weekday);
|
||
|
||
/**
|
||
* @brief I2C 总线器件扫描诊断函数
|
||
* @details 逐个发送 I2C 写地址,检测总线上是否有响应的器件,并在串口打印发现的设备地址
|
||
*/
|
||
void PCF8563_ScanDiagnostic(void);
|
||
|
||
/**
|
||
* @brief 尝试直接用最底层时序试读 RTC 控制寄存器并输出 ACK 调试日志
|
||
*/
|
||
bit PCF8563_TryReadDiagnostic(void);
|
||
|
||
// 动态引脚对调标志 (由 pcf8563.c 维护,0: 默认, 1: 互换)
|
||
extern volatile u8 i2c_swapped;
|
||
|
||
#endif // __PCF8563_H__
|