Blog
Recent Posts
ESP32 TWAI Driver Explained: A Practical Guide to CAN Bus Programming
Posted by on
The ESP32 has become one of the most popular microcontrollers for CAN bus applications. Whether you are building industrial controllers, SAE J1939 devices, NMEA 2000 products, robotics systems, or automotive prototypes, the ESP32 provides a powerful and cost-effective platform with a built-in CAN controller.
Yet, many developers are confused when they encounter the term TWAI in the ESP-IDF documentation. Is TWAI different from CAN? Does it require special hardware? Can it be used with SAE J1939 or NMEA 2000?
This article explains the ESP32 TWAI driver, how it relates to CAN bus communication, and how to get started with CAN programming on the ESP32.
What Is TWAI?
TWAI stands for Two-Wire Automotive Interface.
In reality, TWAI is simply Espressif's name for a CAN controller. The functionality is essentially identical to the CAN controller found in earlier ESP32 devices. Espressif adopted the term TWAI primarily for naming and trademark reasons, while maintaining compatibility with standard CAN communication.
When developers speak about ESP32 CAN programming, they are usually referring to the ESP-IDF TWAI driver.
TWAI Versus CAN: Is There a Difference?
From an application perspective, the answer is simple:
TWAI is CAN.
The ESP32 TWAI controller supports:
- Standard 11-bit CAN identifiers
- Extended 29-bit CAN identifiers
- Classical CAN communication up to 1 Mbps
- CAN error detection and recovery
- Acceptance filtering
- Listen-only monitoring mode
Because extended 29-bit identifiers are supported, the ESP32 TWAI driver can be used for:
- SAE J1939
- NMEA 2000
- CANopen
- DeviceNet
- Proprietary CAN protocols
The controller is fully compatible with Classical CAN communication and supports both standard and extended frame formats.
One Important Detail: You Still Need a CAN Transceiver
One of the most common misconceptions is that the ESP32 can be connected directly to a CAN network.
It cannot.
The ESP32 contains only the CAN controller. To communicate on a physical CAN bus, an external CAN transceiver is required. The transceiver converts the ESP32's logic-level TX and RX signals into the differential CAN-H and CAN-L signals used on the network.
This is similar to Ethernet. A microcontroller may include an Ethernet MAC, but it still requires a PHY chip to connect to the network cable.
ESP32 Development Boards with Integrated CAN Hardware
If you prefer to avoid wiring separate transceiver modules, several ESP32-S3 development boards already include the necessary CAN hardware:
- ESP32S3 Board with CAN FD and Classical CAN Ports...
- ESP32S3 CAN & LIN Bus Board...
- ESP32S3 CAN Bus Board with NMEA 2000 Connector...
All of these boards can be programmed using the standard ESP-IDF TWAI driver for Classical CAN applications.
For developers working with SAE J1939, NMEA 2000, industrial automation, or general CAN bus monitoring, integrated CAN hardware significantly simplifies development and testing.
TWAI Driver Architecture
The ESP-IDF TWAI driver provides a software layer between your application and the hardware CAN controller.
The basic architecture looks like this:
Application Software
↓
TWAI Driver
↓
TWAI Controller
↓
CAN Transceiver
↓
CAN Network
The driver handles:
- Message transmission
- Message reception
- Hardware filtering
- Error management
- Bus state monitoring
- Interrupt handling
This allows application software to focus on the actual data being exchanged rather than low-level controller details.
Driver Configuration
A typical TWAI application starts by configuring three structures:
General Configuration
The general configuration defines:
- TX pin
- RX pin
- Operating mode
- Queue sizes
- Alert settings
Typical operating modes include:
- Normal Mode
- Listen-Only Mode
- No-Acknowledge Mode
Listen-Only Mode is especially useful when monitoring existing CAN networks because the ESP32 will not influence bus traffic or transmit acknowledgments.
Timing Configuration
The timing configuration determines the CAN bit rate.
Common values include:
- 125 kbps
- 250 kbps
- 500 kbps
- 1 Mbps
All nodes on the network must use the same bit rate.
Filter Configuration
Acceptance filters determine which messages are received.
For heavily loaded networks such as SAE J1939 systems, filtering can dramatically reduce processor workload.
Transmitting Messages
Sending a CAN frame is straightforward.
The application fills a message structure containing:
- Identifier
- Data length
- Data bytes
- Frame type
The message is then placed into the transmit queue.
The TWAI driver handles:
- Arbitration
- Frame formatting
- Error checking
- Retransmissions
In most applications, transmitting a message requires only a few lines of code.
Receiving Messages
Reception works similarly.
Incoming frames are placed into a receive queue where they can be processed by the application.
The TWAI driver automatically handles:
- CRC verification
- Frame validation
- Acceptance filtering
- Queue management
For monitoring applications such as CAN analyzers or J1939 data loggers, the receive function often becomes the core of the application.
Understanding Error States
One of the strengths of CAN technology is its sophisticated error handling.
The TWAI driver exposes the same error states found in standard CAN controllers.
Error Active
This is the normal operating state.
The node can transmit and receive messages without restrictions.
Error Passive
The node has detected excessive communication errors.
It can still participate on the network but with reduced influence.
Bus Off
If communication errors continue to accumulate, the controller enters Bus Off state.
At this point, transmissions are disabled until recovery is initiated. The TWAI driver includes alerts and recovery mechanisms to detect and manage these situations.
TWAI Alerts
The ESP-IDF driver includes an alert system that reports important bus events.
Examples include:
- Transmission successful
- Transmission failed
- Error warning
- Error passive
- Error active
- Bus recovery
- Bus off
For industrial and automotive applications, these alerts are invaluable for diagnostics and troubleshooting.
Can TWAI Be Used with SAE J1939?
Absolutely.
Because SAE J1939 uses extended 29-bit identifiers, many developers initially assume special hardware is required.
In reality, the TWAI controller natively supports 29-bit identifiers and works very well with J1939 applications.
Typical applications include:
- Engine monitoring
- Vehicle diagnostics
- Fleet management
- Agricultural equipment
- Construction machinery
The same applies to NMEA 2000, which is also based on extended CAN identifiers.
What About CAN FD?
This is where many developers become confused.
The TWAI controller found in traditional ESP32 and ESP32-S3 devices supports Classical CAN only. CAN FD frames are not supported by the TWAI peripheral and will be treated as errors.
If your application requires CAN FD communication, additional hardware support is necessary.
However, for many industrial, marine, and heavy-duty vehicle applications, Classical CAN remains the dominant protocol and is fully supported by the TWAI driver.
Common Beginner Mistakes
After helping engineers with CAN networks for many years, I frequently see the same problems:
Missing Transceiver
The ESP32 cannot be connected directly to CAN-H and CAN-L.
A transceiver is always required.
Missing Termination
Every CAN network requires proper 120-ohm termination resistors at both ends of the bus.
Incorrect Bit Rate
A network operating at 250 kbps will not communicate with a node configured for 500 kbps.
Using MCP2515 Libraries
The built-in TWAI controller does not require MCP2515 libraries.
Those libraries are intended for external MCP2515 CAN controllers connected via SPI.
Conclusion
The ESP32 TWAI driver provides a powerful and surprisingly easy-to-use interface for CAN bus communication. Despite the unusual name, TWAI is simply Espressif's implementation of a standard CAN controller.
Combined with the ESP32's processing power, wireless connectivity, and low cost, the TWAI driver makes the ESP32 an excellent platform for CAN-based applications ranging from industrial automation and robotics to SAE J1939 and NMEA 2000 development.
For developers using ESP32-S3 CAN hardware such as the Copperhill Technologies CAN FD, CAN/LIN, or NMEA 2000 development boards, getting started with CAN communication can be as simple as installing the driver, configuring the bit rate, and transmitting the first message.
Programming the ESP32 In C Using the Arduino Library
The Espressif ESP32 is a remarkably versatile microcontroller. Despite its low cost, it integrates a wide range of peripherals and processing capabilities, making it suitable for everything from simple hobby projects to sophisticated embedded applications. Programming the ESP32 in C provides the speed and efficiency required for real-time systems, while the Arduino framework offers an accessible development environment. Built on top of Espressif’s official ESP-IDF (IoT Development Framework), the Arduino layer simplifies development without preventing access to the advanced features of the underlying platform when greater control is needed.
This book explores the ESP32’s capabilities through practical, hands-on examples that focus on understanding the hardware and developing essential embedded programming skills. Topics include GPIO, interrupts, PWM, SPI, I²C, 1-Wire, UART communications, Wi-Fi networking, SD card interfaces, low-power operation, real-time clock functions, touch sensors, RMT peripherals, and FreeRTOS-based multitasking. Rather than presenting a collection of finished projects, the book emphasizes the concepts and techniques needed to design and build your own applications with confidence, minimizing trial and error and helping you bring ideas to completion efficiently. More information...
Loading... Please wait...
