数码之家

 找回密码
 立即注册
搜索
查看: 43651|回复: 159

[C51] 用单片机解锁笔记本电池被锁的教程及分析(电池管理芯片为BQ3060)

    [复制链接]
发表于 2020-10-20 18:58:28 | 显示全部楼层 |阅读模式
写在前面的话,笔记本电脑的电池的通信协议是SMBus(IIC协议中的一种),且地址都是(0x16)   

上个星期看到坛友发了个驱动电池管理芯片BQ40Z50,详情看这里,想起我古老的笔记本电脑的电池被锁了很多年了,现在电芯都它用了。想想现在自己的理解能力,编程能力都有了提升。加上现在的英文翻译软件很牛了,资料也好找了,于是,动起来!

通过上TI的网站,找齐了BQ3060必要的资料,用STC15F104E、TM1651搭建好电路,开始了编程序的艰难过程。说起来很奇怪,我自己写的程序不管怎么改,只能正常读到一个字节。无奈中下了他的程序,改改使程序用于STC15F104E,发现也只能正确读一个字节。又只能用回自己的程序,却惊喜的发现能正确的读到两个字节,同时也发现时而错码,时而正常。反复的阅读SMBus协议文件,感觉是BQ3060没有及时应答造成的。于是改从机应答程序。才终于调通了程序,正确的读到数据。


这个是读电池电压的示波器的波形,读出的电压是(0x2e24)=11812mV=11.812V



接下来,就是要知道BQ3060有哪些命令了,哪些命令导致了锁电池,哪些是解除此命令的命令了
这个是笔记本电脑电池(地址都是0x16)的通用命令了



在这些命令中,要解锁电池,要用到的命令是:
1:0x00,写解锁命令就用它了,这个命令里还有很多子命令。

下面的应该是BQ3060的专用命令了(其它的芯片资料没看过)



在这些命令中,重要的命令都在这了:
b1:0x53:这个命令只能读,它记录了电池被锁的原因,我用单片机给它个命令Read_bq3060(0x53),返回的数据是0x4c02,转成二进制是:0100 1100 0000 0010,这4个1 的意思分 别是1:一个永久性的故障已经产生;1:过流放电;1:过流充电;1:过电压。

b2:0x62:这个命令能读写,是为了消除上面4个1而存在的。它记着的是一串密匙,只要把它通过0x00命令写入到BQ3060中,就能将上面的4个1变为0.给它个命
令Read_bq3060_four(0x62);,返 回的数据是0x17122673,有这个,解锁就两条命令的事:Write_BQ3060_two(0x00,0x2673); //低两位
Write_BQ3060_two(0x00,0x1712); //高两位,当然没这么简单,行不行要看下面的命令看么说。

b3:0x54:这个命令只能读,它记录了BQ3060的运行状态,给它个命令Read_bq3060(0x54),返回的数据是0x8840,   转成二进制是:1000 1000 0100 0000,
1,说明接有电池, 0,表明BQ3060是可以完全访问的,上面的解锁命令是可以执行的;
0,如果这个是1的话,就表明BQ3060是加锁的,是不可以改写数据的; 1,电芯寿命到了;
1,电池状态(0x16),表示正在放电。

b4:0x60:这个命令能读写,也是一串密匙,是当BQ3060被上锁后(不是所说的电池被锁),用来转变成未加锁状态,使用方法同0x62.

b5: 0x61:这个命令能读写,也是一串密匙,是当BQ3060未被上锁,用来转变成完全访问状态,使用方法同0x62.

总结:当b3中的0是0,0也0,b2中的命令就能执行,就能完成电池解锁,将b1的0x53的值全变为0。手册中提示密匙是要倒着写入,也就是0x7326和0x1217,不过实践是不能倒着写的.如果电池解锁后,觉得还是要给BQ3060上锁,保护芯片工作不被干扰,就给它上锁,给个命令Write_BQ3060_two(0x00,0x0020) 就行。至于其它电量校正,也不是什么麻烦事了,麻烦的是手头没有新电池,也就不多说 了。


