J1939 in simple words

J1939 is a set of rules that lets controllers on heavy vehicles understand each other over CAN bus.

CAN moves the raw frame. J1939 explains how to build the 29-bit CAN ID, how controllers identify themselves, and what many messages and parameters mean.

This distinction matters:

Example
CAN = how the frame travels
J1939 = what the frame means and how devices use it

Where J1939 is used

J1939 is common in systems such as:

  • trucks and buses
  • tractors and harvesters
  • construction equipment
  • off-highway machines
  • marine engines
  • generators and industrial engines

These systems often contain ECUs from different suppliers. A shared protocol makes it easier for an engine, transmission, dashboard, brake controller, and diagnostic tool to exchange known data.

The four terms to learn first

You can understand most beginner J1939 discussions by learning four terms:

TermMeaning
29-bit CAN IDThe extended CAN identifier used by J1939
Source addressThe address of the ECU that sent the frame
PGNParameter Group Number, which identifies the message type
SPNSuspect Parameter Number, which identifies a parameter inside a PGN

The relationship is:

Example
29-bit CAN ID -> PGN -> one or more SPNs

A common J1939 example

You may see a frame like this in a CAN log:

Example
0CF00401#AABBCCDD11223344

The extended CAN ID is 0x0CF00401.

  • Priority: 3
  • PGN: 0xF004, or 61444
  • Source address: 0x01

PGN 61444 is commonly called EEC1, or Electronic Engine Controller 1. It contains engine-related SPNs. One of the well-known parameters in that group is engine speed.

The exact data-byte meaning still comes from the J1939 parameter definition or a matching DBC file.

Why J1939 uses PGNs

On a simple proprietary CAN network, engineers often treat the full CAN ID as the message key. J1939 needs more structure because the identifier also carries priority and addressing information.

A PGN identifies the parameter group independently of the source address. Two different engines can therefore send the same PGN from different source addresses.

For example:

Example
0x0CF00401 -> PGN 61444 from source 0x01
0x0CF00417 -> PGN 61444 from source 0x17

The message type is the same. The sender is different.

Broadcast and destination-specific messages

Some J1939 messages are broadcast. Every node can receive them. Other messages are sent to one destination address.

This is controlled by the PDU Format and PDU Specific fields inside the 29-bit ID. You will often hear the names:

  • PDU1 for destination-specific messages
  • PDU2 for broadcast parameter groups

You do not need to memorize all the bits on day one. Start by using a tested PGN extraction function or a J1939-aware tool.

What an SPN is

An SPN is one value inside a PGN. A PGN may contain several SPNs, just as a DBC message may contain several signals.

An SPN definition normally tells you:

  • byte and bit position
  • length
  • byte order
  • scale and offset
  • unit
  • valid range
  • special values such as not available

For example, an engine-speed SPN may take two bytes. If the raw value is 16000 and the scale is 0.125 rpm per bit, the result is:

Example
16000 x 0.125 = 2000 rpm

J1939 also handles network behavior

J1939 is more than a list of signals. It also defines behavior such as:

  • address claiming
  • request messages
  • multi-packet transport
  • diagnostic messages
  • standard message rates for many parameter groups

Address claiming helps nodes choose and defend a source address. The transport protocol is used when a payload is larger than one classical CAN frame.

J1939 diagnostics

Heavy-duty diagnostics often use Diagnostic Message PGNs. You may see terms such as:

  • DM1 for active diagnostic trouble codes
  • DM2 for previously active trouble codes
  • DTC for diagnostic trouble code

J1939 diagnostics are not the same as UDS, even though both are used to diagnose ECUs. Always check which protocol your target uses.

How to start working with J1939

Use this order:

  1. Confirm the CAN bitrate and that frames use 29-bit IDs.
  2. Record a short, read-only CAN log.
  3. Extract the PGN and source address from each ID.
  4. Load the correct J1939 DBC or parameter definitions.
  5. Decode a few known SPNs.
  6. Check message rates and unavailable values.
  7. Only then add transmit, request, or diagnostic behavior.

The simple summary

J1939 is a higher-level protocol built on CAN. It uses a structured 29-bit identifier, PGNs for message types, SPNs for individual values, and source addresses for senders. If CAN is the road, J1939 is the traffic language used by many heavy-duty vehicles.

References