10-22-2026, 11:23 PM
(This post was last modified: 10-23-2026, 01:50 AM by damann.
Edit Reason: Updated to include network-management message
)
Volvo SPA power seat: CAN frames (updated)
Context: I worked these out on a real car with a CANable, pressing each switch and logging the result. An AI assistant (Claude) helped analyse the captures and wrote this summary, so treat it as a working document, not an official reference. Everything comes from my captures; unconfirmed parts are marked.
New since the last version: the position switches stop being reported, and one frame keeps them coming
The slide, height, cushion and backrest switches only show in the module's switch frame for about 10 s after the last use of one, or after the knob was used. After that the seat still moves, but those switches no longer appear on the bus. The knob and its four buttons are always reported, and using them brings the others back.
Sending one frame keeps them reported:
I found this by replaying a real S90's frames and narrowing them down: ID 501 alone was enough, and this one payload alone was enough. Not enough on their own: nothing sent, a diagnostic session, the car's real 0F0 sequence, and the earlier state 01 40 20 01. I have only tried that one payload alone, tested on the driver seat.
What I think it is (not confirmed): a network-management message, AUTOSAR style with partial networks.
Commissioning
The module reads its own switches and drives its motors once it has seen this frame. Nothing else is commanded over CAN.
A static copy works and the module latches it. On a real car bytes 1, 4 and 7 roll: byte 4 follows byte 1 (23 pairs seen, not a standard CRC-8) and byte 7's bits 5 and 7 flip between frames. That did not matter for the position switches.
Switch frames
A switch frame is held-state: the code stays while the switch is down and drops back to idle on release.
Not yet confirmed: the passenger's slide back and knob buttons are the driver's codes mirrored; I haven't pressed them on the passenger seat.
The adjustment knob's menus
Turning the knob moves through three menus and stops at each end. Up goes to the top menu, down to the bottom.
The knob's four buttons act on the selected menu:
Not on the bus
There is no live position of the slide, height, tilt or backrest in any frame, with the module kept awake or not.
Still unknown
Corrections welcome, and captures of the memory buttons most of all.
Context: I worked these out on a real car with a CANable, pressing each switch and logging the result. An AI assistant (Claude) helped analyse the captures and wrote this summary, so treat it as a working document, not an official reference. Everything comes from my captures; unconfirmed parts are marked.
New since the last version: the position switches stop being reported, and one frame keeps them coming
The slide, height, cushion and backrest switches only show in the module's switch frame for about 10 s after the last use of one, or after the knob was used. After that the seat still moves, but those switches no longer appear on the bus. The knob and its four buttons are always reported, and using them brings the others back.
Sending one frame keeps them reported:
Code:
ID 501 01 40 A0 21 00 00 00 00 repeated every 0.5 sWhat I think it is (not confirmed): a network-management message, AUTOSAR style with partial networks.
- 505, 506 and 501 all have byte 0 = the ID's last digit (the node number) and byte 1 = 40. In that scheme byte 1 40 is the "partial network information" bit and bytes 2 onward are partial-network request bits.
- 505 and 506 are the seat modules' own frames (driver, passenger). Their byte 2 bit 6 comes on when the knob is used and goes off a few seconds later, which looks like the seat asking for its network.
- 501 is node 1, some central module, saying what the car wants awake. In the S90 trace it changes as the ignition goes to position 2: A0 21 and later F7 FD 04 while on, 20 01 and 24 09 before and after.
Commissioning
The module reads its own switches and drives its motors once it has seen this frame. Nothing else is commanded over CAN.
Code:
ID 0F0 80 32 00 00 D6 D4 00 00Switch frames
A switch frame is held-state: the code stays while the switch is down and drops back to idle on release.
Code:
DRIVER ID 090 [b0] 05 [b2] [b3] B8 00 00 00
b0 bit 1 = a switch is down, bits 5-6 = menu (below)
b2 01 / 02 seat position control up / down (height)
04 / 08 seat cushion control up / down
10 / 20 / 40 / 80 knob button up / down / forward / back
b3 01 idle
04 / 08 seat position control forward / back (slide)
10 / 20 knob turned up / down
40 / 80 backrest control forward / back
idle: 68, 48 or 28 05 00 01 B8 00 00 00 down: b0 | 02
PASSENGER ID 0A5 [b0] [b1] 00 00 00 00 00 00
b0 = the driver's b2
b1 = the driver's b3, but the idle bit is bit 1: idle 02
ID 0A0 05 [b1] C0 00
b1 bits 5-6 = menu, bit 3 = a switch is down (idle 61, 41 or 21)The adjustment knob's menus
Turning the knob moves through three menus and stops at each end. Up goes to the top menu, down to the bottom.
Code:
bits 5-6 (090 b0 / 0A0 b1) menu
0x40 top Side Support (the bolsters)
0x20 middle Lumbar Support
0x60 bottom Seat Cushion ExtensionCode:
forward back up down
Cushion extension extends retracts nothing nothing
Lumbar support inflates deflates support moves up support moves down
Side support inflates bolsters deflates nothing nothingNot on the bus
There is no live position of the slide, height, tilt or backrest in any frame, with the module kept awake or not.
Still unknown
- Memory recall and store (on a real car these come from the driver door module). I need a real SPA car or the door module to capture them.
- The bits of 501, and what the other 501 payloads do alone.
- The adjustment lock the manual mentions; no frame seen.
Corrections welcome, and captures of the memory buttons most of all.

