Haltech PD-16 CAN Protocol

Haltech PD-16 CAN Protocol


Multiplexing

We're sending and receiving a lot of data. We'll multiplex our CAN messages to consume as few CAN IDs as possible. If a message is multiplexed then the first byte will be a multiplex ID used to identify the payload. The Multiplex ID has two sections - the IO type section and the IO index section.
For example, the CAN packet for turning on the 8A output 3 and 25A output 4 will have the same CAN ID and the same payload, but the multiplex ID will indicate which output the packet corresponds to.

Protocol

ECU to PD16

High Priority / High Output Rate

Notes: The ECU and dash can send messages asynchronously whenever there are changes of the I/O. So for example the ECU will send out the message for controlling HBO 1 (CAN ID=base CAN ID, Mux Type=HBO, Mux Index=0) at the base rate of 50ms. So if no changes on the pin occur, that is what can be measured for that particular combination of CAN ID, Mux Type, and Mux Index. If the function that is controlling that pin updates at a faster rate, then you can expect to see a higher rate of CAN messages to control HBO 1. The PD16 will do the same with its inputs, if nothing changes on them they come out at the base rate. If they are changing more often then the frequency is increased.

CAN I.D.

Rate (Hz)

Direction

Message Position

Sign

Channel

Units

Conversion from Raw

PD16 A: 0x6D0
PD16 B: 0x6D8
PD16 C: 0x6E0
PD16 D: 0x6E8

20

RX

0:7 - 0:5

Unsigned

Mux ID (IO Type)

0 = 25A

0:3 - 0:0

Unsigned

Mux ID (IO Index)

25A: 0 - 3

1:7 - 2:00

Unsigned

25A <Mux ID> Duty Cycle

%

1000 = 100.0%

3:7 - 4:00

Unsigned

25A <Mux ID> Frequency

Hz

1000 = 1000Hz

PD16 A: 0x6D0
PD16 B: 0x6D8
PD16 C: 0x6E0
PD16 D: 0x6E8

20

RX

0:7 - 0:5

Unsigned

Mux ID (IO Type)

1 = 8A

0:3 - 0:0

Unsigned

Mux ID (IO Index)

0 = 8A-HCO1
1 = 8A-HCO2
2 = 8A-HCO3
3 = 8A-HCO4
4 = 8A-HCO5
5 = 8A-HCO6
6 = 8A-HCO7
7 = 8A-HCO8
8 = 8A-HCO9
9 = 8A-HCO10

1:7 - 2:00

Unsigned

8A <Mux ID> Duty Cycle

1000 = 100.0%

3:7 - 4:00

Unsigned

8A <Mux ID> Frequency

1000 = 1000Hz

PD16 A: 0x6D0
PD16 B: 0x6D8
PD16 C: 0x6E0
PD16 D: 0x6E8

20

RX

0:7 - 0:5

Unsigned

Mux ID (IO Type)

2 = Half Bridge

0:3 - 0:0

Unsigned

Mux ID (IO Index)

0 = HBO1
1 = HBO2

1:7 - 2:00

Unsigned

Half Bridge <Mux ID> Duty Cycle

%

1000 = 100.0%

3:7 - 4:00

Unsigned

Half Bridge <Mux ID> Frequency

Hz

1000 = 1000Hz


Low Priority / Low Output Rate

CAN I.D.

Rate (Hz)

Direction

Message Position

Sign

Channel

Units

Conversion from Raw

PD16 A: 0x6D1
PD16 B: 0x6D9
PD16 C: 0x6E1
PD16 D: 0x6E9

2

RX

0:7 - 0:5

Unsigned

Mux ID (IO Type)

0 = 25A

0:3 - 0:0

Unsigned

Mux ID (IO Index)

0 = 25A-HCO1
1 = 25A-HCO2
2 = 25A-HCO3
3 = 25A-HCO4

1:7 - 1:5

Unsigned

