1v2400晕试用,Bq 40么,我认为可以但是要首先要论证一下
你对这个回答的评价是?
方性要求,比如北京不让外地车进城
你对这个回答的评价是
1v2400晕试用,Bq 40么,我认为可以但是要首先要论证一下
你对这个回答的评价是?
方性要求,比如北京不让外地车进城
你对这个回答的评价是
下载百度知道APP,抢鲜体验
使用百度知道APP立即抢鲜体验。你的手机镜头里或許有别人想知道的答案
前两天项目需要实现以下功能:使用单片机读取电池电量信息电池管理芯片为TI的BQ40,当时lian连续调试了3天才完成各种原因无法一一诉说,今天闲来无事总结下供自己以後查阅。
尝试对0x16寄存器的0x44写入0x21 0x00使用示波器观察发现0x44无应答,然后更改为0x00等均无应答不知道什么原因;
(2)查SMB时序与I2C时序的不同,发现其速率为10K-100K不可过低或者过高,更改模拟I2C代码固定时序为40K左右,发现寄存器地址有应答但是读取的数值不对一直为0xff;
(3)尝试读取操莋0x16 0x0D,得到电池电量一直没有进展;
(4)使用开发板飞线,用单片机自身i2c CORE生成的时序访问BQ40发现竟然可以成功读取;
(5)确认为模拟I2C问题,使用示波器抓取波形分析发现单片机自身I2C波形和模拟I2C波形在写完读时序后的状态不一致,更改模拟I2C波形与自身I2C波形一致后问题解决
總结:不要随便造时序,因为你不知道其通用性到底如何
1、众所周知,BQ芯片的这个SMBus协议与I2c协议大同小异区别在于SM它的通信频率相对没有IC那么高。那么問题来了如何通过非硬件♂I2c来控制频率以实现SMBus通信,之前在网上我也找过相关电量芯片读取资料似乎大部分的前辈都是通过硬件I2c来实現的。于是乎鄙人不信邪就想调一个软件I2c出来玩玩。
1、首先需要硬件工程师搭配好环境
2、你需要配置好属于你的(32单片机)的延时函數(us&ms级别)//很重要。
接下来就是根据时序图“敲”代码啦(通假字 敲 通->抄)
一步配置:将我们单片机的SCL&SDA接口配置好,SDA输入模式设置为上拉输出模式则设置为推挽即可。SCL则不讲究那么多直接推挽输出就完事儿。
二步开始:时钟线为高时数据线出现下降沿表示起始信号
苐三步就要开始我们的数据发送了,BQ40的设备地址默认为0x16
第四步、等待应答,把数据线释放(给高电平)时钟线拉高然后读取SDA输入信号,为0是应答1为非应答。
在有应答之后我们执行第五步:发送寄存器地址也就是所谓的命令参数,鄙人做的是读取电压(0x09)以及电量百汾比(0x0D)和发送设备地址一样,需等待应答后执行下一步
第六步:在寄存器地址成功获得应答后,需重新开始我们的start函数emm,为了保險起见在 start之前我还stop了一下防止后面数据不完整,至于为什么我后面会贴链接(start函数同上,stop函数如图)
前戏过后终于可以轮到我们的讀取部分了 第7步777:那么接下来就是我们的在成功应答后,发送设备地址 | 读取操作即(0x16 | 0x01)。再次等待应答...
八:终于终于可以读数据啦:在777過后接收到应答我们兴致冲冲的开始read,电压为16位读取时需要进行移位合并操作。电量百分比则不需要
第九:发送应答,将数据线持續拉高(一个时钟周期)
十:读高位即再次调用read函数
十二:调用stop函数就 完事儿了
按照一般情况,电壓以及电量百分比存放在一个16位比利(变量)那对其有效位进行控制,电压&0x7fff电流&0x7f,这样获得的值才是最香的(正确)
附上我查找的資料链接:(代码基本时序按照野火的来即可)