Thread 中讨论的其他器件:BQ25798、 TPS25751
工具/软件:
您好团队:
我在使用 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;
}

此致!
光圈