接下来是程序的编写问题:
c0:在从机应答子程序中,有一个等待从机响应的代码while(SDA);//等待从机拉低数据线,表示不忙,如果从机无响应,程序就会卡在这,不过不会有影响,
有了这个,反而好知道从机正常不 正常。
c1:CMBus总线协议手册1.1版本中只介绍了两个字节的读写,块读写(4个字节以上)并没有给出时序图,2.0版本中也只是给个框图,这对0x62命令很不友好。

通过反复试验,才找到正确的 读写方法,读4个字节的命令是上面的波形图中,在0x17后加上一条读一个字节命令chl=IICreceiveByte();master_ACK();
这个命令能知道要读多少个字节,如4,表示要接着读4个字节。

写4个字节的命令是在命令后告诉BQ3060要写多少个字节,如4个就这样写:
IICSendByte(address);check_ACK();
IICSendByte(4);
check_ACK();
c2:那又如何知道自己读的数据(如0x62中的)是正确呢?可以用0x22命令来验证!这个命令是读电芯的材质,这BQ3060的默认值是LION,这是字符形的,用命令Read_bq3060_four(0x22);
返回的值是0x4e4f494c,哪这个又是什么意思呢,别急,转到软件STC_ISP就知道了,看图:


c3:程序晶振频率选择6M,12M都能正常运行。选用TM1651显示数据,是因为我有个机顶盒的LED数码管驱动芯片是CS1635,引脚和TM1651一样。
c4:这里我设置的下载程序文件要20M,是因为坛友设置收20m,总不能砸他饭碗吧。本来想设置高点的,但回头发现就是20,不能多
c5:本文中BQ3060中所有资料,均来自https://www.ti.com.cn/.,如有需要,可先下载BQ3060手册:https://www.ti.com.cn/cn/lit/ds/symlink/bq3060.pdf, 其里面提供了电路设计,详细命令,SMBus总线规范的下载地址。

c6:如果你不想用单片机搞,要用电脑搞,请看这里:bq2084主控笔记本电池换电芯+复位电池参数解锁

最后,来张搭建的硬件图:


看来我的文字表达能力还不行,那再来个框图:作得很烂,见谅



本帖子中包含更多资源

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

x

打赏

参与人数 31家元 +532 收起 理由
liningepdc + 10
cushion + 20 優秀文章
digittjau + 40 以資鼓勵
moritenw + 12
温力口 + 20 谢谢分享。。。。这个必须要顶,收藏备用。.
杜杀 + 9 優秀文章
栀浅 + 10
fanchao2003 + 20 優秀文章,技术指标高我完全看不懂.
aers000 + 10 非常实用的教程。
myhaly + 20

查看全部打赏

发表于 2020-10-20 20:52:47 | 显示全部楼层
这不是人家要花好几千购买的软件才能解决的吗?
回复 支持 反对

使用道具 举报

发表于 2020-10-20 21:00:11 | 显示全部楼层
只能瞻仰了
回复 支持 2 反对 0

使用道具 举报

发表于 2020-10-21 09:04:53 | 显示全部楼层
期待后续成果
回复 支持 反对

使用道具 举报

发表于 2020-10-21 10:26:55 | 显示全部楼层
已搬床备好方便面躺等
回复 支持 反对

使用道具 举报

发表于 2020-10-21 19:00:01 | 显示全部楼层
牛逼呀 感觉是精华预定了
回复 支持 反对

使用道具 举报

发表于 2020-10-22 10:46:20 | 显示全部楼层
其实这种东西真不难,Ti,ADI都是有雄厚实力的公司,所以他们的BMS芯片被用在很多产品中,而且资料都是高度开放,甚至还有许多案例就怕你不会设计。
所以,突破笔记本厂商的封锁其实很容易,毕竟不是自己的一套机制而是依赖于现成BMS的芯片。而一般的BMS也不会引入像某些FLASH的One-time program或者MCU的熔丝机制,导致永久锁死。所以通过合适的手段就可以解除。
一个普通的电子专业的本科生研究几天就能搞定的东西,被卖到几千元的高价只能说明市场太小,不能成气候引起竞争控制价格,也没有完善的方案和稳定的客源。所以一搞就是自起炉灶,干个一单几单回本,价格自然就高。而且顺带垄断恰更多。:titter:

