This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] BQ76940:I2C (TWI)通信错误

Guru**** 2529560 points
Other Parts Discussed in Thread: BQ76940

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1114394/bq76940-i2c-twi-communication-error

器件型号:BQ76940

大家好、我需要一些帮助。 我在主机控制器 AT90CAN128芯片上遇到 I2C 通信错误。

当我尝试从 BQ76940接收 ACK 脉冲时、我会得到奇怪的脉冲电平。

这里是我的代码 、它是 osc 波形的图片。

字节数据= 0;

TWCR =(1<<TWINT)|(1<TWSTA)|(1<TWEN);

while (!(TWCR &(1<<TWINT)));
while ((TWSR & 0xf8)!= 0x08);
//------------------ ------------ ------------ ----
TWDR = 0x10;

TWCR =(1<<TWINT)|(1<twen);

while (!(TWCR &(1<<TWINT)));
//while ((TWSR & 0xf8)!= 0x18);
//------------------ ------------ ------------ ----
延迟(10);
TWDR = reg_addr;

TWCR =(1<<TWINT)|(1<twen);

while (!(TWCR &(1<<TWINT)));
//while ((TWSR & 0xf8)=0x28);
//------------------ ------------ ------------ ----
TWCR =(1<<TWINT)|(1<TWSTA)|(1<TWEN);

while (!(TWCR &(1<<TWINT)));
//while ((TWSR & 0xf8)!= 0x10);
//------------------ ------------ ------------ ----
TWDR = 0x11;

TWCR =(1<<TWINT)|(1<twen);

while (!(TWCR &(1<<TWINT)));
PORTA = TWSR;
//------------------ ------------ ------------ ----
TWCR =(1<<TWINT)|(1<twen);

while (!(TWCR &(1<<TWINT)));

PORTA = TWSR;

延迟(10);

Data=TWDR;
//------------------ ------------ ------------ ----
TWCR =(1<<TWINT)|(1<TWSTO)|(1<TWEN);

返回数据;

->>上面的代码生成此波形

字节数据= 0;

TWCR =(1<<TWINT)|(1<TWSTA)|(1<TWEN);

while (!(TWCR &(1<<TWINT)));
while ((TWSR & 0xf8)!= 0x08);
//------------------ ------------ ------------ ----
TWDR = 0xF0;

TWCR =(1<<TWINT)|(1<twen);

while (!(TWCR &(1<<TWINT)));
//while ((TWSR & 0xf8)!= 0x18);
//------------------ ------------ ------------ ----
延迟(10);
TWDR = reg_addr;

TWCR =(1<<TWINT)|(1<twen);

while (!(TWCR &(1<<TWINT)));
//while ((TWSR & 0xf8)=0x28);
//------------------ ------------ ------------ ----
TWCR =(1<<TWINT)|(1<TWSTA)|(1<TWEN);

while (!(TWCR &(1<<TWINT)));
//while ((TWSR & 0xf8)!= 0x10);
//------------------ ------------ ------------ ----
TWDR = 0xF1;

TWCR =(1<<TWINT)|(1<twen);

while (!(TWCR &(1<<TWINT)));
PORTA = TWSR;
//------------------ ------------ ------------ ----
TWCR =(1<<TWINT)|(1<twen);

while (!(TWCR &(1<<TWINT)));

PORTA = TWSR;

延迟(10);

Data=TWDR;
//------------------ ------------ ------------ ----
TWCR =(1<<TWINT)|(1<TWSTO)|(1<TWEN);

返回数据;

->>此代码具有错误的用于欺骗 NACK 信号的斜线地址。

BQ76940发送奇怪的 ACK 脉冲电平(位:0)、但 NACK 脉冲电平是正常的。

如何解决此问题?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好,JongWhi,

    似乎存在阻止 SDA 达到正确电平的电气问题。 总线上是否可能存在争用现象?

    此致、

    Matt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Matt、感谢您回答我的问题。

    它们仅在 MCU 和 AFE 之间具有连接(MCU SDA <-> AFE-SDA/MCU SCL <-> AFE-SCL 引脚)。
    我应该在电路上添加上拉或下拉电阻吗?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、I2C 需要上拉电阻器。

    此致、

    Matt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我已将上拉电阻器添加到3.3V、但它仍然有相同的问题

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    现在添加了上拉电阻器、您能否捕获波形? 您在 BQ76940 IC 的 REGOUT 引脚上测量的电压是多少?

    Matt