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.

[参考译文] BQ40Z50:使用 MSP430解决 BQ40Z50上的 SMBus 通信问题所需的帮助

Guru**** 2551110 points
Other Parts Discussed in Thread: MSP430F5529, MSP430FR5994, BQ40Z50, EV2400, BQ25798

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1350192/bq40z50-assistance-needed-with-smbus-communication-issue-on-bq40z50-using-msp430

器件型号:BQ40Z50
主题中讨论的其他器件: EV2400BQ25798、MSP430FR5994、MSP430F5529

尊敬的 TI E2E 支持团队:

我希望这条消息能让您满意。 我联系以寻求帮助、以解决我在 BQ40Z50电池管理 IC 上遇到的 SMBus 通信问题。

通常、与 BQ40Z50进行通信的官方方法是使用 EV2400接口。 但在我的应用中、我使用具有修改后的 I2C 端口的 MSP430微控制器来建立软件 SMBus 通信。 虽然这种方法已经很有希望、但与通过 EV2400接口获取的读数相比、数据读数存在差异。

为了提供一些背景信息、我附上了描述从这两种方法获得的读数的图片:

图1:EV2400读数0x09 (电池组电压)-结果:0x388B = 14475mV

图2:0x09的 MSP430读数(电池组电压)-结果:0x3875 = 14453mV

图3:EV2400的0x0A 读数(电池组电流)-结果:0x1C1 = 449mA  

图4:0x0A 的 MSP430读数(电池组电流)-结果:0x157 = 343mA  

虽然电池组电压读数显示出可容许的变化、但电池组电流读数的差异很明显。 如图中的红线所示、电流探头建议值更接近450mA、并且与 EV2400读数一致。

我已经全面审查了我的实施方案、无法发现任何明显的错误。 因此、非常感谢您的团队为解决此问题提供的任何见解或指导。 具体而言、我对基于 MSP430的 SMBus 通信可能导致不准确的电池组电流读数以及如何对其进行校正感兴趣。

感谢您关注此事、我热切期待您的答复。

