SD2506初始化18H改回读校验+漂移时写允许窗口修复,充电宏位与注释订正(E-32修复)
This commit is contained in:
+38
-15
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user