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.

[参考译文] TPS25751EVM:通过 PD 控制器控制充电器 IC

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

https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1510438/tps25751evm-control-charger-ic-via-pd-controller

器件型号:TPS25751EVM
Thread 中讨论的其他器件:BQ25798TPS25751

工具/软件:

您好团队:

我在使用 TPS25751使用 IIC 读取和写入 BQ25798的寄存器时遇到问题。 如果我直接从寄存器(0x01)读取数据、则值为00。但 EE 同事在计算机上读取的结果为0x0348、如果我首先将数据写入寄存器、然后读取该寄存器(将0x0346写入0x01寄存器)、回读的数据也是0x3C46。但 EE 同事在计算机上读取的数据仍为0x0348。
您能帮助我检查导致这种情况的原因吗、例如代码错误或硬件问题
这是我的读写函数和返回的日志

[MSDK][TPS25751 READ_reg:reg 08、值04
[MSDK][TPS25751 CMD1状态:04 00 00 00 00

[MSDK][TPS25751 ]从 BQ25798读取数据:40 03 01 02 00 00 00 00 00  

#define TPS25751_REG_CMD1   0x08
#define TPS25751_REG_DATA1  0x09
static int tps25751_read_bq25798_iindpm(const msdk_device_t *dev, uint8_t *data_out)
{
    int ret = MSDK_STATUS__ERROR;

    // Step 1: Write DATA1 (0x09), with data to set up TPS25751 to read from BQ25798
  
    uint8_t setup_data[4];
    setup_data[0] = 0x03;       // length = 3 bytes
    setup_data[1] = 0x6B;       // BQ25798 I2C slave address
    setup_data[2] = 0x01;       // target register in BQ25798
    setup_data[3] = 0x02;       // read 2 bytes
    ret = write_reg(dev, TPS25751_REG_DATA1, setup_data, sizeof(setup_data));
    if (ret != MSDK_STATUS__OK) {
        MSDK_LOG_ERR("Failed to write TPS25751 DATA1");
        return ret;
    }

    // Step 2: Write CMD1 (0x08) with 'I2Cr' command
    uint8_t i2cr_cmd[5] = { 0x04, 'I', '2', 'C', 'r' };
    ret = write_reg(dev, TPS25751_REG_CMD1 , i2cr_cmd, sizeof(i2cr_cmd));
    if (ret != MSDK_STATUS__OK) {
        MSDK_LOG_ERR("Failed to write TPS25751 CMD1 for I2Cr");
        return ret;
    }

    // Step 3: Read CMD1 back to confirm command executed (should return 0x00 0x00 0x00 0x00)
    uint8_t cmd_status[5] = {0};
    ret = read_reg(dev, TPS25751_REG_CMD1, cmd_status, sizeof(cmd_status));
    if (ret != MSDK_STATUS__OK) {
        MSDK_LOG_ERR("Failed to read TPS25751 CMD1 status");
        return ret;
    }
	MSDK_LOG_DBG("CMD1 Status: %02X %02X %02X %02X %02X", 
              cmd_status[0], cmd_status[1], cmd_status[2], cmd_status[3],cmd_status[4]);

    // Step 4: Read back the 2 bytes result from DATA1 (0x09)
    ret = read_reg(dev, TPS25751_REG_DATA1, data_out, 4);
    if (ret != MSDK_STATUS__OK) {
        MSDK_LOG_ERR("Failed to read response from TPS25750 DATA1");
        return ret;
    }
	MSDK_LOG_DBG("Read Data from BQ25798: %02X %02X %02X %02X", data_out[0], data_out[1],data_out[2],data_out[3]);
    return MSDK_STATUS__OK;
}


static int tps25751_write_bq25798_iindpm(const msdk_device_t *dev)
{
    int ret = MSDK_STATUS__ERROR;

    // Step 1: Write to TPS25751's DATA1 register (0x09)
    // Data: 05 6b 03 06 00 C8
    // -> Length = 5
    // -> Slave address = 0x6B
    // -> Write operation (0x03)
    // -> Register = 0x01
    // -> Data = 0x0346
    uint8_t data1_setup[] = { 0x05, 0x6B, 0x03, 0x06, 0x03, 0x46 };
    ret = write_reg(dev, TPS25751_REG_DATA1, data1_setup, sizeof(data1_setup));
    if (ret != MSDK_STATUS__OK) {
        MSDK_LOG_ERR("Failed to write TPS25751 DATA1");
        return ret;
    }

    // Optional: Verify write to DATA1
    uint8_t data1_readback[6] = {0};
    ret = read_reg(dev, TPS25751_REG_DATA1, data1_readback, sizeof(data1_readback));
    if (ret != MSDK_STATUS__OK) {
        MSDK_LOG_ERR("Failed to read back TPS25750 DATA1");
        return ret;
    }
    MSDK_LOG_DBG("DATA1 Readback: %02X %02X %02X %02X %02X %02X",
        data1_readback[0], data1_readback[1], data1_readback[2],
        data1_readback[3], data1_readback[4], data1_readback[5]);

    // Step 2: Write 'I2Cw' to CMD1 register (0x08)
    uint8_t i2cw_cmd[] = { 0x04, 'I', '2', 'C', 'w' };  
    ret = write_reg(dev, TPS25751_REG_CMD1, i2cw_cmd, sizeof(i2cw_cmd));
    if (ret != MSDK_STATUS__OK) {
        MSDK_LOG_ERR("Failed to send I2Cw command to CMD1");
        return ret;
    }

    // Step 3: Read back CMD1 status
    uint8_t cmd_status[5] = {0};
    ret = read_reg(dev, TPS25751_CMD1_REG, cmd_status, sizeof(cmd_status));
    if (ret != MSDK_STATUS__OK) {
        MSDK_LOG_ERR("Failed to read CMD1 status\n");
        return ret;
    }

    MSDK_LOG_DBG("CMD1 Status: %02X %02X %02X %02X %02X",
        cmd_status[0], cmd_status[1], cmd_status[2], cmd_status[3],cmd_status[4]);


    return MSDK_STATUS__OK;
}

  




此致!
光圈

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

    尊敬的 Iris:

    请与 TPS25751共享 json 文件来生成二进制文件。

    请 在每种情况下向 BQ 器件提供 I2C 事务的数字示波器日志、以便我们可以确认实际正在写入 BQ 器件的内容。

    1. 通过 TPS25751使用 I2Cw 和 I2Cr 时的 I2C
    2. 当 PC 直接从 BQ 读取时进行 I2C 读取

    如果在 GUI 配置中选择了 BQ 器件、PD 控制器将配置一些 BQ 寄存器。 BQ 是在类似情况下读取的? 两个系统都有一个 TPS25751、其刷写了相同的二进制文件、供电和连接是相同的?

    您和您的同事之间的设置是否有任何差异?

    谢谢。此致、

    Chris

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

    您好 Chris:

    抱歉、我没有使用您提到的 JSON 来与 TPS25751一起用于生成二进制文件

    通过 TPS25751使用 I2Cw 和 I2Cr 时、I2C 的日志如下:Read Data from BQ25798:40 03 06 02 00 C8 00 00(先将0x00C8写入寄存器06、然后读取获得的日志)

    2.  PC 直接从 BQ 读取时 I2C 读取的日志 如下:[MSDK][TPS25751 ]从 BQ25798读取数据:40 03 01 02 00 00 00 00 (直接读取 BQ25798的0x01寄存器)


    昨天提供了相关的读写函数

    与同事相比、设置没有差异

    此致!

    光圈

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

    尊敬的 Iris:

    您是如何生成二进制文件的? 您使用的是 EEPROM 还是 I2C MCU、如何在启动时将补丁捆绑包加载到 TPS25751? 加载补丁捆绑包是引导过程中的一个重要步骤。 该捆绑包可能会影响 PD 控制器上 I2C 线路的运行。

    您能否确认 I2Cw 和 I2Cr 正常工作? 即当您发送命令时、如果您将数字分析仪或示波器连接到 I2Cc 线路、I2C 看起来是否正确?

     当您发送这些命令并共享捕获时、请捕获 I2Cc 线路。

    为什么您在 I2Cw 同步加载中写入保留位、这是个拼写错误?

    谢谢。此致、

    Chris

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

    您好 Chris:

    您所引用的二进制文件是用于从 PTCH 模式转换到 APP 模式的二进制文件吗? 如果是、我们使用 TI 提供的上部计算机工具生成该模型。 但是、我们尚未将 PTCH 模式的这一步实施为 APP 模式、这个步骤被卡住了第十步。 打印的日志无法识别我们的补丁程序、我们目前正在寻求技术支持。


    我是否可以询问此 PD 读数 BQ25798通过 IIC 的实现是否必须基于成功的加载补丁、即 PD 是否处于 APP 模式?

    我在 EVM 上断开了 EEPROM (移除 JP16)

    写入的数组应该是 uint8_t data1_setup []={0x05、0x6B、0x00、0x02、0x03 0x46}?


    0x05是指该 I2C 写入数据包的大小;μ s

    0x6B 指 BQ25798设备地址;

    0x00是指 保留位(bytes2-3中的前八位);

    0x02表示 事务有效载荷中的字节数;

    请参阅0x03 0x46 表示写入寄存器的数据;

    此致!
    光圈

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

    尊敬的 Iris:

    这用于 I2Cw 命令的输入数据、对吗?

    根据 TRM、它应该看起来像[0x05、0x6B、0x02、0x00、"BQ 寄存器偏移"、 0x03、0x46]

    您需要遵循 TRM 中定义的格式。

    谢谢。此致、

    Chris

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

    您好、Chris、
    bytes2-3中的标识符0-15是否应该如图所示? 8-15对应于高8位、即 byte2、即0x00、而0-7对应于低8位、即 byte3、即0x02。 我的理解不正确吗?

    此致!

    光圈

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

    尊敬的 Iris:

    是的、这就是为什么您的原始格式不正确、您忽略了保留位并写入这些位的原因。

    谢谢。此致、

    Chris

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

    另外、PD 控制器应处于 APP 模式才能使用 I2Cr 和 I2Cw 4CC 命令。

    谢谢。此致、

    Chris

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

    您好 Chris、

    好的、非常感谢您指出错误消息。  

    我已按照您的说明进行了修改、代码如下所示。 即使成功加载补丁后、我也能够读取充电器的相关信息、但返回的结果仍然不正确。 代码和相关日志如下所示。 您能帮我检查导致问题的原因吗? 非常感谢!((我首先写入数据寄存器之前阅读它))
    另外、我想问您的 PD 在通过 IIC 读取其相关信息时是否需要对充电器执行任何初始化工作?
    或者、您是否使用了逻辑分析仪工具来捕获通过 IIC 读取充电器的 PD 的相关时序图? 您能与我们分享吗? 我们可以根据时序图进行比较!

    但之前使用我的未修改代码、在成功加载 PATC 的情况下、可以正常读取和写入0x01寄存器的值、但存在例外情况。 一些寄存器未能读取默认值但写入成功、而其他寄存器成功读取了默认值、但写入后无法再次读取
    非常感谢!


    #define TPS25751_REG_CMD1   0x08
    #define TPS25751_REG_DATA1  0x09
    static int tps25751_read_bq25798_iindpm(const msdk_device_t *dev, uint8_t *data_out)
    {
        int ret = MSDK_STATUS__ERROR;
     
        // Step 1: Write DATA1 (0x09), with data to set up TPS25751 to read from BQ25798
        uint8_t setup_data[4];
        setup_data[0] = 0x03;       // length = 3 bytes
        setup_data[1] = 0x6B;       // BQ25798 I2C slave address
        setup_data[2] = 0x06;       // target register in BQ25798
        setup_data[3] = 0x02;       // read 2 bytes
        ret = write_reg(dev, TPS25751_REG_DATA1, setup_data, sizeof(setup_data));
        if (ret != MSDK_STATUS__OK) {
            MSDK_LOG_ERR("Failed to write TPS25751 DATA1");
            return ret;
        }
        else {
            MSDK_LOG_DBG("TPS25751 DATA1 written successfully");
        }
     
        // Step 2: Write CMD1 (0x08) with 'I2Cr' command
        uint8_t i2cr_cmd[5] = { 0x04, 'I', '2', 'C', 'r' };
        ret = write_reg(dev, TPS25751_REG_CMD1 , i2cr_cmd, sizeof(i2cr_cmd));
        if (ret != MSDK_STATUS__OK) {
            MSDK_LOG_ERR("Failed to write TPS25751 CMD1 for I2Cr");
            return ret;
        }
        else {
            MSDK_LOG_DBG("TPS25751 CMD1 for I2Cr written successfully");
        }
     
        // Step 3: Read CMD1 back to confirm command executed (should return 0x00 0x00 0x00 0x00)
        uint8_t cmd_status[5] = {0};
        ret = read_reg(dev, TPS25751_REG_CMD1, cmd_status, sizeof(cmd_status));
        if (ret != MSDK_STATUS__OK) {
            MSDK_LOG_ERR("Failed to read TPS25751 CMD1 status");
            return ret;
        }
        else {
            MSDK_LOG_DBG("TPS25751 CMD1 status read successfully");
            MSDK_LOG_DBG("CMD1 Status: %02X %02X %02X %02X %02X",
                    cmd_status[0], cmd_status[1], cmd_status[2], cmd_status[3],cmd_status[4]);
        }
        /*if (cmd_status[1] != 0x00 || cmd_status[2] != 0x00 || cmd_status[3] != 0x00 || cmd_status[4] != 0x00) {
            MSDK_LOG_ERR("TPS25751 I2Cr command failed to execute properly");
            return MSDK_STATUS__ERROR;
        }*/
    	msdk_time_delay_ms(50);
        // Step 4: Read back the 8 bytes result from DATA1 (0x09)
        ret = read_reg(dev, TPS25751_REG_DATA1, data_out, 8);
        if (ret != MSDK_STATUS__OK) {
            MSDK_LOG_ERR("Failed to read response from TPS25750 DATA1");
            return ret;
        }
        MSDK_LOG_DBG("Read Data from BQ25798: %02X %02X %02X %02X %02X %02X %02X %02X", data_out[0], data_out[1],data_out[2], data_out[3],data_out[4], data_out[5],data_out[6], data_out[7]);
        return MSDK_STATUS__OK;
    }
    
    
    
    static int tps25751_write_bq25798_iindpm(const msdk_device_t *dev)
    {
        int ret = MSDK_STATUS__ERROR;
    	uint8_t data1_setup[] = { 0x06, 0x6B, 0x02, 0x00, 0x06, 0x00, 0xC8 };
        ret = write_reg(dev, TPS25751_REG_DATA1, data1_setup, sizeof(data1_setup));
        if (ret != MSDK_STATUS__OK) {
            MSDK_LOG_ERR("Failed to write TPS25751 DATA1");
            return ret;
        }
    
        // Optional: Verify write to DATA1
        uint8_t data1_readback[8] = {0};
        ret = read_reg(dev, TPS25751_REG_DATA1, data1_readback, sizeof(data1_readback));
        if (ret != MSDK_STATUS__OK) {
            MSDK_LOG_ERR("Failed to read back TPS25750 DATA1");
            return ret;
        }
        MSDK_LOG_DBG("DATA1 Readback: %02X %02X %02X %02X %02X %02X %02X %02X",
            data1_readback[0], data1_readback[1], data1_readback[2],
            data1_readback[3], data1_readback[4], data1_readback[5], data1_readback[6], data1_readback[7]);
    
        // Step 2: Write 'I2Cw' to CMD1 register (0x08)
        uint8_t i2cw_cmd[] = { 0x04, 'I', '2', 'C', 'w' };  
        ret = write_reg(dev, TPS25751_REG_CMD1, i2cw_cmd, sizeof(i2cw_cmd));
        if (ret != MSDK_STATUS__OK) {
            MSDK_LOG_ERR("Failed to send I2Cw command to CMD1");
            return ret;
        }
    
        // Step 3: Read back CMD1 status
        uint8_t cmd_status[5] = {0};
        ret = read_reg(dev, TPS25751_REG_CMD1, cmd_status, sizeof(cmd_status));
        if (ret != MSDK_STATUS__OK) {
            MSDK_LOG_ERR("Failed to read CMD1 status\n");
            return ret;
        }
    
        MSDK_LOG_DBG("CMD1 Status: %02X %02X %02X %02X %02X",
            cmd_status[0], cmd_status[1], cmd_status[2], cmd_status[3],cmd_status[4]);
    
    
        return MSDK_STATUS__OK;
    }
    e2e.ti.com/.../3718.read_5F00_write_5F00_log.txt

    Bset 表示!

    光圈

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

    尊敬的 Iris:

    如果我理解正确、I2Cr 和 I2Cw 命令是否部分正常运行? 有时它工作正常,其他人,不是那么多?

    在这些故障期间、您能否共享 I2Cc 到 BQ 总线的日志、并说明在特定时间发送了哪些 I2Cr 和 I2Cw 命令? 这样我们就可以看到您正在写入的命令到 PD 控制器、我们可以确认我们在 I2Cc 线路上看到或者没有看到活动。 我需要查看总线上的实际 I2C 通信以确认问题发生在哪里。

    在 I2Cr 和 I2Cw 命令之间等待多长时间? 根据 TRM、我们预计连续读取和写入之间会有很长的时间。

    另外、我想问您的 PD 在通过 IIC 读取其相关信息时是否需要对充电器执行任何初始化工作?

    如果您使用的配置中选择了 BQ 器件、PD 控制器将在启动时配置几个 BQ25798寄存器。 如果您连接了一个数字分析仪、那么您应该能够在引导时看到 I2Cc 总线处于活动状态。

    谢谢。此致、

    Chris

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果您使用选中 BQ 器件的配置、PD 控制器将在启动时配置几个 BQ25798寄存器。 如果您连接了一个数字分析器、您应该能够在引导时看到 I2Cc 总线处于活动状态。

    您好 Chris、

    我们是否确实可以在启动时读取和写入 PD 配置的寄存器? 这些寄存器是什么?

    此致!

    光圈

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

    尊敬的 Iris:

    我们能否真正读取和写入 PD 在启动时配置的寄存器? 这些寄存器是什么?

    我做的评论是、TPS25751会在启动时自动自行配置一些 BQ25798寄存器。 如果您有一个数字分析仪、则应该能够看到 I2Cc 总线处于活动状态、并会看到这些 I2C 写入。

    您无法更改这些默认写入。 您可以看到数字分析仪的写入结果。


    您仍然看到什么问题?

    如果我理解正确、I2Cr 和 I2Cw 命令是否部分正常运行? 有时它工作正常,其他人,不是那么多?[/报价]

    这是否仍是主要问题?

    您是否研究过在 I2Cw 和 I2Cr 命令之间添加延迟?

    谢谢。此致、

    Chris

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

    尊敬的 Iris:

    对混淆表示歉意、我刚才发现您最初使用 I2Cw 命令的方式是正确的。 TPS25751TRM 中存在一个未使用该保留位的错误。 请参阅下面正确的表格、我们正在进行更新。

    请参阅 I2Cw 的示例日志、并在下面阅读。 您可以将其用作开发的参考。

    I2Cw 到器件地址0x6B 处的外设。 写入寄存器0x81、0x01的有效载荷

    I2Cr 到器件地址0x6B 处的外设。 从寄存器0x81读取、读数为0x01。

    I2Cr 格式正确。 对这里的困惑表示歉意。

    谢谢。此致、

    Chris