Book a demo

Know-how · Heavy duty

SAE J1939

The commercial-vehicle world does not run on manufacturer-private CAN databases. It runs on a published application layer, which is why a truck can be read without asking anyone.

By , Founder & Lead Engineer

In short

SAE J1939 is the application layer used on heavy-duty and off-highway vehicles, running on CAN with 29-bit extended identifiers. Data is organised into Parameter Group Numbers (PGNs), each carrying a defined set of Suspect Parameter Numbers (SPNs) at fixed bit positions with defined scaling, offset and range. Because the definitions are published rather than manufacturer-private, a J1939 signal can be decoded without a vendor database — the opposite of a typical passenger-car CAN bus, which needs a DBC. Faults are broadcast in diagnostic messages, principally DM1 for currently active faults, each carrying an SPN identifying the affected parameter, an FMI describing the failure mode, and an occurrence count. J1939 also defines address claiming, so nodes negotiate source addresses on the bus at start-up.

01

PGN and SPN: how the data is organised

A PGN identifies a group of parameters that travel together in one message — engine temperature, for example, or electronic engine controller data. The PGN is encoded inside the 29-bit CAN identifier along with priority and source address. A receiver that understands the PGN knows the layout of the eight data bytes without further information.

Within that layout, each SPN occupies a defined bit position and length, with a defined resolution and offset. Engine speed is an SPN with a known scaling; so is coolant temperature. This is the key difference from passenger-car CAN: the mapping from bits to physical quantity is in a published standard rather than in a file the manufacturer may or may not give you.

  • PGNParameter Group Number — identifies the message and its layout.
  • SPNSuspect Parameter Number — one parameter, with bit position and scaling.
  • Source addressWhich node sent it; negotiated through address claiming.
  • Transport protocolBAM and CMDT carry payloads longer than eight bytes.

02

Faults: DM1, SPN, FMI and occurrence count

J1939 fault reporting is a broadcast rather than a request. DM1 carries the currently active diagnostic trouble codes; DM2 carries previously active ones. Each entry identifies the affected parameter by SPN, describes how it failed by FMI, and gives an occurrence count.

The FMI is the part engineers underuse. It distinguishes "above normal, most severe" from "data erratic", "voltage below normal" from "abnormal update rate" — the failure mode, not just the failed thing. An SPN with FMI 3 and the same SPN with FMI 5 point at different physical causes, and reading only the SPN throws away half the information in the message.

  • DM1Active faults, broadcast periodically while present.
  • DM2Previously active faults held in memory.
  • FMIFailure mode — range, erratic, open circuit, update rate, and others.
  • Occurrence countHow many times the fault has been recorded.

03

J1939 and UDS on the same vehicle

They are not alternatives and they are not layered on each other. J1939 provides the normal operating data and a published fault model; UDS provides manufacturer diagnostic services — sessions, security access, routines, programming. A commercial vehicle typically carries both, and an engineer moves between them depending on the question.

If you want to know what the engine is doing right now, J1939 answers without anyone's permission. If you want to run a routine, read a manufacturer-specific identifier or reprogram an ECU, that is UDS, and it needs the manufacturer description and usually security access.

04

Reading J1939 in a measurement

A J1939 recording is useful precisely because it decodes without a vendor file, which makes fleet and field data tractable in a way passenger-car CAN often is not. The same recording usually holds far more than the fault: the operating point, the aftertreatment state and the duty cycle around the event.

MDX reads the MDF4 recording with the bus traffic alongside decoded signals. DiagAI handles the J1939 diagnostic side as well as UDS and OBD-II, so active and previously active faults can be read and interpreted in the context of the same test.

Standards & references

Check the source.

These primary sources define the formats and regulatory context discussed above. They do not certify or endorse VehicleLab products.

Questions

Frequently asked.

What is the difference between a PGN and an SPN?

A PGN identifies a message and the group of parameters it carries. An SPN identifies one parameter inside that message, with a defined bit position, length, resolution and offset.

Do I need a DBC file for J1939?

Usually not. J1939 parameter definitions are published in the standard, so a tool with J1939 support can decode the common messages without a manufacturer database. Proprietary extensions on a given vehicle are the exception.

What is an FMI in J1939?

Failure Mode Identifier. It describes how a parameter failed — out of range high or low, erratic, open circuit, abnormal update rate — rather than simply that it failed. The SPN says what, the FMI says how.

Is J1939 the same as CAN?

No. CAN is the underlying bus. J1939 is an application layer running on CAN with 29-bit identifiers, defining message structure, parameter definitions, addressing and diagnostics.

Is J1939 used outside trucks?

Yes. It is widely used across off-highway, agricultural, construction and marine equipment, and derivatives are used in other heavy machinery domains.

Next step

Open one of your own files with us.

Send a measurement, an A2L or an EHANDBOOK container. We will open it in the instruments on a call, with your engineers in the room.