First digit: the letter
The first character of a DTC tells you which system the code refers to:
| Letter | System | Examples |
|---|---|---|
| P | Powertrain — engine, transmission, fuel, emissions | P0171, P0300, P0420 |
| U | Network — CAN bus, gateway, lost communication | U0100, U0121, U0140 |
| B | Body — lighting, climate, airbags, seats | B0001 (airbag stage 1) |
| C | Chassis — ABS, steering, suspension | C0020 (ABS pump), C1145 (steering angle) |
Second digit: generic vs. manufacturer-specific
The second digit of a DTC is 0–7 for generic (SAE-standardised) codes and 8–9 for manufacturer-specific codes:
- 0–7: SAE-standardised. The meaning is the same on every car make, not just BMW. A $20 OBD-II reader covers these.
- 8–9: Manufacturer-specific. BMW, Ford, GM, etc. each have their own proprietary meaning for codes 8xxx and 9xxx. A standard OBD-II reader won’t decode them; you need a BMW-specific tool (which is what Beemuu is).
Third digit: the subsystem
For P-codes (powertrain), the third digit identifies the specific subsystem:
| Third digit | Subsystem |
|---|---|
| 0 | Fuel and air metering (generic) |
| 1 | Fuel and air metering (manufacturer-specific) |
| 2 | Fuel and air metering (ignition system) |
| 3 | Ignition system (generic) |
| 4 | Emissions system (auxiliary emissions controls) |
| 5 | Vehicle speed, idle control, engine |
| 6 | Computer/output circuit |
| 7 | Transmission |
| 8, 9 | Reserved for manufacturer-specific powertrain codes |
U-codes (network) use a different sub-system breakdown: 0–3 = network electrical, 4–8 = network communication, 9–F = manufacturer-specific network. B-codes (body) cover climate, restraints, lighting, etc. C-codes (chassis) cover ABS, steering, suspension.
Fourth and fifth digits
The fourth and fifth digits together form the specific fault number within the subsystem. They are assigned by SAE for generic codes, by the manufacturer for manufacturer-specific codes. There is no further structure — the meaning is per-code, not positional.
Examples
| Code | Breakdown |
|---|---|
| P0171 | P (powertrain) · 0 (generic) · 1 (fuel/air metering, manufacturer-specific) · 71 (specific fault: system too lean, Bank 1) |
| P0301 | P (powertrain) · 0 (generic) · 3 (ignition system) · 01 (specific fault: cylinder 1 misfire detected) |
| P0420 | P (powertrain) · 0 (generic) · 4 (emissions) · 20 (specific fault: catalyst efficiency below threshold, Bank 1) |
| U0100 | U (network) · 0 (generic) · 1 (network communication, generic) · 00 (specific fault: lost communication with ECM) |
BMW-specific codes
BMW uses 4-hex-digit codes in addition to the SAE J2012 5-character codes. The BMW codes look like 29E0, 2A82, 120308, etc. They live in the same fault memory as the SAE codes, alongside them.
The BMW code structure:
- First two hex digits: the subsystem (e.g. 27xx is the accelerator pedal, 28xx is intake manifold pressure, 29xx is fuel rail pressure, 2Axx is VANOS, 30xx is boost pressure).
- Last two hex digits: the specific fault within that subsystem.
BMW-specific codes are visible only to a BMW-specific diagnostic tool. A standard OBD-II reader sees only the SAE J2012 codes. Beemuu reads both.
DTC structure questions
What does the second digit in a P-code mean?
0–7 = generic (SAE-standardised). 8–9 = manufacturer-specific. The third digit is the subsystem; the fourth and fifth are the specific fault number.
What’s the difference between a P-code and a BMW 4-hex code?
P-codes are SAE-standardised (e.g. P0171, P0300). BMW 4-hex codes (e.g. 29E0, 2A82) are manufacturer-specific and only visible to a BMW-specific tool. Beemuu reads both.
Why is my BMW code 120308 not in any online OBD-II database?
It’s a BMW-specific 6-hex-digit code, not an SAE code. Online OBD-II databases only cover the SAE subset. Beemuu includes BMW-specific codes in its catalog; use the live lookup.