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:TPS25751EVM

Guru**** 2475955 points
Other Parts Discussed in Thread: TPS25751

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

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

器件型号:TPS25751EVM
主题中讨论的其他器件:TPS25751

工具/软件:

您好的团队:

下载补丁捆绑包时遇到错误。 当执行步骤6以读取0x09寄存器时、它应该已经完全返回0x00、但我的不是。 我返回的第一个数字是0x06。 根据数据表、0x06表示无效的超时值、但数据表中指示超时值设为0x32、这让我感到困惑。 我想问一下超时值应定义为什么?

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

    您好、

    由于 TI 美国正在度假、我们下周将回复您。

    此致

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

    您好、 林通美:

    感谢您的更新。 我很感激通知、并将等待你下周的跟进。
    如果您在此期间需要我们方面的任何其他信息、请随时与我们联系。
    此致!
    光圈
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Li:  

    您是否可以共享写入 Input DataX 的值和 Output DataX 读取值?

    此致、  

    Aya Khedr

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

    您好 Aya Khedr、

    以下是用于下载补丁和输出数据的代码。 。表示步骤六 μ s 后的日志输出

    此致!

    光圈

    int tps25751_download_patch_bundle(const msdk_device_t *dev, const uint8_t *patch_data, size_t patch_size)
    {
        int ret;
        uint8_t buf[64];
        // Step 1: Check ReadyForPatch bit (INT_EVENT1, Reg 0x14, Byte 11, Bit 1 = 0x02)
        memset(buf, 0, sizeof(buf));
        ret = read_reg(dev, 0x14, buf, 12);
        if (ret != MSDK_STATUS__OK || (buf[11] & 0x02) == 0) {
            MSDK_LOG_ERR("Not ready for patch (0x14h != 0x02)");
            return MSDK_STATUS__ERROR;
        }
        MSDK_LOG_DBG(" %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5],buf[6], buf[7], buf[8], buf[9], buf[10], buf[11]);
    
        // Step 2: Check current mode == 'PTCH'
        memset(buf, 0, sizeof(buf));
        ret = read_reg(dev, 0x03, buf, 5);
        if (ret != MSDK_STATUS__OK || strncmp((char *)&buf[1], "PTCH", 4) != 0) {
            MSDK_LOG_ERR("Not in PTCH mode, got %.4s", &buf[1]);
            return MSDK_STATUS__ERROR;
        }
        MSDK_LOG_DBG(" %02X %02X %02X %02X %02X ", buf[0], buf[1], buf[2], buf[3], buf[4]);
    
        // Step 3: Write DATA1 = [size_LSB...MSB][target][timeout]
        memset(buf, 0, sizeof(buf));
        buf[0] = (uint8_t)(patch_size & 0xFF);
        buf[1] = (uint8_t)((patch_size >> 8) & 0xFF);
        buf[2] = (uint8_t)((patch_size >> 16) & 0xFF);
        buf[3] = (uint8_t)((patch_size >> 24) & 0xFF);
        buf[4] = 0x30;  // Patch I2C target address (must be different from default)
        buf[5] = 0x32;  // Timeout = 5s = 0x32 * 100ms
        ret = write_reg(dev, 0x09, buf, 6);
        if (ret != MSDK_STATUS__OK) return ret;
        msdk_time_delay_ms(10);
        MSDK_LOG_DBG(" %02X %02X %02X %02X %02X %02X %02X", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5], buf[6]);
    
        // Step 4: Write CMD1 = 'PBMs'
        uint8_t pbms_cmd[5] = {0x04, 'P', 'B', 'M', 's'};
        ret = write_reg(dev, 0x08, pbms_cmd, 5);
        if (ret != MSDK_STATUS__OK) return ret;
        MSDK_LOG_DBG(" %02X %02X %02X %02X %02X", pbms_cmd[0], pbms_cmd[1], pbms_cmd[2], pbms_cmd[3], pbms_cmd[4]);
    
        msdk_time_delay_ms(10); // Wait 10ms
    
        // Step 5: Poll CMD1 (0x08) until cleared
        for (int i = 0; i < 10; i++) {
            memset(buf, 0, sizeof(buf));
            ret = read_reg(dev, 0x08, buf, 5);
            if (ret == MSDK_STATUS__OK && buf[1] == 0x00) break;
            msdk_time_delay_ms(5);
        }
        if (buf[1] != 0x00) {
            MSDK_LOG_ERR("PBMs command did not clear CMD1, buf[1]=0x%02X", buf[1]);
            return MSDK_STATUS__ERROR;
        }
    
        msdk_time_delay_ms(5);
        // Step 6: Check if DATA1 status is 0
        memset(buf, 0, sizeof(buf));
        ret = read_reg(dev, 0x09, buf, 5);
        MSDK_LOG_DBG(" %02X %02X %02X %02X %02X %02X", buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
        if (ret != MSDK_STATUS__OK || buf[1] != 0x00) return MSDK_STATUS__ERROR;
    
    
        // Step 7: Write Patch Data to I2C addr 0x30 register 0x01 (burst)
        size_t offset = 0;
        const size_t chunk_size = 16;
        while (offset < patch_size) {
            size_t len = (patch_size - offset > chunk_size) ? chunk_size : patch_size - offset;
            ret = msdk_i2c_write_reg(dev, 0x30, 0x01, (uint8_t *)&patch_data[offset], len);
            if (ret != MSDK_STATUS__OK) {
                MSDK_LOG_ERR("Failed writing patch at offset 0x%X", (unsigned)offset);
                return ret;
            }
            offset += len;
        }
    
        msdk_time_delay_ms(10); // Wait 10ms
    
        // Step 8: Write CMD1 = 'PBMc' to complete
        uint8_t pbmc_cmd[5] = {0x04, 'P', 'B', 'M', 'c'};
        ret = write_reg(dev, 0x08, pbmc_cmd, 5);
        if (ret != MSDK_STATUS__OK) return ret;
    
        // Step 9: Confirm CMD1 is cleared
        memset(buf, 0, sizeof(buf));
        ret = read_reg(dev, 0x08, buf, 5);
        if (ret != MSDK_STATUS__OK || buf[1] != 0x00) return MSDK_STATUS__ERROR;
    
        // Step 10: Confirm DATA1 status is 0
        memset(buf, 0, sizeof(buf));
        ret = read_reg(dev, 0x09, buf, 5);
        if (ret != MSDK_STATUS__OK || buf[1] != 0x00) return MSDK_STATUS__ERROR;
    
        // Step 11: Check Mode = 'APP '
        memset(buf, 0, sizeof(buf));
        ret = read_reg(dev, 0x03, buf, 6);
        if (ret != MSDK_STATUS__OK || strncmp((char *)&buf[1], "APP ", 4) != 0) {
            MSDK_LOG_ERR("Patch success but still not in APP mode, got: %.4s", &buf[1]);
            return MSDK_STATUS__ERROR;
        }
    
        MSDK_LOG_INF("TPS25751 patch bundle loaded successfully, device is in APP mode");
        return MSDK_STATUS__OK;
    }

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

    尊敬的 Li:  

    您能否共享完整的 I2C 日志? 我可以看到寄存器读取值、但也希望在可能的情况下看到写入。  

    此致、  

    Aya Khedr

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

    您好  Aya Khedr、

    这里是我们输出的所有日志。 打开文档后、您可以搜索"tps25751"以查看与 tps25751相关的日志。

    此致!

    光圈

    e2e.ti.com/.../tps25751.txt

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

    尊敬的 Li:

    感谢您提供。 我将在一周结束时回顾并提供反馈。

    此致、  

    Aya Khedr  

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

    您好 Aya Khedr、

    没关系。 非常感谢!

    此致!

    光圈

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

    尊敬的 Li:

    没问题。  

    此致、  

    Aya Khedr

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

    您好 Aya Khedr、
    鉴于项目进度,我们希望尽快收到您的回复。 我们希望您的理解并非常感谢!

    此致!

    光圈

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

    您好 Aya Khedr、
    鉴于项目进度,我们希望尽快收到您的回复。 我们希望您的理解并非常感谢!

    此致!

    光圈

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

    您好 Aya Khedr、
    鉴于项目进度,我们希望尽快收到您的回复。 我们希望您的理解并非常感谢!

    此致!

    光圈

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

    顺便说一下 您在 EVM 上执行这些操作吗? EVM 上已有 EEPROM。

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

    尊敬的 Li:  

    要补充 Ghouse 的问题、我的假设是您在 EVM 上断开了 EEPROM (移除 JP16)、对吗?  

    在查看日志时、我注意到在第3步中、写入 DATAX 寄存器似乎不正确。  

    859 1.861693 190 MCU 24 [M:MSDK C:info F:L:]:[MSDK][TPS25751 write_reg:reg 09、value 80
    860 1.861695 200 MCU 44 [M:MSDK C:info F:L:]:[MSDK][TPS25751 ] 80 77 00 30 32 00

    第一个字节应该是字节计数、其值是06、而不是80。 超时值应在字节6中。  

    此致、  

    Aya Khedr  

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

    你好 Ghouse、
    是的、我们对 EVM!进行了测试

    此致!
    光圈

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

    您好 Aya Khedr、
    您是对的、我们断开了 EEPROM 的连接并拔下了 J16跳线帽。如果 EEPROM 未打开。 第一步将出现错误、如图所示



    此致!
    Iris!á lez

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

    尊敬的 Li:  

    您能澄清一下错误发生的时间吗? 连接 J16时是否会出现这种情况?

    此致、  

    Aya Khedr  

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

    您好 Li、

    我们已经确定了问题。 在步骤中写入寄存器时出现错误。 Buf [0]应该已作为06传入、但我们错误地传入了它
    非常感谢您的支持!

    此致!
    光圈

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

    您好 Aya Khedr、

    您好、我们在第十步中遇到错误、表明补丁无效。 以下是代码和日志。 您可以在 logCo 中搜索 tps25751您是否可以帮助我们确定问题发生的位置? 非常感谢!

    此致!

    光圈
    e2e.ti.com/.../dowload_5F00_patch_5F00_log.txte2e.ti.com/.../dowload_5F00_patch_5F00_code.txt

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

    尊敬的 Iris:  

    您是否确保 INT_EVENT1.PatchLoaded = 1? 如果是、您是否在读取模式之前等待10ms?  

    此致、  

    Aya Khedr  

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

    您好 Aya Khedr、
    对不起,我在几天前度假。
    是的、我们确保 INT_EVENT1。 BatchLoaded=1、我们在读取模式之前也等待了10ms、但结果仍然不可能
    此外、我还有一个问题、我们在第6步中返回的数据是0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00、、但数据簿上的字节计数为0x04、我不知道是否返回0x40

    此致!

    光圈

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

    尊敬的 Iris:  

    数据寄存器9h 为0x40、但只需要读取前四个字节为0。  

    我将再次回顾流程、并向您提供反馈。

    此致、  

    Aya Khedr  

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

    尊敬的 Aya Khedr:
    好的,我很抱歉给你麻烦。我在步骤十中打印的日志是什么:步骤10: 40 00 40 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00、μ s 而不是0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00、根据表、0x40表示不是补丁、0x80表示失败

    此致!
    光圈

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

    尊敬的 Li:

    没问题!

    您能否确认加载的补丁是低区二进制文件、而不是全闪存二进制文件?  

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

    您好 Aya Khedr、
    我们确认加载的补丁位于低区。

    此外,在我们今天的测试中,我们发现,在第7步中编写补丁后,我们再次阅读它,我们读取的数据与我们写的数据不同、我们不能很确定是什么导致 this.Comparison 显示第一个数字与写的数字不同

    tps25751_crite_patch 函数如下所示

    static int tps25751_write_patch(const msdk_device_t *dev, const uint8_t *patch_data, uint32_t patch_len)
    {
        uint32_t i = 0;
        uint32_t tmp_len = 0;
        const tps25751_cfg_t *dev_config = (const tps25751_cfg_t *const)dev->config;
        int ret = 0;
        uint32_t total_written = 0;
     
        MSDK_LOG_DBG("tps25751_write_patch patch size %d", patch_len);
    
        uint8_t read_buffer[TPS25751_MAX_PATCH_WRITE_SIZE] = {0x00};
    
        for (i = 0; i < patch_len; i += TPS25751_MAX_PATCH_WRITE_SIZE) {
            if ((patch_len - i) < TPS25751_MAX_PATCH_WRITE_SIZE) {
                tmp_len = patch_len - i;
                MSDK_LOG_DBG("tps25751_write_patch left patch size %d  %02X", tmp_len, patch_data[i]);
            } else {
                tmp_len = TPS25751_MAX_PATCH_WRITE_SIZE;
            }
    
            // write data
            ret = msdk_i2c_write_reg(dev_config->i2c_dev, dev_config->i2c_addr, 0x01, (uint8_t *)&patch_data[i], tmp_len);
            if (ret != 0) {
                MSDK_LOG_ERR("Patch write error at offset %d", i);
                return ret;
            }
    
            // read data
            ret = msdk_i2c_read_reg(dev_config->i2c_dev, dev_config->i2c_addr, 0x01, read_buffer, tmp_len);
            if (ret != 0) {
                MSDK_LOG_ERR("Patch read error at offset %d", i);
                return ret;
            }
            /*
            // comare
            for (uint32_t j = 0; j < tmp_len; j++) {
                if (read_buffer[j] != patch_data[i + j]) {
                    MSDK_LOG_ERR("Data mismatch at offset %d, byte %d", i, j);
                    return MSDK_STATUS__ERROR;
                }
            }
            */
            total_written += tmp_len;
            msdk_time_delay_ms(1);
        }
        for (uint32_t j = 0; j < total_written; j++) {
            MSDK_LOG_DBG("read_buffer[%d] = 0x%02X", J, read_buffer[j]);
        }
    
    
        if (total_written != patch_len) {
            MSDK_LOG_ERR("Patch write incomplete: expected %d bytes, wrote %d bytes", patch_len, total_written);
            return MSDK_STATUS__ERROR;
        } else {
            MSDK_LOG_DBG("Patch write complete: %d bytes", total_written);
        }
    
        return 0;
    }

    此致!
    光圈

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

    尊敬的 Iris:  

    根据您的描述以及步骤10中的输出数据、修补程序可能被错误地写入。  

    请参阅 TRM 中概述的以下协议:  

    另请参阅随附的序列示例 I2C 日志以及应如何加载补丁捆绑包(请参阅第18行以获得参考)

    e2e.ti.com/.../0741.PBMx_5F00_PowerUp_5F00_Two_5F00_994.xlsx

    此致、  

    Aya Khedr

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

    尊敬的 Aya Khedr:

    您好、我已与我的同事确认、我们根据图中所示的 IIC 协议编写了数据。 根据 Excel 电子表格、我们在编写补丁时还将补丁分组为每64字节一组。 但是、测试结果仍与之前相同。

    我们使用逻辑分析仪捕获数据、写入补丁的数据与我们的补丁一致。

    请问您能否为我们提供 C 语言的演示例程供我们进行比较。谢谢!

    此致!

    光圈

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

    尊敬的 Iris:  

    请在此处查看我的反馈。  https://e2e.ti.com/support/power-management-group/power-management/f/power-management-forum/1511854/tps25751evm-can-not-download-patch-successfully

    此致、  

    Aya Khedr