打赏

参与人数 2家元 +27 收起 理由
刀刀是条狗 + 15 謝謝分享
2545889167 + 12 正解

查看全部打赏

回复 支持 15 反对 0

使用道具 举报

发表于 2020-10-22 12:09:34 | 显示全部楼层
我的dellXT3电池突然不充电了,有时间研究一下:lol:
回复 支持 反对

使用道具 举报

发表于 2020-10-22 12:14:59 | 显示全部楼层
有种感觉想用Arduino写一套工具放上Github开源

Arduino可能比STC单片机更好获得,也更好用

打赏

参与人数 1家元 +10 收起 理由
栀浅 + 10

查看全部打赏

回复 支持 4 反对 1

使用道具 举报

发表于 2020-10-22 12:53:38 | 显示全部楼层
这东西原理不难,自己搞最大的问题是电池怎么无损拆,搞完以后怎么再装起来:dizzy:
回复 支持 2 反对 0

使用道具 举报

发表于 2020-10-22 15:09:34 | 显示全部楼层
ww5223017240 发表于 2020-10-22 12:53
这东西原理不难,自己搞最大的问题是电池怎么无损拆,搞完以后怎么再装起来 ...

汽油大法。。是最合适的。
回复 支持 反对

使用道具 举报

发表于 2020-10-22 15:49:08 | 显示全部楼层
x067 发表于 2020-10-22 15:09
汽油大法。。是最合适的。

怎么弄?涂在壳上还是整个浸里面?
回复 支持 反对

使用道具 举报

发表于 2020-10-22 16:10:15 | 显示全部楼层
我家领导的笔记本电脑电池锁死了,充不了电,上次强拆了出来一个个充满再装回去竟然好了
你这个方法可以不拆电池解锁吗?
回复 支持 反对

使用道具 举报

发表于 2020-10-22 16:25:59 | 显示全部楼层
ww5223017240 发表于 2020-10-22 15:49
怎么弄?涂在壳上还是整个浸里面?

涂在接缝处,然后用保鲜膜包紧,你可以搜索一下具体操作方法。
毕竟汽油难弄,也没过度研究。
回复 支持 反对

使用道具 举报

发表于 2020-10-22 17:10:15 | 显示全部楼层
我现在都是在线式的换电池了,就是要换的笔记本电池和原电池一起并联后再取下老电池。

打赏

参与人数 1家元 +10 收起 理由
栀浅 + 10

查看全部打赏

回复 支持 3 反对 0

使用道具 举报

发表于 2020-10-22 18:54:13 | 显示全部楼层
x067 发表于 2020-10-22 16:25
涂在接缝处,然后用保鲜膜包紧,你可以搜索一下具体操作方法。
毕竟汽油难弄,也没过度研究。 ...

谢谢,这个下次试试看
回复 支持 反对

使用道具 举报

发表于 2020-10-22 19:14:05 | 显示全部楼层
这个思路非常好,其实笔记本电池被“锁”,实际上是电池管理电路认为电池出现了永久性故障而切断了电池回路进入保护状态
同时,上位机检测到电池故障也会拒绝使用电池。所谓的“解锁",实际就是恢复电池的故障状态并重新写入参数。
一般这种操作需要TI的EV2300适配器完成,楼主用单片机替代EV2300向电池内写数据,确实是个好点子。

打赏

参与人数 1家元 +10 收起 理由
栀浅 + 10

查看全部打赏

回复 支持 4 反对 0

使用道具 举报

发表于 2020-10-22 20:22:36 | 显示全部楼层
本帖最后由 benli 于 2020-10-22 20:35 编辑

这个怎么用?麻烦楼主详细说一下
回复 支持 反对

使用道具 举报

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

本版积分规则

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

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-25 08:23 , Processed in 0.109200 second(s), 12 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

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