EFC

DTC Index: Bad Module or Bad Wiring?

A code stored in a module is not evidence that the module is faulty. The four buckets every fault code falls into, and which one actually justifies buying a controller.

10 min readDiagnostics · DTC · Reference
By ECU Flash Cartel · ECU Flash Cartel · US-based · Texas operations

As of September 2026, the single most expensive mistake we see in module work is a controller replaced because of a code that was never about the controller. A fault stored in the engine controller's memory is not evidence that the engine controller is faulty. Most of the time it is the module reporting, accurately, that something outside it is wrong.

There is a small set of codes that genuinely implicate the module itself, a larger set that implicate the network or the power feeding it, and a very large set that implicate a sensor, a circuit or a mechanical condition and have nothing to do with the module at all. Knowing which bucket you are in before you buy a replacement is the difference between a $150 session and a $900 mistake.

The four buckets

Every code we index falls into one of four categories, and the category determines the next action far more reliably than the code's description does.

BucketExamplesWhat it usually means
Module internalP0606, B1000The controller has failed its own self-test
Network and powerU0100, U0073, U0140, U0121A module is not being heard — bus, power or ground
ConfigurationC0561, C1201Modules disagree about what car this is
Sensor and mechanicalP0100, P0171, P0300, P0420, P0741, P245AThe module is correctly reporting a real fault elsewhere

Every code named above has its own page in our DTC lookup, which is free and needs no account. What follows is how to read the buckets.

Bucket one: the module really is the problem

Two families point inward.

P0606— ECM/PCM processor fault. The controller ran its internal integrity checks and did not like the result. This is the closest thing to a code that says “replace me”, and it is still not a guarantee — low or noisy supply voltage, a corrupted flash region and a genuinely dead processor all present the same way. Our P0606 guide walks the branch, and the reason it is worth walking is that two of the three outcomes are considerably cheaper than the third.

B1000— ECU malfunction, body control module internal. The same statement from the body side. Again, check supply and grounds before condemning — a body module browning out at crank produces remarkably convincing internal faults.

A corrupted region is worth its own sentence because it is recoverable. A flash that was interrupted leaves a controller that may fail its own checks and may not communicate at all; our interrupted-flash recovery post covers what is salvageable, and our checksum repair guide covers the narrower case where the contents are fine but the integrity value no longer matches them.

Bucket two: U-codes, which are about being heard

The U family is the most misread group on the list, because the wording sounds like an accusation and is actually an observation.

U0100, lost communication with the engine controller, is set by other modules when the engine controller stops answering. That silence has at least four ordinary causes: the module has no power, the module has no ground, the bus wiring between them is broken, or the module is genuinely dead. Only the last needs a controller. Our U0100 post separates them in order of cost.

U0073, control module communication bus “A” off, is the same story about the bus rather than one participant. A bus in the off state has usually been shorted or has lost termination, and swapping a module into a dead network achieves nothing.

U0140 and U0121 say the same thing about the body module and the ABS module respectively. The pattern to watch for is a cluster of U-codes across several modules: when four controllers all report that they cannot hear each other, the thing they have in common is the network, not four simultaneous failures.

“One U-code is a module question. Four U-codes is a wiring question, and I have never once seen four modules die on the same Tuesday.” — Remote programming desk, ECU Flash Cartel

There is a timing subtlety worth knowing. U-codes set readily during battery disconnection, jump-starting and module programming, because modules genuinely do go quiet during those events. A U-code with a timestamp matching yesterday's alternator replacement is usually history rather than news. Clear them, drive, and see which ones come back.

Bucket three: configuration disputes

C0561, system configuration mismatch, is the most honest code in the catalogue. The module is telling you that what it believes about this vehicle and what the vehicle actually is do not agree. Nothing is broken; something was never written.

This is the signature fault of a replacement module that was programmed but not configured — the distinction our VIN mismatch post exists to explain. It is a session task and it is usually quick.

C1201, engine control system malfunction, deserves its own warning because of where it is stored. This code lives in the ABSmodule and reports that the ABS module has been told, over the network, that the engine control system has a problem. It is a relay, not a finding. Chasing C1201 in the brake system is a well-worn way to lose an afternoon; read the engine controller's own codes and work those instead.

Bucket four: the module is the messenger

This is the largest group and the one that most often gets a controller replaced for no reason.

P0100is a mass airflow circuit fault — sensor, connector or wiring. P0171 is a lean condition, which on most engines means unmetered air, a fuel delivery shortfall or a sensor reporting honestly about either. P0300is random misfire, which is ignition, fuel, compression or — as covered in our relearn index — occasionally a crank variation relearn that was never run.

P0420 reports catalyst efficiency below threshold, and P245A reports an EGR cooler bypass circuit condition. Both name specific physical components, and the correct response to both is diagnosis and repair of the named component. We will not supply files that make an emissions-related fault stop being reported, which is worth stating plainly on a page that lists these codes.

P0700 is an indicator rather than a fault: it means the transmission controller has stored something of its own. Read the transmission controller. P0741, torque converter clutch circuit performance, is a real transmission finding and is sometimes solenoid, sometimes hydraulic, sometimes fluid condition.

Immobiliser codes are their own conversation

B2784, immobiliser authentication failure, and B2103, antenna coupling coil circuit failure, both sit in the security system rather than the powertrain, and both change the diagnostic path completely.

