时钟测试完毕

This commit is contained in:
2026-08-28 21:59:04 +08:00
parent 02a05a7a63
commit 565f23ea18
6 changed files with 259 additions and 324 deletions

View File

@@ -30,8 +30,8 @@ uint8_t sd2506_bcd_to_dec(uint8_t bcd) {
}
/*
* 函数功能:十进制<EFBFBD>?BCD <EFBFBD>? * 入口参数dec - 十进制数<E588B6>? uint8_t 0 - 99
* <EFBFBD>?<3F>?值BCD 编码<E7BC96>? * 限定条件:输入值在 0 - 99 范围<E88C83>? * 函数说明:十位存入高 4 位个位存入<E5AD98>?4 <20>? */
* 函数功能:十进制BCD
* 入口参数dec - 十进制数 uint8_t 0 - 99 */
uint8_t sd2506_dec_to_bcd(uint8_t dec) {
return ((dec / 10) << 4) | (dec % 10);
}
@@ -177,17 +177,17 @@ int sd2506_init(void) {
return ret;
}
/* 上电重置充电寄存<EFBFBD>?18H = 82H (开启充<EFBFBD>? 5K电阻)
* 手册强烈建议每次上电时重置此<EFBFBD>?*/
/* 上电重置充电寄存18H = 82H (开启充 5K电阻)
* 手册强烈建议每次上电时重置此寄存器 */
ret = sd2506_write_reg(SD2506_REG_CHARGE, 0x82U);
if (ret != SD2506_OK) {
return ret;
}
/* 配置: 24小时<EFBFBD>? 自动复位使能
* 0FH = 0x20 (bit5=ARST=1, 其它标志位清<EFBFBD>?
* 写入时需注意: 写允许状态下 0FH <EFBFBD>?WRTC 位必须为1
* 此处直接写入 0x20 即可 (ARST=1, <EFBFBD>?WRTC <EFBFBD>? */
/* 配置: 24小时制,写允许状态下 0FH 的 WRTC 位必须为 1
* 0FH = 0x20 (bit5=ARST=1, 其它标志位清零)
* 注意: 写入时需注意 0FH WRTC 位必须为 1
* 此处直接写入 0x20 即可 (ARST=1, WRTC 位) */
ret = sd2506_write_reg(SD2506_REG_CTR1, SD2506_CTR1_WRITE_OFF);
if (ret != SD2506_OK) {
return ret;
@@ -197,13 +197,13 @@ int sd2506_init(void) {
}
/*
* 函数功能:设<EFBFBD>?RTC 时间日期
* 函数功能:设RTC 时间日期
* 入口参数p_time - 时间结构体指针,包含要设置的时间
* 返回值0 - 成功<EFBFBD>?2 - I2C 错误
* 限定条件sd2506_init() 已调<EFBFBD>?
* 函数说明<EFBFBD>?. 先开写保<EFBFBD>?
* 2. 一次性写<EFBFBD>?7 字节时间数据 (00H~06H)
* 3. 关闭写保<EFBFBD>?
* 返回值0 - 成功2 - I2C 错误
* 限定条件sd2506_init() 已调用成功
* 函数说明1. 先开写保
* 2. 一次性写7 字节时间数据 (00H~06H)
* 3. 关闭写保
*/
int sd2506_set_time(const sd2506_time_t *p_time) {
int ret = 0;
@@ -213,25 +213,25 @@ int sd2506_set_time(const sd2506_time_t *p_time) {
return SD2506_ERROR;
}
/* 组装 7 字节时间数据 (BCD <EFBFBD>? */
buf[0] = sd2506_dec_to_bcd(p_time->second); /* 00H: <EFBFBD>?*/
buf[1] = sd2506_dec_to_bcd(p_time->minute); /* 01H: <EFBFBD>?*/
buf[2] = sd2506_dec_to_bcd(p_time->hour) | 0x80U; /* 02H: <EFBFBD>?(bit7=1, 24小时<EFBFBD>? */
/* 组装 7 字节时间数据 (BCD 码) */
buf[0] = sd2506_dec_to_bcd(p_time->second); /* 00H: */
buf[1] = sd2506_dec_to_bcd(p_time->minute); /* 01H: */
buf[2] = sd2506_dec_to_bcd(p_time->hour) | 0x80U; /* 02H: (bit7=1, 24小时制) */
buf[3] = sd2506_dec_to_bcd(p_time->week); /* 03H: 星期 */
buf[4] = sd2506_dec_to_bcd(p_time->day); /* 04H: <EFBFBD>?*/
buf[5] = sd2506_dec_to_bcd(p_time->month); /* 05H: <EFBFBD>?*/
buf[6] = sd2506_dec_to_bcd(p_time->year - 2000U); /* 06H: <EFBFBD>?*/
buf[4] = sd2506_dec_to_bcd(p_time->day); /* 04H: */
buf[5] = sd2506_dec_to_bcd(p_time->month); /* 05H: */
buf[6] = sd2506_dec_to_bcd(p_time->year - 2000U); /* 06H: */
/* 开启写保护 */
ret = sd2506_write_enable();
if (ret != SD2506_OK) return ret;
/* 一次性写<EFBFBD>?7 字节时间数据 (00H~06H)
* 手册要求: 不可单独写某一个时间寄存器,否则可能引起错误进<EFBFBD>?*/
/* 一次性写7 字节时间数据 (00H~06H)
* 手册要求: 不可单独写某一个时间寄存器,否则可能引起错误进*/
ret = sd2506_write_regs(SD2506_REG_SEC, buf, 7);
if (ret != SD2506_OK) return ret;
/* 关闭写保<EFBFBD>?*/
/* 关闭写保*/
ret = sd2506_write_disable();
if (ret != SD2506_OK) return ret;
@@ -254,20 +254,20 @@ int sd2506_get_time(sd2506_time_t *p_time) {
return SD2506_ERROR;
}
/* 一次读<EFBFBD>?7 字节时间数据 (00H~06H)
* 手册说明: 读取时所有实时数据被锁存,避免错<EFBFBD>?*/
/* 一次读7 字节时间数据 (00H~06H)
* 手册说明: 读取时所有实时数据被锁存,避免错*/
ret = sd2506_read_regs(SD2506_REG_SEC, buf, 7);
if (ret != SD2506_OK) {
return ret;
}
p_time->second = sd2506_bcd_to_dec(buf[0] & 0x7FU); /* 00H: <EFBFBD>?*/
p_time->minute = sd2506_bcd_to_dec(buf[1] & 0x7FU); /* 01H: <EFBFBD>?*/
p_time->second = sd2506_bcd_to_dec(buf[0] & 0x7FU); /* 00H: */
p_time->minute = sd2506_bcd_to_dec(buf[1] & 0x7FU); /* 01H: */
p_time->hour = sd2506_bcd_to_dec(buf[2] & 0x7FU); /* 02H: 屏蔽 bit7 (12/24标志) */
p_time->week = sd2506_bcd_to_dec(buf[3] & 0x07U); /* 03H: 星期 */
p_time->day = sd2506_bcd_to_dec(buf[4] & 0x3FU); /* 04H: <EFBFBD>?*/
p_time->month = sd2506_bcd_to_dec(buf[5] & 0x1FU); /* 05H: <EFBFBD>?*/
p_time->year = sd2506_bcd_to_dec(buf[6]) + 2000U; /* 06H: <EFBFBD>?*/
p_time->day = sd2506_bcd_to_dec(buf[4] & 0x3FU); /* 04H: */
p_time->month = sd2506_bcd_to_dec(buf[5] & 0x1FU); /* 05H: */
p_time->year = sd2506_bcd_to_dec(buf[6]) + 2000U; /* 06H: */
return SD2506_OK;
}
@@ -294,12 +294,12 @@ int sd2506_get_temperature(int8_t *p_temp) {
return ret;
}
/* bit7 为符号位, 其余为温度<EFBFBD>?*/
/* bit7 为符号位, 其余为温度*/
if (val & 0x80U) {
/* 负温<EFBFBD>? 取补<EFBFBD>?*/
/* 负温 取补*/
*p_temp = (int8_t)(val | 0xF0U);
} else {
/* 正温<EFBFBD>?*/
/* 正温*/
*p_temp = (int8_t)(val & 0x7FU);
}
@@ -324,17 +324,17 @@ int sd2506_get_battery_voltage(uint16_t *p_voltage) {
return SD2506_ERROR;
}
/* 读取 1AH bit7 (BAT8_VAL) <EFBFBD>?1BH (BAT_VL) */
/* 读取 1AH bit7 (BAT8_VAL) 1BH (BAT_VL) */
ret = sd2506_read_reg(SD2506_REG_CTR5, &val_high);
if (ret != SD2506_OK) return ret;
ret = sd2506_read_reg(SD2506_REG_BAT_VAL, &val_low);
if (ret != SD2506_OK) return ret;
/* 组合 9 <EFBFBD>? bit8=BAT8_VAL(1AH bit7), bit7~0=BAT_VL(1BH)
* <EFBFBD>?1AH=80H, 1BH=30H => 电压 = 0x130 = 304 => 3.04V => 3040mV */
/* 组合 9 位值 bit8=BAT8_VAL(1AH bit7), bit7~0=BAT_VL(1BH)
* 例: 1AH=80H, 1BH=30H => 电压 = 0x130 = 304 => 3.04V => 3040mV */
uint16_t raw = ((val_high & 0x80U) << 1) | val_low;
*p_voltage = raw * 10; /* 转换为毫<EFBFBD>?(raw 单位 0.01V) */
*p_voltage = raw * 10; /* 转换为毫(raw 单位 0.01V) */
return SD2506_OK;
}
@@ -398,8 +398,8 @@ int sd2506_write_sram(uint8_t addr, const uint8_t *p_buf, uint8_t len) {
return SD2506_ERROR;
}
/* SRAM 无需开写保护即可写<EFBFBD>?(写保护仅<EFBFBD>?00H~71H 有效, SRAM <EFBFBD>?2CH~71H)
* 但为安全起见, SRAM 写入也走写保护流<EFBFBD>?*/
/* SRAM 无需开写保护即可写(写保护仅00H~71H 有效, SRAM 2CH~71H)
* 但为安全起见, SRAM 写入也走写保护流*/
int ret = 0;
ret = sd2506_write_enable();
if (ret != SD2506_OK) return ret;
@@ -429,29 +429,29 @@ int sd2506_set_alarm(const sd2506_time_t *p_time, uint8_t mask) {
}
/* 组装 8 字节报警数据 (07H~0EH) */
buf[0] = sd2506_dec_to_bcd(p_time->second) & 0x7FU; /* 07H: 秒报<EFBFBD>?*/
buf[1] = sd2506_dec_to_bcd(p_time->minute) & 0x7FU; /* 08H: 分报<EFBFBD>?*/
buf[2] = sd2506_dec_to_bcd(p_time->hour) & 0x3FU; /* 09H: 时报<EFBFBD>?(最高位始终<EFBFBD>?) */
buf[0] = sd2506_dec_to_bcd(p_time->second) & 0x7FU; /* 07H: 秒报 */
buf[1] = sd2506_dec_to_bcd(p_time->minute) & 0x7FU; /* 08H: 分报 */
buf[2] = sd2506_dec_to_bcd(p_time->hour) & 0x3FU; /* 09H: 时报最高位始终为0 */
buf[3] = 0x00U; /* 0AH: 星期报警 */
buf[4] = sd2506_dec_to_bcd(p_time->day) & 0x3FU; /* 0BH: 日报<EFBFBD>?*/
buf[5] = sd2506_dec_to_bcd(p_time->month) & 0x1FU; /* 0CH: 月报<EFBFBD>?*/
buf[6] = sd2506_dec_to_bcd(p_time->year - 2000U); /* 0DH: 年报<EFBFBD>?*/
buf[4] = sd2506_dec_to_bcd(p_time->day) & 0x3FU; /* 0BH: 日报 */
buf[5] = sd2506_dec_to_bcd(p_time->month) & 0x1FU; /* 0CH: 月报 */
buf[6] = sd2506_dec_to_bcd(p_time->year - 2000U); /* 0DH: 年报 */
buf[7] = mask; /* 0EH: 报警允许 */
/* 开启写保护 */
ret = sd2506_write_enable();
if (ret != SD2506_OK) return ret;
/* 写入报警寄存<EFBFBD>?(07H~0EH) */
/* 写入报警寄存(07H~0EH) */
ret = sd2506_write_regs(SD2506_REG_AL_SEC, buf, 8);
if (ret != SD2506_OK) return ret;
/* 使能报警中断: CTR2 <EFBFBD>?INTAE=1, INTS1=0, INTS0=1, IM=1 (周期<EFBFBD>? */
/* 使能报警中断: CTR2 INTAE=1, INTS1=0, INTS0=1, IM=1 (周期中断) */
ret = sd2506_write_reg(SD2506_REG_CTR2,
SD2506_CTR2_INTAE | SD2506_CTR2_INTS0 | SD2506_CTR2_IM);
if (ret != SD2506_OK) return ret;
/* 关闭写保<EFBFBD>?*/
/* 关闭写保*/
ret = sd2506_write_disable();
if (ret != SD2506_OK) return ret;
@@ -471,7 +471,7 @@ int sd2506_clear_alarm(void) {
int ret = 0;
uint8_t val = 0;
/* 读取 CTR1, ARST=1 时自动清<EFBFBD>?INTAF */
/* 读取 CTR1, ARST=1 时自动清INTAF */
ret = sd2506_read_reg(SD2506_REG_CTR1, &val);
if (ret != SD2506_OK) {
return ret;