diff --git a/Drivers/BSP/SD2506/sd2506.c b/Drivers/BSP/SD2506/sd2506.c index 32a734cc..5517b65b 100644 --- a/Drivers/BSP/SD2506/sd2506.c +++ b/Drivers/BSP/SD2506/sd2506.c @@ -157,15 +157,12 @@ static int sd2506_write_disable(void) { /* * 函数功能:初始化 SD2506API-G RTC * 入口参数:无 - * 返回值:0-成功,2-I2C 错误 int + * 返回值:0-成功,-1-校验失败,-2-I2C 错误 int * 限定条件:CubeMX 已完成 I2C1 初始化(PB6-SCL, PB7-SDA) * 函数说明:1. 读取芯片 ID 验证通信 - * 2. 上电重置充电寄存器 (0x18=0x82) - * 3. 配置 24 小时制、开自动复位 - * 限定条件:CubeMX 已完成I2C1 初始化 - * 函数说明:读取芯片 ID 验证通信 - * 2. 上电重置充电寄存器18H=82H - * 3. 配置 24 小时制、开自动复位 + * 2. 充电寄存器 18H 回读校验(出厂 82H 非易失),值漂移时经写允许 + * 窗口重置并回读验证(手册 §4.8:强烈建议每次上电重置 18H) + * 3. 上电即写禁止态(WRTC 全 0),无需再写 0FH */ int sd2506_init(void) { int ret = 0; @@ -177,22 +174,48 @@ int sd2506_init(void) { return ret; } - /* 上电重置充电寄存器 18H = 82H (开启充电 5K电阻) - * 手册强烈建议每次上电时重置此寄存器 */ - ret = sd2506_write_reg(SD2506_REG_CHARGE, 0x82U); + /* 充电寄存器 18H:手册 §4.8"出厂均配置成 82H"(非易失), + * 先回读校验,正常路径(=82H)不再写;仅值漂移(长时掉电等)时 + * 经写允许窗口重置并回读验证(手册强烈建议每次上电重置 18H) + * 0x82 = EN_Charge(Bit7) | Charge1(Bit1):开启充电,5K 电阻 */ + uint8_t charge_val = 0; + + ret = sd2506_read_reg(SD2506_REG_CHARGE, &charge_val); if (ret != SD2506_OK) { return ret; } - /* 配置: 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; + if (charge_val != SD2506_CHARGE_INIT_VALUE) { + int ret_read = 0; + + ret = sd2506_write_enable(); + if (ret != SD2506_OK) { + return ret; + } + + ret = sd2506_write_reg(SD2506_REG_CHARGE, SD2506_CHARGE_INIT_VALUE); + if (ret != SD2506_OK) { + (void)sd2506_write_disable(); + return ret; + } + + ret_read = sd2506_read_reg(SD2506_REG_CHARGE, &charge_val); + ret = sd2506_write_disable(); + if (ret != SD2506_OK) { + return ret; + } + + if (ret_read != SD2506_OK || charge_val != SD2506_CHARGE_INIT_VALUE) { + return SD2506_ERROR; + } } + /* 上电后芯片即处于写禁止态:WRTC1/2/3 全 0(手册 L119 复位值), + * CTR1(0FH)/CTR2(10H) 均为复位值 00H,无需再写 0FH 上锁(写禁止态 + * 写 0FH 的普通位会被芯片忽略,原 0x7B 写为无效操作);0x7B 是手册 + * L396 的写禁止过渡建议值,仅在写允许窗口内的收尾写有意义。 + * 注意:ARST 位位于 CTR3(11H) D7,与 0FH 无关(原注释误注)。 */ + return SD2506_OK; } diff --git a/Drivers/BSP/SD2506/sd2506.h b/Drivers/BSP/SD2506/sd2506.h index 502cf331..3807fa36 100644 --- a/Drivers/BSP/SD2506/sd2506.h +++ b/Drivers/BSP/SD2506/sd2506.h @@ -113,16 +113,24 @@ extern "C" { /* ======================== 充电配置 ======================== */ -/* 充电寄存器 (18H) 建议上电写入值: 0x82 (开启充电, 断开) */ -#define SD2506_CHARGE_EN (1U << 7) /* 充电允许位 */ -#define SD2506_CHARGE_2K (0U << 0) /* 2K电阻 */ -#define SD2506_CHARGE_5K (1U << 0) /* 5K电阻 */ +/* 充电寄存器 (18H) 位定义(手册 §4.8): + * Bit7=EN_Charge(充电允许,复位 0=禁止); + * Bit1=Charge1、Bit0=Charge0:00=2K / 01=10K / 10=5K / 11=断开(复位态) */ + +#define SD2506_CHARGE_EN (1U << 7) /* EN_Charge: 充电允许 (Bit7) */ +#define SD2506_CHARGE_2K (0U) /* 2K 电阻: Charge1=0, Charge0=0 */ +#define SD2506_CHARGE_10K (1U << 0) /* 10K 电阻: Charge1=0, Charge0=1 */ +#define SD2506_CHARGE_5K (1U << 1) /* 5K 电阻: Charge1=1, Charge0=0 */ +#define SD2506_CHARGE_DISCON (0x03U) /* 断开: Charge1=1, Charge0=1(复位态) */ +#define SD2506_CHARGE_INIT_VALUE (0x82U) /* 上电目标值: EN_Charge|5K = 出厂 82H */ /* ======================== 写保护配置 ======================== */ -/* 写允许时 0FH 寄存器建议值: 0xFF (WRTC1=1, WRTC2=1, WRTC3=1) */ +/* 写允许窗口内写 0FH 的建议值: 0xFF(手册 L396:WRTC 位只能保持 1, + * 0FH 其余位均为标志位) */ #define SD2506_CTR1_WRITE_ON 0xFFU -/* 写禁止时 0FH 寄存器建议值: 0x7B (WRTC1=0, WRTC2=0, WRTC3=0, ARST=1) */ +/* 写禁止过渡时 0FH 的建议值: 0x7B(WRTC2/WRTC3=0、标志位 1;WRTC1 在 + * CTR2 需另行清除;ARST 在 CTR3 与本寄存器无关) */ #define SD2506_CTR1_WRITE_OFF 0x7BU /* ======================== 返回值定义 ======================== */ @@ -162,11 +170,12 @@ typedef struct { /* * 函数功能:初始化 SD2506API-G RTC * 入口参数:无 - * 返回值:0 - 成功,-2 - I2C 通信错误 + * 返回值:0 - 成功,-1 - 校验失败,-2 - I2C 通信错误 * 限定条件:CubeMX 已完成 I2C1 初始化 * 函数说明:1. 读取芯片 ID 验证通信 - * 2. 上电重置充电寄存器 18H=82H - * 3. 配置 24 小时制、开自动复位 + * 2. 充电寄存器 18H 回读校验(出厂 82H 非易失),值漂移时经写允许 + * 窗口重置并回读验证 + * 3. 上电即写禁止态(WRTC 全 0),无需再写 0FH */ int sd2506_init(void); diff --git a/docs/硬件平台/V0.0_网表详细分析报告.md b/docs/硬件平台/V0.0_网表详细分析报告.md index 35a0259d..757bd8a5 100644 --- a/docs/硬件平台/V0.0_网表详细分析报告.md +++ b/docs/硬件平台/V0.0_网表详细分析报告.md @@ -277,7 +277,7 @@ flowchart LR - 器件为 **SD2506API 模块**(非裸片):内置 32.768k 晶振 + **内置充电电池 + 充电电路**(手册 L11:电池满充常温下掉电走时约 8 个月,电池寿命 5~8 年;自动电源切换:VDD<2.4V 且 VDD