Kenwood Car Headunit Interface Protocol
Kenwood, like Sony, was an early player in the car audio system market and as technolgy improved, new features were added. One of these improvments was the idea of a CD changer, which was taken up by most companies. The connection from the headunit to the CD changer depends on the manufacuter and this page outlines the protocol used by Kenwood since 1999. (A slightly different protocol was used before 1999). It should be stated that because of developments in music technolgy the CD changer connection has now become more of an accessory connection for which manufactures (including Kenwood) have been fast to relise.
The comunication between the headunit and the CD change is based upon SPI (Serial Peripheral Interface) but it has a few extra features. The headunit and the CD changer both have 13-pin DIN sockets and so a cable with a 13-pin plug at both ends is used to connect the units. The pin out for the connector is as follows:
Pin |
Direction |
Description |
|---|---|---|
1 |
OUT |
CH-REQH, Active Low, Request from headunit to changer |
2 |
- |
Ground |
3 |
- |
Vcc +12V |
4 |
OUT |
CH-CON, High = Operation Mode, Low = Standby |
5 |
IN |
CH-MUTE - Mute request from changer, Active High |
6 |
- |
Audio GND |
7 |
OUT |
CH-RST - Reset output to changer |
8 |
IN |
Audio Channel Right |
9 |
IN |
CH-REQC, Request input from changer, Active Low |
10 |
IN |
CH-DATAC - Data input from changer |
11 |
0UT |
CH-DATAH - Data output to changer |
12 |
IN |
Audio Channel Left |
13 |
- |
CH-CLK Clock input/output for changer |
(IN / OUT referenced to headunit)
The easiest way to find the correct pins is to connect a multimeter to a known ground point and find pin 3 which had 12v on it. All others can be referenced from this pin.
I should note here that the following data was not found by me but was mirrored from Mictronics who in actual fact mirrored it from another site by Arne Hennigs. This site no longer directly avalible but might be found here at the Web Archive. I have provided the data here for two reasons: one in case Mictronics ever removes the data but also because it is my intention to extend on the information over time.
The following information should be noted:
The clock high and low period are both 4µS, hence a clock rate of 125 KHz. The data is transfered in bytes (8 bits with MSB first) and is valid at the rising clock edge. Data transfer can be initiated either by the radio or the changer, the initiator pulls its REQ line low.
When the transfer is started by the radio by setting its REQ line (CH-REQH) low it waits for the changer to do the same on its REQ line (CH-REQC) and then sends the 4 byte address header, the data size in bytes and then the data.
The changer can start the communication by lowering its REQ line. The radio will send 4 address bytes and 1 data size byte (which is 40 clock cycles). [NB I am not sure that this is correct - I belive that the address and and data size byte sent by the changer] The radio will set its REQ line low if it accepts the transfer.
The first table shows the Packet Structure and the following tables just show the data part.
Packet Structure : Direction
= Both |
||
|---|---|---|
| Byte | Value | Description |
| 0 | 0x29 | Destination Address |
| 1 | 0x10 | Destination Address |
| 2 | 0x1E | Own Address |
| 3 | 0x00 | Own Address |
| 4 | x | Data Size in Bytes |
| 5 | x | First Data Byte |
| 4 + Data Size | x | Last Data Byte |
Initialisation Handshake
: Direction = C to R |
||
|---|---|---|
| Byte | Value | Description |
| 0 | 0x11 | Command Identifier |
| 1 | 0xA4 | Cycle Number of packet |
| 2 | 0x00 | ? |
| 3 | 0x01 | ? |
| 4 | 0x02 | ? |
Sent after the above packet:
Maybe radio identicication |
||
|---|---|---|
| Byte | Value | Description |
| 0 | 0x20 | Command Identifier |
| 1 | 0x00 | |
| 2 | 0x11 | |
| 3 | 0x01 | |
| 4 | 0x03 | |
| 5 | 0x0B | |
| 6 | 0x0B | |
| 7 | 0x07 | |
| 8 | 0x05 | |
| 9 | 0x83 | |
| 10 | 0x84 | |
| 11 | 0xC0 | |
| 12 | 0xC1 | |
| 13 | 0xC2 | |
| 14 | 0xC3 | |
| 15 | 0xC4 | |
| 16 | 0xC5 | |
| 17 | 0xC6 | |
Sent after above packet Direction: R to C |
||
|---|---|---|
| Byte | Value | Description |
| 0 | 0x20 | Command Identifier |
| 1 | 0x01 | |
| 2 | 0x11 | |
| 3 | 0x29 | Changer Address |
| 4 | 0x10 | Changer Address |
| 5 | 0x00 | maybe last bytes of cmd 0x11 |
| 6 | 0x01 | maybe last bytes of cmd 0x11 |
| 7 | 0x02 | maybe last bytes of cmd 0x11 |
Changer Caps Info (?) Sent
after above packet Direction: C to R |
||
|---|---|---|
| Byte | Value | Description |
| 0 | 0x70 | Command Identifier |
| 1 | 0x02 | |
| 2 | 0x0A | maybe disc count |
| 3 | 0x3F | |
| 4 | 0x03 | |
| 5 | 0x0C | |
| 6 | 0x02 | |
Play Position Info Direction
: C to R |
||
|---|---|---|
| Byte | Value | Description |
| 0 | 0x60 | Command Identifier |
| 1 | 0x02 | Might be sub command ID |
| 2 | 0x00 | |
| 3 | 0x00 | |
| 4 | 0x00 | Error Code: 0 is no error |
| 5 | 0x00 | Changer Status: Load, Eject, .... |
| 6 | 0x02 | Play Status: 1=Play, 2=Pause |
| 7 | 0x00 | |
| 8 | 0x01 | |
| 9 | 0x00 | Track Order Mode 0 = Normal, 1 = TrackScan, 2 = DiskScan 6 = Random |
| 10 | 0x04 | |
| 11 | 0xBB | Some bcd number: Displayed when Byte3 != 0 |
| 12 | 0x01 | |
| 13 | 0x0B | Track Number |
| 14 | 0x07 | Disk Number |
| 15 | 0x01 | Min (bcd) |
| 16 | 0x22 | Sec (bcd) |
| 17 | 0x62 | Min disc (bcd) |
| 18 | 0x26 | Sec disc (bcd) |
| 19 | 0x09 | Min Remain (bcd) |
| 20 | 0x30 | Sec Remain (bcd) |
Text info request : Direction
R to C |
||
|---|---|---|
| Byte | Value | Description |
| 0 | 0x42 | Command Identifier |
| 1 | 0x02 | |
| 2 | 0x07 | Disk Number |
| 3 | 0x0A | Track Number |
| 4 | 0x00 | Text Section Number - 12 bytes size |
| 5 | 0x00 | |
| 6 | 0x80 | Text ID (0x80 = Name, 0x81 = Artist) |
Test info sent after request
: Direction C to R |
||
|---|---|---|
| Byte | Value | Description |
| 0 | 0x62 | Command Identifier |
| 1 | 0x02 | |
| 2 | 0x07 | Disc Number |
| 3 | 0x02 | |
| 4 | 0x0A | Track Number (0 = Disc Title Transfer) |
| 5 | 0x00 | Text Section Number - 12 bytes size |
| 6 | 0x09 | |
| 7 | 0x00 | |
| 8 | 0x80 | Text ID (0x80 = Name, 0x81 = Artist) |
| 9...20 | x | Text |
Commands Sent When Radio
Keys Pressed : Direction R to C |
||||
|---|---|---|---|---|
| Byte | Play |
FWD(toggle) |
BWD(toggle) | Description |
| 0 | 0x50 |
0x50, 0x50 |
0x50, 0x50 |
Command Identifier |
| 1 | 0x02 |
0x01, 0x04 |
0x01, 0x04 |
Event ID 0x00 = All up 0x01 = Down 0x02 = Toggle 0x04 = Up 0x06 = Hold |
| 2 | 0x02 |
0x02, 0x02 |
0x02, 0x02 |
|
| 3 | 0x00 |
0x02, 0x02 |
0x02, 0x02 |
|
| 4 | 0x07 |
0x01, 0x01 |
0x02, 0x02 |
Key ID |
| 5 | 0x00 |
0x05, 0x05 |
0x06, 0x06 |
|
Commands Sent When Radio
Keys Pressed : Direction R to C |
|||
|---|---|---|---|
| Byte | disc-(toggle) |
disc+(toggle) | Description |
| 0 | 0x50, 0x50 |
0x50, 0x50 |
Command Identifier |
| 1 | 0x02, 0x00 |
0x02, 0x00 |
Event ID 0x00 = All up 0x01 = Down 0x02 = Toggle 0x04 = Up 0x06 = Hold |
| 2 | 0x02, 0x02 |
0x02, 0x02 |
|
| 3 | 0x00, 0x00 |
0x00, 0x00 |
|
| 4 | 0x04, 0x00 |
0x02, 0x00 |
Key ID |
| 5 | 0x00, 0x00 |
0x00, 0x00 |
|