Blog
SAE J1939 SPN List Explained: Structure, Decoding, and Common Parameter Numbers
August 25, 2026
If you've decoded a J1939 fault code or looked inside a message like PGN 61444, you've already run into SPN Suspect Parameter Number. It's one of the most-referenced identifiers in heavy-duty diagnostics, right alongside PGN, but the two are often confused. This guide explains exactly what an SPN is, how it's structured, how it works together with FMI to form a diagnostic trouble code, and lists the SPNs you'll see most often on a real J1939 network.
SPN stands for Suspect Parameter Number. It identifies a single, specific data parameter on a J1939 network a sensor reading, a status flag, or a calculated value such as engine speed, coolant temperature, or boost pressure.
Where a PGN identifies an entire message (a container that can carry several parameters at once), an SPN identifies one parameter inside that container. Every SPN is documented in the SAE standard mainly J1939-71 (Vehicle Application Layer) for normal operating parameters, and J1939-73 (Diagnostics Layer) for parameters used specifically in diagnostic contexts with its bit position, byte offset, scaling, resolution, and valid range fully specified.
SPNs matter for two related but distinct reasons:
An SPN is a 19-bit value, giving the standard room for roughly 524,000 possible parameter identifiers far more than the number of PGNs, since a single PGN commonly carries several SPNs.
Unlike a PGN, an SPN isn't broken into sub-fields the way PGNs are split into DP/PF/PS it's simply a flat numeric identifier assigned by SAE, published alongside its definition:
| Attribute | Description |
|---|---|
| SPN number | The unique numeric identifier (e.g., 190 for Engine Speed) |
| Parameter name | Human-readable description of what's being measured |
| Data length | How many bits/bytes the parameter occupies inside its PGN |
| Resolution | The scaling factor applied to the raw bits |
| Range | The valid engineering-unit range for the parameter |
| Operational range | The range under normal operating conditions |
| Reference PGN | Which PGN(s) the SPN is transmitted inside |
These three identifiers get used together constantly, and mixing them up is one of the most common sources of confusion for anyone new to J1939 diagnostics.
| Aspect | PGN | SPN | FMI |
|---|---|---|---|
| Full name | Parameter Group Number | Suspect Parameter Number | Failure Mode Identifier |
| What it identifies | A message (group of parameters) | A single data parameter | The type of failure on that parameter |
| Bit width | 18 bits | 19 bits | 5 bits |
| Answers the question | "What message is this?" | "What parameter is this?" | "What's wrong with it?" |
| Example | 61444 (EEC1) | 190 (Engine Speed) | 3 (Voltage Above Normal) |
| Defined in | J1939-71, J1939-73 | J1939-71, J1939-73 | J1939-73 |
A diagnostic trouble code is essentially the combination of these: SPN + FMI tells you which parameter failed and how it failed, while the DTC is transported inside a diagnostic PGN like DM1 (65226) or DM2 (65227).
Say a scan tool reports a fault of SPN 102, FMI 3. Decoded:
Put together, this reads as: "The boost pressure sensor circuit voltage is reading higher than expected — check for a short to power or a failing sensor.
This SPN/FMI pair is carried inside PGN 65226 (DM1 – Active Diagnostic Trouble Codes), along with an Occurrence Count (OC) tracking how many times the fault has been detected, and a lamp status section indicating whether the malfunction indicator lamp (MIL) or other warning lamps should be illuminated.
Below are some of the most frequently referenced SPNs across engine, vehicle, and diagnostic functions. Always confirm exact scaling and byte position against the current SAE J1939-71/73 revision or your ECU's own J1939 database (DBC) before using these in production decoding logic.
| SPN | Parameter Name | Typical Unit | Carried In (PGN) |
|---|---|---|---|
| 190 | Engine Speed | rpm | 61444 (EEC1) |
| 512 | Driver's Demand Engine – Percent Torque | % | 61444 (EEC1) |
| 513 | Actual Engine – Percent Torque | % | 61444 (EEC1) |
| 91 | Accelerator Pedal Position 1 | % | 61443 (EEC2) |
| 84 | Wheel-Based Vehicle Speed | km/h | 65265 (CCVS) |
| 110 | Engine Coolant Temperature | °C | 65262 (ET1) |
| 175 | Engine Oil Temperature 1 | °C | 65262 (ET1) |
| 100 | Engine Oil Pressure | kPa | 65263 (EFL/P1) |
| 102 | Engine Intake Manifold #1 Pressure (Boost) | kPa | 65270 (IC1) |
| 105 | Engine Intake Manifold 1 Temperature | °C | 65270 (IC1) |
| 96 | Fuel Level 1 | % | 65276 |
| 183 | Engine Fuel Rate | L/h | 65266 (LFE) |
| 247 | Engine Total Hours of Operation | hours | 65253 (HOURS) |
| 158 | Battery Potential / Power Input 1 | V | 65271 |
| 168 | Electrical Potential (Battery) | V | 65271 |
FMI is a 5-bit field (values 0-31) standardized in J1939-73, describing the nature of a fault rather than which parameter it affects. A handful of the most common FMI values:
| FMI | Meaning |
|---|---|
| 0 | Data Valid But Above Normal Operating Range – Most Severe |
| 1 | Data Valid But Below Normal Operating Range – Most Severe |
| 2 | Data Erratic, Intermittent, or Incorrect |
| 3 | Voltage Above Normal or Shorted to High Source |
| 4 | Voltage Below Normal or Shorted to Low Source |
| 5 | Current Below Normal or Open Circuit |
| 7 | Mechanical System Not Responding or Out of Adjustment |
| 9 | Abnormal Update Rate |
| 13 | Out of Calibration |
| 31 | Condition Exists |
In practice, this bit-level unpacking is exactly what a J1939 protocol stack or Diagnostic Event Manager module is built to automate — production code typically calls something like faults_post_active(SPN, FMI, OC) rather than manually shifting and masking bytes for every fault.
SPN stands for Suspect Parameter Number. It's a unique identifier assigned to a specific data parameter — like engine speed or coolant temperature — that can be transmitted normally as part of a PGN, or referenced in a diagnostic trouble code when that parameter is faulting.
PID (Parameter ID) is the OBD-II equivalent used in the 16-bit CAN protocol (ISO 15765/SAE J1979) for light-duty vehicles. SPN is the J1939 equivalent used in heavy-duty vehicle networks. They serve a similar conceptual purpose but come from different standards with different numbering and bit-width conventions.
An SPN is a 19-bit value, giving the standard space for roughly 524,000 unique parameter identifiers, though the actual number of defined SPNs is far smaller and grows with each SAE revision.
It's uncommon but possible some parameters are duplicated across related PGNs for legacy or redundancy reasons. As a rule, always confirm the SPN-to-PGN mapping against your specific ECU's J1939 database rather than assuming a single fixed relationship.
SPN 190 is Engine Speed, transmitted in rpm as part of PGN 61444 (Electronic Engine Controller 1) — one of the most frequently read parameters in J1939 telematics and diagnostic applications.
SPN identifies which parameter has a problem; FMI identifies what kind of problem it has. A full diagnostic trouble code needs both — SPN 102 (Boost Pressure) with FMI 3 (Voltage Above Normal) is a complete, actionable fault description, while either value alone is not.