bq24195 I2C通信不上
急急急!这两天我用430g2452的USI模块的I2C模式来跟bq24195进行通信,读取bq24195的时候读取回来的数据都是0xff,我怀疑我自己写的读取代码有问题然后我就查看了一下读取时序,发现发送每一字节数据之后等待从机回应ACK的过程中SCL是高电平状态(空闲状态),正常情况下不是被从机拉低的么?这是软件问题还是硬件上存在问题呢。一下我把I2C配置代码贴出,请大家帮忙一下....
void I2c_Master_2452(void) //配置I2C模块
{
USICTL0 = USIPE6+USIPE7+USIMST+USISWRST; // Port & USI mode setup
USICTL1 = USII2C+USIIE; // Enable I2C mode & USI interrupt
USICKCTL = USIdiv_3+USISSEL_2+USICKPL; // Setup USI clocks: SCL = SMCLK/8 (~125kHz)
USICNT |= USIIFGCC; // Disable automatic clear control
USICTL0 &= ~USISWRST; // Enable USI
USICTL1 &= ~USIIFG; // Clear pending flag
}
这个配置是TI官网上的例程。
下面是我中断服务程序里面读取寄存器的代码
{
switch(I2C_State)
{
case 0: // Generate Start Condition & send address to slave
USISRL = 0x00; // set MSB of the shiftregister to 0
USICTL0 |= USIGE+USIOE; //置位USIGE、USIOE
USICTL0 &= ~USIGE; //清除USIGE
USISRL = 0X0D6; // ... and transmit address, R/W = 0
USICNT = (USICNT & 0xE0) + 0x08; // Bit counter = 8, TX Address
I2C_State = 2; // Go to next state: receive address (N)Ack
break;
case 2: // Receive Address Ack/Nack bit
USICTL0 &= ~USIOE; // SDA = input
USICNT |= 0x01; // Bit counter = 1, receive (N)Ack bit
I2C_State = 4; // Go to next state: check (N)Ack
break;
case 4: // Process Address Ack/Nack & handle data TX
USICTL0 |= USIOE; // SDA = output
if (USISRL & 0x01) // If Nack received...
{ // Send stop...
USISRL = 0x00;
USICNT |= 0x01; // Bit counter = 1, SCL high, SDA low
I2C_State = 18; // Go to next state: generate Stop
}
else
{ // Ack received, TX data to slave...
USISRL = RegAddr; // 发送要访问的寄存器地址
USICNT |= 0x08; // Bit counter = 8, start TX
I2C_State = 6; // Go to next state: receive data (N)Ack
}
break;
case 6: // Receive Address Ack/Nack bit
USICTL0 &= ~USIOE; // SDA = input
USICNT |= 0x01; // Bit counter = 1, receive (N)Ack bit
I2C_State = 8; // Go to next state: check (N)Ack
break;
case 8: // Process Address Ack/Nack & handle data TX
USICTL0 |= USIOE; // SDA = output
if (USISRL & 0x01) // If Nack received...
{ // Send stop...
USISRL = 0x00;
USICNT |= 0x01; // Bit counter = 1, SCL high, SDA low
I2C_State = 18; // Go to next state: generate Stop
}
else
{
// 产生开始条件并发送从机地址
// Delay_1ms(1);
USISRL = 0x00; // set MSB of the shiftregister to 0
USICTL0 |= USIGE+USIOE; //置位USIGE、USIOE
USICTL0 &= ~USIGE; //清除USIGE
USISRL = 0x0D7; // ... and transmit address, R/W = 0
USICNT = (USICNT & 0xE0) + 0x08; // Bit counter = 8, TX Address
I2C_State = 10; // Go to next state: receive address (N)Ack
}
break;
case 10: // Receive Data Ack/Nack bit
USICTL0 &= ~USIOE; // SDA = input
USICNT |= 0x01; // Bit counter = 1, receive (N)Ack bit
I2C_State = 12; // Go to next state: check (N)Ack
break;
case 12: // Process Data Ack/Nack & send Stop
USICTL0 |= USIOE;
if (USISRL & 0x01) // If Nack received...
{ // Send stop...
USISRL = 0x00;
USICNT |= 0x01; // Bit counter = 1, SCL high, SDA low
I2C_State = 18; // Go to next state: generate Stop
}
else // Ack received
{ //接收bq24195数据
USICTL0 &= ~USIOE; // SDA = input
USICNT |= 0x08; // Bit counter = 1, receive (N)Ack bit
I2C_State = 14; // Go to next state: check (N)Ack
}
break;
case 14: // Process bq24195发来的数据 and Transmit Data Nack bit
ReadData = USISRL;
USISRL = 0x01;
USICTL0 |= USIOE; // SDA = output
USICNT |= 0x01; // Bit counter = 1, receive (N)Ack bit
I2C_State = 16; // Go to next state: check (N)Ack
break;
case 16://Send Stop ...
USISRL = 0x00;
USICNT |= 0x01; // Bit counter = 1, SCL high, SDA low
I2C_State = 18; // Go to next state: generate Stop
break;
case 18: // Generate Stop Condition
USISRL = 0x0FF; // USISRL = 1 to release SDA
USICTL0 |= USIGE; // Transparent latch enabled
USICTL0 &= ~(USIGE+USIOE);// Latch/SDA output disabled
I2C_State = 0; // Reset state machine for next transmission
LPM0_EXIT; // Exit active for next transfer
break;
}
USICTL1 &= ~USIIFG; // Clear pending flag
}
1.无MCU控制的情况下,我们的charger也是可以使用默认状态充电的,请检查默认状态下,芯片的工作正常与否。
2.使用测试程序,只对一个寄存器写,看是否有效果,比如只对设置充电电流的那个寄存器写操作。
3.注意I2C地址,可以用示波器抓波形看时序是否正常。
感觉I2C地址最大嫌疑,你用D6(Hex)试下?
另外,ACK的表现是:第9个时钟脉冲时SCL为高、SDA为低。
我查看时序的时候发现第八个时钟之后(也就是发送完一个字节之后)SCL的电平状态是高电平(空闲状态),而且第八个时钟跟第九个时钟是有一段时间间隔的,等待ACK的时候:SCL时钟线是高电平状态,SDA线的扎un国泰是保持最后的状态。正常情况下等待ACK的时候SCL时钟线不是被从机拉低吗?
楼主,你现在可以对BQ24195进行写操作么?先尝试一下写操作,看看BQ24195的工作状态会不会改变。如果写操作可以,只是读操作不行的话,你查一下你的时序里面有没有重复启动位。如果写操作也不行,你按照楼上所述,核对一下器件地址是否写对了。
我也遇到相同問題!
到ADDRESS 應該是送D6 的才對吧. 因為SPEC 寫是先送MSB, 而地址是7BIT, 最後一BIT 是方向, 所以WRITE 應該是送D6, READ 是送D7
但我這樣寫之後, 到發送REG ADDR 就讀不到ACK了..老是讀回HIGH
charger是默认充电正常的,说明芯片正常;I2C地址也都对了,现在能够实现读写了,但是我用示波器抓到的时序还是:等待ACK的过程中scl是空闲状态
第九个时钟脉冲之后SCL不应该是低电平的吗?这么会是高电平呢?
已经读写正常了,地址没错,但是还是不明白为什么第九个时钟之后SCL会是空闲状态(高电平),正常的I2C时序不是等待ACK的时候SCL被拉低的吗?
你是不是发了stop位?
可以上传下SDA与SCL的波形。
问一下,首先,你的第九个时钟之后SCL空闲,是每一个字节第九个时钟过后都会空闲么?这个肯定是I2C配置出了问题。看一下你是否误发了停止位。
虽然现在是可以正常I2C通信,但是我对它的时序还是有点疑问。正常的SDA、SCL时序(也就是在BQ24195手册上看到的时序图)如附件图1,我实际用示波器测量的时序图如附件图2。帮忙分析一下,灰常感谢
我用的是BQ34Z100,遇到了和楼主同样的问题,现在I2C通讯不上,发帖问TI也没人回答,求问楼主是怎么解决?
楼主,问一下,我调试的bq25895iic通信,问什么充电电流最高只能达到1.2A,我用的是普通的USB接口,请问,怎样把电流调到1.2A以上,是否需要专用的适配器,来D+、D-检测电流,从而控制电流。
你用的适配器还是电脑的USB接口连到charger上面?看看状态寄存器,是否有进入VINDPM,有可能是适配器供能不足。另,你D+D-现在有连接在USB接口上么?
Hi, IT工程师,bq24195手册给的I2C地址不是0x6B吗?上面怎么说用0xD6,我用0x6B什么数据读取不到,用0xD6才可以,求解释。
你好,0x6B的地址是7位的,I2C的指令是高七位为器件地址,第0位是读写指令位。器件地址为0x01101011(0x6B),如果是写指令,第0位为0,那么第一条指令应该是器件地址整体左移一位,最后一位补0,即0x11010110(0xD6),如果是读指令,就应该是0xD7。
谢谢 George Luo1 ,还有个问题,关于bq24195的I2C寄存器地址,应该如何确定,若寄存器0x01,I2C写数据时,直接发送该寄存器地址0x01,这样对吗?还需要做什么偏移吗? 目前读寄存器0x00,写寄存器0x00都是正确。读取其他寄存器始终是0xff,且也写不进去数据 ,求帮忙分析一下,多谢!
你好,涉及到寄存器地址时,不需要再左移,这个你可以看一下规格书里面的I2C时序图。只有读和写指令需要将器件地址左移,而寄存器地址不需要。你读0x00寄存器是可以的,看一下读其他寄存器的时序是不是跟0x00一样。你先单独对其他的某个寄存器进行读或者写操作,看一下是否正常。
你好,能分享下你的过程么,我买了个BQ25895的EVM板还没玩起来,通讯不上,用的STC单片机,我的QQ是373985805,谢谢你的帮助
您好,我是bq25895EVM板 我用的单片机是STC15W404AS,我单片机电源接的SYS GND ,I/O 接的SCL SDA /CE(/CE一直给你低电平)通讯不上,片子是默认500mA充电状态 ,我把我的时序图给你看看,帮我看看是个啥问题呀,急死了都,谢谢
TI的大神:跪求25895_EVM板的使用说明,设置步骤,还有那些短路插的用途,可以说一下,输入5V,2A充电需要设置那些参数,要插那几个短路插,谢谢
你好,能发分参考程序看一下吗?弄了半天没通讯上,邮箱:904070908@qq.com
在第二次发送从地址前需要释放IIC