单片机与bq34z100评估板 I2C通信,读取无应答
bq34z100评估板与EV2300通信正常,
与单片机模拟I2C通信时,发送数据,无读取应答。
*****************************************************************
读取一个字节的SoC,指令是0x02,程序流程如下:
开始I2C;发送(0xaa);读取应答;
发送(0x02);读取应答;
开始I2C;发送(0xab);读取应答;
读取数据;发送应答;
停止I2C;
*****************************************************************************
以下是示波器截图,4张图是连续的,对应上面的程序流程
发送地址就没有ACK,
在发送数据时,最好不要用MCU内部上拉, 用外部上拉,并且,在等待ACK时,将SDA需要 配置成输入高阻,读取ACK应答信号
单片机设置的是输入并且没设置上拉,用的评估板的外部上拉, 就是没应答。 EV2300却一切正常,这个芯片是不是需要什么特别的时序需要注意。
我程序中的I2C驱动,和TI的INA226进行I2C通信是没有问题的。同样的程序和bq34z100就没应答。
问题解决了。是这芯片读内部数据反应迟钝的问题
又研究了一下EV2300的波形,发现:写CMD指令后,bq34z100要延时90us才能给出ACK;写0xab后,要延时140us以上再读数据才可以。
可否把I2C通讯的代码放上来,共享一下。
如果要读电压 ,对应的Command code为0x08/0x09,这怎么还有两个command啊?怎么怎么去读电压呢?(STAR->AA->08->09->RESTAR-AB-DATA1-DATA2)是这样吗?可否分享一下EV2300读BQ34Z100电压时的波形呢?
0x08,0x09类似数据存放的地址,电压的低字节在0x08,高字节在0x09。
读电压:
START/
写0xaa/ 读ACK/*********************每次写数据后,读ACK也要等待,不断检测SDA 直到被拉低,再跳出ACK
写0x08/ 读ACK/****************
RESTART/
写0xab/ 读ACK/****************
延时(约140us)********************读数据前的这个延时很重要
读(0x08)数据/ 发ACK/
延时(约140us)*******
读(0x09)数据/
STOP
是的,直接拉取下一个clk就可以得到下个地址的寄存器