Controller area networks

What Are Controller Area Networks?

Controller area networks, almost always shortened to CAN, are serial communication buses that let microcontrollers, sensors, and actuators exchange messages over a shared pair of wires without a supervising host computer. Robert Bosch GmbH introduced the protocol in 1986 to replace the point-to-point wiring harnesses used in passenger cars, where every added function meant another dedicated conductor. The protocol is standardized as the ISO 11898 series, with the data link layer and physical coding sublayer specified in ISO 11898-1:2024.

A CAN network is multi-master and message-oriented rather than address-oriented. Each frame carries an identifier that describes the content of the message, engine speed or steering angle for instance, and not the address of a destination node. Receivers apply acceptance filters to that identifier and ignore traffic that does not concern them. A node can therefore be added to a working system without reconfiguring the nodes already on the bus, which is a large part of why the protocol spread from automotive electronics into industrial and agricultural machinery.

Arbitration and Frame Structure

CAN uses carrier sense multiple access with collision resolution rather than collision detection. Bits on the bus are either dominant, encoded as logic zero, or recessive, encoded as logic one, and a dominant bit always overwrites a recessive one on the wired-AND medium. When several nodes begin transmitting at once, each monitors the bus while it sends the identifier field. A node that sends a recessive bit but reads back a dominant one loses arbitration and stops, while the winner continues without any loss of data. The frame with the numerically lowest identifier wins, so priority is fixed by identifier assignment and the highest-priority message has a bounded worst-case latency. Classical CAN frames use an 11-bit base identifier or a 29-bit extended identifier, carry up to eight data bytes, and run at bit rates up to 1 Mbit/s over bus lengths of roughly 40 meters.

Error Detection and Fault Confinement

Reliability comes from five overlapping checks applied to every frame: a 15-bit cyclic redundancy code, bit stuffing after five consecutive identical bits, frame form checking, monitoring of transmitted bits against the bus level, and a mandatory acknowledgment slot that any correctly receiving node asserts. A node that detects a violation transmits an error frame, which destroys the current message and forces a retransmission. Each controller also maintains transmit and receive error counters that move it through error-active, error-passive, and bus-off states, so a node whose transceiver has failed eventually removes itself rather than jamming the network for everyone else.

CAN FD, CAN XL, and Higher-Layer Protocols

Payload demand outgrew the eight-byte limit, and Bosch introduced CAN with flexible data rate in 2012. CAN FD keeps the same arbitration scheme but switches to a faster bit rate after arbitration ends, carrying up to 64 bytes per frame. The third generation, CAN XL, extends payloads to 2048 bytes and data-phase rates toward 20 Mbit/s, and CAN in Automation maintains the specifications for these generations alongside application-layer protocols such as CANopen, SAE J1939 for heavy vehicles, and NMEA 2000 for marine electronics. Because the base protocol includes neither message authentication nor encryption, a compromised electronic control unit can spoof any identifier, and learning-based intrusion detection for in-vehicle networks has become an active research area.

Applications

Controller area networks have applications in a wide range of fields, including:

  • Automotive powertrain, chassis, and body electronics
  • Heavy trucks and buses through SAE J1939
  • Agricultural and construction machinery, including ISOBUS implements
  • Factory automation and motion control through CANopen and DeviceNet
  • Marine instrumentation and navigation networks
  • Medical devices, laboratory analyzers, and elevator controls
Loading…