SD2506初始化18H改回读校验+漂移时写允许窗口修复,充电宏位与注释订正(E-32修复)

This commit is contained in:
2026-09-21 17:36:48 +08:00
parent ee206ab688
commit 115ed00039
3 changed files with 59 additions and 27 deletions
+40 -17
View File
@@ -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;
}
+18 -9
View File
@@ -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);