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.

[参考译文] BQ76952:器件回显 SPI 命令、该命令显示为实际数据

Guru**** 2445770 points
Other Parts Discussed in Thread: BQ76952

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1469049/bq76952-device-echoes-spi-command-which-appears-as-actual-data

器件型号:BQ76952

工具与软件:

我们使用 S32K1 MCU 通过 SPI (通过 CRC)与 BQ76952通信。 在我们发送命令的某个时刻、BQ76952仅回显命令。 这会导致问题、因为它会被解释为真实数据(地址匹配且 CRC 有效)。 例如、以下是我们读取带数据的子命令的顺序:

  1. 将子命令 LSB ID 写入0x3E
  2. 将子命令 MSB ID 写入0x3F
  3. 等待 TRM 中表9-2中定义的"运行时间"周期
  4. 读取响应表单0x61的长度
  5. 从0x40读取数据以了解预期长度
  6. 从0x60读取校验和

现在、此过程会在步骤4随机失败、因为 BQ76952回显了命令、因此我们收到错误的数据长度、即

MOSI:61 FF 13、MISO:61 FF 13

由于接收到的地址(61)是我们预期的地址且 CRC 有效、因此 MCU 无法知道这不是"真实"数据。 我知道 BQ76952可能不是"准备就绪"状态、但在这种情况下、它应该以 FF FF 00进行响应。

您是否能够提供任何见解以帮助我了解正在发生的事情? 除了在步骤3中增加不必要的长延迟之外、我们是否可以采取任何措施来解决此问题?

