Battery 장착 관련 오류
Created: 2026-03-03
Last Modified: 2026-03-06
0. 요약
배터리를 장착한 후 기기 부팅 시 Fuel Gague Detect Error가 발생했다.
로그 분석 결과 Gauge 보드가 Wakeup 상태로 전환되지 않아 CAN 통신이 활성화 되지 않은 것을 확인했다.
BQ34Z100-G1 칩의 Sleep 모드가 원인이었다.
칩이 Sleep 모드에서 Wakeup 모드가 될 때 전류 측정 값 업데이트가 지연되어 실제 전류가 증가했음에도 Gauge보드의 ‘wakeup_check()’ 조건(50mA)을 만족하지 못했다.
이로 인해 Gauge 보드가 계속해서 Standby 모드로 진입했고, 결과적으로 Fuel Gauge Detect Error가 발생했다.
문제를 해결하기 위해 다음과 같은 두 가지 방법을 적용했다.
- BQ34Z100-G1의 Pack Configuration의 SLEEP 비트 LOW로 변경
- wakeup_check() 실패 시 여러 번 재시도하도록 코드 수정
SLEEP 비트를 LOW로 전환한 후 전류 값이 정상적으로 업데이트 되었고, Gauge 보드가 정상적으로 Wakeup 모드로 전환되면서 문제가 해결되었다.
1. 문제 개요
기기에 배터리를 장착한 후 부팅을 진행하면 Fuel Gauge Detect Error가 발생하는 문제가 발견되었다.
해당 문제가 발생할 경우 다음과 같은 현상이 나타났다.
- 기기에 배터리를 장착 시 배터리 인디케이터에 잔량이 표시되지 않음
- 기기 부팅 후 에러 상태로 전환 (Fuel Gauge Detect Error)
문제의 원인을 분석하고 해결하기 위해 로그를 추가하여 분석하였다.
2. 시스템 구성
해당 문제가 나타나는 시스템의 구조는 다음과 같이 구성되어 있다.
- Manul
- 기기 본체의 메인 펌웨어
- 다른 모듈들과의 통신 및 비지니스 로직 담당
- Gauge
- 배터리 팩 내부에 포함된 펌웨어
- 배터리 상태 모니터링 담당
- BQ34Z100-G1
- 배터리 셀의 정보를 읽는 칩
Manul은 CAN 통신을 통해 Gauge에서 배터리 상태 정보를 받아온다.
3. 증상
배터리를 장착했을 때 다음과 같은 증상이 발생하였다.
- 배터리 장착 시 배터리의 인디케이터에 잔량이 표시되지 않음
- 본체 부팅 시 본체의 인디케이터가 약 5초동안 노란색 상태 유지
- 부팅 후 Fuel Gauge Detect 에러 발생
로그를 확인한 결과 다음과 같은 상황이 확인되었다.
Error Case 1.


Error Case 2.

Normal Case

- Manul이 Gauge에 요청을 보냄
- 응답이 정해진 Timeout 시간(5초)을 넘어 도착
정상 상황에서는 요청 후 거의 즉시 응답이 도착한다.
따라서 문제의 원인은 Gauge 보드가 정상적으로 응답하지 못하는 상황으로 추정하였다.
4. 가설
Gauge 보드가 Wakeup 상태로 전환되지 않아 CAN 통신이 활성화 되지 않았을 가능성을 의심하였다.
Gauge 보드는 Standby 모드에서 다음과 같은 과정으로 동작한다.
- RTC Wakeup Timer로 1초마다 Standby 모드 해제
- 전류 상태 체크
- 일정 전류 이상이면 Wakeup 상태로 전환
- 이후 CAN 통신 활성화
- Wakeup 상태로 전환되지 못한 경우 다시 Standby 모드로 전환
Wakeup 체크는 다음 코드와 같이 동작한다.
wakeup_check()
static const int WAKEUP_CURR_MIN = 50; // Wakeup minimum load current value, mA
bool CPower::wakeup_check(void)
{
s16 curr;
g_bq34z100g1.curr_read(curr);
CBq34z100g1::res_e res;
do {
g_bq34z100g1.poll();
res = g_bq34z100g1.get_res();
} while (res == CBq34z100g1::RES_UNKNOWN);
if (res == CBq34z100g1::RES_SUCCESS) {
current_ = curr / 1000.0f;
if (abs_f(current_ * 1000.0f) > WAKEUP_CURR_MIN) {
return true;
}
return false;
} else {
return false;
}
}
curr_read()
const uint BQ34Z100G1_CMD_CURR = 0x0010u;
void CBq34z100g1::curr_read (s16 &data)
{
exec_cmd_read(BQ34Z100G1_CMD_CURR, reinterpret_cast<u08*>(&data), 2);
}

