OBD-II DIAGNOSTIC CODES
Since 1996, all passenger vehicles sold in the United States have incorporated standard OBD-II capabilities. OBD-II (On-Board Diagnostics) is
the second generation of diagnostic equipment designed to keep vehicle emissions as clean as possible. Almost every component in the
vehicle that can affect emissions is monitored for correct functioning and operating parameters.
When a problem occurs, the ODB-II system stores a fault code in it's memory and usually triggers an indicator light on the dashboard. This MIL (Malfunction
Indicator Light) tells the driver that the vehicle is not running effeciently and to have it services soon.
On 1999 and 2000 E46s, the MIL is labeled "Check Engine".
From 2001 on, the MIL is labeled "Check Engine Soon".
When this fault code (also referred to as a DTC or Diagnostic Trouble Code) is triggered, other engine operating parameters are stored at the
time such as RPM, Coolant Temperature, Throttle Position, Speed, etc. This give you an idea of what the engine was doing at the time of
Many different scan tools can read these codes from your BMW to diagnose engine or emission problems. The 16-pin ODB-II Data Link Connector port is under the
driver's side dash panel. Prior to 6/2000 production, BMW included a 20-pin round DLC port under the hood. This DLC was eliminated and
all BMW-specific data was rerouted to the ODB-II 16-pin DLC.
The Society of Automotive Engineers (SAE) created a standard list of trouble codes to indicate various problems. They are 5 digits long and mostly start with the letter
P (for Powertrain). Other letters are used for body, chassis, and so on, but they don't pertain to emissions.
I wrote this page to make it possible to quickly find the description of various trouble codes retreived from my BMW. I am not responsible
for inaccurate or outdated codes. Use of this page is for information only. Any emission repair needs should be taken to your nearest
BMW dealer. Enjoy!
NOTE: The first number after the P in SAE trouble codes is either a zero (0) or a one (1). A zero represents a standard ODB-II code, while
a one represents a manufacturer-specific code. In addition, BMW uses their own specific codes that are more detailed than the ODB-II mandated
standard. These codes are from 1-250 without letters. If you retreive one of these codes, use the box below to look it up...