Understanding CCP and XCP: reading and tuning an ECU
Measurement and calibration

Understanding CCP and XCP: reading and tuning an ECU

Most CAN traffic tells you what an ECU chooses to broadcast. CCP and XCP go further: they open a direct channel into the ECU itself, so an engineer can read internal values at high speed and adjust calibration parameters while the unit runs. Here is how that channel works, and how the two protocols relate.

9 min read2 demosUpdated 2026
2 messages
one for commands, one for data
1 master
the tool, the ECU is the slave
A2L
describes the ECU memory
ASAM
the standards body behind both
The short answer

CCP and XCP are protocols that let a tool read and write an ECU's internal memory while it is running, for measurement and calibration. Ordinary CAN messages only carry what an ECU is built to broadcast. CCP and XCP reach inside it, so an engineer can watch internal variables at high speed and tune calibration values without rebuilding the software. Both are master and slave, with the tool as master and the ECU as slave, and both are address-oriented: they work by reading and writing memory locations. A description file called an A2L tells the tool where each value lives. CCP came first and runs on CAN only. XCP is its successor and runs on many transports. Both are defined by ASAM.

CCP and XCP at a glance
FeatureCCPXCP
Full nameCAN Calibration ProtocolUniversal Measurement and Calibration Protocol
TransportCAN onlyCAN, CAN FD, FlexRay, Ethernet, USB and more
StandardASAM MCD-1 CCPASAM MCD-1 XCP
Introducedmid-1990sstandardised 2003
Command messageCROCTO
Data messageDTODTO
Description fileA2LA2L
Statussuperseded, last at v2.1the current successor
Why they exist

Measuring and calibrating inside the ECU

A modern ECU holds far more than it puts on the bus. Inside are thousands of calibration values, such as fuel and ignition maps, control-loop gains and switching thresholds, plus internal variables that never appear in a normal message. During development an engineer needs to do two things with all of that. First, measure: watch those internal values at high frequency to see how the software actually behaves. Second, calibrate: change the values and see the effect straight away, without recompiling and reflashing for every tweak. That tight measure-and-adjust loop is what CCP and XCP were built for.

The reason they are standards rather than one-off tools is history. Early on, every ECU supplier had its own way of doing this, so a calibration team needed a different tool for each unit. A working group called ASAP, which included Audi, BMW and Volkswagen, brought CCP together so one tool could talk to ECUs from different makers. ASAP was later renamed ASAM, the body that maintains the standards today. CCP was tied to CAN, so as FlexRay, Ethernet and other buses arrived, XCP was created to lift the same protocol onto any transport. That is what the X stands for: an interchangeable transport layer.

You meet these protocols anywhere ECUs are developed and tuned rather than just used. They run on engine, gearbox and climate test benches, in pre-production vehicles on the road and across automated test rigs that exercise a unit for hours. Wherever someone is calibrating a control system or capturing high-rate internal data to validate it, CCP or XCP is usually the channel doing the work.

How the channel works

One master, the ECU as slave

The exchange is strictly one-sided. The tool is the single master and the ECU is a slave, and the master starts everything by sending commands. Several slaves can sit on the same bus, each with its own station address, so the master can talk to one at a time. Before any real work happens, the master opens a logical connection to a chosen slave. That connection stays open until the master disconnects or switches to another slave. While it is open the master drives the whole conversation, and the slave answers after every command, either with the data requested or with an error code. Nothing is left ambiguous about who speaks next.

The other half of the picture is what the commands actually refer to. CCP and XCP are address-oriented, which means a read or write targets a memory location inside the ECU, not a named signal. On its own that would be unusable, because an address is just a number. This is where the A2L file comes in. Defined under the ASAM MCD-2 MC standard, also called ASAP2, the A2L describes the ECU's memory: which variable lives at which address, how big it is and how to turn the raw bytes into a real-world value. It configures the master so the tool can show named, scaled parameters instead of raw addresses.

If that role sounds familiar, it should. An A2L does for CCP and XCP what a DBC file does for raw CAN traffic, an LDF for a LIN network or an EDS for a CANopen device. In every case a description file turns a stream of numbers into something an engineer can read and trust.

A2L file the memory map Calibration tool master ECU slave memory: maps + variables commands (CRO / CTO) over CAN data (DTO)
The tool drives the exchange. It sends commands to the ECU and reads data back, all by memory address. The A2L file turns those addresses into named, scaled values.
On the wire

Command and data messages

For all their reach, these protocols need only two kinds of message. One carries commands from the master to the slave. In CCP it is the Command Receive Object, or CRO, and in XCP it is the Command Transfer Object, or CTO. The other carries data the other way, from slave to master, and in both protocols it is the Data Transmission Object, or DTO. Everything, from reading a value to flashing memory, is built from these two.

