各位专家、您好!
我正在使用 BQ7694003设计13节 BMS。 我在写入 BQ 寄存器时遇到问题。 IC 不会在第9个周期提供 ACK。 SDA 线在第9个周期内不会被拉低。 https://e2e.ti.com/support/power-management/f/196/t/323329之前也提出了同样的问题 、但未指出解决方案和原因。 我更换了 BMS IC、但问题仍未解决。
我研究 了 http://www.ti.com/lit/zip/sluc583上提供的代码 和 ap note http://www.ti.com/lit/pdf/slva626 、并相应地编写了我的代码。
在我的 I2C 设置中-
主机 MCU -> 主器件(始终)
BQ76940 -> 从器件(始终)
我认为这种设置是正确的、因为 BQ 不会生成 SCL、因此在任何事件(TX 或 Rx)中它都不能是主器件。 因此、它将始终是从器件、而 MCU 将始终是主器件、因为它会生成 SCL。 我的理解是否正确?
接下来介绍 I2C 软件。 为了解释我的软件流程、我将考虑 CC_CFG 寄存器的示例
Bq_addr = 0x08或0000 1000
CC_CFG :addr = 0x0B 或0000 1011
数据= 0x19或0001 1001
CRC = 0x89或1000 1001
CRC 多项式:x8 + x2 + x + 1 = 1 0000 0111
CRC 的计算公式为:Bq_addr (8位) | CC_CFG (8位) | DATA (8位)
0000 1000 | 0000 1011 | 0001 1001
由于 CRC 多项式的幂为8、因此在上述二进制数后附加8个零、然后计算 CRC
我得到了0x89作为上述情况的 CRC
然后、整个 I2C 帧被发送到 BQ。 BQ 在接收到的每个字节后发送一个 ACK。 帧格式为
START | SLAVE_ADDR (7)+W (1) | REGISTER_ADDR (8) | DATA (8) | CRC (8) | STOP
(n) ->表示位数
SLAVE_ADDR + W = 0001 0000 (BQ_ADDR 左移1)
REGISTER_ADDR = 0000 1011
数据= 0001 1001
CRC = 1000 1001
SLAVE_ADDR 是左移1位的 BQ 地址。 该域的第8位为0、表示主机处于传输模式(MT 模式)。 因此、主器件将数据写入从器件的寄存器。
现在的问题是 、BQ 不是在 SLAVE_ADDR + W 之后的第9个周期发送 ACK。SLAVE_ADDR + W 字节已成功发送、但 BQ 在第9个周期给出了 NACK、SDA 未拉低。
以下是我在 BQ IC 的不同引脚上观察到的电压读数-
(所有电压均为 WRT 接地)
TS1 = 0.0V (启动后)
TS2 = 20.2V
TS3 = 36.4V
CAP1 = 3.28V
CAP2 = 23.7V
CAP3 = 40.1V
REGSRC = 18.4V
VC5X = 20.4V [C1、C2、C3、C4、C5]
VC10X = 36.7V [C6、C7.C8.C10]
BAT = 53.2V [C11、C12、C13、C15]
PACK+ = 53.3V
我使用了3个10k NTC 热敏电阻、每个热敏电阻焊接在 TS1-GND、TS2-VC5X、TS3-VC10X 之间。 当我按下 BOOT 按钮时、TS1电压上升至2.7V。此外、在连接电池后应用 BOOT 信号。 BQ 启动后会启动 I2C 通信。
我还使用了3.3 - 5V 双向逻辑电平转换器、以实现5V MCU 和3.3V BQ IC 之间的安全且正确的通信。
那么、引发此问题的原因是什么? BQ 为何不发送 ACK? (PS:我无法访问 EVM 板、因此不要要求在 EVM 上测试 I2C)