B2103 in particular is one of the cheapest wins in this whole index: the coil around the ignition lock is a physical part that fails, and a car that will not authenticate a key it should recognise is frequently a coil rather than anything expensive. Our security-light no-start guide walks the crank-versus-no-crank branch these codes belong to, and our swapped-ECU no-start post covers the version where the module was recently replaced.

A worked example

A van arrives with a no-start. The scan pulls U0100 from the body module, U0121 from the instrument cluster, and P0606 from the engine controller. Three codes, one of which names the engine controller directly.

The tempting read is that the engine controller has failed and took the network down with it. That read sells a module.

The better read starts with what the codes have in common. Two of the three are other modules reporting that they cannot hear somebody. The third is the engine controller reporting that it failed its own integrity test — which is exactly what a controller does when its supply voltage collapses during a crank attempt.

Check the battery and the main grounds first. A weak battery on a cold morning drags the whole network below the voltage several modules need to stay online, every module complains about every other module, and the engine controller adds an internal fault because from its perspective the fault was internal. Replace the battery, clear the codes, and all three stay gone.

This is not a rare shape. It is the most common false positive in the entire index, and the tell is always the same: multiple modules reporting simultaneously about each other.

Codes that travel together

Combinations carry more information than any single code, and a few recur often enough to name.

Several U-codes and nothing else. Power, ground or bus. Do not read it as several failed modules.

P0700 with nothing in the transmission controller. Either the codes were cleared from one module and not the other, or the scan tool never actually reached the transmission controller. Re-scan and confirm it responded.

C0561 immediately after a module replacement. Configuration, not failure. The module was programmed and not told what car it is in.

B2784 with a crank that never fires. Immobiliser, and the branch in our security-light guide applies. Nothing in the powertrain codes will help until this is resolved.

P0171 with P0300. One condition, two symptoms: enough unmetered air to lean the mixture far enough to misfire. Chasing them as separate problems is how a straightforward intake leak becomes a week.

Reading codes without being misled

Four habits do most of the work.

Scan every module, not the engine. A generic reader that only pulls powertrain codes hides the U-codes and the body codes that would have told you where the problem actually lives.

Read freeze frame. Engine speed, load, coolant temperature and vehicle speed at the moment of the fault turn a code into a story. A misfire logged at cold idle and a misfire logged under full load are different problems wearing the same number.

Count occurrences. A code that has set once in six months and a code setting on every drive cycle deserve different budgets.

Clear and reproduce. A code that does not come back was history. This is the fastest way to strip out the U-codes left over from the last battery disconnection.

The standards behind the numbers

The reason a P-code means the same thing across manufacturers is SAE J2012, which defines the diagnostic trouble code format and the first-letter grouping into powertrain, body, chassis and network. The reason an independent shop can run the manufacturer's own application against a module is SAE J2534, and the reason credentialed security functions are available outside the dealer network is the registry administered by NASTF. Manufacturer-specific codes live outside J2012's common list, which is why a code your generic reader describes vaguely may have a precise meaning in the platform's own service information.

We do not provide emissions defeat, delete files, or services intended to bypass emissions laws. Our services exist for tuning preparation, diagnostics, repair, motorsport, and off-road use where legally permitted. Customer is responsible for confirming legal use in their location and application.

Freeze frame is the cheapest evidence you have

Most scan tools capture a snapshot of operating conditions at the moment a code sets, and most people never open it. It frequently settles the bucket question on its own.

Look first at the recorded system voltage. A fault that set while the supply was well below normal is telling you about the supply, not about whatever the code names — and that single reading is what separates a genuine internal failure from a module that browned out during a crank attempt.

Then look at engine speed, coolant temperature and load. A code that only ever sets at crank, or only from cold, or only under high load, has a condition attached to it, and the condition narrows the search far more than the code's description does. A fault with no pattern at all — hot, cold, idle, load, every time — points at wiring or a connector more often than at a component.

The short version

Only P0606 and B1000 point at the module, and even they have cheaper explanations worth eliminating first. U-codes are about power, ground and the bus. C-codes about configuration are session work. Everything in the P family with a component in its name is telling you about that component. Look up what you have in the free DTC index, and if the answer turns out to be programming or configuration, book it on the flash pagewith the codes in hand — they route the job faster than a description of the symptom does.

Frequently asked

Does a code stored in the ECU mean the ECU has failed?
Usually not. Most codes in a module memory are that module accurately reporting something wrong outside itself. Only a small family points inward.
Which codes actually point at the module?
P0606 and B1000 are the clearest, and even those have cheaper explanations worth eliminating first, including low supply voltage and a corrupted flash region.
What do U-codes really mean?
That a module is not being heard. That silence has at least four ordinary causes: no power, no ground, broken bus wiring, or a genuinely dead module. Only the last needs a controller.
What does a cluster of U-codes across several modules indicate?
Almost always power, ground or the bus. Four modules do not fail simultaneously; what they have in common is the network.
What are configuration codes?
Codes such as C0561 that appear right after a replacement, where modules disagree about what vehicle this is. That is session work, not a failed part.
How does freeze frame help?
It records the conditions when the code set. Low system voltage at the moment of the fault reframes an apparent internal failure as a supply problem, and that single reading often settles the whole question.
Where can I look up a specific code?
The DTC index on this site is free and needs no account. It covers the codes named in this article and links each to the relevant guide.

Ready to put this into practice?

Book a remote ECU programming session in minutes — or drop a dump on the free identifier first to see whether we cover your variant.