此致、
J·弗雷迪

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

    您好、Freddie。

    只是确认一下、在使用 EV2400和 MSP430的两种情况下、它们是否都连接到定制 PCB 上的 bq40z50而不是 bq40z50EVM?

    在 使用 MSP430进行通信时、您能否告诉我发送给监测计以进行检查的指令列表?

    与 EV2400进行通信时、SMBus 线路或电池组连接的布线与 EV2400是否有任何差异?

    此致、

    安东尼·巴尔迪诺

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

    尊敬的 Anthony:

    感谢您的及时回复和查询。 以下是您请求的详细信息:

    1. 设置确认:是的、EV2400和 MSP430都连接到包含 bq40z50而不是 bq40z50EVM 的定制 PCB。

    2. 指令列表:下面是使用 MSP430与 bq40z50通信的示例代码片段:

      I2C_Master_ReadReg(0x0B, 0x0A, 3);
      

      下面是I2C_Master_ReadReg函数的实现:

      I2C_Mode I2C_Master_ReadReg
      (
              uint8_t dev_addr,
              uint8_t reg_addr,
              uint8_t count
      )
      {
          /* Initialize state machine */
          MasterMode = TX_REG_ADDRESS_MODE;
          TransmitRegAddr = reg_addr;
          RXByteCtr = count;
          TXByteCtr = 0;
          ReceiveIndex = 0;
          TransmitIndex = 0;
      
          UCB2I2CSA = dev_addr;
          UCB2IFG &= ~(UCTXIFG + UCRXIFG);       // Clear any pending interrupts
          UCB2IE &= ~UCRXIE;                       // Disable RX interrupt
          UCB2IE |= UCTXIE;                        // Enable TX interrupt
      
          UCB2CTLW0 |= UCTR + UCTXSTT;             // I2C TX, start condition
          __bis_SR_register(LPM0_bits + GIE);              // Enter LPM0 w/ interrupts
      
          return MasterMode;
      }
      
      
      //******************************************************************************
      // I2C Interrupt ***************************************************************
      //******************************************************************************
      #if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
      #pragma vector = USCI_B2_VECTOR
      __interrupt void USCI_B2_ISR(void)
      #elif defined(__GNUC__)
      void __attribute__ ((interrupt(USCI_B2_VECTOR))) USCI_B2_ISR (void)
      #else
      #error Compiler not supported!
      #endif
      {
          switch(__even_in_range(UCB2IV, USCI_I2C_UCBIT9IFG))
          {
          case USCI_NONE:                         // Vector 0: No interrupts
              break;
          case USCI_I2C_UCALIFG:                  // Vector 2: ALIFG
              break;
          case USCI_I2C_UCNACKIFG:                // Vector 4: NACKIFG
              UCB2CTL1 |= UCTXSTP; // Send I2C stop condition
              UCB2IFG = 0;
              break;
          case USCI_I2C_UCSTTIFG:                 // Vector 6: STTIFG
              break;
          case USCI_I2C_UCSTPIFG:                 // Vector 8: STPIFG
              break;
          case USCI_I2C_UCRXIFG3:                 // Vector 10: RXIFG3
              break;
          case USCI_I2C_UCTXIFG3:                 // Vector 12: TXIFG3
              break;
          case USCI_I2C_UCRXIFG2:                 // Vector 14: RXIFG2
              break;
          case USCI_I2C_UCTXIFG2:                 // Vector 16: TXIFG2
              break;
          case USCI_I2C_UCRXIFG1:                 // Vector 18: RXIFG1
              break;
          case USCI_I2C_UCTXIFG1:                 // Vector 20: TXIFG1
              break;
          case USCI_I2C_UCRXIFG0:                 // Vector 22: RXIFG0
              rx_val = UCB2RXBUF;
              if (RXByteCtr)
              {
                  ReceiveBuf[ReceiveIndex++] = rx_val;
                  RXByteCtr--;
              }
              if (RXByteCtr == 1)
              {
                  UCB2CTLW0 |= UCTXSTP;
              }
              else if (RXByteCtr == 0)
              {
                  UCB2IE &= ~UCRXIE;
                  MasterMode = IDLE_MODE;
                  __bic_SR_register_on_exit(CPUOFF);      // Exit LPM0
              }
              break;
          case USCI_I2C_UCTXIFG0:                 // Vector 24: TXIFG0
              switch (MasterMode)
              {
                  case TX_REG_ADDRESS_MODE:
                      UCB2TXBUF = TransmitRegAddr;
                      if (RXByteCtr) {
                          MasterMode = SWITCH_TO_RX_MODE;   // Need to start receiving now
                      } else {
                          MasterMode = TX_DATA_MODE;        // Continue to transmision with the data in Transmit Buffer
                      }
                      break;
      
                  case SWITCH_TO_RX_MODE:
                      UCB2IE |= UCRXIE;              // Enable RX interrupt
                      UCB2IE &= ~UCTXIE;             // Disable TX interrupt
                      UCB2CTLW0 &= ~UCTR;            // Switch to receiver
                      MasterMode = RX_DATA_MODE;    // State state is to receive data
                      UCB2CTLW0 |= UCTXSTT;          // Send repeated start
                      if (RXByteCtr == 1)
                      {
                          //Must send stop since this is the N-1 byte
                          while((UCB2CTLW0 & UCTXSTT));
                          UCB2CTLW0 |= UCTXSTP;      // Send stop condition
                      }
                      break;
      
                  case TX_DATA_MODE:
                      if (TXByteCtr)
                      {
                          UCB2TXBUF = TransmitBuf[TransmitIndex++];
                          //EUSCI_A_UART_transmitData(EUSCI_A3_BASE, UCB0TXBUF);
                          TXByteCtr--;
                      }
                      else
                      {
                          //Done with transmission
                          UCB2CTLW0 |= UCTXSTP;     // Send stop condition
                          MasterMode = IDLE_MODE;
                          UCB2IE &= ~UCTXIE;                       // disable TX interrupt
                          __bic_SR_register_on_exit(CPUOFF);      // Exit LPM0
                      }
                      break;
      
                  default:
                      __no_operation();
                      break;
              }
              break;
          default:
              break;
          }
      }

      此代码启动对 bq40z50上寄存器0x0A (电池组电流)的读取操作、数据长度为3字节。

    3. SMBus 线路和电池组连接的比较:MSP430和 EV2400设置之间 SMBus 线路(SCL、SDA)和电池组连接的布线保持一致。 它们使用相同的连接- SCL、SDA 和 GND (VSS)。


      如果您需要任何进一步的信息、或者我们可以采取其他步骤来诊断和解决问题、请告诉我。

      此致、

      J·弗雷迪

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

    您好、Freddie。

    感谢您发送这些信息。 上面、您说、当 MSP430读取电池组电流时、测得的电流仍在450mA 附近。 该测量是否是从测量连接到 SRN 和 SRP 的感应电阻测得的? 监测计依靠该感应电阻进行电流测量。

    您还能告诉我是否对监测计进行了任何电流校准吗?

    此致、

    安东尼·巴尔迪诺

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

    尊敬的 Anthony:

    感谢您提出后续问题。 以下是您请求的说明:

    1. 电流测量的说明:是的、当 MSP430读取450mA 时获得的周围电池组电流的测量值确实是通过测量连接到 SRN 和 SRP 的感应电阻测得的。 该感应电阻器是电量监测计电流测量所不可或缺的一部分。

    2. 有关电流校准的信息:关于电流校准、我只使用 TI 工具、特别是 Battery Management Studio 以及 EV2400来执行校准。 当示波器显示450mA 读数时、我将该值输入 Battery Management Studio 中的"Current calibration (校准电量监测计)"框、然后点击"Calibrate Gas Gauge"按钮。

    鉴于这些要点、我的好奇心是为什么 BQ40z50在使用相同的硬件(定制 PCB)和相同的 SMBus 模式的情况下可能会以不同的值回复。 是否有任何我可能忽略的因素或注意事项?

    非常感谢您对此问题的见解和指导。

    此致、

    J·弗雷迪

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

    您好、Freddie。

    考虑到这些问题,我的好奇心在于理解为什么 BQ40z50尽管使用相同的硬件(定制 PCB)和相同的 SMBus 模式,但却可以用不同的值来回复。 是否有我可能忽略的任何因素或注意事项?

    我同意、这是一个奇怪的问题、因为硬件不应有任何变化。 关于软件、我想知道在初始化连接后以及进行测量之前 MCU 是否向电量监测计发送了任何命令。

    如果可能、您能否看看当硬件连接到 EV2400和 MCU 以检查软件是否未更改任何内容时、这些值是否有任何差异?

    您还可以检查是否可以从上电复位中缓解此问题吗?

    此致、

    安东尼·巴尔迪诺  

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

    尊敬的 Anthony:

    感谢您的持续支持和建议。 根据你的最新查询,我作了进一步调查,并作了一些观察:

    1. MCU 初始化:我可以确认在 MCU 初始化期间、没有命令发送到 BQ40Z50。 但是、同一 SMBus 上还有另一个 IC、即具有地址0x6B 的 BQ25798、进行初始化。

    2. BQ25798的初始化:以下是 BQ25798的初始化序列的快照:

    3. 电流和电流偏移配置:在 PCB 配置中、用于电流检测的电阻器值为10 Ω。 下图描述了电流和电流失调:

    考虑到这些要点、我想知道是否需要调整任何配置来确保与同一 SMBus 上的 BQ25798和 BQ40Z50正确通信。 尽管执行了上电复位、但问题仍然存在。

    您能否建议在此场景中是否需要更改配置?

    期待您的见解。

    此致、
    J·弗雷迪

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

    您好、Freddie。

    感谢您分享关于 MCU 和校准值的信息。 我认为 bq27598不会造成任何与通信有关的问题。

    为了进行检查、您是否可以从 MCU 和 EV2400上读取监测计的固件版本、以便确认 SMBus 线路不存在问题? 从这两者读取时、该值应该相同。

    关于 MCU、这是 bq40z50所采用的定制电路板的一部分还是非板载连接? 如果可能、您能否发送原理图以便我们更深入地了解导致电流差异的原因?

    此致、

    安东尼·巴尔迪诺

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

    尊敬的 Anthony:

    感谢您的及时回复和建议。 以下是有关我们的设置的更新和附加信息:

    1. 固件版本:虽然我不确定 MCU 的固件版本、但我可以确认 BQ40Z50已从 R1更新为 R3、如图1所示。

       图1.

    2. MCU 连接简介:MCU PCB 通过 CN42连接到 BQ40Z50 PCB 上的 CN8、与 BQ40Z50 PCB 相连。 此外、SDA 和 SCL 通过上拉电阻上拉至3.3V、

      • 图2:BQ40Z50 PCB 的方框图
      • 图3:BQ40Z50 PCB 的原理图
      • 图4、5:MCU PCB 原理图



        图2.

        图3.


        图4.


        图5.




    如果您需要任何进一步的详细信息、或者您希望我们专注于特定领域进行故障排除、请告诉我。

    期待您的指导。

    此致、

    J·弗雷迪

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

    您好、Freddie。

    感谢您发送这些原理图文件。 关于感应电阻器的形成、我有几个问题:

    您能告诉我检测电阻上方 C328电容器的用途吗? 通常、在我们的 bq40z50EVM 原理图中、该电容器位于 R592和 R593连接上、如下所示:

    您是否还可以确认 GND_BMC1_BP1和 GND_BMC_PCU 已连接到电池组负极侧和电池组连接(PACK-)负极侧?

    在下面的文档中、可在第15页找到 EV2400的原理图。 我认为、这在比较定制 MCU 与 EV2400通信线路的匹配程度方面会很有用。

    https://www.ti.com/lit/pdf/sluu446

    此致、

    安东尼·巴尔迪诺

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

    感谢您的咨询和提供的更多指导。 以下是有关您的问题的说明和更新:

    1. 电容器 C328的用途:C328确实打算用作电源的偏置电容器、类似于电容器 C8和 C10在 bq40z50EVM 原理图中的放置。

    2. 接地连接确认:GND_BMC1_BP1和 GND_BMC_PCU 确实已连接到电池组负极侧和电池组连接(PACK-)负极侧。

    3. MCU 和 EV2400的比较:感谢您提供 EV2400原理图。  我们当前的 MCU 是 MSP430FR5994、而 EV2400使用 MSP430F5529。 在我们的设置中、我已将 FR5994的 P7.0和 P7.1配置为 I2C 模式、以模拟 SMBus 通信。 然而、F5529的 P4.6和 P4.7被指定为通用 I/O。 SMBus 通信似乎是使用软件模拟的。 您能提供通用 I/O 的软件 SMBus 代码吗?

    再次感谢您的帮助和支持。 您的见解和指导对于解决此问题非常重要。

    此致、

    J·弗雷迪

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

    您好、Freddie。

    MCU 和 EV2400的比较:感谢您提供 EV2400原理图。  我们当前的 MCU 是 MSP430FR5994、而 EV2400使用 MSP430F5529。 在我们的设置中、我已将 FR5994的 P7.0和 P7.1配置为 I2C 模式、以模拟 SMBus 通信。 然而、F5529的 P4.6和 P4.7被指定为通用 I/O。 SMBus 通信似乎是使用软件模拟的。 您能提供通用 I/O 的软件 SMBus 代码吗?

    我不相信可以共享 EV2400的 SMBus 代码、但如果使用的 MSP430可以在没有 NACK 的情况下从监测计读取数据、我不认为这是问题。

    如果可能、您是否能够在上面的原理图中测试 CN8的连接点(对于 EV2400/MCU 连接)、并查看每个 EV2400和 MCU 连接时电压或电流是否存在较大差异?

    此致、

    安东尼·巴尔迪诺

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

    尊敬的 Anthony:

    我认为我已经确定了当前的问题。 进一步检查后、我发现 GND_BMC1_BP1和 GND_BMC1_SYS 都连接在一起。 这个配置在通过 RS19和达到 GND_BMC1_BP1前引起电流分频。

    这种认识可能是我们在当前读数中遇到的差异的原因。

    再次感谢您在整个故障排除过程中继续提供支持和指导。

    此致、
    J·弗雷迪

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

    您好、Freddie。

    这似乎是导致出现该问题的原因。 希望这可以解决这个问题!

    此致、

    安东尼·巴尔迪诺