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.

[参考译文] MSPM0L1306:当 MSPM0L1306使用示例代码进行 BQ76905时、I2C 通信卡住

Guru**** 2325040 points
Other Parts Discussed in Thread: SYSCONFIG, ISO1540, BQ76905, MSPM0L1306, BQ76905EVM, BQ40Z50, TCA9546A, ISO1541
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1509417/mspm0l1306-i2c-communication-stuck-when-mspm0l1306-with-bq76905-using-example-code

器件型号:MSPM0L1306
主题中讨论的其他器件:BQ76905BQ76905EVM、SYSCONFIG、 BQ40Z50TCA9546AISO1541、ISO1540

工具/软件:

我有一个使用 MSPM0L1306和 BQ76905的定制电路板(基于 I2C 协议)、我能够通过 I2C 刷写其示例代码、但该示例卡在的 I2C_READ 函数处  

/*等待控制器发送所有字节*/
while (gI2cControllerStatus!= I2C_STATUS_TX_COMPLETE)&&
(gI2cControllerStatus!= I2C_STATUS_ERROR)){
__ WFE ();
}

何时  

/* I2C 写入示例*/

DirectCommands (AlarmEnable、0x00、R);//读取 AlarmEnable 配置

请告诉我为什么会发生这种情况。

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

    1) gI2cControllerStatus 似乎未声明为"volatile "。 Optimization=2 (-O2)时、循环可能看不到变量更新(由 ISR 完成)。 具体来说:

    > enum I2cControllerStatus {

    请尝试:

    > Volatile enum I2cControllerStatus {

    2)另一种可能是您遇到了 NACK (示例代码似乎没有正确处理 NACK)。 您使用的是 bq76905EVM 吗?

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

    消息流  

    > Volatile enum I2cControllerStatus {  

    而不是  

    > enum I2cControllerStatus {

    这没有解决我的问题。 它仍然卡住  

    /*等待控制器发送所有字节*/
    while (gI2cControllerStatus!= I2C_STATUS_TX_COMPLETE)&&
    (gI2cControllerStatus!= I2C_STATUS_ERROR)){
    __ WFE ();
    }   

    我正在使用 BQ76905RGRR。

    请引导我。

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

    1)您可以发布电路板的原理图吗? (如果您使用的是商用分线板、则产品名称和/或链接可能就足够了。) 首先我要查找 SDA/SCL 上的上拉电阻器。 如果它们(仅)连接到 REGOUT、我非常确定您需要连接电池。 (该 EVM 具有两组上拉电阻、以防万一。)

    2)您似乎有调试程序可用;您是否可以看到"gI2cControllerStatus"的值?

    3)您是否更改了示例代码中的任何内容?

    4)如果你有一个示波器或逻辑分析仪,这可能是一个很好的设置.

    我建议您保留"波动性"的更改;即使这不是您现在看到的内容的原因、它最终也会出现。

    我没有这些器件、所以我只能做一些建议。

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

    嗨、Nitin、
    除了 Bruce 提到的内容(您应该100%执行这些操作)外、我建议检查您使用的引脚以及它们在 SysConfig 中的配置方式。

    此致、

    Diego Abad

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

    请在下面找到我的答复、

    1)您可以发布电路板的原理图吗? (如果您使用的是商用分线板、则产品名称和/或链接可能就足够了。) 首先我要查找 SDA/SCL 上的上拉电阻器。 如果它们(仅)连接到 REGOUT、我非常确定您需要连接电池。 (该 EVM 具有两组上拉电阻、以防万一。)  

    响应:  我的电路板由 MSPM0L1306的 SDA 和 SCL 引脚定制、分别为 PA0和 PA1。 4.7k 上拉通过单独的3.3V 稳压器电压连接到它、而不是来自 REGOUT。 稳压器输入电压是电池电压。

    2)您似乎有调试程序可用;您是否可以看到"gI2cControllerStatus"的值?

    响应:   gI2cControllerStatus 的值为"I2C_STATUS_TX_INPROGRESS"

    3)您是否更改了示例代码中的任何内容?

    响应:  编号

    4)如果你有一个示波器或逻辑分析仪,这可能是一个很好的设置.

    响应:  我在逻辑分析仪上检查了 SDA 信号、发现它等待 ACK 并收到超时错误。

    在示例代码中、SDA 和 SCL 引脚已配置为 PA0表示 SDA、PA1表示 SCL、我的电路板也有相同的引脚连接。

    此致、

    镍锡

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

    您对逻辑分析仪跟踪方式的描述会很有意思。 如果主器件(MSPM0)正在等待 ACK、这必须意味着从器件(BQ76905)正在延展时钟。 数据表(SLUSE97)图7-4指示它可能会在 ACK 周期后延展时钟。 我想知道这实际上是否意味着它会延长 ACK 周期本身(尽管我看到了 BQ40Z50(此处)的迹线、显示其在第一个 Tx 位(中字节)之后拉伸)。

    如果 BQ76905正将时钟拉伸整整2秒(它的"长"超时)、这表明该设备有一些不太正确的东西--也许是它在您的电路板上的布线方式。 您有 EVM 吗? 我很好奇你是否看到同样的症状。

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

    嗨、Nitin、
    M0似乎按预期工作、 BQ76905没有响应。 我建议将此问题发布到 BMS-BGP E2E 论坛、以获取有关 BQ76905的更多帮助。
    此致、
    Diego Abad

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

    目前我没有 EVM。 在将尝试它,但直到你能建议任何东西在同一个我的定制板,这将解决我的问题?

    此致、

    镍锡

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

    在 I2C 级别、如果从器件将 SCL 保持(延展)为低电平、主器件无法执行太多操作。 I2C 规范(UM10204 rev7)第3.1.16节建议对从器件进行复位或下电上电;我没有看到复位引脚、并且我认为 BQ 通过电池运行、因此这些可能是不可选的。 鉴于第一个事务失败、我的猜测是、即使您重置了它、它也可能会执行相同的操作。

    此时、我要将 EVM 原理图[Ref UG (SLUUCY9) sec 5.1]与您的原理图进行比较、并考虑它们之间的任何差异。

    您能否发布逻辑分析仪跟踪[插入->图像]? 也许这里有人会看到一条线索。

    正如 Diego 指出的、电源管理人员可能有更好的建议:

    https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum

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

    你好

    感谢您的支持。

    我认为我的电路板 本身有问题。 但我想请您提供建议。 将 SDA、SCL 和 GND 引脚连接到逻辑分析仪以检查波形时执行的 I2C 通信。 当 GND 与逻辑分析仪断开连接时、它再次卡住  

    /*等待控制器发送所有字节*/
    while (gI2cControllerStatus!= I2C_STATUS_TX_COMPLETE)&&
    (gI2cControllerStatus!= I2C_STATUS_ERROR)){
    __ WFE ();
    }   

    请让我知道问题将是什么。

    此致、

    镍锡

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

    我想这意味着您有接地问题。 如何连接引脚11 (VSS)? 我假设 VSS 应该与 MCU 共享。

    我注意到该 EVM 的"pin"21 (底部的外露焊盘)也连接到 GND、但我在数据表中没有看到这方面的建议。  

    我的 EE 曾建议、在示波器似乎改变 GND 的情况下、在示波器上使用3:2引脚电源适配器、并将第三个引脚(适配器上)保持 未连接状态、从而提供一种形式的隔离。 至少您可以看到 I2C 上实际发生的情况。

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

    VSS 连接到 GND、MCU 和 BQ76905具有公共 GND。

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

    嗨、Nitin、
    我建议查看以下参考设计(TIDA-010268)、因为这应该可以为 BQ76905和 MSPM0L 器件的应用布局提供很好的参考。

    此致、

    Diego Abad

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

    我将根据参考设计对定制板进行返工。

    感谢您的支持

    此致、

    镍锡

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

    您好:

    我更新了原理图、但仍无法执行示例代码。 它卡住了  

    /*等待控制器发送所有字节*/
    while (gI2cControllerStatus!= I2C_STATUS_TX_COMPLETE)&&
    (gI2cControllerStatus!= I2C_STATUS_ERROR)){
    __ WFE ();
    }   

    还要在逻辑分析仪上找到 I2C 线路波形。

      

    请指导我完成此操作。

    此致、

    镍锡  

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

    我认为这是进步:没有(总线)挂起,我认为这不是第一次交易,所以至少有一个成功了。

    但是、您收到了对寄存器/命令0x60的写入数据的 NACK、我在 TRM 第11节中看不到。 如前所述、此示例处理 NACK (由于 gI2cControllerStatus)问题不大、因此我想(TI)测试人员没有遇到这种情况。 您能否显示堆栈反向跟踪、或者至少告诉我们正在调用哪个函数(来自 main)?

    Diego:由于这是一个 SDK 演示、您是否知道有人知道此代码/器件将如何工作? 我可以从首要原则入手、但我对该器件一无所知、只需浏览 TRM 即可。

    [编辑:数据表->TRM]

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

    您好 Bruce 和 Nitin、

    原始示例旨在使 I2C 通信按如下方式工作:

    1.控制器发送数据

    2.目标接收数据并传回

    3.控制器接收数据并在成功时切换 LED

    如果器件卡在代码的该部分、则必须满足以下条件:1. M0未完成预期事务、因为它无法到达 TX DONE 中断。 2. NACK 未被 M0注册(这很奇怪、因为它有一个中断处理程序。) 为了进行验证、Nitin 可以在 代码的 DL_I2C_IIDX_CONTROLLER_NACK 部分(硬件或软件断点)内部设置一个断点。 我想检查它是否正在访问该中断、因为有关其不工作原因的另一个解释是 gI2CControllerStatus 不是 TX_STARTED。

    此致、

    Diego Abad

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

    布线显示 I2C 地址0x20、但 BQ76905的地址为0x08 (DEV_ADDR)。 I2C 总线上还有其他东西吗?

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

    我正在查看示例(演示) bq7690x_control_i2c:

    https://dev.ti.com/tirex/explore/node?node=A__AOcJ8NCFdwGlSLJgqnoWEw__MSPM0-SDK__a3PaaoK__LATEST

    这里的 NACK 错误与一些基本 I2C 示例中的 NACK 类似:NACK 仅在特定状态(实际上是一对中的一个)下被识别、但此时该状态是不可能/不可能的、因此条件始终为 false、NACK 被忽略。 在基本示例中、这是因为首先发生 FIFO 中断。 这一个是不同的,因为这些状态永远不会发生--没有代码将状态设置为 RX/TX_STARTED。

    我一开始看不到(任何)状态检查的用途。 我记得、如果是 NACK、您不会收到 TXDONE 事件(尽管 I2C 单元会终止传输)、因此症状是挂起、而不是故障。  即使检查确实有效、他们也不会捕获数据 NACK 的情况(如此处所示)。

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

    即使假设 BQ76905 (以某种方式)响应地址0x20:对校验和寄存器(0x60)的写入与对子命令()的调用一致;用户可能会猜测 NACK 是由不正确的校验和产生的。 但这只是半理论、因为:

    1) TRM [Ref 第3.1]规定、在写入长度寄存器(0x61)之前、器件不会(无法)验证校验和、因此该 NACK 太早。

    2)此程序中没有对 subcommands()的调用(如提供)。

    更可能的是,分析仪迹线显示来自其他设备的响应——一个不同意在其0x60寄存器中设置的值。

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

    您好:

    我只保留了器件地址0x08。  

    我还将 gI2cControllerStatus 设置为易失性、并获得"I2C_STATUS_TX_INPROGRESS"。  

    我在  DL_I2C_IIDX_CONTROLLER_NACK 处设置断点、并观察到它通过 I2C_READ 函数中的 I2C_STATUS_TX_INPROGRESS 进入 while 循环

    在我的定制板中、I2C 线路通过4K7连接到3.3V 上拉电阻、并且还在 MCU 和 BQ76905 I2C 线路之间使用了隔离 IC。

    请告诉我什么是错的。  

    此致、

    镍锡

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

    我非常确定您收到了 NACK、但我在将其绑定到分析仪迹线中的 NACK 时遇到问题、因为这似乎不是来自 BQ76905。

    -----

    您使用的是什么隔离器 IC? 我想弄清楚是仅电气(例如 ISO16xx)还是 I2C 多路复用器(例如 TCA9546A)。

    -----

    为了确保:我查看了 SDK 示例代码"bq7690x_control_i2c"[上方链接]。 您使用的是这样吗?

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

    您好 Bruce、
    我同意你的说法。 我只需要它来检查器件是否能够识别 NACK、根据 Nitin 的评论、这似乎是这样做的。 为了摆脱无限循环、我可以认为的解决方案是 在 NACK 中断内添加"|| gI2cControllerStatus == I2C_STATUS_TX_INPROGRESS"。 但是、这不会解决通信问题、只需退出无限 while 循环即可。

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

    嗨、Nitin、
    我第二次 Bruce 对您使用的隔离器发表了评论。 您是否有办法通过直接与 BQ76905进行 I2C 通信来对此进行测试? 此外、 您是否在 BMS-BGP E2E 论坛上发布了这个问题? 您 是否收到了 BMS-BGP 团队的任何反馈?

    此致、

    Diego Abad

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

    此外:当我编译此程序(从 Import 中刷新)时、链接器发出警告:"warning #10210-D:创建默认大小为0x800的".sysmem"段;这是通过使用 printf ()触发的。

    我建议您通过将"Project->Properties->Build->Arm Linker->Basic->Heap Size"设置为512来避免此警告。

    除了摆脱警告,这也将为栈提供更多的内存,以防我们看到栈溢出(可能有神秘症状的东西)。 这可能是问题、也可能不是问题、但您不必担心。

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

    我的(反)建议是从 NACK 问题中完全删除 if()。 除其他外,此程序不能正确处理状态,这使得 if()容易受到过时状态值的影响。

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

    您好:

    我使用隔离器 IC ISO1514、并在 I2C 线路上添加两侧上拉电阻。

    我正在针对 TX 完成在循环期间卡住的相同代码中使用 SDK 示例代码"bq7690x_control_i2c"(gI2cControllerStatus == I2C_STATUS_TX_INPROGRESS)。

    我在 BMS-BGP E2E 论坛上没有收到任何反馈。

    此致、

    镍锡

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

    嗨、Nitin、
    我似乎找不到任何与该隔离器匹配的器件、您能否将其数据表分享? 此外、我建议遵循 Bruce 的建议、从 NACK 中断中删除 if 语句、这样  每当发生 gI2cControllerStatus 就会更改为 error。 最后、在删除 if 语句之前、能否检查 gI2cControllerStatus 每当卡住时的状态是什么? 是否仍有 I2C_STATUS_TX_INPROGRESS?

    此致、

    Diego Abad

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

    我正在使用隔离器 IC ISO1514  

    如果这旨在表示 ISO1541、我将指出该器件不允许从侧时钟延展[参考数据表(SLLSEB6F)第3节]、因此需要 ISO1540。 (BQ76905明显依赖于时钟延展。)

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

    您好:

    很抱歉拼写错误。 正确的隔离器 IC 为 ISO1541。

    此致、

    镍锡

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

    您好:

    很抱歉拼写错误。 IC 为 ISO1541。  

    删除 if 语句后、 gI2cControllerStatus 仍为 I2C_STATUS_TX_INPROGRESS。

    此致、

    镍锡

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

    您好:

    绕过隔离 IC 后、得到了:

    和调试消息、如下所示、

    CELL1电压寄存器=-300mV
    CELL2电压寄存器= 2530mV
    CELL3电压寄存器= 1mV
    电芯4电压寄存器= 3258mV
    Cell5 Voltage 寄存器=-483mV
    电芯6电压寄存器= 0mV
    Cell7电压寄存器= 0mV
    电池组电压= 8078mV
    REG18电压= 1764mV
    VSS 电压= 0mV
    CC2电流=-18 mA
    CC1电流=-23 mA
    ºC 温度= 34k Ω

    BQ7690x 完成的测试序列。

    但我有12V 锂离子电池、其中4节连接到 BQ76905、实际电池电压为13.16V

    请告诉我为什么会这样?

    此致、

    镍锡

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

    隔离器似乎确实是(最新的)问题。

    正在根据器件的内容(命令0x1A -> 0x0CB0)正确报告 Cell4电压(3258mV)、因此我(回到)想了解接线。 VC1-5上是否有测试点?

    更笼统地说:我现在超出了我的专业知识;我必须服从电源管理人员。

    该线程报告了似乎是一个类似的问题--只有 Cell4正确报告。 未提及解决方案、但 TI 人员(Terry)需要检查以下方面:

    https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1508090/bq76905-measured-voltage-error-on-the-first-3-cells-of-the-5-cell-series/5825307

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

    隔离器似乎确实是(最新的)问题。

    正在根据器件的内容(命令0x1A -> 0x0CB0)正确报告 Cell4电压(3258mV)、因此我(回到)想了解接线。 VC1-5上是否有测试点?

    更笼统地说:我现在超出了我的专业知识;我必须服从电源管理人员。

    该线程报告了似乎是一个类似的问题--只有 Cell4正确报告。 未提及解决方案、但 TI 人员(Terry)需要检查以下方面:

    https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1508090/bq76905-measured-voltage-error-on-the-first-3-cells-of-the-5-cell-series/5825307

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

    嗨、Nitin、
    由于 MSPM0 I2C 部分似乎没问题、因此建议在  BMS-BGP E2E 论坛中创建新的 E2E。

    此致、

    Diego Abad