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.

[参考译文] TPS25751:尝试使用补丁突发模式、但遇到意外错误

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1450091/tps25751-trying-to-use-patch-burst-mode-but-running-into-unexpected-error

器件型号:TPS25751

工具与软件:

大家好、

正如标题所示、我正在尝试使用 PBMx 命令初始化我的 TPS25751。 问题是、我遇到了与此相关帖子相同的问题。

成功执行命令'PBMc'后、输出数据的字节1为0x03、如下所述:

"查阅 TRM 表3-1后、字节[1]= 0x03似乎表示该指令被拒绝、读取寄存器0x03仍会获取'PTCH'。"

(TPS25750EVM:如何使用补丁突发模式在没有 EEPROM 配置的情况下成功初始化 TPS25750EVM -电源管理论坛-电源管理- TI E2E 支持论坛)

在本主题中、我不太了解问题是如何解决的。

此外、我不确定是否正确写入了补丁突发数据。 如果我将低位区域二进制文件的前64个字节写入从器件地址到寄存器0x01、等待一个短暂的延迟、然后在同一位置写入接下来的64个字节、是否正确?
我的 C 语言代码:

  uint8_t buffer[64];
  size_t offset = 0;
  size_t binary_size = sizeof(low_region_binary);

  while (offset < binary_size) {
    size_t chunk_size = (binary_size - offset > sizeof(buffer)) ? 
        sizeof(buffer) : (binary_size - offset);
            
    memcpy(buffer, &binary_lr[offset], chunk_size);

    HAL_I2C_Mem_Write(&hi2c2, target_address << 1, 0x01, 1, buffer, chunk_size,
                      HAL_MAX_DELAY);
    offset += chunk_size;
    HAL_Delay(20);
  }

low_region_binary 是由应用程序自定义工具创建的数组(二进制表示为 c 代码)
TARGET_ADDRESS 为0x10、与'PBMs'输入数据的字节5相同

我希望您能理解我的问题、并能提供解决问题的建议。

提前感谢。


此致 Luca

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

    尊敬的 Luca:

    请允许我在星期五之前 EOB 深入审查该问题并提供有意义的更新。

    此致、

    Conner

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

    我做了一些最近的发现。

    成功执行'PBMs'后、低位区域二进制数据不应该有任何开销。 正常 I2C 事务包含寄存器地址、数据长度和实际数据。 降至最低 而变化 数据应发送。

    因此、我切换到了  HAL_I2C_HAL Master_Transmit。 通常、此函数的参数* pData 需要一个数组、其中包含寄存器地址和数据 iirc 的长度。

    我注意到的另一件事是,似乎有一种超时。 在发送第一个  HAL_I2C_HAL_ERROR 后 、会有一个大约为4.9秒的窗口、然后下一个事务返回 Master_Transmit。

    这或许是有帮助的。

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

    我想我能够解决这个问题。

    下面是我更新的代码片段:

    #include "stm32h7xx_hal.h"
    #include <stdlib.h>
    #include <string.h>
    
    uint8_t buffer[64];
    size_t offset = 0;
    size_t binary_size = sizeof(low_region_binary);
    
    while (offset < binary_size) {
        size_t chunk_size =
            (binary_size - offset > sizeof(buffer)) ?
                sizeof(buffer) : (binary_size - offset);
    
        memcpy(buffer, &binary_lr[offset], chunk_size);
    
        HAL_StatusTypeDef status = HAL_I2C_Master_Transmit(&hi2c2,
                                                           target_address << 1,
                                                           buffer,
                                                           chunk_size,
                                                           HAL_MAX_DELAY);
                                                           
        offset += chunk_size;
    }

    需要说明的是、我删除了  HAL_DELAY (20)。 这似乎至关重要。

    对于任何感兴趣的人、下面是我代码其余部分中的更多代码片段

    uint8_t pbms_input[6 + 1] = { 0x00 };
    uint8_t target_address = 0x10;
    
    uint8_t intev_data[INTERRUPT_EVENT_SIZE + 1];
    uint8_t mode_data[MODE_SIZE + 1];
    
    uint8_t pbms_command[4] = { 0x50, 0x42, 0x4D, 0x73 };
    
    // ReadyForPatch asserted?
    TPS25751_ReadRegister(INTERRUPT_EVENT_REGISTER, intev_data,
                            sizeof(intev_data));
    if ((intev_data[11] & 0b00000010) != 0b00000010) {
        return -1;
    }
    __NOP();
    
    // MODE is PTCH?
    TPS25751_ReadRegister(MODE_REGISTER, mode_data, sizeof(mode_data));
    if (mode_data[1] != 0x50) {
        return -1;
    }
    
    // Write input data
    pbms_input[1] = 0x80;
    pbms_input[2] = 0x33;
    pbms_input[5] = target_address;
    pbms_input[6] = 0x32;
    
    TPS25751_WriteRegister(DATA1_REGISTER, pbms_input, sizeof(pbms_input));
    
    // Execute PBMs
    send_4CC_command(pbms_command);

    使用的功能:

    void TPS25751_ReadRegister(uint8_t reg_addr, volatile uint8_t *data,
                               size_t size) {
      uint8_t output_data[size];
      HAL_I2C_Mem_Read(&hi2c2, TPS25751_I2C_ADDRESS, reg_addr, I2C_MEMADD_SIZE_8BIT,
                       output_data, size, HAL_MAX_DELAY);
      for (size_t i = 0; i < size; i++) {
        data[i] = output_data[i];
      }
    }
    
    void TPS25751_WriteRegister(uint8_t reg_addr, volatile uint8_t *data,
                                size_t size) {
      uint8_t input_data[size];
      for (size_t i = 0; i < size; i++) {
        input_data[i] = data[i];
      }
      HAL_I2C_Mem_Write(&hi2c2, TPS25751_I2C_ADDRESS, reg_addr,
                        I2C_MEMADD_SIZE_8BIT, input_data, size, HAL_MAX_DELAY);
    }
    
    int send_4CC_command(uint8_t *command) {
      volatile uint8_t cmd1_data[CMD1_SIZE + 1];
      for (int i = 0; i < 4; i++) {
        cmd1_data[i + 1] = command[i];
      }
      TPS25751_WriteRegister(CMD1_REGISTER, cmd1_data, sizeof(cmd1_data));
      while (cmd1_data[1] != 0x00) {
        TPS25751_ReadRegister(CMD1_REGISTER, cmd1_data, sizeof(cmd1_data));
        if (cmd1_data[1] == 0x21) {
          return -1;
        }
        HAL_Delay(20);
      }
      return 0;
    }

    这段代码肯定不是最优的、但对我 来说很有用、可能对其他人也很有用。

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

    感谢您提供您的解决方案、它将帮助其他用户。 我还将考虑将其添加到我们的常见问题解答中。

    此致、

    Conner Gillette