Our jCOM.J1939.USB gateway board is a vehicle network adapter for SAE J1939 applications, which allows any host device with a USB COM port to monitor SAE J1939 data traffic and communicate with the SAE J1939 vehicle network.
The board supports the complete SAE J1939 protocol according to SAE J1939/81 Network Management (Address Claiming) and SAE J1939/21 Transport Protocol (TP). It comes with an extensive programming interface for the Raspberry Pi, including full C source code for short time-to-market developments. In this case, we have chosen the Raspberry Pi Zero due to its small form factor. Needless to mention, but, of course, the following will also work with any other version of the Raspberry Pi.
The strength of the USB gateway lies in the fact that the entire SAE J1939 protocol, including all timing requirements, is stored on-chip, thus not only taking the burden off the RPi CPU but also circumventing the need for addressing critical timing requirements. The board uses a USB COM port to communicate with the RPi, i.e., all data transfer is managed through standard COM port access (/dev/ttyUSB0). The communication protocol between the board and the primary system (e.g., a PC, Raspberry Pi, or any other Linux system) is well documented, which allows a smooth portation to any computer system with a USB connection. A working source code library exists for the Raspberry Pi (C using the standard GCC compiler).
With all its features, the USB gateway enables the simulation of an SAE J1939 ECU (Electronic Control Unit), as well as monitoring and storing received data frames.
Why Not Implement a Linux SAE J1939 Protocol Stack?
There are only very few choices in the marketplace for purchasing an SAE J1939 protocol stack, and the pricing is prohibitive compared to the RPi's low-cost approach. The cost range is within several thousands of dollars, and the use is limited due to license agreements.
We had considered an implementation of an SAE J1939 protocol stack for Linux (for instance on the Raspberry Pi in combination with our PiCAN boards) but always come to the same conclusion: The actual implementation may be smooth, but the actual problem is warranting reliable operation, specifically satisfying the various SAE J1939 timing requirements.
Yet again, it is possible, but the programming efforts would be immense. Add to this the ever-changing operating system updates and the work proving that the current protocol stack will still work with each new Linux version (not even talking about backward-compatibility).
In contrast, communication with our USB board is completely operating-system-independent and thus immune to frequent Linux updates. The SAE J1939 functionality remains consistent, and the protocol stack's performance is not impacted by the operating system.
Connecting the jCOM.J1939.USB Board
Connect the USB board to any free USB port on your Raspberry Pi. The Raspbian operating system will identify the new USB connection automatically; thus there is no driver installation needed.
For the CAN/J1939 connection, the board uses a 5-pin terminal connector. The board also features an internal termination resistor of 120 Ohm, which is activated per wire jumper in the terminal block.
The connections (from top to bottom) are:
- CAN Termination Wire Jumper
- CAN Termination Wire Jumper
It sounds obvious, but it is, nevertheless, overseen frequently: You will need a second SAE J1939 node (or a whole network) to control the board's complete functionality. The board comes with a "heartbeat" function (i.e., a heartbeat message sent per USB every one second), indicating that the board is "awake" and running, but that doesn't prove any SAE J1939 functionality.
The jCOM.J1939.USB board comes with three LEDs:
- PWR - Directly connected to power.
- LED2 - Indicates USB port activity (including heartbeat message)
- LED1 - CAN / SAE J1939 activity
Upon powering up the board you will see the power LED plus the USB LED blinking with a one second frequency (heartbeat).
Programming the jCOM.J1939.USB Using C
The jCOM.J1939.USB C source code contains of the following files:
The config.h file is important, because it allows some user/application settings such as:
- Preferred Node Address (for Address Claim Process)
- Negotiable Node Address Range (also for Address Claim Process)
- ECU NAME
The COM1939 and CANInterface modules manage the communication between the Raspberry Pi and the jCOM.J1939.USB board. These modules need no further detailed attention, unless you want to spend the time to understand and extend them.
The most important module, when it comes to mere application programming, is main.c.
To initialize the board, use the following lines:
In order to call the SAE J1939 protocol stack, you need only one line:
int nStatus = COM1939_Receive(&lPGN, &nPriority, &nSourceAddress, &nDestAddress, &nData, &nDataLen);
This function call receives messages from the J1939 network. However, before you can receive any messages, you will need to set message filters for the PGNs you need:
PGN_SAMPLE_RX is defined in config.h and it can be replaced with any PGN. And, of course, you can add more PGNs using the same function call (up to 80 PGNs).
To negotiate an address, use this line:
COM1939_SetProtocolParameters(msgNAME, SA_PREFERRED, ADDRESSRANGEBOTTOM, ADDRESSRANGETOP, OPMODE_EVENT, true);
Again, all parameters are set in config.h.
Please, be aware that you need a valid J1939 node address before you can transmit data into the network. To transmit data, use the following line:
COM1939_Transmit(6, PGN_SAMPLE_TX, nSA, DEST_ADDR_SAMPLE, &SampleTxData, 8);
For further details, have a closer look at the main.c file. The code explains all functionality is an easy-to-comprehend form.
Compile and Run the C Program
In order to compile the program, run the following command in terminal mode:
gcc main.c COM1939.c CANInterface.c -o jCOM1939
Naturally, you can use any other name than jCOM1939 for the executable file.
To run the program, type:
Download the C Source Code
Note: While not explicitly mentioned in the following, the program also allows the recording of SAE J1939 data frames, i.e. writing the data to a file (We added the functionality after this post was written).
Some Screen Shots
To edit or view any of the program modules use the internal editor, for instance:
After executing the jCOM1939 program, the screen will show the COM port status, either successful (as shown here) or with an error message:
Type 'h' for help:
Type 'b' to check the reception of the heartbeat message:
Type 'f' to apply the message filter, type 'd' to delete the message filter:
Type 'c' to initiate the address claim process:
Type 't' to transmit a J1939 data frame:
Last, but the hardware configuration provides ample opportunities for implementing further applications that we haven't attempted yet but are definitely feasible:
- SAE J1939 to WiFi Gateway
- SAE J1939 to Bluetooth Gateway
- SAE J1939 to Ethernet Gateway
Exploring Raspberry Pi: Interfacing to the Real World with Embedded Linux
This book promotes engineering principles over a 'recipe' approach to provide you the experiences you need to create and build your projects. You will learn the basic principles in a way that transfers to any electronics, electronic modules, or external peripherals, using a "learning by doing" approach that caters to beginners and experts.
The book starts with elementary Linux and programming skills and helps you stock your inventory with common parts and supplies. Next, you will discover how to produce parts work together to accomplish the goals of the project, no matter what type of components you use.
The companion website provides a full repository that structures all of the code and scripts, along with links to video tutorials and supplementary content that takes you deeper into your project.
LIN (Local Interconnect Network) is a serial network protocol used for communication between components in vehicles. The demand for a second serial network emerged as the technologies and the facilities implemented in modern cars grew, while the CAN Bus was too expensive to implement for every component in the car.The Arduino Compatible LIN Bus And CAN [...]
Hioki (Japan) has launched its clip-on device for non-contact monitoring of Classical CAN/CAN FD signals up to 3 Mbit/s, which allows the analysis of network signals without a direct galvanic connection.The SP7001 and SP7002 modules implement a 9-pin Dsub plug for connection to CAN interface modules such as, for instance, USB dongles. The link to the [...]
LIN To CAN Bus Gateway - Implementing CAN Bus And Lin Bus Master With Arduino-Compatible Teensy Board
This post is a follow-up to a previous entry, LIN To CAN Bus Gateway - Prototyping And Firmware Development With The Arduino-Compatible Teensy Board. The Teensy USB Development Board Teensy is a brand of microcontroller development boards created by PJRC and designed by the co-owner, Paul Stoffregen. As a long-time maker of creative technologies, Paul saw the versatility [...]
PEAK-System announced its I/O modules PCAN-MicroMod FD, which is now available in a black aluminum profile enclosure. The device offers a variety of peripherals for special requirements. The data exchange is performed via CAN FD, which is downward-compatible to the Classical CAN Bus.The motherboard PCAN-MicroMod FD Analog 1 features analog inputs and outputs with eight input ports [...]
Axiomatic has announced its AX130770, an ECU System converting CAN Bus data to two analog or digital isolated signals and one relay output for rugged engine applications.The relay output converter connects to a CAN Bus vehicle network (SAE J1939, high-speed SAE J1939m, or CANopen). It accommodates two analog/digital isolated signal outputs, which can be configured as 0 [...]
Fanless Embedded System With NXP i.MX 8M Processor With Isolated CAN Bus Port For In-Vehicle Applications
Axiomtek, a design and manufacturing company in the industrial computer and embedded field, announced the release of their Agent336, a RISC-based fanless embedded box PC certified for in-vehicle applications. The Agent336 measures 6.46" x 4.65" x 1.7" and weighs about 2.2 lbs. The embedded computer can endure harsh operating environments with an operating temperature range [...]
Ethernet, the most widely used LAN technology in homes, offices, and factories, is increasingly utilized in the automotive world in the form of Automotive Ethernet. Vehicles now routinely accommodate multiple cameras, on-board diagnostics, advanced driver assistance systems (ADAS), infotainment systems, and in-dash displays. With all the added hardware and software comes a massive demand for [...]
LIN To CAN Bus Gateway - Prototyping And Firmware Development With The Arduino-Compatible Teensy Board
In general, let's start with a brief comparison of CAN Bus (Controller Area Network) and LIN Bus (Local Interconnect Network): LIN Bus networks provide cost-efficient communication in applications where the bandwidth and versatility of the CAN Bus technology are not required. LIN Bus applications are relatively inexpensive using the standard serial universal asynchronous receiver/transmitter (UART) technology, which are embedded [...]
Onlogic introduced its Karbon 700 rugged computer series to serve applications such as a data-logger, network video recorder, or edge device in demanding industrial, in-vehicle, or remote installations. The system also comes with a CAN Bus interface.Ensuring reliable operation under extreme conditions, the product underwent tests regarding MIL-STD-810G standards to resist damage from continued vibration and [...]