25A <Mux ID> Retries

0 = never
1 = 1
2 = 2
3 = 5
4 = 10
5 = 20
6 = 30
7 = always

1:4 - 1:3

Unsigned

25A <Mux ID> Drive Type

0 = undefined
1 = high side
2 = both
3 = open circuit

1:2 - 1:1

Unsigned

25A <Mux ID> Safe State

0 = inactive
1 = active
2 = open circuit

1:0

Unsigned

25A <Mux ID> Active State

0 = low
1 = high

2:7 - 2:0

Unsigned

25A <Mux ID> Retry Delay

1 = 1 second
range: 0 - 240

3:7 - 3:0

Unsigned

25A <Mux ID> Fuse Current

1 = 0.2A
range = 0 - 250

4:7 - 4:0

Unsigned

25A <Mux ID> Soft Start Current

1 = 0.2A
range = 0 - 250

5:7 - 5:0

Unsigned

25A <Mux ID> Soft Start Duration

1 = 0.1 seconds
range = 0 - 250

PD16 A: 0x6D1
PD16 B: 0x6D9
PD16 C: 0x6E1
PD16 D: 0x6E9

2

RX

0:7 - 0:5

Unsigned

Mux ID (IO Type)

1 = 8A

0:3 - 0:0

Unsigned

Mux ID (IO Index)

0 = 8A-HCO1
1 = 8A-HCO2
2 = 8A-HCO3
3 = 8A-HCO4
4 = 8A-HCO5
5 = 8A-HCO6
6 = 8A-HCO7
7 = 8A-HCO8
8 = 8A-HCO9
9 =8A-HCO10

1:7 - 1:5

Unsigned

8A <Mux ID> Retries

0 = never
1 = 1
2 = 2
3 = 5
4 = 10
5 = 20
6 = 30
7 = always

1:4 - 1:3

Unsigned

8A <Mux ID> Drive Type

0 = undefined
1 = undefined
2 = high side
3 = open circuit

1:2 - 1:1

Unsigned

8A <Mux ID> Safe State

0 = inactive
1 = active
2 = open circuit

1:0

Unsigned

8A <Mux ID> Active State

0 = low
1 = high

2:7 - 2:0

Unsigned

8A <Mux ID> Retry Delay

1 = 1 second
range: 0 - 240

3:7 - 3:0

Unsigned

8A <Mux ID> Fuse Current

1 = 0.2A
range = 0 - 250

PD16 A: 0x6D1
PD16 B: 0x6D9
PD16 C: 0x6E1
PD16 D: 0x6E9

2

RX

0:7 - 0:5

Unsigned

Mux ID (IO Type)

2 = Half Bridge

0:3 - 0:0

Unsigned

Mux ID (IO Index)

0 = HBO1
1 = HBO2

1:7 - 1:5

Unsigned

Half Bridge <Mux ID> Retries

0 = never
1 = 1
2 = 2
3 = 5
4 = 10
5 = 20
6 = 30
7 = always

1:4 - 1:3

Unsigned

Half Bridge <Mux ID> Drive Type

0 = low side
1 = high side
2 = both
3 = open circuit

1:2 - 1:1

Unsigned

Half Bridge <Mux ID> Safe State

0 = inactive
1 = active
2 = open circuit

1:0

Unsigned

Half Bridge <Mux ID> Active State

0 = low
1 = high

2:7 - 2:0

Unsigned

Half Bridge <Mux ID> Retry Delay

1 = 1 second
range: 0 - 240

PD16 A: 0x6D1
PD16 B: 0x6D9
PD16 C: 0x6E1
PD16 D: 0x6E9

2

RX

0:7 - 0:5

Unsigned

Mux ID (IO Index)

3 = SPI

0:3 - 0:0

Unsigned

Mux ID (IO Index)

0 = SPI1
1 = SPI2
2 = SPI3
3 = SPI4

1:1

Unsigned

SPI <Mux ID> Pullup

