Volvo P1, P2 and P3 platforms: which models, which diagnostics
"Is my car P2 or P3?" is the first question on every Volvo forum thread about diagnostics — and for good reason. The platform tells you which modules to expect and how they talk.
What a platform is
A platform is the shared engineering base under several models: floor pan, suspension, and — most important for us — the electrical architecture. Cars on the same platform share their control modules, their network layout and their diagnostic messages, even when they look completely different.
That is why the platform, not the badge on the boot lid, is the best starting point when you want to know what a diagnostic tool can read on your car.
Which models are P1, P2 and P3
Year ranges are approximate model years and vary by market; the VIN is the reliable way to tell.
| Platform | Models | Approx. model years |
|---|---|---|
| P1 | S40, V50, C30, C70 (second generation) | 2004–2013 |
| P2 | S80 (first generation), S60 (first generation), V70, XC70, XC90 (first generation) | 1999–2009 (XC90 to 2014) |
| P3 | S80 (second generation), V70, XC70, XC60 (first generation), S60, V60 | 2007–2018 |
Watch out for the overlaps: a V70 or XC70 can be P2 or P3 depending on the year, and the same goes for the S60 and S80. The second-generation XC90 and the later 60/90-series cars are on newer platforms that are outside the scope of this guide.
P1: D2 messages on CAN
P1 cars use Volvo's D2 diagnostic messages over CAN. All diagnostic requests go to one shared 29-bit identifier, 0x000FFFFE. The first data byte carries the message length, the second the address of the target module, the third the service. On a 2008 C70, for example, the central electronic module answers on address 0x50 on the high-speed bus and 0x40 on the low-speed bus, and the diesel engine module on 0x11.
The VIN is read from the central electronic module, fault codes with Volvo's own AE service, and live values through record identifiers decoded with each module's scaling formulas. P1 cars also make heavy use of the low-speed CAN bus — see Volvo HS-CAN and LS-CAN explained for which modules live there.
P2: the older D2 generation
P2 cars belong to the same D2 family as P1, which is why the two are often grouped together. Earlier P2 cars carry part of their diagnostics over the K-line, while later ones move more of it onto CAN. As always, which modules a particular car has depends on its year, engine and options.
P3: UDS, module by module
P3 is a different world. Its modules speak UDS (ISO 14229), the same standard family most manufacturers moved to: session control (10), reset (11), clear codes (14), read codes (19), read data by identifier (22) and security access (27).
Instead of one shared identifier, every module has its own pair of 11-bit CAN identifiers: one it listens on and one it answers on, eight higher. A few examples from P3 configurations:
| Module | Request ID | Response ID | Bus |
|---|---|---|---|
| ECM — engine | 0x7E0 | 0x7E8 | HS-CAN |
| CEM — central electronic module | 0x726 | 0x72E | HS-CAN |
| BCM — brakes | 0x760 | 0x768 | HS-CAN |
| CCM — climate | 0x733 | 0x73B | LS-CAN, 125 kbit/s |
Note that UDS on P3 is still not the same as generic OBD-II: the body, climate and airbag modules answer UDS requests on their own identifiers, not the broadcast OBD-II request. We explain the difference in why a generic OBD-II scanner misses Volvo fault codes.
Why the protocol is decided per module
It is tempting to say "P1 is D2, P3 is UDS" and stop there, but strictly speaking the protocol belongs to each module, defined in its own configuration. Engines and gearboxes in particular come from different suppliers and are described by their own profiles, separate from the body of the car. A tool that assumes one protocol for the whole car will sooner or later send the wrong kind of message to the wrong module.
Volscan therefore decides module by module. It reads the VIN, combines the matching model, engine and gearbox profiles, and picks D2 or UDS for every module from its configuration. If the data doesn't determine a module's protocol, Volscan says so and sends that module nothing, instead of guessing. See the supported models.