数码之家

 找回密码
 立即注册
搜索
查看: 2528|回复: 5

[综合] CP2112读写多次的T61电池挂掉了,感觉小有收获,这里总结一下

[复制链接]
发表于 2023-12-10 21:43:14 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
通过读写一块废掉的T61电池,感觉小有收获,这里总结一下。
根据读取的info,可以了解到这块电池循环的不多,不知什么原因,电压降到了190多mV,不能正常充电使用了。

DesignCapacity: 5616 10mWh
FullChargeCapacity: 5616 10mWh
CycleCount: 40
Date: 2008.03.15 yyyy.mm.dd
DesignVoltage: 10800 mV
ManufName: 。。。。.06.
DeviceName: IBM-92P1141
SerialNumber: 0617
ChargingCurrent: 0 mA
ChargingVoltage: 0 mV
DeviceChemistry: LION
Temperature: 27.9 C
Voltage: 191 mV
Current: 0 mA
RelativeSOC: 0%
AbsoluteSOC: 0%
RemainingCapacity: 0 10mWh
Mfg1: 65535 integer
Mfg2: 65535 integer
Mfg3: 65535 integer
Mfg4: 3013 integer
SpecificationInfo: 0031 Hex
Battery Status:
RCA|INIT|


一、笔记本电池虽然是个配件,内部居然藏着一块8位的RISC控制芯片BQ80201,该芯片硬件等同于bq20z80,采用定制的控制程序,与TI的手册小部分命令相同,大部分命令不同,与外界通过SMB总线进行通信,还通过iic总线和电池管理芯片Bq29312通信,实现对cell电压、温度、电流等的监控。参考http://www.karosium.com/2016/08/ ... sanyo-firmware.html,和该大神的开源程序,可以下载里面的firmware和Data Flash,并进行分析,之前完全没接触过RISC,代码读起来有点费劲,下图是连猜带蒙分析的进fas部分。

image.png
代码中判断是否进入fas
image.png
bq80201 概况
image.png
RISC控制芯片和管理芯片Bq29312的结构

二、CP2112模块和Be2wroks配合还算默契,比较稳定,Be2works写DF时,再读出来,会有不一致。可对DF进行参数修改,用Be2works写入,没有变砖,只是电池重启后,由于校验有错误,会进行容量等参数的重置。

image.png
改动前读出的
image.png
修改后,发现有重复的部分,开始的部分与改动前差别较大
三、猜想的电池预充管理算法
cell分为cell-V-A, cell-V-B,cell-0..3,其中cell-V-A代表电池组中的最高的那组电压,cell-V-B代表电池组中最低的那组电压。0..3代表各组电压。

prechg_sub_A26()//
_RAOUT_rr_1_8_pre_chg_sub_86DF(1,E);
_update_120h_sub_6A8F ; (0x120) &= ( ~0x18);
update_0x148_ChargingCurrent_sub_75C3 ; 设置 200mA
upt_ChargingVoltage_0x14A_sub_75E1 ; 12600        
F_C_byte_12068 |= 0x40;
for(;;)
{
if ((_53h_byte_1207E == 0x53) && (F_byte_1207D==0xF))         _0x120_or_r3r2_sub_3C6F ; 0x120) | 0x8000
if (current<49mA)
{
i3_4=0;
i3_5=0;
}
else
{
i3_4++
i3_5++
}

if(cell_v_b< 2000mV)//40DE -- 对应DF的0xDE位置,其他类似
{
        if (current<10) //,in code
        {
                        if(subB0D9()<5499)//in code
                        {
                                i3_7++;
                                if (i3_7<10) //10 - 0x40E0
                                        {
                                        _RAOUT_and_1_8_pre_chg_sub_86DF(1,E);//close all  fets  0x40E0 -  10
                                        goto lab_aaa;
                                }
                                else
                                {
                                        if 0x4224 == 0001
                                                Cell_VB->0x4260;
                                        for(;;)
                                        {
                                                RAOUT_or_1_6_prechg_fetctrl_??_867F(1,8) //pre chg
                                                RAOUT_rr_sub_8742(2,)
                                        }
                                }
                        }
                        
        }
}

        i3_7=0;//>2000mV || C>10mA||ADC >5499
                lab_aaa:
        if ((i3_5,i3_4)>14400 )
                stop_chg_sub_3D3E()
        else
                {
                if (cell_VB>3200)//3200mV 以上
                                if (current>40)
                                {
                                        FC_byte_12068 &=0xBF;
                                        _sub_CC(4,0x6C);//r3 r2
                                }
                if (current>500)//0x4097/98 0x1F4  -> 0 测试一下
                        {
                                i3_6++;
                                if (i3_6 >5)
                                {
                                        if (cell_VB <=3200 )//0x4040 -5A 5B ,0x40E5
                                        {
                                                RAOUT_or_1_6_prechg_fetctrl_??_sub_867F(1,8);//开启 慢速充电 充电
                                                TCA=1;
                                                ChargingCurrent_sub_75C3(0);
                                                upt_ChargingVoltage_0x14A_sub_75E1 (0);
                                                
                                                for(i3_6=0;i3_6<16,i3_6++) bbb_call_RCA_sub_AF98();
                                                i3_6=0;
                                                __RAOUT_and_1_8_pre_chg_sub_86DF  (1,8);//关 pre chg??
                                                update_0x148_ChargingCurrent_sub_75C3 ; 200
                                                upt_ChargingVoltage_0x14A_sub_75E1 ; 12600
                                                TCA=0
                                                
                                       
                                        }
                                        else
                                         break;
                                }
                                else break;
                        }                                       
                }

}


