时钟测试完毕

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

@@ -92,6 +92,85 @@ static void sd2506_phase_basic(void)
}
#endif /* ENABLE_RTC_BASIC_TESTS */
/* ===================== Phase 2全功能 API 覆盖 ===================== */
#ifdef ENABLE_RTC_API_TESTS
static void sd2506_phase_api(void)
{
DBG_INFO("=== SD2506 Phase 2: full API coverage ===");
/* TC-RTC-010: BCD<->DEC 互转(纯算法,确定性,无需硬件交互) */
int conv_ok = 1;
uint8_t samples[][2] = {
{0, 0x00U}, {1, 0x01U}, {9, 0x09U}, {10, 0x10U}, {23, 0x23U},
{59, 0x59U}, {60, 0x60U}, {99, 0x99U}, {42, 0x42U}, {88, 0x88U}
};
for (uint32_t i = 0U; i < (sizeof(samples) / sizeof(samples[0])); i++) {
uint8_t dec = samples[i][0];
uint8_t bcd = samples[i][1];
if (sd2506_dec_to_bcd(dec) != bcd) {
conv_ok = 0;
DBG_ERROR(" dec_to_bcd(%u) != 0x%02X", (unsigned int)dec, (unsigned int)bcd);
}
if (sd2506_bcd_to_dec(bcd) != dec) {
conv_ok = 0;
DBG_ERROR(" bcd_to_dec(0x%02X) != %u", (unsigned int)bcd, (unsigned int)dec);
}
}
SD2506_TEST_CHECK(conv_ok, "bcd<->dec round-trip (10 samples)");
/* TC-RTC-011: 内部温度读取 */
int8_t temp = 0;
int ret = sd2506_get_temperature(&temp);
SD2506_TEST_CHECK(ret == SD2506_OK, "sd2506_get_temperature() ret=%d (expect 0)", ret);
if (ret == SD2506_OK) {
DBG_INFO(" temperature: %d C", (int)temp);
SD2506_TEST_CHECK(temp >= -40 && temp <= 85,
"temperature in range [-40,85]: %d", (int)temp);
}
/* TC-RTC-012: 电池电压(毫伏) */
uint16_t volt = 0U;
ret = sd2506_get_battery_voltage(&volt);
SD2506_TEST_CHECK(ret == SD2506_OK, "sd2506_get_battery_voltage() ret=%d (expect 0)", ret);
if (ret == SD2506_OK) {
DBG_INFO(" battery: %u mV", (unsigned int)volt);
SD2506_TEST_CHECK(volt > 2000U && volt < 5000U,
"battery voltage plausible: %u mV", (unsigned int)volt);
}
/* TC-RTC-013: 芯片 8 字节 ID */
uint8_t id[8] = {0};
ret = sd2506_get_id(id);
SD2506_TEST_CHECK(ret == SD2506_OK, "sd2506_get_id() ret=%d (expect 0)", ret);
if (ret == SD2506_OK) {
DBG_INFO(" id: %02X%02X%02X%02X%02X%02X%02X%02X",
id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7]);
}
/* TC-RTC-014: 用户 SRAM 读写回环addr=0, len=8 */
uint8_t wbuf[8] = {0xA1U, 0xB2U, 0xC3U, 0xD4U, 0xE5U, 0xF6U, 0x07U, 0x18U};
uint8_t rbuf[8] = {0};
ret = sd2506_write_sram(0U, wbuf, 8U);
SD2506_TEST_CHECK(ret == SD2506_OK, "sd2506_write_sram() ret=%d (expect 0)", ret);
if (ret == SD2506_OK) {
ret = sd2506_read_sram(0U, rbuf, 8U);
SD2506_TEST_CHECK(ret == SD2506_OK, "sd2506_read_sram() ret=%d (expect 0)", ret);
int sram_ok = (memcmp(wbuf, rbuf, 8U) == 0);
SD2506_TEST_CHECK(sram_ok, "SRAM write==readback");
}
/* TC-RTC-015: 报警设置 + 清除(验证 API 通路,不影响时间寄存器) */
sd2506_time_t at;
at.year = 2026; at.month = 8; at.day = 28; at.hour = 12; at.minute = 0; at.second = 30; at.week = 4;
ret = sd2506_set_alarm(&at, (uint8_t)(SD2506_AL_EN_EAS | SD2506_AL_EN_EAMN));
SD2506_TEST_CHECK(ret == SD2506_OK, "sd2506_set_alarm() ret=%d (expect 0)", ret);
ret = sd2506_clear_alarm();
SD2506_TEST_CHECK(ret == SD2506_OK, "sd2506_clear_alarm() ret=%d (expect 0)", ret);
SD2506_TEST_REPORT("Phase 2 API");
}
#endif /* ENABLE_RTC_API_TESTS */
/* ===================== 套件入口 ===================== */
void sd2506_test_run(void)
{
@@ -122,6 +201,10 @@ void sd2506_test_run(void)
sd2506_phase_basic();
#endif
#ifdef ENABLE_RTC_API_TESTS
sd2506_phase_api();
#endif
/* 恢复原始时间(用公共 API写保护逻辑已由 sd2506.c 正确处理) */
if (have_orig) {
int r = sd2506_set_time(&orig);