0 = disable
1 = enable

1:0

Unsigned

SPI <Mux ID> Edge Select

0 = falling
1 = rising

4:7 - 5:0

Unsigned

SPI <Mux ID> Upper Threshold

V

5000 = 5.00V

6:7 - 7:0

Unsigned

SPI <Mux ID> Glitch Filter

us

1 = 1us
Range: 0 - 500

2:7 - 2:0

Unsigned

PD16 A: 0x6D1
PD16 B: 0x6D9
PD16 C: 0x6E1
PD16 D: 0x6E9

2

RX

0:7 - 0:5

Unsigned

Mux ID (IO Index)

4 = AVI

0:3 - 0:0

Unsigned

Mux ID (IO Index)

0 = AVI1
1 = AVI2
2 = AVI3
3 = AVI4

1:2 - 1:0

Unsigned

AVI <Mux ID> Pullup

0 = disable
1 = enable (1k)
2 = enable (240Ω) (AVI 1 only)

2:7 - 3:0

Unsigned

AVI <Mux ID> Switch On Threshold

V

5000 = 5.00V

4:7 - 5:0

Unsigned

AVI <Mux ID> Switch Off Threshold

V

5000 = 5.00V

PD16 A: 0x6D2
PD16 B: 0x6DA
PD16 C: 0x6E2
PD16 D: 0x6EA

2

RX

0:4

Unsigned

ECR status*

0 = off
1 = on

*ECR, when on, will force the PD16 to stay on even if the ignition power switch is removed (until either this bit gets sent with a zero, or CAN comms is lost). Only when in CAN master mode (ie, device was turned on with the ignition switch).

0:3

Unsigned

CAN Power

0 = disabled
1 = enabled*

*Not Implemented / Reserve

0:2

Unsigned

Reserved

0 = disabled

0:1

Unsigned

CAN Termination (Bus 1)

0 = disabled
1 = enabled

0:0

Unsigned

Reserved

0 = disabled


PD16 to ECU

High Priority / High Output Rate

CAN I.D.

Rate (Hz)

Direction

Message Position

Sign

Channel

Units

Conversion from Raw

PD16 A: 0x6D3
PD16 B: 0x6DB
PD16 C: 0x6E3
PD16 D: 0x6EB

20

TX

0:7 - 0:5

Unsigned

Mux ID (IO Index)

3 = SPI

0:3 - 0:0

Unsigned

Mux ID (IO Index)

0 = SPI1
1 = SPI2
2 = SPI3
3 = SPI4

1:0

Unsigned

SPI <Mux ID> State

0 = OFF
1 = ON

2:7 - 3:0

Unsigned

SPI <Mux ID> Voltage

V

5000 = 5.000V

4:7 - 5:0

Unsigned

SPI <Mux ID> Duty Cycle

%

1000 = 100.0%

6:7 - 7:0

Unsigned

SPI <Mux ID> Frequency

Hz

1000 = 1000Hz

PD16 A: 0x6D3
PD16 B: 0x6DB
PD16 C: 0x6E3
PD16 D: 0x6EB

20

TX

0:7 - 0:5

Unsigned

Mux ID (IO Index)

4 = AVI

0:3 - 0:0

Unsigned

Mux ID (IO Index)

0 = AVI1
1 = AVI2
2 = AVI3
3 = AVI4

1:0

Unsigned

AVI <Mux ID> State

0 = OFF
1 = ON

2:7 - 3:0

Unsigned

AVI <Mux ID> Voltage

V

5000 = 5.000V


Low Priority / Low Output Rate

CAN I.D.

Rate (Hz)

Direction

Message Position

Sign

Channel

Units

Conversion from Raw

PD16 A: 0x6D4
PD16 B: 0x6DC
PD16 C: 0x6E4
PD16 D: 0x6EC

5

TX

0:7 - 0:5

Unsigned

Mux ID (IO Type)

0 = 25A

