A Beginner's Guide to SAE J1939 Embedded Software Development
Welcome to my beginner's guide! By opening this page, you have entered the first and probably most crucial stage toward developing your SAE J1939 project: Reading. Over the years, I dealt with many newcomers to the J1939 technology, some of them motivated by great product ideas. Others were thrown into a project because they were embedded system programmers. What they all had in common was that they were grateful to have found me, and they all wanted to pick my brain. The problem is, while I happily share my knowledge, a phone call or multiple emails cannot sufficiently explain the topic of J1939 embedded software development. My answer was always consistent and sometimes frustrating for the engineer eager to get his hands on some embedded hardware: You need to grasp your development's full scope, and that includes a solid understanding of the SAE J1939 protocol. The J1939 serial protocol is not complicated, but it comes with a multitude of ingenious features, and learning about these features will speed the development process. You also need a basic set of development tools, including a J1939 monitoring and simulation network. I will explain everything in the following, and I will provide references for you to check out.
Let's start with the reading part. I have invested significant efforts to document everything regarding SAE J1939 development on this website and books I wrote. Consequently, I will mostly point you to existing posts plus a few additional resources. Whenever necessary, especially when it comes to development tips, I will add previously undocumented tips.
Controller Area Network (CAN)
Every development involving SAE J1939 requires a basic knowledge of Controller Area Network (CAN). The CAN Bus provides the hardware layer for J1939, i.e., the serial connection. Let me stress the word “basic:” It helps to understand the CAN Bus technology, but what kind of knowledge level you would like to reach is up to you. The following references start with a basic overview, continuing to more detailed literature.
A Brief Introduction to Controller Area Network:
Controller Area Network (CAN Bus) – Serial Network Technology for Embedded Systems (PPT Presentation):
A Comprehensible Guide to Controller Area Network:
SAE J1939 is a higher-layer protocol that uses the CAN Bus technology as the hardware layer. The protocol is not complicated, and it is well documented. The complete SAE J1939 Standard comes in the form of a colossal work of 1600+ pages with a painfully high price tag. To worsen matters, the SAE J1939 Standards Collection was not created for educational purposes, i.e., readability is poor (to put it diplomatically). Consequently, I don’t necessarily recommend buying it to learn J1939. Here, too, the following references start with a basic overview up to detailed literature.
A Brief Introduction to the SAE J1939 Protocol:
SAE J1939 – Serial Control and Communications Vehicle Network:
SAE J1939 Address Claim Procedure – SAE J1939-81 Network Management:
After you worked through the SAE J1939 documentation, you will realize that almost everything regarding J1939 programming has to do with reading and transmitting PGNs (Parameter Group Numbers). However, many beginners don’t realize that the read/write process comes with some exceptions:
- Not all PGNs are dedicated to engine data and performance. A great range of PGNs is used for network management, diagnostics, and more.
- Not all data containing PGNs are transmitted periodically using their individual message frequency. Some data are only available per request.
- In order to transmit a PGN into an SAE J1939 network, you need to acquire a node address first.
For the beginner, that means, when it comes to PGNs, familiarize yourself with:
- The PGN range.
- The difference between message broadcasting and peer-to-peer communication.
- The message request procedure.
- The address claim procedure.
SAE J1939 - Digital Annex
We’re still looking at PGNs… In order to determine the nature of data containing PGNs, you will need to purchase the SAE J1939-71 Standard. J1939-71 specifies the application layer for a J1939 network, and it is responsible for defining all application layer SPNs and PGNs. Also included in this specification are parameters, offset, scaling, and acceptable range.
However, the SAE (Society of Automotive Engineers) also offers a digital form of SAE J1939-71, called J1939DA (Digital Annex). The digital annex is a Microsoft Excel file that contains all PGNs and their description. It can be sorted and searched for easier use. Yet again, it comes with a hefty price tag of $260 (at the time of this writing), but it is well worth the investment as it will help with your development.
SAE J1939 Data Traffic Simulation and Monitoring
For obvious reasons, most engineers will not have the opportunity to perform tests of their devices on a real-world, running vehicle. For that reason, we at Copperhill Technologies have developed several devices for SAE J1939 data simulation, monitoring, and recording.
- SAE J1939 Gateway Module with USB Port, RTC, MIcroSD Memory Card...
- SAE J1939 Gateway with USB Port, RTC, MicroSD, Power Supply...
Both gateways will allow you to simulate (transmit) or monitor (receive) any PGN, either through our programming interface or our free-of-charge Windows software, the JCOM1939 Monitor.
Note: I have been asked multiple times whether or not our gateway/software allows the transmission of SPNs, and, actually, it doesn't. In accordance with the SAE J1939 Standards Collection, SPNs are not part of an SAE J1939 data frame. SPNs are mere data descriptions allowing the development engineer to interpret the data. In other words, any application layer software needs to know how to interpret the data and that needs to be hard-coded.
But let’s make this a point: When it comes to developing and testing your application, you will need a J1939 network. A single node connected to your device will not do. A working network provides J1939 operation under stable conditions, i.e., the assurance that any possible communication problems have to do with your device (no pun intended; that’s just in the nature of things).
Let me explain the single-node insufficiency: I have had several cases where users challenged the proper operation of our single-node simulator. The problem was always solved by checking the following:
- Did you activate the termination resistors on both devices?
- Are you using the same CAN baud rate on both devices?
- Is your device in silent mode?
Silent mode devices are “invisible” to the rest of the network. They must be tested while connected to a running network. See: How CAN Bus Automatic Baudrate Detection Works And What To Consider When Connecting To A Network.
SAE J1939 Starter Kit and Network Simulator:
Alternatively, if you are in the business of SAE J1939 embedded programming, have a look at our Arduino-Based ECU Development Board with Dual CAN Bus Interface.
I often receive inquiries from newcomers to the J1939 technology asking if the simulator board can emulate a specific diesel engine, e.g., a "Tonka 2004 Giant Diesel Motor" (I made that up). The answer is, the simulator board is designed to simulate an SAE J1939 network, and SAE J1939 applies to diesel engines in general. Therefore, it is up to the user to define the PGNs they need, and the simulator board supports any PGN. In other words, the simulator board enables the user to replicate the data traffic from any diesel engine.
As I mentioned earlier, I have invested significant efforts to document everything regarding SAE J1939 development on this website. Whenever you see a product on this website that sparks your interest, please take your time to check out and read all the references on the product’s page, as they may address your concerns and questions.