Modern battery packs are much more than cells, MOSFETs and a protection circuit.
A smart battery can continuously measure voltage, current and temperature, estimate remaining capacity, count charge/discharge cycles, and communicate this information to the host system. The Smart Battery System specification defines commands for parameters including Temperature, Voltage, Current, Relative State of Charge, Remaining Capacity, Full Charge Capacity, Battery Status and Cycle Count.
I wanted to build a small laboratory tool that could make this information visible without modifying the battery firmware.
The interesting part is the BQ9003. Unlike common TI battery-management ICs with extensive public documentation, BQ9003 is difficult to approach as a conventional new-design component. Public reverse-engineering work identifies it in DJI intelligent batteries and documents its communication through SMBus. Some DJI implementations reportedly expose the controller using firmware behavior associated with the BQ40Z307 family.
That makes the device particularly interesting for engineers working on:
- smart battery diagnostics
- drone battery repair and analysis
- embedded battery interfaces
- SMBus development
- battery telemetry
- BMS reverse engineering
- USB-connected laboratory instruments
Instead of trying to reprogram the BQ9003, this project takes a safer approach.
The battery's SDA and SCL lines are connected to a CP2112-F03-GM USB-to-SMBus bridge. A PC then acts as the SMBus host. Python periodically sends standard Smart Battery read commands and records the returned values.
For example, the standard SBS command table assigns:
0x08β Temperature0x09β Voltage0x0Aβ Current0x0Dβ Relative State of Charge0x0Fβ Remaining Capacity0x10β Full Charge Capacity0x16β Battery Status0x17β Cycle Count0x18β Design Capacity0x19β Design Voltage
These command numbers are part of the Smart Battery Data specification rather than being claims about undocumented BQ9003-specific registers.
The result is essentially a small USB smart-battery diagnostic instrument.
Once the basic reader is working, the same hardware can be used to log battery behavior during a controlled discharge test. Voltage, reported state of charge, remaining capacity and temperature can then be plotted against time.
That gives us something much more useful than simply displaying a battery percentage: we can observe how the battery-management system reports the battery's condition as the pack is actually being used.
What makes this project useful?The project demonstrates a practical interface between three different engineering layers:
Battery β SMBus β USB β Python
The battery remains responsible for measurement and battery-management decisions, while the PC becomes a convenient visualization and data-logging platform.
This is particularly useful when developing a battery-service fixture, studying legacy smart batteries, or learning how SMBus-based battery telemetry works.
test procedure1. Verify the batteryUse a known-good battery pack and identify its exact connector pinout.
Do not assume that every BQ9003-containing battery uses the same connector or pin assignment.
2. Verify the SMBus voltageBefore connecting the CP2112, measure SDA and SCL relative to GND.
Confirm that the voltage is compatible with the CP2112 interface.
3. Connect only the communication signalsStart with:
Battery SDA β CP2112 SDA
Battery SCL β CP2112 SCL
Battery GND β CP2112 GND
Do not connect PACK+ to the CP2112.
4. Capture the first transactionUse a logic analyzer to confirm that the host generates SMBus transactions and that the battery acknowledges them.
5. Read standard SBS informationStart with:
0x08 Temperature
0x09 Voltage
0x0D Relative SOC
0x0F Remaining Capacity
0x10 Full Charge Capacity
0x16 Battery Status
0x17 Cycle CountThese are particularly useful because they give an immediate picture of the battery's reported operating state.
6. Log the dataThe Python program writes:
timestamp
temperature
voltage
SOC
remaining capacity
full-charge capacity
battery status
cycle count
to a CSV file.
7. Plot the discharge curveVoltage
β\
β \
β \
β \
β \____
β
βββββββββββββββββββ Time
and compare it with:
Reported SOC
β\
100% β \
β \
50% β \
β \
0% β_____\
βββββββββββββββββββ Time
This lets users see how the BMS's reported SOC changes compared with the actual pack voltage during a controlled test.
Important engineering notesFirst, BQ9003 should not be presented as if TI currently provides a normal public datasheet and complete programming reference for it. The public evidence available today is largely from reverse-engineering work on DJI batteries. The documented WM240 design, for example, identifies BQ9003 as the battery-management chip and shows its SMBus connection to the host.
Second, the standard SBS commands should not automatically be interpreted as proof that every BQ9003 firmware build implements every command identically. Vendor firmware can modify behavior. The Smart Battery specification itself defines the standard command set, while the DJI reverse-engineering documentation notes modifications to the SBS/SMBus behavior.
That distinction makes the project technically credible and avoids claiming undocumented BQ9003 features as facts.







Comments