0:3 - 0:0

Unsigned

Mux ID (IO Index)

0 = 25A-HCO1
1 = 25A-HCO2
2 = 25A-HCO3
3 = 25A-HCO4

1:7 - 1:0

Unsigned

25A <Mux ID> Load

%

100 = 100%

2:7 - 3:0

Unsigned

25A <Mux ID> Voltage

V

12000 = 12.000V

4:7 - 5:0

Unsigned

25A <Mux ID> Low Side Current

A

50000 = 50.000A

6:7 - 6:0

Unsigned

25A <Mux ID> High Side Current

A

50000 = 50.000A

7:7 - 7:4

Unsigned

25A <Mux ID> Retry Count

0 - 30

7:3 - 7:0

Unsigned

25A <Mux ID> Pin State

0 = operational
1 = high current
2 = over current
3 = short circuit
4 = open circuit

PD16 A: 0x6D4
PD16 B: 0x6DC
PD16 C: 0x6E4
PD16 D: 0x6EC

5

TX

0:7 - 0:5

Unsigned

Mux ID (IO Type)

1 = 8A

0:3 - 0:0

Unsigned

Mux ID (IO Index)

0 = 8A-HCO1
1 = 8A-HCO2
2 = 8A-HCO3
3 = 8A-HCO4
4 = 8A-HCO5
5 = 8A-HCO6
6 = 8A-HCO7
7 = 8A-HCO8
8 = 8A-HCO9
9 =8A-HCO10

1:7 - 1:3

Unsigned

8A <Mux ID> Retry Count

0 = never
1 = 1
2 = 2
3 = 5
4 = 10
5 = 20
6 = 30
7 = always

1:2 - 1:0

Unsigned

8A <Mux ID> Pin State

0 = operational
1 = high current
2 = over current
3 = short circuit
4 = open circuit

2:7 - 3:0

Unsigned

8A <Mux ID> Voltage

V

12000 = 12.000V

4:7 - 5:0

Unsigned

8A <Mux ID> Current

A

1000 = 1.000A

6:7 - 6:0

Unsigned

8A <Mux ID> Load

%

100 = 100%

PD16 A: 0x6D4
PD16 B: 0x6DC
PD16 C: 0x6E4
PD16 D: 0x6EC

5

TX

0:7 - 0:5

Unsigned

Mux ID (IO Type)

2 = Half Bridge

0:3 - 0:0

Unsigned

Mux ID (IO Index)

0 = HBO1
1 = HBO2

1:7 - 1:3

Unsigned

Half Bridge <Mux ID> Retry Count

0 - 31
31 indicates > 30

1:2 - 1:0

Unsigned

Half Bridge <Mux ID> Pin State

0 = operational
1 = high current
2 = over current
3 = short circuit
4 = open circuit

2:7 - 3:0

Unsigned

Half Bridge Voltage

V

12000 = 12.000V

4:7 - 5:0

Unsigned

Half Bridge LS Current

6:7 - 7:0

Unsigned

Half Bridge HS Current

PD16 A: 0x6D5
PD16 B: 0x6DD
PD16 C: 0x6E5
PD16 D: 0x6ED

2

TX

0:7 - 0:4

Unsigned

Status

0=In bootmode
1=In firmware
2=Hardware failure
3=Firmware erased
4=Watchdog timeout
5=Illegal op-code

0:3

Unsigned

USB Connected

0:1

Unsigned

ID Conflict

1:7 - 1:3

Unsigned

Boot Version

1:1 - 1:0

Unsigned

FW Major Version

2:7 - 2:0

Unsigned

FW Minor Version

3:7 - 3:0

Unsigned

FW Bugfix Version

4:7 - 4:0

Unsigned

FW Release Version

PD16 A: 0x6D6
PD16 B: 0x6DE
PD16 C: 0x6E6
PD16 D: 0x6EE

2

TX

0:7 - 0:0

Unsigned

