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.

BQ4050: BQ4050 reading fail

Part Number: BQ4050

Hello,

I used BQ4050 and nRF52832. I got broken data from BQ4050 as following.

The last marked values which are temperature from DAStatus2Reg(0x72). it works well but randomly it works malfunction.  

How can I solve this problem? please help me.

<info> app: bms(3:37:57) : 11178 12400 2679
<info> app: bms(3:37:58) : 11178 12400 2679
<info> app: bms(3:37:59) : 11179 12400 2679
<info> app: bms(3:38:0) : 11178 12400 2679
<info> app: bms(3:38:1) : 11178 12400 2679
<info> app: bms(3:38:2) : 11178 12400 2679
<info> app: bms(3:38:3) : 11178 12400 2679
<info> app: bms(3:38:4) : 11178 12400 2679
<info> app: bms(3:38:5) : 11178 12400 2679
<info> app: bms(3:38:6) : 11178 12400 2679
<info> app: bms(3:38:7) : 11178 12400 2679
<info> app: bms(3:38:8) : 11178 12400 -275
<info> app: bms(3:38:9) : 11178 12400 -275

my reading code is following,

void read_BQ4050_data(uint8_t regAddress, uint8_t size)
{
ret_code_t err_code;
uint8_t reg[1] = {regAddress};
uint8_t buf[2] = {0};

err_code = nrf_drv_twi_tx(&m_twi, BQ4050_WHO_AM_I, reg, sizeof(reg), false);
APP_ERROR_CHECK(err_code);

twi_done();


switch(size)
{
case 1:
err_code = nrf_drv_twi_rx(&m_twi, BQ4050_WHO_AM_I, m_buf8, size);
break;

case 2:
err_code = nrf_drv_twi_rx(&m_twi, BQ4050_WHO_AM_I, (uint8_t *)m_buf16, size);
break;

case 4:
err_code = nrf_drv_twi_rx(&m_twi, BQ4050_WHO_AM_I, m_buf, size);
break;

default:
err_code = nrf_drv_twi_rx(&m_twi, BQ4050_WHO_AM_I, m_buf, size);
break;

}

APP_ERROR_CHECK(err_code);

twi_done();

switch(regAddress)
{
case StateOfChargeReg:
m_bms_measurement1->realSOC = (uint8_t)m_buf8[0];
break;

case CellVoltageOne:
m_bms_measurement1->cellV[0] = m_buf16[0];
//err_check_read(&m_bms_measurement1->cellV[0], &pre_cV1, 1);
break;

case CellVoltageTwo:
m_bms_measurement1->cellV[1] = m_buf16[0];
//err_check_read(&m_bms_measurement1->cellV[1], &pre_cV2, 1);
break;

case CellVoltageThree:
m_bms_measurement1->cellV[2] = m_buf16[0];
//err_check_read(&m_bms_measurement1->cellV[2], &pre_cV3, 1);
break;

case CellVoltageFour:
m_bms_measurement1->cellV[3] = m_buf16[0];
//err_check_read(&m_bms_measurement1->cellV[3], &pre_cV4, 1);
NRF_LOG_INFO("cell V : %d %d %d %d ", m_bms_measurement1->cellV[0], m_bms_measurement1->cellV[1], m_bms_measurement1->cellV[2], m_bms_measurement1->cellV[3]);
break;

case CurrentReg:
m_bms_measurement1->packCurrent = m_buf16[0];
//m_bms_measurement1->packCurrent = 21000;
//err_check_read(&m_bms_measurement1->cellV[2], &pre_cV3, 1);
//NRF_LOG_INFO("Pack C : %d", m_bms_measurement1->packCurrent);
break;

case VoltageReg:
m_bms_measurement1->packVoltage = m_buf16[0];
err_check_read(&m_bms_measurement1->packVoltage, &pre_pV, 1);
//NRF_LOG_INFO("Pack V : %d", m_bms_measurement1->packVoltage);
break;

case OperationStatusReg:
m_status_bq4050->OperationStatus = byte2short(m_buf[1], m_buf[2]);
break;

case ManufacturingStatusReg:
m_status_bq4050->ManufacturingStatus = byte2short(m_buf[1], m_buf[2]);;
break;

case DAStatus2Reg:
m_bms_measurement2->temperature[0] = byte2short(m_buf[3], m_buf[4])-KTEMP_PARAM;
m_bms_measurement2->temperature[1] = byte2short(m_buf[5], m_buf[6])-KTEMP_PARAM;
m_bms_measurement2->temperature[2] = byte2short(m_buf[7], m_buf[8])-KTEMP_PARAM;
m_bms_measurement2->temperature[3] = byte2short(m_buf[9], m_buf[10])-KTEMP_PARAM;
//NRF_LOG_INFO("Pack Temp : %d", m_bms_measurement2->temperature[0]);
break;
}
}

  • Hello David,

    It is hard to find mistakes in code without having full information. I recommend that you monitor the bus and see if there is interference causing data corruption. If the bus reports correct data, then the code is likely the cause.