Fuel Gauge 에서 I2C로 BQ34Z100-G1를 통해 읽은 전류 값이 50mA 이상일 때 Wakeup 상태로 전환된다.
또한 Wakeup 상태로 전환된 후 아래와 같은 코드로 동작하며 특정 조건을 만족 시 Wakeup 모드에서 Standby모드로 진입한다.
CPower::poll()
void CPower::poll(void)
{
g_bq34z100g1.poll();
// Fuel gauge vakues update
do_values();
// Check for automatic switch to standby mode
do_standby_check();
}
do_standby_check()
static const int BTN_WAKEUP_TIME = 10000; // Time of wakeup after button event when no load detected, ms
void CPower::do_standby_check(void)
{
if (!isnan_f(current_) && abs_f(current_ * 1000.0f) > WAKEUP_CURR_MIN ) {
// No fuel gauge communication errors and load current exsceeds wakeup treshold
return;
}
if (btn_wakeup_time_ != 0 && systime_diff_ms<s64>(btn_wakeup_time_) < BTN_WAKEUP_TIME) {
// Wakeup by button and operation time less than wakeup treshold time
return;
}
auto req_time = kernel::req_time_get();
if (req_time != 0u && systime_diff_ms<s64>(req_time) < REQ_WAKEUP_TIME) {
// There was requests within last REQ_WAKEUP_TIME
return;
}
// All conditions met - switch to standby mode
g_telem.set_debug_event(gauge::GAUGE_DEBUG_EVENT_STANDBY_ENTERED, 0u);
standby();
}
따라서 배터리와 기기 사이의 전류가 50mA를 한번에 넘지 않아 Wakeup모드로 전환되지 않는 것으로 예상된다.
5. 분석
테스트를 위해 Gauge 보드의 펌웨어에 Standby 모드에서 Wakeup 모드로 전환되는 과정의 로그를 추가하여 다음과 같은 결과를 확인했다.
Test 1-1.

Test 1-2.

테스트 1-1, 1-2의 로그 분석 결과 다음 현상이 확인되었다.
- wakeup_check()를 통과하지 못함
- Guage 보드가 Standby 모드로 반복 진입
해당 문제의 원인을 BQ칩이 전류 값 증가를 바로 파악하지 못하거나 실제 전류 값이 오르기까지 오래 걸린다고 가정하고 추가적인 로그를 추가하여 테스트를 진행했다.
BQ칩에서 읽는 전류 값을 계속해서 출력하는 로그를 추가하여 다음과 같은 결과를 확인하였다.
Test 2-1.

Test 2-2.

Test 2-3.

테스트 로그를 분석한 결과 BQ칩에서 읽는 전류가 실시간 전류의 값을 출력하기 까지 시간이 걸린다는 것을 확인하게 되었다.
즉, 전류 값 업데이트에 지연이 발생하고 있었다.
6. Root Cause
BQ34Z100-G1의 데이터 시트를 확인한 결과 ‘SLEEP’ 비트가 High(1)로 설정되어 있을 경우 칩이 자동으로 Sleep 모드에 진입할 수 있다는 것을 확인하였다
실제 BQ의 속성을 확인해보니 [SLEEP]비트가 High로 설정되어 있어 Sleep 모드에서 Wakeup 모드가 되는 과정에서 전류 값 업데이트에 지연이 발생하였다.
그 결과 다음과 같은 문제가 발생하였다.
실제 전류 증가 → BQ 전류값 업데이트 지연 → wakeup_check() 실패 → Standby 모드 진입(CAN 비활성화) → 반복 → Fuel Gague Detect Error
즉, 문제의 원인은 BQ 칩의 Sleep 모드로 인한 전류 업데이트 지연이었다.
7. 해결 방법
7.1 BQ 칩 설정 변경 (근본 해결)
BQ 칩이 Sleep 모드로 진입하지 않도록 Sleep 비트를 High → Low로 변경 후 테스트를 진행해본 결과 정상 작동을 확인하였다.

7.2 코드 수정(대안 해결)
코드 레벨에서도 문제를 완화할 수 있도록 수정해보았다.
기존에는 wakeup_check()를 power 모듈 초기화 시점에 한 번만 수행하였다.
수정 후에는 power 모듈의 poll()을 돌며 여러번 재시도하도록 아래 코드와 같이 변경했다.
CPower::init()
read_curr_more_count_ = 0;
last_wakeup_check_time_ = 0;
can_enable(true);
g_bq34z100g1.owner_set(this);
g_bq34z100g1.stdblock_update();
CPower::poll()
static const int CPower::wakeup_check_max = 5
if (read_curr_more_count_ < wakeup_check_max && (last_wakeup_check_time_ == 0 || systime_diff_ms<s64>(last_wakeup_check_time_) > 1000)) {
if(wakeup_check()){
read_curr_more_count_ = wakeup_check_max;
}else{
last_wakeup_check_time_ = systime_get_ticks();
read_curr_more_count_++;
}
}else if (read_curr_more_count_ >= wakeup_check_max) {
do_standby_check();
}
수정 내용
- wakeup_check() 실패 시 즉시 Standby 모드로 진입하지 않도록 수정
- 1초 간격으로 최대 5회 재시도
테스트 결과 아래 로그와 같이 정상적으로 Wakeup 상태로 전환되는 것을 확인하였다.
(SP_INFO sent devType=69가 출력된 시점이 전원 버튼을 누른 시점이다.)
8. 결론
이번 문제의 원인은 BQ34Z100-G1 칩의 Sleep 모드로 인한 전류 업데이트 지연이었다.
Sleep 모드에서 Wakeup 되는 과정에서 전류 측정 값이 늦게 업데이트 되면서 wakeup_check() 조건을 만족하지 못했고, 결과적으로 Gauge 보드가 Wakeup 상태로 전환되지 못했다.
문제 해결을 위해 다음과 같은 두 가지 방법을 시도해 해결해보았다.
- BQ 칩 SLEEP 비트 비활성화
- wakeup_check() 재시도 로직 추가
9. Lessons Learned
이번 문제를 통해 다음과 같은 점을 확인할 수 있었다.
- BQ 칩의 Sleep 모드가 측정 데이터 업데이트에 영향을 줄 수 있음
- 센서 값을 기반으로 상태 판단을 할 경우 초기 데이터 안정화 과정이 필요함
- 하드웨어의 내부 동작(펌웨어 or 하드웨어적 특성)은 시스템 동작에 예상치 못한 영향을 줄 수 있어 데이터 시트를 꼼꼼히 확인해 봐야함