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
+38 -15
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 (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);
@@ -277,7 +277,7 @@ flowchart LR
- 器件为 **SD2506API 模块**(非裸片):内置 32.768k 晶振 + **内置充电电池 + 充电电路**(手册 L11:电池满充常温下掉电走时约 8 个月,电池寿命 5~8 年;自动电源切换:VDD<2.4V 且 VDD<VBAT 时自动转电池供电,PMF 位指示电源模式)。
- **封装与引脚编号(已核实,设计正确)**:实物封装 6 个引脚,但编号**不按 1~6 顺序**——模块只引出手册脚号 **1/4/5/6/7/8**(表 1:1=TEST, 4=GND, 5=SDA, 6=SCL, 7=INT, 8=VDD;pin2/3 未引出)。网表接 4/5/6/8 = GND/SDA/SCL/VDD ✓,1(TEST,手册要求悬空)与 7(INT,未用)悬空 ✓,与手册完全一致。
- **掉电走时(已核实,无缺陷)**:后备电源为模块内置充电电池(无外接 VBAT 脚),不存在"无后备电池"问题;代码每次上电写 18H=0x82 使能内置充电(手册 L390 要求),并开机读电池电压寄存器 1AH/1BH 输出 battery: 标记(sd2506.c L180-182 / L327-335),与手册完全一致。
- **掉电走时(已核实,无缺陷)**:后备电源为模块内置充电电池(无外接 VBAT 脚),不存在"无后备电池"问题;18H 充电寄存器非易失(手册 §4.8:出厂均配置 82H = EN_Charge+5K 电阻),长时掉电可能改值——代码每次上电**回读校验 18H**(=0x82 不写;≠0x82 经写允许窗口重置为 0x82 并回读验证,2026-09-21 修复 E-32,`sd2506_init()`),满足手册 L390 每次上电重置 18H 的要求;开机另读电池电压寄存器 1AH/1BH 输出 battery: 标记(`sd2506_get_battery_voltage()`),与手册一致。
#### U19 = GD5F2GQ5UE(WSON-8,SPI NAND)