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

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.
工具/软件:
您好的团队:
下载补丁捆绑包时遇到错误。 当执行步骤6以读取0x09寄存器时、它应该已经完全返回0x00、但我的不是。 我返回的第一个数字是0x06。 根据数据表、0x06表示无效的超时值、但数据表中指示超时值设为0x32、这让我感到困惑。 我想问一下超时值应定义为什么?

您好 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;
}

您好 Aya Khedr、
这里是我们输出的所有日志。 打开文档后、您可以搜索"tps25751"以查看与 tps25751相关的日志。
此致!
光圈
尊敬的 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
您好 Aya Khedr、
您好、我们在第十步中遇到错误、表明补丁无效。 以下是代码和日志。 您可以在 logCo 中搜索 tps25751您是否可以帮助我们确定问题发生的位置? 非常感谢!
此致!
光圈
e2e.ti.com/.../dowload_5F00_patch_5F00_log.txte2e.ti.com/.../dowload_5F00_patch_5F00_code.txt
您好 Aya Khedr、
对不起,我在几天前度假。
是的、我们确保 INT_EVENT1。 BatchLoaded=1、我们在读取模式之前也等待了10ms、但结果仍然不可能
此外、我还有一个问题、我们在第6步中返回的数据是0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x00、、但数据簿上的字节计数为0x04、我不知道是否返回0x40 
此致!
光圈
尊敬的 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表示失败
此致!
光圈

您好 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
尊敬的 Iris:
此致、
Aya Khedr