A command message is eight bytes. The first byte is the command code, which says what the message is for. The second is a counter that tracks the exchange and comes back in the reply, so a tool can match a response to its request. The remaining bytes carry parameters that depend on the command, and any byte the command does not use is a do-not-care. The reply, a DTO, starts with a single byte called the Packet ID, and that byte alone tells you what kind of message it is. There are three cases, and the decoder below works through them.

Decode a DTO packet ID

Enter the first byte of a DTO, the Packet ID, as hex like 0xFF or as a number from 0 to 255. The tool shows which of the three message types it is.

the byte, bit 7 to bit 0
0x00 to 0xFDDAQ data
0xFEEvent
0xFFCommand return

0xFF is a command return message, the reply to a command. 0xFE is an event message, a status report from the slave. Anything from 0x00 to 0xFD is data acquisition, and the value is the ODT number, which is why there can be up to 254 ODT lists at once.

Getting the data out

Polling and DAQ

There are two ways to pull measurement data from a slave, and the difference decides whether a setup can keep up. The first is polling. The master asks for a value, the slave sends it back, and that is one reading. It is simple and fine for the odd value, but every reading costs a full request and reply, so it does not scale to many signals or to high sample rates.

The second is DAQ, short for Data Acquisition, and it is how real test logging is done. Instead of asking each time, the master configures the slave once with a list of what to measure, then starts it. From then on the slave samples those values itself and streams them back in DAQ messages, either periodically or when an event fires. The commands stop and the data flows on its own, which is far more efficient when you are capturing dozens of signals at speed.

The structure underneath supports that. Measured values are grouped into DAQ lists, each built from smaller ODT lists, and a single ODT list points at up to seven memory locations in the ECU. The master turns a list on or off with a start and stop command. Because the packet ID that labels each data message runs from 0 to 253, up to 254 of these lists can be active at once, which is what lets a tool stream a large set of values in parallel.

Polling Master Slave request value request value one request, one reply, every reading DAQ Master Slave configure + START data, data, data set up once, then the slave streams
Polling costs a round trip for every reading. DAQ is configured once, then the slave sends a steady stream on its own, which is why it scales to many signals at high rates.
Putting it together

Choosing the approach

On a real job the choice between the two methods comes down to three things: how many values you need, how fast they change and whether you want a steady stream or just the odd reading. A single occasional value is fine to poll. A set of signals captured continuously, or anything at a high rate, belongs in DAQ. Work through a few cases below.

Polling or DAQ?

Pick a measurement task to see which method usually fits, and why.

Choose a task above to see the usual answer.

The takeaway

CCP and XCP are a window into the ECU. One master, the ECU as slave, every read and write by memory address, with an A2L file naming what is where. Poll for the odd value, run DAQ to stream a set of them and step up from CCP to XCP when you need a transport other than CAN.

Common questions

CCP and XCP FAQ

What is the difference between CCP and XCP?

CCP is the original CAN Calibration Protocol, tied to CAN. XCP is its successor, the Universal Measurement and Calibration Protocol, which runs the same idea over many transports including CAN, CAN FD, FlexRay and Ethernet. Both are master and slave, both are address-oriented and both use an A2L file. XCP is the version in active use today.

What are CCP and XCP used for?

Measuring an ECU's internal values at high speed and calibrating its parameters while it runs, during development and testing rather than in the field. You meet them on engine, gearbox and climate test benches and in pre-production vehicles, wherever a control system is being tuned and validated.

What is an A2L file?

A description file, defined under the ASAM MCD-2 MC standard, also called ASAP2, that maps an ECU's memory. It records which variable sits at which address, how big it is and how to scale the raw bytes into a real value, and it configures the tool so addresses appear as named parameters. It plays the same role for CCP and XCP that a DBC file plays for raw CAN.

What is the difference between polling and DAQ?

Polling asks for each value with a request and a reply, which is simple but costs a round trip every time. DAQ, short for Data Acquisition, configures the slave once and then lets it stream the chosen values on its own. DAQ scales to many signals at high rates, so it is the method used for real test logging.

What do CRO, CTO and DTO mean?

They are the message types. The command message from master to slave is the CRO in CCP and the CTO in XCP. The data message from slave to master is the DTO in both. The first byte of a DTO, the Packet ID, tells you whether it is a command reply, an event report or measured data.

Can Influx Technology loggers do CCP and XCP?

Yes. The REBEL range from Influx Technology supports CCP and XCP on CAN, and DIALOG reads the A2L file to set up the measurement and calibration channel. The same loggers also handle CAN 2.0 monitoring, J1939, OBD2 and UDS.

Written by the engineering team at Influx Technology. CCP and XCP behaviour follows the ASAM specifications. Confirm details against the specification and the A2L file for your ECU.

Test inside the ECU

Log CCP and XCP on CAN with the REBEL range

The REBEL data loggers from Influx Technology support CCP and XCP on CAN, with DIALOG reading the A2L file to set up measurement and calibration. The same loggers also cover CAN 2.0 monitoring, J1939, OBD2 and UDS, so a full test session lands in one place.