前两天项目需要实现以下功能:使用单片机读取电池电量信息,电池管理芯片为TI的BQ40Z50,当时lian连续调试了3天才完成,各种原因无法一一诉说,今天闲来无事总结下,供自己以后查阅。
单片机使用的STM32F207,使用模拟I2C读取BQ40Z50芯片寄存器。
单独使用此模拟I2C时序读取AT24C02,光模块均可正常工作,但是读取BQ40Z50就不可以。
(1)查芯片手册如下
尝试对0x16寄存器的0x44写入0x21 0x00,使用示波器观察发现0x44无应答,然后更改为0x00等均无应答,不知道什么原因;
(2)查SMB时序与I2C时序的不同,发现其速率为10K-100K,不可过低或者过高,更改模拟I2C代码,固定时序为40K左右,发现寄存器地址有应答,但是读取的数值不对一直为0xff;
(3)尝试读取操作0x16 0x0D,得到电池电量,一直没有进展;
(4)使用开发板飞线,用单片机自身i2c CORE生成的时序访问BQ40Z50,发现竟然可以成功读取;
(5)确认为模拟I2C问题,使用示波器抓取波形分析,发现单片机自身I2C波形和模拟I2C波形在写完读时序后的状态不一致,更改模拟I2C波形与自身I2C波形一致后问题解决。
总结:不要随便造时序,因为你不知道其通用性到底如何。