Practical DTC Diagnosis Workflow
Module 4 of 5 · 1 comprehensive lesson · ~18 min · ← Back to Learning Hub
Welcome to the practical diagnostic workshop. In this module, you will step into the shoes of an automotive calibration or master diagnostic technician executing an end-to-end fault investigation, freeze frame capture, component repair, and memory clearance.
Interactive Diagnostic Mission Console
Step through the 8 stages of the investigation below. Watch how the virtual vehicle’s check engine light (MIL), rough idle RPM, and DTC status bytes respond to your commands in real time:
ISO 14229 End-to-End Diagnostic Workflow
Enter Extended Diagnostic Session
Transitions ECU from 0x01 Default Session to 0x03 Extended Session to unlock full DTC reading, freeze frame retrieval, and memory clearing capabilities.
Extended Diagnostic Session active · S3 watchdog timer running (5.0s).
Fault confirmed across multiple cycles (stored in EEPROM)
Real-World Scenario: Misfire & Lean Mixture
A vehicle arrives in the service bay with the Check Engine Light (MIL) illuminated. The driver reports sudden hesitation under load and rough idle at stoplights.
As the diagnostic engineer, you follow the standardized 8-stage ISO 14229 workflow:
- Establish a Diagnostic Session (
0x10 0x03) - Count Active DTCs (
0x19 0x01) - Retrieve Fault Codes & Status Bytes (
0x19 0x02) - Capture Freeze Frame Operating Data (
0x19 0x04) - Execute Physical Hardware Repair (Replace Coil / Plug)
- Purge Fault Memory (
0x14 FF FF FF) - Verify Repair with Drive Cycle Re-Read (
0x19 0x01→ 0 DTCs) - Exit Diagnostic Session Gracefully (
0x10 0x01)
Step-by-Step Technical Execution
Step 1: Enter Extended Diagnostic Session (SID 0x10)
Standard factory ECUs boot into Default Session (0x01), which locks out extended memory reads and fault memory erasure to protect vehicle security while driving. First, elevate to Extended Diagnostic Session (0x03):
Positive Response (0x7E8)
> ECU replies with 0x50 (0x10 + 0x40), confirming Extended Session (0x03), P2 timeout 50ms (0x0032), and P2* extended timeout 5000ms (0x01F4).
Always confirm the positive response before sending subsequent requests. If the ECU returns NRC 0x22 (ConditionsNotCorrect), verify that vehicle speed is 0 km/h and ignition KL15 is active.
Step 2: Query DTC Count (SID 0x19 0x01)
Before pulling full multi-frame DTC lists across the CAN bus, query the total number of fault records matching status mask (bits 0–3 combined: active, confirmed, and pending faults):
Count Response (0x7E8)
> 0x59 positive response echoing mask 0x0F, format identifier 0x01 (ISO 14229-1 DTC format), and 2-byte count 0x0002 (2 DTCs present).
Step 3: Retrieve Stored DTCs and Status Bytes (SID 0x19 0x02)
Now pull the exact 3-byte DTC identifiers along with their 1-byte ISO status descriptors:
Read DTC List (0x7E0)
> Subfunction 0x02 (ReportDTCByStatusMask) requesting all faults matching mask 0x0F.
DTC List Response (0x7E8)
> Positive response echoing mask 0x0F, followed by DTC 1 (0x043001, status 0x2F) and DTC 2 (0x017100, status 0x0C).
Payload Breakdown:
| DTC Bytes | Standard Code | Description | Status Byte | Severity / State |
|---|---|---|---|---|
| 0x04 0x30 0x01 | P0301 | Cylinder 1 Misfire Detected | 0x2F (0010 1111) | Confirmed, Active, MIL Requested |
| 0x01 0x71 0x00 | P0171 | System Too Lean (Bank 1) | 0x0C (0000 1100) | Pending Fault (Seen in 1 cycle) |
Step 4: Capture Freeze Frame Data (SID 0x19 0x04)
To understand what caused the misfire, query the Freeze Frame Snapshot (Record ) captured by the ECU at the millisecond the fault was confirmed:
Freeze Frame Query (0x7E0)
> Subfunction 0x04 (ReportSnapshotRecordByDTCNumber) for P0301, record 0xFF (all records).
Snapshot Response (0x7E8)
> Echoes DTC P0301 and status 0x2F, followed by Record 0x01 containing Speed 62 km/h (DID 0x0101), RPM 2450 (DID 0x0104), and Coolant Temp 92°C (DID 0x0105).
The Freeze Frame is your diagnostic time machine. It captures load percentage, RPM, vehicle speed, and short-term fuel trim at the moment the misfire occurred, distinguishing intermittent faults from permanent hardware failures.
Step 5: Execute Physical Hardware Repair
Armed with the freeze frame context, technicians service the vehicle:
- P0301: Inspect Cylinder 1 ignition coil and spark plug. A cracked ceramic insulator on plug #1 allowed secondary voltage to ground out. Replace coil and spark plug (gap: 0.8 mm).
- P0171: Check intake manifold vacuum lines. Reseat loose PCV breather hose.
Step 6: Purge Fault Memory (SID 0x14)
With physical repairs completed, command the ECU to erase all stored fault records, freeze frames, and readiness flags:
Clear All DTCs (0x7E0)
> ClearDiagnosticInformation targeting group 0xFFFFFF (all DTC groups).
Clear Confirmation (0x7E8)
> Positive response 0x54 (0x14 + 0x40). Non-volatile DTC memory is purged and the cluster MIL lamp extinguishes.
Step 7: Post-Repair Drive Cycle Verification (SID 0x19 0x01)
Perform a standardized drive cycle so ECU monitors can run. Then re-poll the fault count:
Clean Count Response (0x7E8)
> 0x59 positive response showing 0x0000 (0 DTCs remaining). Repair verified!
Step 8: Graceful Session Termination (SID 0x10 0x01)
Always return the ECU to its Default Diagnostic Session (0x01) before disconnecting your diagnostic tool:
Session Restored (0x7E8)
> ECU confirms return to Default Session (0x01). S3 watchdog timer stops and standard vehicle CAN multiplexing resumes.
ISO 14229-1 DTC Status Byte Bitmask Reference
Every DTC returned by SID includes a 1-byte status bitmask:
| Bit | Mask | Status Name | Meaning When Bit = 1 |
|---|---|---|---|
| 0 | 0x01 | testFailed | The diagnostic test is currently failing at the time of the request. |
| 1 | 0x02 | testFailedThisOperationCycle | The fault failed at least once during the current drive cycle. |
| 2 | 0x04 | pendingDTC | Fault detected in current or previous drive cycle; not yet confirmed. |
| 3 | 0x08 | confirmedDTC | Fault verified across qualifying drive cycles; stored in non-volatile EEPROM. |
| 4 | 0x10 | testNotCompletedSinceLastClear | The test monitor has not completed execution since DTC memory was cleared. |
| 5 | 0x20 | testFailedSinceLastClear | The fault has failed at least once since DTC memory was cleared. |
| 6 | 0x40 | testNotCompletedThisOperationCycle | The test monitor has not completed running during this specific cycle. |
| 7 | 0x80 | warningIndicatorRequested | The ECU has requested MIL / check engine warning lamp illumination. |
Complete Frame Sequence Summary
| Stage | Action | Request Frame | Response Frame | Result |
|---|---|---|---|---|
| 1 | Enter Extended Session | 10 03 | 50 03 00 32 01 F4 | Unlocks full diagnostics |
| 2 | Count DTCs | 19 01 0F | 59 01 0F 01 00 02 | 2 DTCs found |
| 3 | Read DTC List | 19 02 0F | 59 02 0F [DTCs] | P0301 (0x2F) & P0171 (0x0C) |
| 4 | Freeze Frame | 19 04 04 30 01 FF | 59 04 [Snapshot] | Speed 62 km/h, 2450 RPM |
| 5 | Physical Repair | — | — | Replace coil & spark plug #1 |
| 6 | Clear DTCs | 14 FF FF FF | 54 | MIL lamp extinguished |
| 7 | Verify Repair | 19 01 0F | 59 01 0F 01 00 00 | 0 DTCs remaining |
| 8 | Exit Session | 10 01 | 50 01 00 32 01 F4 | Returns to Default Session |
Next Steps
Advance to Best Practices to learn production-grade error recovery, retry timing strategies, and negative response handling.