In my previous article, SAE J1939 and NMEA 2000 — Close Relatives, Different Worlds, I compared SAE J1939 and NMEA 2000 from a more personal perspective. The two standards are close relatives, but the industries and organizations surrounding them are quite different.
This time, let’s forget about membership, certification, documentation, and boats versus trucks.
Let’s look at the bits.
From a CAN Bus developer’s perspective, NMEA 2000 can look remarkably familiar. If you understand J1939, you already understand much of the foundation on which NMEA 2000 is built.
But there are some interesting differences.
The Same CAN Foundation
Both protocols use Classical CAN with 29-bit extended identifiers and operate at 250 kbit/sec in their traditional implementations.
More importantly, they organize messages around the same basic concept: the Parameter Group Number, or PGN.
If you know how to dissect a J1939 CAN identifier into priority, Data Page, PDU Format, PDU Specific, and Source Address, you can apply essentially the same method to an NMEA 2000 identifier.
The familiar structure is still there:
Priority | DP | PF | PS | Source Address
The distinction between PDU1 and PDU2 messages also remains. With PDU1, the PDU Specific field represents a destination address. With PDU2, it contributes to the PGN and the message is broadcast.
Address Claim is another familiar feature. NMEA 2000 uses PGN 60928, just as J1939 does, and the 64-bit NAME concept is recognizable to anyone who has implemented a J1939 node.
This is why moving from J1939 into NMEA 2000 does not feel like learning an entirely new CAN protocol.
Then Comes the Data Page
One of the first differences you will notice is the PGN numbering.
Traditional J1939 application traffic is concentrated in the Data Page 0, or DP0, range. Consequently, J1939 developers are accustomed to PGNs such as:
61444 — Electronic Engine Controller 1
65262 — Engine Temperature 1
65265 — Cruise Control/Vehicle Speed
NMEA 2000 makes extensive use of Data Page 1.
That immediately produces the characteristic six-digit NMEA 2000 PGNs:
126996 — Product Information
127488 — Engine Parameters, Rapid Update
128267 — Water Depth
129025 — Position, Rapid Update
129029 — GNSS Position Data
130306 — Wind Data
Take PGN 129025 as an example.
129025 decimal is 0x1F801.
That leading 1 represents the Data Page bit being set. Once you understand that, those unfamiliar-looking NMEA 2000 PGN numbers become considerably less mysterious.
The underlying PGN mechanism has not changed. NMEA 2000 is simply making use of another portion of the available PGN address space.
NMEA 2000 Still Uses Some Familiar DP0 PGNs
This is an important point.
NMEA 2000 did not move everything into DP1.
Some of its fundamental network-management functions use the same DP0 PGNs familiar from J1939 and ISO 11783. Examples include PGN 59904 for ISO Request, PGN 60928 for Address Claim, PGN 60160 and 60416 for the ISO Transport Protocol, and PGN 65240 for Commanded Address. Garmin, for example, lists these standard network-management PGNs alongside its NMEA 2000 application PGNs.
So we really have two layers of familiarity: much of the underlying network machinery occupies territory a J1939 developer already knows, while much of the specifically marine application layer lives in DP1.
More Than Eight Bytes: Fast Packet
Here we encounter one of the more interesting differences.
Classical CAN gives us only eight data bytes per frame. J1939 solves the problem of longer messages primarily through its Transport Protocol, using PGN 60416 for Transport Protocol Connection Management and PGN 60160 for Transport Protocol Data Transfer.
NMEA 2000 supports those ISO transport mechanisms as well.
But NMEA 2000 also introduced a mechanism commonly known as Fast Packet.
Fast Packet allows a Parameter Group larger than eight bytes to be transmitted as a sequence of ordinary CAN frames. Sequence information in the data bytes allows the receiver to reconstruct the complete message.
This is important because many NMEA 2000 PGNs are longer than eight bytes.
PGN 129029, GNSS Position Data, is a good example. There is simply too much information to squeeze into one Classical CAN frame.
For a J1939 programmer, Fast Packet requires a small change in thinking. You cannot assume that every multi-packet message you encounter will arrive through the familiar J1939 Transport Protocol.
The CAN controller still sees individual eight-byte CAN frames. Your NMEA 2000 protocol layer has to recognize Fast Packet PGNs and assemble their payloads.
The NMEA Group Function
Another significant addition is PGN 126208, the NMEA Group Function.
This provides a considerably richer mechanism for interacting with Parameter Groups.
Depending on the function code, PGN 126208 can be used to request information, command parameters, acknowledge operations, read fields, and write fields. It can also be used for such functions as changing transmission intervals or configuring parameters within a device.
This goes beyond the simple J1939 ISO Request mechanism most J1939 developers know.
In J1939, if I want an ECU to transmit a supported PGN, I can send PGN 59904 containing the requested PGN number.
NMEA 2000 retains that mechanism but adds a more sophisticated layer through PGN 126208.
That makes sense in a marine network.
A display or multifunction device may need not only to receive information from a sensor, but also to configure how another device behaves.
Devices Describe Themselves
NMEA 2000 also places greater emphasis on devices providing information about themselves.
For example, PGN 126996 contains Product Information, while PGN 126998 contains Configuration Information. NMEA 2000 implementations also commonly provide PGN lists describing which Parameter Groups they transmit and receive. These system PGNs are part of the normal NMEA 2000 device environment.
This produces something closer to a self-describing network.
Connect a device and other equipment can learn considerably more about what it is, what it supports, and how it participates in the network.
Again, the concept does not seem revolutionary when viewed individually. But collectively these features give NMEA 2000 networks a somewhat different personality from the typical J1939 vehicle network.
Heartbeat
Another example is PGN 126993 — Heartbeat.
A device periodically transmits this message to indicate that it is still present and operating. Heartbeat behavior is part of the requirements implemented for certified NMEA 2000 devices.
J1939 developers may immediately think of various messages that can effectively tell us that an ECU is alive. But NMEA 2000 formalizes this concept as a dedicated network function.
It is a small addition, but a useful one.
Same Foundation, Different Personality
If I were implementing a basic NMEA 2000 stack after years of J1939 development, I would not start from scratch.
I already have CAN communication.
I already understand 29-bit identifiers.
I already understand PGNs, PDU1 versus PDU2, source addresses, Address Claim, NAME, ISO Requests, and multi-node CAN networks.
What I would need to add is primarily the NMEA 2000-specific layer: its DP1 application PGNs, Fast Packet handling, Group Functions, product and configuration information, heartbeat behavior, and the additional network-management requirements associated with a compliant NMEA 2000 device.
That is why calling NMEA 2000 simply “J1939 for boats” is both useful and misleading.
It is useful because the family relationship is obvious at the protocol level.
It is misleading because NMEA 2000 has developed its own application layer and added mechanisms that make sense for a network of interoperating marine electronics.
For somebody coming from J1939, though, there is good news.
When you look at an NMEA 2000 CAN trace for the first time, you don’t have to learn how to read the language.
You already know the grammar.
You just need to learn some new vocabulary.