Mux ID = 0

1:0

Unsigned

Ignition input switch status

0 = off
1 = on

2:7 - 3:0

Unsigned

Main Rail Voltage

V

12000 = 12.000V

4:7 - 5:0

Unsigned

Protected Rail Voltage

V

12000 = 12.000V

6:7 - 7:0

Unsigned

ECR Plug Voltage

V

12000 = 12.000V

PD16 A: 0x6D6
PD16 B: 0x6DE
PD16 C: 0x6E6
PD16 D: 0x6EE

2

TX

0:7 - 0:0

Unsigned

Mux ID = 1

2:7 - 3:0

Unsigned

Boost Voltage

V

12000 = 12.000V
The expected value should sit 10V above the Battery Voltage

4:7 - 5:0

Unsigned

SEPIC Voltage

V

12000 = 12.000V

An internal rail. The expected value is 12V

6:7 - 7:0

Unsigned

ECR Plug Current

mA

1 = 1mA

PD16 A: 0x6D6
PD16 B: 0x6DE
PD16 C: 0x6E6
PD16 D: 0x6EE

2

TX

0:7 - 0:0

Unsigned

Mux ID = 2

2:7 - 3:0

Unsigned

UVLO Voltage

V

12000 = 12.000V
An internal rail. The expected value is 3.3V

4:7 - 5:0

Unsigned

Sensor Ground Voltage

V

12000 = 12.000V

6:7 - 7:0

Unsigned

VDD Voltage

V

12000 = 12.000V

PD16 A: 0x6D6
PD16 B: 0x6DE
PD16 C: 0x6E6
PD16 D: 0x6EE

2

TX

0:7 - 0:0

Unsigned

Mux ID = 3

1:7 - 1:0

Unsigned

Mail Rail Temperature

1 = 1 degree Celsius

Temperatures below zero read as zero.

2:7 - 2:0

Unsigned

Thermistor 1 Temperature

3:7 - 3:0

Unsigned

Thermistor 2 Temperature

4:7 - 4:0

Unsigned

Thermistor 3 Temperature

5:7- 5:0

Unsigned

CPU Temperature

6:7 - 7:0

Unsigned

Total Current Draw

A

0.1 A resolution

1000 = 100.0A

PD16 A: 0x6D6
PD16 B: 0x6DE
PD16 C: 0x6E6
PD16 D: 0x6EE

2

TX

0:7 - 0:0

Unsigned

Mux ID = 4

2:7 - 3:0

Unsigned

Battery Voltage

V

12000 = 12.000V

4:7 - 5:0

Unsigned

PD-16 On Time

1 = 1 second

6:7 - 6:6

Unsigned

HCO25 3 & 4 Temperature

0 = OK
1 = Warning ( > 115 degrees)
2 = shutdown ( > 145 degrees)

6:5 - 6:4

Unsigned

HCO25 1 & 2 Temperature

6:3 - 6:2

Unsigned

TVS Temperature

6:1 - 6:0

Unsigned

Main Rail Temperature

PD16 A: 0x6D6
PD16 B: 0x6DE
PD16 C: 0x6E6
PD16 D: 0x6EE

2

TX

0:7 - 0:0

Unsigned

Mux ID = 5

2:7 - 2:4

Unsigned

Digit 1 of serial number

0x19

2:3 - 2:0

Unsigned

Digit 2 of serial number

3:7 - 3:4

Unsigned

Digit 3 of serial number

0x80

3:3 - 3:0

Unsigned

Digit 4 of serial number

4:7 - 4:4

Unsigned

Digit 5 of serial number

0x00

4:3 - 4:0

Unsigned

Digit 6 of serial number

5:7 - 5:4

Unsigned

Digit 7 of serial number

0x1c

5:3 - 5:0

Unsigned

Digit 8 of serial number

6:7 - 6:4

Unsigned

Digit 9 of serial number

0x3c

6:3 - 6:0

Unsigned