谢谢你。

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

    Dan、您好!

    如果您只是尝试使用数据读取子命令、则 不需要从0x61读取响应的长度。  第2节子命令  应用手册更详细地解释了这一点。  第5.6节 RAM 寄存器读取示例:启用保护功能 A 中的 展示了 SPI 中该过程的示例。

    表9-2. 命令/子命令运行时间 给出了完成操作所需的近似时间;但是、它可能会因当时的系统操作而异。 建议采用来自主机处理器的重试方案来处理操作期间可能发生的通信错误或延迟。

    前一篇文章可能也很有用: 0x60校验和和0x61数据长度

    此致、
    Alexis

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

    尊敬的 Alexis:

    我的方法在读取后验证校验和、因此我确实需要读取长度。 请注意、我遵循 TRM 第3.1节中所述的"从子命令读取数据的最高效方法"。

    假设不需要进行校验和验证、因为我使用的是具有 CRC 的 SPI、我认为仍然会有问题。 根本问题是 BQ76952回显命令、而不是使用 FF FF 00进行响应、以指示其未 就绪。 因此、如果 BQ76952回传40FF 54命令、我将得到寄存器40的数据、而不是"接收"不正确的长度。

    在请求长度之前、我目前使用了较长的延迟、但这不够理想。 很遗憾重试机制不可靠。

    谢谢

    Dan

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

    Dan、您好!

    我的方法是在读取后验证校验和、因此我确实需要读取长度。

    不过、我可能会有点误解、校验和是通过0x3E、0x3F 和缓冲区数据计算得出的。 它不包含0x60和0x61中的校验和或长度、因此您不需要0x61中的响应长度。

    潜在问题是 BQ76952回显命令、而不是使用 FF 00响应命令、指示该命令未 就绪。 因此、如果 BQ76952回传40 FF 54命令、我将得到寄存器40的错误数据、而不是我"收到"不正确的长度。

    您是否介意分享您显示此内容的逻辑分析仪文件?

    此致、
    Alexis

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

    尊敬的 Alexis:

    您完全正确、因为校验和计算不需要长度、我在描述中不是很清楚。 我读取长度是为了避免为了节省时间而必须读取数据块的所有32个字节(我们需要高速从 BQ76952读取数据、以便尽可能节省时间)。 然后通过0x3E、0x3F 计算校验和、仅计算从数据块读取的字节数(由长度给出)。

    无论如何、真正的问题是回显命令、以下是我的意思的几个示例:

    命令失败1:

    Data MOSI 数据 MISO
    850B 60 7C 86
    850B 850B
    Bf 00 8C 850B
    Bf 00 8C Bf 00 8C
    61 FF 09 第四十六章46.
    61 FF 13. FF FF FF 00
    61 FF 13. FF FF FF 00
    61 FF 13. 61 FF 13.

    命令2失败:

    Data MOSI 数据 MISO
    Bf 00 8C Bf 00 8C
    61 FF 13. Bf 00 8C
    61 FF 13. FF FF FF 00
    61 FF 13. 61 FF 13.
    重试---
    850B 61 FF 13.
    850B 850B
    Bf 00 8C 850B
    Bf 00 8C Bf 00 8C
    61 FF 13. Bf 00 8C
    61 FF 13. 61 FF 13.
    34 FF 5E 61 FF 13.

    命令3失败:

    Data MOSI 数据 MISO
    贝斯特韦尔83 19. 3B FF 4E
    贝斯特韦尔83 19. 贝斯特韦尔83 19.
    Bf 00 8C 贝斯特韦尔83 19.
    Bf 00 8C Bf 00 8C
    61 FF 13. Bf 00 8C
    61 FF 13. 61 FF 13.

    以下是成功执行命令的示例:

    Data MOSI 数据 MISO
    Bf 00 8C 850B
    Bf 00 8C Bf 00 8C
    61 FF 09 Bf 00 8C
    61 FF 09 FF FF FF 00
    61 FF 09 FF FF FF 00
    61 FF 13. FF FF FF 00
    61 FF 13. 61 06 F2
    40 FF A8 61 06 F2
    40 FF A8 40 00 5B
    41 FF BD 40 00 5B
    41 FF BD 41 00 4E.
    60 FF 06. 41 00 4E.
    60 FF 06. 第94章

    另一种:

    Data MOSI 数据 MISO
    850B 60 7C 86
    850B 850B
    Bf 00 8C
    850B
    Bf 00 8C FF FF FF 00
    Bf 00 8C FF FF FF 00
    第四十六章46. FF FF FF 00
    第四十六章46. FF FF FF 00
    Bf 00 8C Bf 00 8C
    61 FF 13. Bf 00 8C
    61 FF 13. 61 06 F2
    40 FF A8 61 06 F2
    40 FF A8 40 00 5B
    41 FF BD 40 00 5B
    41 FF BD 41 00 4E.
    60 FF 06. 41 00 4E.
    60 FF 06.  第94章

    谢谢

    Dan

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

    Dan、您好!

    感谢您澄清并分享这些示例。 发送子命令后、读取0x61之前添加更长的延迟时间是一个选项、可能会如您之前所述有所帮助。

    我从您共享的内容中发现的另一点是、您没有读取0x3E 和0x3F 来检查子命令在步骤1和步骤2之后是否已完成操作、如中所述 第3.1节直接命令和子命令 曲线。 如果读取0x3E 和0x3F、则返回0xFF、这表示子命令也尚未完成操作。 此响应仅适用于返回待读回的数据的子命令。

    通过执行此步骤、您可以确保子命令已完成操作、而不是等待可能足够长的延迟、该延迟可能会因子命令和主机处理器而异。 您是否想尝试这样做、看看这是否更适合您的情况?

    此致、
    Alexis

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

    尊敬的 Alexis:

    我将给出这样的答案、 我想一旦器件回传写命令、它就表明已进行处理。 这是否意味着 在之后读取长度之前不需要任何延迟/等待时间?

    谢谢

    Dan

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

    Dan、您好!

    我认为、一旦设备回传写命令、它就表明它已被处理

    向0x3E 和0x3F 写入时、如果器件回显写入命令、我认为该命令已接收/处理、但子命令不一定已完成操作/数据准备就绪。

    这是否意味着我 以后在读取长度之前不需要任何延迟/等待期?

    正确、如果您连续读取0x3E 和0x3F 来查看它是否返回0xFF 或反映命令。

    此致、
    Alexis

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

    尊敬的 Alexis:

    感谢您的确认。 我已经实现了0x3E 和0x3F 读取、它都解决了命令回显问题、并缩短了设置子命令 ID 和读取数据长度之间的时间。

    谢谢

    Dan