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,这样获得的值才是最香的(正确)。
本内容转载于网络,侵删!
#学习路径#