Digit 10 of serial number

7:7 - 7:4

Unsigned

Digit 11 of serial number

0xd1

7:3 - 7:0

Unsigned

Digit 12 of serial number



CAN ID Swaps

Request to swap ID (from ECU):

CAN ID

Byte pos

Value

PD16 A: 0x6F7
PD16 B: 0x6F9
PD16 C: 0x6Fb
PD16 D: 0x6Fb

0

0x04

1

0x2e

2

0x43

3

0x2b

4

Value of the new box ID from 0 - 3

5

0x55

6

0x55

7

0x55

PD16 response / acknowledgement:

CAN ID

Byte pos

Value

PD16 A: 0x6F8
PD16 B: 0x6FA
PD16 C: 0x6FC
PD16 D: 0x6FE

0

0x01

1

0x6e

2

0xaa

3

0xaa

4

0xaa

5

0xaa

6

0xaa

7

0xaa

Request soft reset:

CAN ID

Byte pos

Value

PD16 A: 0x6F7
PD16 B: 0x6F9
PD16 C: 0x6FB
PD16 D: 0x6FD

0

0x02

1

0x11

2

0x03 (soft reset) (could be 01 for hard reset or 02 for key on/off reset)

3

0x55

4

0x55

5

0x55

6

0x55

7

0x55

PD16 reset response / acknowledgement:

CAN ID

Byte pos

Value

PD16 A: 0x6F8
PD16 B: 0x6FA
PD16 C: 0x6FC
PD16 D: 0x6FE

0

0x03

1

0x51

2

0x03

3

0x00

4

0xaa

5

0xaa

6

0xaa

7

0xaa


CAN Rates

CAN ID

Payload

# Messages

Desired Output Rate (ms)

Cycle Time (ms)

CAN Packets/s

Base CAN ID

·        Output duty cycle

·        Output frequency

16

50

3

333 

Base CAN ID + 1

·        Output settings

·        Input settings

24

500

20

50

Base CAN ID + 2

·        System config

1

500

500

2

Base CAN ID + 3

·        Input state

·        Input voltage

·        Input duty cycle

·        Input frequency

8

50

6.25

160

Base CAN ID + 4

·        Output voltage

·        Output retry count

·        Output pin state

16

200

12.5

80

Base CAN ID + 5

·        Status info

1

500

500

2

Base CAN ID + 6

·        Serial number

·        Battery voltage

·        Diagnostics

1

500

500

2

629



For more information about the Haltech CAN Protocol specification, click on this link.
    • Related Articles

    • Haltech ECU CAN Broadcast Protocol

      Device Version for Full Support* Nexus Series ECU 1.24 Elite Series ECU 3.10 IC7 Dash ? * Earlier versions support parts of this protocol. The most up-to-date ECU and dash firmware available will support most signals. CAN I.D. Rate (Hz) Direction ...
    • Haltech CAN Protocol Specification

      Key Information The Haltech CAN bus operates at 1 MBit/s and uses 11-bit IDs, which are expressed in Hexadecimal. The first byte in a packet is considered byte 0, and the 8th byte is byte 7. The most significant bit in a byte is considered bit 7 and ...
    • Haltech ECU Comparison Table

      STILL UNSURE? If you’ve narrowed your choice down to a couple of ECUs but want to confirm you’ve made the right decision contact our Tech Support Hotline. Remember, our goal is not to just sell you any ECU, we want to provide you with an ECU that’s ...
    • Haltech CAN System

      Haltech CAN System This node allows any CAN Devices to be enabled and for a DTC Severity level to be set for each device. Displays If you have a Haltech CAN Supported Dash it will need to be enabled in this page by clicking the Tick box for the: ...
    • Haltech Can Bus Selection

      The Haltech CAN Bus is used to communicate with all Haltech CAN based expansion devices such as wideband controllers, display dashes and I/O expander boxes. Select the port where you would like the Bus to be broadcast.