BQ40Z50芯片的使用心得(基于STM32F302)

申明:本人使用的芯片为BQ40Z50-r1,主控模块为STM32F302,参考代码为野火通讯的模拟I2c部分。


1、众所周知,BQ芯片的这个SMBus协议与I2c协议大同小异,区别在于SM它的通信频率相对没有IC那么高。那么问题来了,如何通过非硬件♂I2c来控制频率以实现SMBus通信,之前在网上我也找过相关电量芯片读取资料,似乎大部分的前辈都是通过硬件I2c来实现的。于是乎鄙人不信邪,就想调一个软件I2c出来玩玩。

2、下面为操作过程:

1、首先需要硬件工程师搭配好环境。

2、你需要配置好属于你的(32单片机)的延时函数(us&ms级别)//很重要。

3、开整。ctrl+c ctrl+v


接下来就是根据时序图“敲”代码啦(通假字 敲 通->抄)。

一步配置:将我们单片机的SCL&SDA接口配置好,SDA输入模式设置为上拉,输出模式则设置为推挽即可。SCL则不讲究那么多,直接推挽输出就完事儿。

二步开始:时钟线为高时,数据线出现下降沿表示起始信号

第三步:就要开始我们的数据发送了,BQ40Z50的设备地址默认为0x16。

第四步:等待应答,把数据线释放(给高电平),时钟线拉高然后读取SDA输入信号,为0是应答,1为非应答。

第五步:在有应答之后我们执行第五步,发送寄存器地址,也就是所谓的命令参数,鄙人做的是读取电压(0x09)以及电量百分比(0x0D),和发送设备地址一样,需等待应答后执行下一步。

第六步:在寄存器地址成功获得应答后,需重新开始我们的start函数,emm,为了保险起见在 start之前我还stop了一下。防止后面数据不完整,至于为什么我后面会贴链接。

前戏过后,终于可以轮到我们的读取部分了

 第七步:那么接下来就是我们的在成功应答后,发送设备地址 | 读取操作,即(0x16 | 0x01)。再次等待应答...

八:终于终于可以读数据啦:在777过后接收到应答,我们兴致冲冲的开始read,电压为16位,读取时需要进行移位合并操作。电量百分比则不需要。

九:发送应答,将数据线持续拉高(一个时钟周期)

十:读高位即再次调用read函数

十一:回复无应答

十二:调用stop函数就 完事儿了。

我为什么要分享这么一份代码:作为一个新手,我调试这部分代码花费了大概10天的时间,没错!我就是这么的菜。最后多亏了同事陈某某 弄了个示波器协助调试才调好。在SMBus通信中,我使用的延时为40us,emm但这个值不是准确的,我还偶尔会出现发送设备地址无应答的情况,这个原因咱也不懂,还在调查中,找不到原因就作一个无应答数据的无效处理即可。

容易出错的地方就是两个函数之间的时序衔接,容易出现一些幺蛾子,细心的朋友可以再细点。

按照一般情况,电压以及电量百分比存放在一个16位比利(变量)那。对其有效位进行控制,电压&0x7fff,电流&0x7f,这样获得的值才是最香的(正确)。

本内容转载于网络,侵删!
#学习路径#
全部评论
🤣芯片 太强了
点赞 回复 分享
发布于 2022-02-16 19:02
我的毕业设计就是这个芯片,哈哈哈哈
点赞 回复 分享
发布于 2022-02-14 14:37

相关推荐

点赞 评论 收藏
分享
05-26 22:25
门头沟学院 Java
Java小肖:不会是想叫你过去把你打一顿吧,哈哈哈
点赞 评论 收藏
分享
评论
2
3
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务