四、根据上述分析,对DF中相应电压门限进行了修改,尝试打开fet,进行涓流充电,通过读取ram中相应的状态位,判断fet开启指令可能未被执行。原因可能有以下情况:


1 硬件部分有过流、短路保护情况存在;
2 DF中有状态标志电池已报废;
经分析DF开头的部分和Ram中的fet控制Reg有关,遂进行了DF的擦除,重新写入,中途中断断电重启后,不认指令,无输出,看来只能暴力拆开,看看Zchgfet的控制电压是否开启了。

image.png
erase后,读取的DF,说明擦除是成功的
image.png
失败的写入后,读取的DF

打赏

参与人数 1家元 +60 收起 理由
家睦 + 60

查看全部打赏

发表于 2023-12-15 06:54:46 来自手机浏览器 | 显示全部楼层
楼主有毅力,
研究代码挺辛苦的。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-16 16:29:47 | 显示全部楼层
rongwu 发表于 2023-12-15 06:54
楼主有毅力,
研究代码挺辛苦的。

代码量不大,还行吧,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-16 16:56:30 | 显示全部楼层
本帖最后由 sjz10 于 2023-12-16 17:32 编辑

按照坛友的方法,先用裁纸刀划开点胶,再撬的方法对电池进行了拆解,效果挺不错的。
经过和一些资料对比,分析工作原理后,发现之前不充电的原因在于保险,虽然外观完好,但充电方向的保险已熔断,放电方向功能正常,不过自放电速度挺快的。bq29312的xalert一直为低电平,表示出现过过载或短路电流。
标注-PXL_20231216_020748141.jpg
电池充放电控制板
2023_0000769.JPG
充电指示灯不亮
2023_0000768.JPG
短接保险两端,充电指示灯亮
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-12-17 19:12:44 | 显示全部楼层
DF的0x204处记录的是电池废掉时的状态:
  (safety status) V C T cell_V0 V1 V2 V3 RealtimeT  ,其中T (-2732后对应摄氏度)
        50 02、 29 3A(10554mV)、 F9 00(-1792表示放电)、 0B E3(3043) 、00 00(0)、 0E 21(3617mV) 、0E 11(3601)、 0D 08(3336) 0B F1(3057)
         0D 13 0E 29 00 FA 0F 10 0F 2C
        //对应 measure delta
         mean_cell_VB 、 mean_cell_VA、[abs(delta(mean_V_A-delta(mean_V_B))??] mean_cell_VB、 mean_cell_VA
        0D 13(3347mV) 0E 29(3625mV) 00 FA(250) 0F 10(3856) 0F 2C(3884)
        验证:(3625-3347)-(3884-3856)=250,其中cell_V_B表示最低组电压,A-表示最高组电压
对应代码:
ROM:00003039 E7 C4 3A                    calls       get_R3R2_from_r3r2_sub_B148 ; Voltage
ROM:0000303C 04 FB 02                    move        (i3,4), r3
ROM:0000303F 05 FC 02                    move        (i3,5), r2
ROM:00003042 FE AB 0E                    move        r3, #1
ROM:00003045 CB AC 0E                    move        r2, #0x34
ROM:00003048 E7 C4 3A                    calls       get_R3R2_from_r3r2_sub_B148 ; Current
ROM:0000304B 06 FB 02                    move        (i3,6), r3
ROM:0000304E 07 FC 02                    move        (i3,7), r2
ROM:00003051 FE AB 0E                    move        r3, #1
ROM:00003054 CF AC 0E                    move        r2, #0x30
ROM:00003057 E7 C4 3A                    calls       get_R3R2_from_r3r2_sub_B148 ; Temperature
ROM:0000305A 08 FB 02                    move        (i3,8), r3
ROM:0000305D 09 FC 02                    move        (i3,9), r2
ROM:00003060 FE AB 0E                    move        r3, #1
ROM:00003063 AD AC 0E                    move        r2, #0x52
ROM:00003066 E7 C4 3A                    calls       get_R3R2_from_r3r2_sub_B148 ; 0x152 cell V  000
ROM:00003069 0A FB 02                    move        (i3,0xA), r3
ROM:0000306C 0B FC 02                    move        (i3,0xB), r2
ROM:0000306F FE AB 0E                    move        r3, #1
ROM:00003072 AB AC 0E                    move        r2, #0x54
ROM:00003075 E7 C4 3A                    calls       get_R3R2_from_r3r2_sub_B148 ; cell V  001
ROM:00003078 0C FB 02                    move        (i3,0xC), r3
ROM:0000307B 0D FC 02                    move        (i3,0xD), r2
ROM:0000307E FE AB 0E                    move        r3, #1
ROM:00003081 A9 AC 0E                    move        r2, #0x56
ROM:00003084 E7 C4 3A                    calls       get_R3R2_from_r3r2_sub_B148 ; cell V  002
ROM:00003087 0E FB 02                    move        (i3,0xE), r3
ROM:0000308A 0F FC 02                    move        (i3,0xF), r2
ROM:0000308D FE AB 0E                    move        r3, #1
ROM:00003090 A7 AC 0E                    move        r2, #0x58
ROM:00003093 E7 C4 3A                    calls       get_R3R2_from_r3r2_sub_B148 ; 0x158  cell V  003
ROM:00003096 10 FB 02                    move        (i3,0x10), r3
ROM:00003099 11 FC 02                    move        (i3,0x11), r2
ROM:0000309C FE AB 0E                    move        r3, #1
ROM:0000309F A5 AC 0E                    move        r2, #0x5A
ROM:000030A2 E7 C4 3A                    calls       get_R3R2_from_r3r2_sub_B148 ; 0x15A  Temperature
ROM:000030A5 12 FB 02                    move        (i3,0x12), r3
ROM:000030A8 13 FC 02                    move        (i3,0x13), r2
ROM:000030AB 00 F5 02                    move        (i3,0), i2h
ROM:000030AE 01 F4 02                    move        (i3), i2l
ROM:000030B1 E3 AC 0E                    move        r2, #0x1C
ROM:000030B4 FF AB 0E                    move        r3, #0
ROM:000030B7 6E AF 0C                    move        r0, i3l
ROM:000030BA FD CE 0E                    add         r0, #2
ROM:000030BD 7D 5F 0D                    incc        r1, i3h
ROM:000030C0 4F D4 3A                    calls       save_into_DF??_sub_8310 ; r3r2:num ,r1r0:i3hi3l:buf
ROM:000030C3
ROM:000030C3             loc_30C3:                               ; CODE XREF: kill_batt_??_sub_2FBE+63j
ROM:000030C3 FF AB 0E                    move        r3, #0
ROM:000030C6 B2 F0 3A                    calls       save_into_DF_4040h_sub_2DE7
ROM:000030C9 FE A1 0E                    move        i0h, #1
ROM:000030CC DF A0 0E                    move        i0l, #0x20
ROM:000030CF 01 AC 18                    move        r2, (i0)
ROM:000030D2 00 AB 18                    move        r3, (i0,0)  ; 0x120) vs 0x2002
ROM:000030D5 DF 1B 0E                    cmp         r3, #0x20
ROM:000030D8 B4 EF 32                    jne         blown_fuse_0x807C_0x8072_loc_30E1
ROM:000030DB FD 1C 0E                    cmp         r2, #2
ROM:000030DE AC EF 36                    jeq         dead_loop_loc_30F9
ROM:000030E1
ROM:000030E1             blown_fuse_0x807C_0x8072_loc_30E1:      
ROM:000030E1 8F A0 0E                    move        i0l, #0x70  ; 807C
ROM:000030E4 7F A1 0E                    move        i0h, #0x80
ROM:000030E7 0C AB 18                    move        r3, (i0,0xC) ; RC Control Register
ROM:000030EA FD BB 0E                    or          r3, #2      ; RCPUP1 = 1
ROM:000030ED 0C CB 02                    move        (i0,0xC), r3
ROM:000030F0 02 AB 18                    move        r3, (i0,2)  ; 0x8072
ROM:000030F3 FD BB 0E                    or          r3, #2      ; RC Output Register
ROM:000030F6 02 CB 02                    move        (i0,2), r3  ; RCOUT1  ,blown fuse

回复 支持 反对

使用道具 举报

发表于 2024-3-30 01:04:28 | 显示全部楼层
还是兼容电池好,保护板不会断电锁死
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-28 21:50 , Processed in 0.171600 second(s), 17 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表