数码之家
标题:
CP2112读写多次的T61电池挂掉了,感觉小有收获,这里总结一下
[打印本页]
作者:
sjz10
时间:
2023-12-10 21:43
标题:
CP2112读写多次的T61电池挂掉了,感觉小有收获,这里总结一下
通过读写一块废掉的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部分。
[attach]1993086[/attach]
代码中判断是否进入fas
[attach]1993066[/attach]
bq80201 概况
[attach]1993069[/attach]
RISC控制芯片和管理芯片Bq29312的结构
二、CP2112模块和Be2wroks配合还算默契,比较稳定,Be2works写DF时,再读出来,会有不一致。可对DF进行参数修改,用Be2works写入,没有变砖,只是电池重启后,由于校验有错误,会进行容量等参数的重置。
[attach]1993061[/attach]
改动前读出的
[attach]1993063[/attach]
修改后,发现有重复的部分,开始的部分与改动前差别较大
三、猜想的电池预充管理算法
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的控制电压是否开启了。
[attach]1993083[/attach]
erase后,读取的DF,说明擦除是成功的
[attach]1993084[/attach]
失败的写入后,读取的DF
作者:
rongwu
时间:
2023-12-15 06:54
楼主有毅力,
研究代码挺辛苦的。
作者:
sjz10
时间:
2023-12-16 16:29
rongwu 发表于 2023-12-15 06:54
楼主有毅力,
研究代码挺辛苦的。
代码量不大,还行吧,
作者:
sjz10
时间:
2023-12-16 16:56
本帖最后由 sjz10 于 2023-12-16 17:32 编辑
按照坛友的方法,先用裁纸刀划开点胶,再撬的方法对电池进行了拆解,效果挺不错的。
经过和一些资料对比,分析工作原理后,发现之前不充电的原因在于保险,虽然外观完好,但充电方向的保险已熔断,放电方向功能正常,不过自放电速度挺快的。bq29312的xalert一直为低电平,表示出现过过载或短路电流。
[attach]1997718[/attach]
电池充放电控制板
[attach]1997738[/attach]
充电指示灯不亮
[attach]1997739[/attach]
短接保险两端,充电指示灯亮
作者:
sjz10
时间:
2023-12-17 19:12
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
还是兼容电池好,保护板不会断电锁死
作者:
sjz10
时间:
2024-9-23 20:03
我也遇到过不锁的,外观看都一样,T61的电池。前一阵救回一个X61的电池,闪黄灯,恢复了一下容量好了,不知道是不是里面电压还比较高,没烧保险,还是怎么的。
作者:
hst
时间:
2025-8-28 16:23
郭老师 发表于 2024-3-30 01:04
还是兼容电池好,保护板不会断电锁死
首先感谢楼主分享!另外,有没有BQ8050兼容电池?
欢迎光临 数码之家 (https://www.mydigit.cn/)
Powered by Discuz! X3.4