General Disclaimer:   (HV) (DC) injury or death hazard,   use at your own risk,   may void warranty.

Prius PHEV TechInfo

From My wiki
Jump to navigation Jump to search
Click show for a short list of the current PHEV conversion and kit options for the Toyota Prius.

For Prius conversion details see the Prius PHEV article and comparisons table.

  1. Ron's Original PriusPlus History and current Contactor Based PriusPlus documentation for DIY projects.
  2. Ryan's PriusBlue is the testbed for DC-DC PFC Based PiPrius kits and documentation for DIY projects.
  3. Toyota OEM Prius PHEV and Prime Could use some work on this page
  4. Enginer China. But the rest of these appear to all be defunct as of 2020?
  5. |~- Hybrids-Plus USA/Colorado/Li -~|~- EnergyCS USA -~|~- Hymotion USA/Canada -~|~- Amberjac UK. -~|~- EDrive USA -~| Peter mentioned Plug-In Conversions |~-

--={ PiPrius }={ Process }={ fan control }={ Manzanita Micro }={ MM-PFC }={ Mk 3 Reg }=--
--={ PriusBlue }={ Maker Faire }={ Photos }={ EVents }={ 2006 mpg }={ 2005 mpg }=--
--={ CAN-View }={ Schematics }={ User Interfaces }={ Battery Options }={ TechInfo }=--

--={ More Vehicles: AVI }={ WhiteBird }={ GrayPearl }={ GreenCarCo }=--

Team Photo from the PriusPlus conversion of Sven's Prius from Nov 2006.
  • Add a new thumbnail for PirusBlue and other cars?

Technical information on the Prius useful when designing a Prius PHEV conversion.


Original generations

This is the original 4-door sedan:

  • 1997 Japan only release, chassis NHW10 (Gen 1, referred to as Mk1 in Australia and the UK, where it has occasionally been privately imported)
  • 2000 worldwide release, chassis NHW11 (Almost always called Gen 1 in North America, sometimes Gen 2)

Next generation

This is the 5-door hatchback, often called Gen 2, sometimes called Gen 3:

  • 2003 release in selected countries (as model year 2004), chassis NHW20.

Present generation

This is the new 5-door hatchback, more angular body, usually called Gen 3:

  • 2009 release as model year 2010, chassis ZVW30.

Tech info

Traction battery


  • Mass: 83 lb (37.5 kg)
  • Dimensions: 33 x 15 x 7.5"
  • Nominal Voltage: 201.6 V
  • Nominal Capacity : 6.5Ah
  • Module weight: 1040 g
  • Module Form Factor: Prismatic
  • No of Modules: 28
  • Total no of Cells: 168
  • Module specs:


The traction battery includes a Battery ECU (Electronic Control Unit). As the Battery Management System (BMS), this unit does the following:

  • It calculates the battery's SOC by integrating the current ("Coulomb counting"). This value is corrected for State Of Charge Drift, self-discharge when the vehicle is not running, etc, by skewing the SOC upward when the open circuit battery voltage surpasses approx. 242V, and, presumably, by skewing it downward when the open circuit voltage is below an as-yet-unmeasured value.
  • It reads the pack temperature using 3 thermistors, and the air intake temperature with a 4th thermistor
  • It controls its cooling fan (variable speed).
  • It calculates the battery dynamic resistance (delta voltage over delta current). This resistance increases with battery aging.
  • It protects the battery by limiting its current (even down to 0), if the SOC or temperature are at their limits, or the dynamic resistance is too high, or if it detects a fault.
  • It broadcasts to the rest of the vehicle, through the CAN bus, the following data:
    • Voltage
    • Current (positive for discharge, negative for charge)
    • Minimum & maximum temperature
    • Maximum current it's able to provide (Discharge Current Limit, or DCL)
    • Maximum current it's able to accept (Charge Current Limit, or CCL)
    • State Of Charge (SOC)
    • Any fault codes (DTCs)

Battery voltage

Voltage vs State Of Charge at various temperatures
Voltage vs State Of Charge at various discharge currents

If you replace the stock battery, you need to know its voltage, because that's what the vehicle expects. If you add a pack to the stock battery, you need to know its voltage, in order to connect the two together, somehow.

The nominal pack voltage is: 168 cells x 1.2 V = 201.6 V

The pack voltage depends on SOC, temperature and current.

  • The voltage depends on State of Charge and on temperature. It is affected by cold, but not much by heat; so, for temperatures abiove 20 C, use the 20 C curve.
  • The voltage depends on State of Charge and on discharge current. The voltage is not affected by low currents; so, for current below 1.3 A, use the 1.3 A curve.
  • The maximum charge voltage is 1.8 V / cell.
Therefore, roughly, the estimate pack voltage range is:
Max brake No current Max drive
>=20 C, 0% DOD 302 V 237 V 168 V
-10 C, 80 % DOD 302 V 160 V 126 V
So, the estimated overall voltage range is:
Min Nom Max
126 V 202 V 302 V

Though, Hybrid Interfaces reports a range of 165 to 270V, while Toyota specifies a normal range of 150 to 300 V (in READY mode) (Ref: "\Repair Manual\04priusf\05\21bpm\cidlitac.pdf"). However, Toyota's "normal" ranges, as reported in their repair manuals, are often misleading; either they are too generous, or the conditions under which they can be expected are not clearly stated.

See also Toyota Prius Battery Specs

Battery current

The battery current ranges from > -100 to > + 100.

These graphs are from data from Argonne National Labs: 600610092_Data_D3.txt. In these data, positive means into the battery (braking).

During easy driving, the current is on the order of 20 A, but is more like 40 A during serious driving.

Plot of battery current, 30 s average
Histogram of battery current

Battery heat dissipation

The battery power dissipation (assuming an internal resistance of 0.5 Ohm) peaks at 4.5 kW!

During easy driving, the dissipation is on the order of 200 W, but is more like 2000 W during serious driving.

Plot of battery heat dissipation, 100 s average
Histogram of battery heat dissipation

AC components in battery voltage

When the system relays are off, the battery floats with respect to the car chassis.

When the system relays are engaged, there is a common AC voltage between the battery terminals and the chassis. Its frequency is 5 KHz. When the engine is charging, its amplitude is 90 Vpp and its shape is a square wave. In EV drive, its amplitude is 100 Vpp and its shape is a combination of 2 square waves, each at 5 KHz, but not synchronized, so that one drifts with respect to the other one. The differential mode voltage is 200 Vdc (or course) plus noise spikes at the edges of the common mode wave, on the order of 10 Vpp.

A PHEV conversion must deal with this significant common noise.

Reconnecting traction battery

  • While working on the High Voltage section, ensure that the READY light is off and then remove the orange Service Plug on left end of the battery pack
  • If you attempt to turn on the car while the orange Service Plug is removed, or the Battery ECU is disconnected, the Prius will generate a fault code (DTC) and light-up the /!\ (Red Exclamation in a Triangle) symbol on the dashboard, and show a car with an Exclamation point in it on the Multi-Function Display (MFD).
  • To end the fault display
    • Turn off the car (READY light OFF)
    • Reconnect whatever is disconnected
    • Turn on the car
    • Drive
    • Turn off the car
  • Now the DTC is still stored, but at least there is no fault display on the dashboard.

Cabling to traction battery

Harness to the battery

The harness to the traction battery has 3 tails, each with a connector

  • To Battery ECU - power, communication, fan control
  • To the orange Service Plug - to detect if the Service Plug is fully plugged-in
  • To the System Relays - to drive the relays that connect the traction battery to the inverter

Pin-out of connector on Battery ECU

Battery ECU (electronic Control Unit)

    • Gnd - to chassis
    • AM - 12 V, always on, for memory retention
    • IGCT - 12 V when the car is in the "READY" mode
    • IG - 12 V when ignition is on
    • CANH - CAN bus High
    • CANL - CAN bus Low
    • VM - monitors fan voltage, 2 to 12 V
    • SI - variable duty cycle (PWM) square wave to control fan speed
    • FCTL1 - drives the relay which in turn powers the fan

Service Plug disconnect/connect sensor.
A simple reed switch, which is integrated into the 2004-up Prius service plug, is opened during the service plug removal sequence, just BEFORE the service plug opens the battery circuit. Upon re-installation, the switch is closed (shorted) just AFTER the service plug completes the circuit. Two pins connect the reed switch to the battery ECU. The purpose of this switch is to tell the battery ECU that the service plug is being removed, so that the system main relays can be opened prior to disconnecting the battery in the event that the service plug is inadvertently being removed while the system is in READY mode. Toyota warns that the HV ECU can be damaged if the power switch is engaged with the service plug disconnected.

NOTE: If the service plug in not firmly pushed down after insertion, the switch will not close, the system will not ready up, and a DTC will be set. This is a common oversight.

The service plug disconnect/connect sensor is a failsafe that prevents arcing at the service plug. It is not present on the service plug used in 1997-2003 Prius vehicles, but is integrated into the receptacle for the plug.

System Relays
Four pins:

  • Common
  • System relay K1 (precharge resistor)
  • System relay K2 (traction pack +, bypassing precharge resistor)
  • System relay K3 (traction pack -)

System Relays

Toyota refers to this assembly as an SMR (System Main Relay). In truth, there are three separate System Main Relays, housed in the drivers' side end of the battery pack enclosure:

  • a precharge relay in series with a precharge resistor
  • 2 contactors, one on the positive circuit and one on the negative circuit.

The system relays (contactors) are turned on in this sequence:


At power up:

  • The precharge relay is turned on first by itself (which results in no current, because there is no return path), and then turned off. This function checks for a stuck relay on the negative side. If that relay was stuck, current would be present. The HV ECU would then record a DTC before shutting itself down. The DTC would have to be cleared and the problem corrected before the vehicle will re-enter READY status.
  • After a pause, the precharge relay and the negative contactors are turned on, to precharge the electronics in the vehicle slowly, through the system resistor.
  • Then the positive contactor is turned on, to complete a direct path between the battery and the vehicle electronics.
  • Then the precharge relay is turned off.

At power down:

  • The positive contactor is turned off, removing power to the vehicle electronics. This is the only time when arcing may occur. Arcing on its contacts will affect its lifetime.
  • Then the negative contactor is turned off.

There is a hump in the waveforms, as the voltage goes from 10 V to 12 V. This is probably due to the DC-DC converter (from the traction battery voltage to the 12 V battery) being on.

CAN bus

If the conversion will replace the stock Battery ECU, it must talk directly with the vehicle CAN bus.

The battery ECU is the last device on the CAN bus, and thus has one of the 2 termination resistors. The termination resistor in the stock ECU is 120 ohm split-termination (meaning there are 2 60 ohm resistors in series, with a small capacitor from the middle of the 2 resistors to ground.) Toyota also uses a common mode choke on the CAN bus for filtering.

CAN Tools

  • CAN-View - uses the vehicle's MFD (Multi Function Display). V1, V2, and V3 are only compatible with the 2004 and 2005 Prius. A new V4 will be compatible with the 2006+ Prius and perhaps other hybrid models.
  • A generic adapter between the CAN-bus and a PC. It is convenient to use a USB port, though the serial or parallel or Ethernet port may be used as well. Examples of USB adapters:
    • Peak's PCAN-USB also sold as the GridConnect's GC-CAN-USB
      • Note: disconnecting this product's USB cable seems to create significant problems for Windows XP (immediate shut-down, or even the "blue screen of death"). You must use the system tray's "Remove hardware" icon first.
      • The PCAN-View software comes free with this product. In theory, it can filter a range of message IDs. In reality, that doesn't work so well if you're filtering more than one ID. However, you can run multiple instances of PCAN-View, each using a different filter, one for each message that interests you.
      • They charge extra for a logger. You can use a free logger instead:
    • Grifo's CANUSB
    • Systec's USB-CANmodul
    • CAN232 is a CAN to RS232 device used by Attila Vass with his early My CAN Project.
      • Communications with CAN232 via a terminal application:
        • send "V" command. You'll see "V1220" version info received.
        • send "N" command. You'll see "NB743" serial number.
        • send "X1" command to enable AutoPoll function.
        • send "S6" command to set 500 kbps CAN speed.
        • send "O" command to open the CAN port. You'll see a lot of CAN messages.
    • The CAN-View should not be confused with this CANview product (notice no dash in the name), which is a CAN to RS232 device.
  • These adapters have a DE-9 DSUB connector, so you'll also need an adapter to the Prius' OBD connector. For example:
  • The Prius' OBD (On Board Diagnostics) connector is located under the dashboard, below and to the right of the steering wheel, facing down. A.k.a.: Data Link Connector 3 (DLC3)
  • Alternatively, tap into the CAN bus directly. Use a short cable to the CAN adapter.
    • CANH - black wire
    • CANL - white wire
    • GND - chassis

CAN bus protocol

  • The CAN bus is active only when the vehicle is in READY mode, and for a few seconds after the end of the READY mode.
  • baud rate: 500 kbits/s (if you use the wrong rate, the vehicle will complain and store a DTC fault until the DTC codes are cleared)
  • Standard: CAN 2.0A ("standard CAN", 11-bit identifier)
  • Remote frames: not used
    • this means all the data are volunteered and none are requested; that is, that every component on the vehicle broadcasts its data periodically; no component puts out requests for data

All CAN messages

Attila Vass prepared a list of all CAN codes (xls).

Battery ECU messages

The Battery ECU (Electronic Control Unit) broadcasts messages to the rest of the vehicle through the CAN bus.

It appears that broadcasting those messages is all the Battery ECU is expected to do. It appears that this ECU only needs to talk, and doesn't need to listen. That is, it doesn't appear that it is expected to do anything about any messages that are placed on the bus by other devices.

The battery ECU is able to protect itself by stating the maximum current it may accept or may provide. It may also protect itself by generating a Fault Code (DTC). In either case, the battery module is at the mercy of the rest of the vehicle to respect those requests and not draw or source too much current. Thanks to Jim Fell for coming up with the checksum algorithm first.

The following data were seen in a 2006 Prius.

The Battery ECU (Electronic Control Unit) broadcasts the following messages. In this table, numbers in parentesis (#) refer to the notes just below the table.

ID (hex) Period
[ms] (1)
No of
byte 0 byte 1 byte 2 byte 3 byte 4 byte 5 byte 6 byte 7
03Bh 8 5 Current (2) Voltage (3) ChkSum (4)
3C9h 100 8 Y (14) Z (15) X (12) X (12) X (12) X (12) ChkSum (4)
3CBh 100 7 CDL (5) CCL (6) Delta SOC? (11) SOC (7) temp1 (8) temp2 (9) ChkSum (4)
3CDh 100 5 fault code (10) Voltage (3) ChkSum (4)
4D1h 1060 8 X (13) X (13) X (13) X (13) X (13) X (13) X (13) X (13)


  • h = hex value; d = decimal value; b = binary value;
  • A.V.: Attila Vaas (Attila Vass) believes...; D'de: Davide (Hybrids-Plus) believes...

1) How often this message is repeated
2) Pack current: 12-bit, signed (>0 = discharge, <0 = charge) [0.1 A], -256 to 254 A. Examples:

  • 0F80h = -128d = charging at 12.8 Amps
  • 0000h = 0d= no pack current
  • 0080h = 128d = discharging at 12.8 Amps

3) Pack voltage: 16-bit, unsigned [V], 0 to 510 V. Note that 2 different messages have this data, though the 2 values can be off by 1 LSB. Examples:

  • 00DCh = 220d = 220 Volts
  • 0100h = 256d = 256 Volts

4) CheckSum: used to check for errors in the data. [Details] (xls) Calculated as follows:

  1. Add the message ID (low byte plus high byte), the individual data bytes (other than the check-sum itself) and the number of data bytes
  2. Take the mod 256 of that (that is, drop the high byte)

5) Maximum discharging current that the pack can handle: 8-bit unsigned, [A]. A.k.a.: CDL (Current Discharge Limit). From that and the pack voltage, the maximum dicharging power (WOUT) is calculated and reported in the Diagnostics Tool (Typically <= 21 kW). The battery reduces this value at cold temperatures (at around 5 C it is down to around 60A) and low SOC. Range seen: 46 to 105 Example:

  • 69h = 105d = 105 Amps -> 21 kW @ 200 V

6) Maximum charging current that the pack can handle: 8-bit unsigned, [A]. A.k.a.: CCL (Current Charge Limit). From that and the pack voltage, the maximum charging power (WIN) is calculated and reported in the Diagnostics Tool (Typically <= 25 kW). The battery reduces this value at high SOC. Example:

  • 7Ah = 122d = 122 Amps -> 24.4 kW @ 200 V. Range seen: 0 to 125 A, normally 115 A.

7) State of Charge: 8-bit, unsigned [0.5%]. Examples:

  • 4Fh = 79d = 39.5 % full (stopped, this is when the motor turns on to start charging the pack)
  • 64h = 100d = 50 % full (stopped, this is when the motor turns off after charging the pack)
  • B4h = 180d = 90 % full

8) A.V.: Lowest temperature reading of any sensor.
D'de: Average temperature of the 3 sensors inside the battery. 8-bit signed, [?C] Example:

  • 18h = 26d = 26 ?C

9) A.V.: Highest temperature reading of any sensor.
D'de: Temperature of the air intake. 8-bit signed, [?C]. Reads the same or *lower* than Temp 1, by 0 to 5 ?C. Example:

  • FEh = -2d = -2 ?C

10) Fault Code (DTC = Diagnostic Trouble Code): 16-bit. The 2 Most Significant bits are the type of code (see below). The other 14 bits are the code. See table below for Fault codes. Examples:

  • 0560h = 0000 0101 0110 0000b = DTC P0560 = No voltage at the "AM" contact
  • 3056h = 0011 0000 0101 0110b = DTC P3056 = Problem with the battery current sensor
  • C100h = 1100 0001 0000 0000b = DTC U0100 = No Communication with the Engine Control Module

11) Delta in State of Charge: 8-bit, unsigned [0.5%]. Difference between SOC of most charged block and SOC of least charged block. This is just a guess. Examples:

  • 00h = 0d = 0 % = all block are equally charged
  • 0Ah = 10d = 5 % = the most charged bloc's SOC is 5 % higher than the least charged block

12) Unknown data. (A.V.: related to release date ?) Typical values:

  • 02 75 02 FA (Attila Vass)
  • 02 99 03 1F (GEO car)
  • 02 9A 03 21 (RG car)

13) Unknown, unchanging data. (A.V.: Batt -> HECU) Typical values:

  • 11 00 01 02 00 00 00 00 (D'de)
  • 11 00 01 00 00 00 00 00 (A.V.)

14) Reading (of what?) used only during calibration(?) at power up. 12 bits. Normally 3FFh. During calibration, about 1/2 scale (0180h). Typical values:

  • 03 FF 01 (RG car, GEO car)
  • 03 FF 05 (GEO car)
  • 01 87 21 (GEO car)
  • 03 FF 21 (GEO car, RG car, A.V.)
  • 00 08 25 (RG car) at power-up
  • 01 1D 25 (RG car) at power-up
  • 01 1E 25 (RG car) at power-up
  • 01 2A 25 (GEO car)
  • 01 2B 25 (GEO car)
  • 01 2C 25 (GEO car)
  • 01 72 25 (GEO car)
  • 01 D1 25 (GEO car)
  • 01 D2 25 (GEO car)
  • 03 FF 25 (GEO car)
  • 03 FF 25 (GEO car)
  • 03 FF 25 (GEO car)
  • 03 FF 25 (RG car)
  • 01 7D 27 (RG car) when engine first comes on
  • 01 84 27 (RG car) when engine first comes on
  • 01 D4 27 (GEO car)
  • 03 FF 29 (GEO car)

15) Probably flags. Related to the calibration bytes above. Typical sequence of values:

  • Power-up: 25h (0101b)
  • After engine comes on, after a few seconds: 27h (0111b), during which time the 1st 2 bytes are something other than 3FFh.
  • Engine still running, after a few seconds: 21h (0001b), and 1st 2 bytes go back to 3FFh
  • Power down: 01h

Other values seen: 05, 29

It appears that the battery pack also sends the following data, though it's unclear in which messages:

VMF FAN VOLTAGE Battery blower motor voltage
Min.: 0 V, Max.: 25.4 V
Actuation condition of battery blower motor
COOLING FAN SPD Battery blower motor drive mode
Min.: 0, Max.: 6
Stopped: 0
Low to high speed actuation: 1 to 6
ECU CTRL MODE ECU control mode
Min.: 0, Max.: 4
Operating condition of HV battery
SBLW RQST Battery blower motor stop control request
(standby blower)
Presence of stop control request to battery
V1 to V14 BATT BLOCK Battery block voltage
Min.: –327.68 V, Max.: 327.67 V
Voltage variance among battery blocks

Altering the SOC (SOC spoofing)

The OEM battery broadcasts a message on the CAN bus approximately every 100ms which includes the SOC. It has been discovered that the Prius's HV ECU listens to the last message received. Simply rebroadcasting that message immediately after it was originally sent with an altered value for the SOC (and altered checksum), causes the car to believe that the SOC is the altered value without intercepting the original message. This allows a conversion to spoof the SOC in a low cost and simple method which does not require altering the OEM battery's ECU or taps. The agent doing the rebroadcasting can be a computer with a device such as CANUSB or a small embedded system with a CAN interface.

Any system which uses SOC spoofing must be careful not to over discharge or overcharge the OEM battery.


The battery reports Charge and Discharge Current Limits depending on the SOC and the temperature. Based on very rough data, these graphs show their relationship.

  • Note that the Discharge limit remains high even if the SOC is very low.
  • The data were taken at a SOC range from 27 to 78 %, and a temperature range from 42 to 56 °C
  • The data were taken just at the upper end of the temperatures. We still need data for the colder temperatures.

Prius CCL graph.gif

Current Charge Limit (CCL) [A] versus SOC [%] at various temperatures [°C]

Prius CDL graph.gif

Current Discharge Limit (CDL) [A] versus temperature [°C]

OBD-II Diagnostic Trouble Codes (DTCs)

The Battery ECU detects and reports many fault conditions.

  • The Battery ECU places a Fault Code (DTC) in its message with an ID of 3CDh
  • The Engine ECU receives such DTCs (from the Battery ECU and from other devices as well)
  • The Engine ECU lights the Malfunction Indicator Lamp (MIL) (a.k.a. "Check Engine Lamp") on the dashboard. (In some cases it does so immediately, in some cases after it receives the same DTC twice.)

Fault codes begin with one of four letters, depending of the 2 Most Significant bits (MSb) of the hex code:

  • Ltr MSBs
  • P 00 Powertrain: Most faults start with this letter
  • C 01 Chassis: steering, brakes, other chassis systems. Faults in the transmission control ECU or electric power steering system
  • B 10 Body: Smart entry and Immobilizer malfunction. The only DTCs are B1294 and B2799
  • U 11 Network: Faults in the CAN network as well as any other networks (The Hybrid Control System cannot communicate with other components on the CAN bus0

All OBD-II diagnostic codes have five digits.

The first digit in an OBD-II DTC is always a letter, narrowing the fault to one of four different sections of the on-board diagnostic system: a P for powertrain, B for body, C for chassis, or U for network. At present, no other letters are used.

The second digit will be a number; SAE-defined codes, known as generic codes, are identified by a 0 (as above), 2, or 3. Manufacturer-specific codes, which are not defined by SAE, must use a 1 for the second digit. They can mean anything within the system defined by the first digit of the DTC.

When a Prius sets a DTC, it also sets a proprietary three-digit diagnostic code that sometimes gives a bit more information. This is typically accessed with a factory scanner.

Common DTC codes that may be set during a conversion:

Code (hex) Cause Note

P0AA6 High Voltage isolation fault - current is detected flowing from the HV system to the chassis of the car (3)
P0AC0 Current Sensor fault

HV Battery Diagnostic Trouble Codes (DTCs)

The battery ECU may generate the following Fault Codes (DTCs = Diagnostic Trouble Codes).

Code (hex) Cause Note

P0560 There's no voltage at the "AM" contact of the battery ECU (it should be 12 V at all times) (1)
P0A1F Battery ECU is bad (many possible symptoms) (2)
P0A7F One of the blocks in the battery pack has deteriorated: its dynamic resistance is too high (1)
P0A80 The difference in voltage between 2 of the blocks in the battery pack is too high (1)
The fan cooling the battery pack has problems (motor voltage or expected battery temperature) (1)
P0A95 Battery pack's fuse is blown (the Service Plug is still plugged in) (3)
P0A9B One of the temperature sensors in the battery pack is opened or shorted (1)
P0AAC The temperature sensors in the air intake is opened or shorted (1)
P30xx Battery block xx - 10 is weak (2)(4)
P3030 One or more of the wires between the Battery ECU and the battery blocks is disconnected (1)
P3056 There's a problem with the battery current sensor (1)


  1. Behavior: lets the vehicle go into the READY mode and drive normally
  2. Behavior: lets the vehicle go into the READY mode but limits driving to fail-safe mode
  3. Behavior: if the engine happened to be on at the time, the vehicle remains in the READY mode and continues driving with just the engine; if the engine happened to be off at the time, without a battery it can't be started, so the vehicle turns off the READY mode and stops
  4. There are 14 blocks in the battery pack (1 through 14); the last 2 digits of the code are the equal to the number of the bad block plus 10; so, if block 1 is bad, the code is P3011, if block 12 is bad, the code is P3022


The battery responds to the following PIDs.

Function REQUEST (e.g.: from ScanGauge) RESPONSE (from battery)
PID ScanGauge Name ID Len Data (1) ID Len Data Units / notes
00 - PID map 07E3h 8 02 21 00 xx xx xx xx xx 07EBh 8 06 61 00 98 18 80 13 00 Specifies which PIDs exist in this block
01 -,-,-,- ?,?,?,? 07E3h 8 02 21 01 xx xx xx xx xx 07EBh 8 06 61 01 aa bb cc dd 00 aa = 00h (?), bb = 04h (?), cc = 00h (?), dd = 00h (?) A. Vass: MIL STATUS
04 - ? 07E3h 8 02 21 04 xx xx xx xx xx 07EBh 8 03 61 04 aa xx xx xx xx aa = 00h (?)
05 -,-,-,- ?,?,?,? 07E3h 8 02 21 05 xx xx xx xx xx 07EBh 8 03 61 05 aa 00 00 00 00 aa = 76h (?)
0C -,- ?,? 07E3h 8 02 21 0C xx xx xx xx xx 07EBh 8 04 61 0C aa bb 00 00 00 aa = 00h (?), bb = 00h (?)
0D -,-,-,- ?,?,?,? 07E3h 8 02 21 0D xx xx xx xx xx 07EBh 8 03 61 0D aa 00 00 00 00 aa = 00h (?)
11 - ? 07E3h 8 02 21 11 xx xx xx xx xx 07EBh 8 03 61 11 aa 00 00 00 00 aa = 23h (1Eh to 28h, varies w/RPM?)
1C - ? 07E3h 8 02 21 1C xx xx xx xx xx 07EBh 8 03 61 1C aa 00 00 00 00 aa = 01h (?)
1F -,- ?,? 07E3h 8 02 21 1F xx xx xx xx xx 07EBh 8 04 61 1F tt tt 00 00 00 tttt = total time engine has been on since power-up [s]
20 - PID map 07E3h 8 02 21 20 xx xx xx xx xx 07EBh 8 06 61 20 80 01 80 01 00 Specifies which PIDs exist in this block
21 -,- ?,? 07E3h 8 02 21 21 xx xx xx xx xx 07EBh 8 04 61 21 aa bb 00 00 00 aa = 00h (?), bb = 00h (?) A. Vass: Drive Mileage
30 - ? 07E3h 8 02 21 30 xx xx xx xx xx 07EBh 8 03 61 30 aa 00 00 00 00 aa = 07h (?)
31 -,- ?,? 07E3h 8 02 21 31 xx xx xx xx xx 07EBh 8 04 61 31 aa bb 00 00 00 aa = 00h (?), bb = 20h (?)
40 - PID map 07E3h 8 02 21 40 xx xx xx xx xx 07EBh 8 06 61 40 C0 0C 00 01 00 Specifies which PIDs exist in this block
41 -,-,-,- ?,?,?,? 07E3h 8 02 21 41 xx xx xx xx xx 07EBh 8 06 61 41 aa bb cc dd 00 aa = 00h (?), bb = 04h (?), cc = 00h (?), dd = 00h (?)
42 -,- ?,? 07E3h 8 02 21 42 xx xx xx xx xx 07EBh 8 04 61 42 aa bb 00 00 00 aa = 37h (?), bb = 1Eh (?)
4D -,- ?,? 07E3h 8 02 21 4D xx xx xx xx xx 07EBh 8 04 61 4D aa bb 00 00 00 aa = 00h (?), bb = 00h (?)
4E -,- ?,? 07E3h 8 02 21 4E xx xx xx xx xx 07EBh 8 04 61 4E aa bb 00 00 00 aa = 00h (?), bb = FBh, FCh (temperature?)
60 - PID map 07E3h 8 02 21 60 xx xx xx xx xx 07EBh 8 06 61 60 C0 0C 00 01 00 Specifies which PIDs exist in this block
61 - ? 07E3h 8 03 21 61 xx xx xx xx xx 07EBh 8 06 61 aa bb cc dd 13 ee aa = 00 (?), bb = 98 (?), cc = 18 (?), dd = 80 (?), ee = 13 (?),
62 - ? 07E3h 8 02 21 62 xx xx xx xx xx 07EBh 8 ?? 61 62 ?? ?? ?? ?? ?? Should exist based on PID map, but not seen
6D - ? 07E3h 8 02 21 6D xx xx xx xx xx 07EBh 8 ?? 61 6D ?? ?? ?? ?? ?? Should exist based on PID map, but not seen
6E - ? 07E3h 8 02 21 6E xx xx xx xx xx 07EBh 8 ?? 61 6E ?? ?? ?? ?? ?? Should exist based on PID map, but not seen
80 - PID map 07E3h 8 02 21 80 xx xx xx xx xx 07EBh 8 06 61 80 00 00 00 01 00 Specifies which PIDs exist in this block
A0 - PID map 07E3h 8 02 21 A0 xx xx xx xx xx 07EBh 8 06 61 A0 00 00 00 01 00 Specifies which PIDs exist in this block
C0 - PID map 07E3h 8 02 21 C0 xx xx xx xx xx 07EBh 8 06 61 C0 00 07 00 01 00 Specifies which PIDs exist in this block
CD - ? 07E3h 8 02 21 CD xx xx xx xx xx 07EBh 8 ?? 61 CD ?? ?? ?? ?? ?? Should exist based on PID map, but not seen
CE SOC,-,- SOC, Current,? 07E3h 8 02 21 CE xx xx xx xx xx 07EBh 8 10 21 61 CE ss cc cc zz ss = SOC [0.5%], cccc = current [10 mA + 8000h] >8000h out of battery, zz = 86h, 85h (?)
CF -,-,-,- ?,?,?,? 07E3h 8 02 21 CF xx xx xx xx xx 07EBh 8 10 12 61 CF aa bb cc dd aa = 7Fh, 86h (?), bb = 07h,7Ch/89h/96h/A4/B0/BD/C9/D6 (some temperature?) , cc = 80h (?), dd= C6h & C7h normally, C2h at power down, BF & BE at power-up (?) A. Vass: Delta SOC, Batt temperatures
D0 -,-,-,- ?,?,?,? 07E3h 8 02 21 D0 xx xx xx xx xx 07EBh 8 10 1F 61 D0 aa bb cc dd aa = 0Eh (?), bb = 00h (?), cc = 00h (?), dd = 00h (?) A. Vass: Battery module voltages and internal resistance calcs
E0 - PID map 07E3h 8 02 21 E0 xx xx xx xx xx 07EBh 8 06 61 E0 C0 00 00 00 00 Specifies which PIDs exist in this block
E1 -,-,-,- ?,?,?,? 07E3h 8 02 21 E1 xx xx xx xx xx 07EBh 8 04 61 E1 aa bb 00 00 00 aa = 00h (?), bb = 00h (?)
E2 -,-,-,- ?,?,?,? 07E3h 8 02 21 E2 xx xx xx xx xx 07EBh 8 07 61 E2 aa bb cc dd ee aa = F2h (?), bb = B2h (?), cc = 99h (?), dd = F3h (?), dd = 40h (?)
E3 - ? 07E3h 8 02 21 E3 xx xx xx xx xx 07EBh 8 ?? 61 E3 ?? ?? ?? ?? ?? Should exist based on PID map, but not seen
E4 - ? 07E3h 8 02 21 E4 xx xx xx xx xx 07EBh 8 ?? 61 E4 ?? ?? ?? ?? ?? Should exist based on PID map, but not seen


  1. ) xx = don't care
  2. ) Voltage [V] * 2^17 / 1000; e.g.: 99 98 = 300 V, B3 30 = 350 V
  3. ) Voltage [V] * 2^15 / 1000; e.g.: 26 66 = 300 V, 2C CC = 350 V
  4. ) Delta [50 mV]; e.g.: 00 = 0 V; 01 = 50 mV; 02 = 100 mV
  5. ) Temper [C] + 40 = (Temper [F] + 40) * 5 / 9; e.g.: 00 = -40 C = -40 F; 28 = 0 C = 32 F; 41 = 25 C = 77 F
  6. ) The 4 bytes are, in order: Max temperature, Min temperature, Avg temperature, ?? temperature
  7. ) Limit [500 mA]; e.g.: 8A = 69 A

Data bytes

... Byte 0 Byte 1 Byte 2 Byte 3 Byte 4 Byte 5 Byte 6 Byte 7
Request 03 = No of data bytes following 22 = mode 22 request ID of ECU PID n.a. n.a. n.a. n.a.
1-byte response 04 = No of data bytes following 62 = response to mode 22 request ID of ECU PID Value n.a. n.a. n.a.
2-byte response 05 = No of data bytes following 62 = response to mode 22 request ID of ECU PID Value, high byte Value, low byte n.a. n.a.

PID maps

The entire range of 256 possible PIDs is divided in 8 blocks of 20h PIDs. The data in the first PID of each block is a bitmap of the PIDs implemented in that block. Convert the data to binary, convert each '1' to its weight, add 1 and add the base address of that block. That will give you the corresponding PID. The last bit of the last data byte is set, which converts to +20h, to point to the next data block (except for the very last block).

For example, for block 40h (02 21 40 xx xx xx xx xx) :

  • The response is 06 61 40 C0 0C 00 01 00, and therefore the data bytes are C0 0C 00 01

We convert C0 0C 00 01 to binary: 1100 0000 0000 1100 0000 0000 0000 0001

high nibble 0000 0000 0000 0000 1111 1111 1111 1111
low nibble  0123 4567 89AB CDEF 0123 4567 89AB CDEF
C00C0001 =  1100 0000 0000 1100 0000 0000 0000 0001

Now we get the weight of each '1':

0000 0000 0000 0000 1111 1111 1111 1111 high nibble of weight
0123 4567 89AB CDEF 0123 4567 89AB CDEF low nibble of weight
1100 0000 0000 1100 0000 0000 0000 0001 -> 00, 01, 0C, 0D, 1F

Now we convert those to PIDs:

00 + 1 + 40 = 41; 01 + 1 + 40 = 42; 0C + 1 + 40 = 4D; 0D + 1 + 40 = 4E; 1F + 1 + 40 = 60;

So, the PIDs in this block are: 41h, 42h, 4Dh and 4Eh. The next PID map is at 60h

ScanGauge set-up

This table shows how to set-up a ScanGauge 2 with XGAUGE to report certain parameters of the stock battery using PIDs. A PHEV should at the very least implement these PIDs.

07E321CE 056186CE0000 3810 0001000AF333 Abt Pack current [A]
07E321CE 056186CE0000 3008 000A00020000 %sc Pack State Of Charge [%]
0033 0100023B0000 2010 000100010000 Vbt Pack Voltage [V]

Causes for errors

The Prius doesn't like the following:

  • Actual battery voltage at 175 V or less (regardless of what you tell it the voltage is). Or, telling the car that the battery voltage is much higher than it really is (say, the battery is 170 V, but you tell it it's 200 V)
    • A fault is generated, car dies
    • Clear the faults, tell it the right voltage, and all will be fine
  • Telling the car that the battery is at 80 % SOC or more
    • Engine runs all the time, drawing current from the battery (about 9 A) to discharge it
  • Resistance from HV- or HV+ to chassis ground less than around 10M

MFD (Multi Function Display)

State Of Charge display

In the Energy screen, the state of charge of the battery is shown with 8 bars. The following graph shows the relationship between the SOC reported by the battery ECU and the number of bars shown. There is a hysteresis of 2.5 % (usually), and filtering with a time constant of about 15 seconds (created inside the HEV ECU - the HEV ECU reacts immediately to changes in SOC, and the display reacts immediately to changes in CAN message 529h).

More SOC images available at Toyota Prius Battery Specs.

Overriding the instrument cluster

There is a way of affecting the display of a few items in the Prius MFD through the CAN Bus, the SOC in particular.

The Hybrid ECU broadcasts a message with some of the information that the instrument cluster (including the MFD) uses to display SOC and alarms.

The message ID is 529h, it has 7 data bytes, and it repeats at most every 1 s (if there's a change in data, it is sent right away, and then every 1 s thereafter). To be exact, it's slightly less that 1 s: it's 999.5 ms.

The typical message is: 28 00 00 84 00 00 00

Byte General effect Default Bits Function Effect
0 - 28h 7 (80h) Set for 1 s whenever data change none
5 (20h) ? none
3 (08h) ? If 0, displays "Problem"
All others ? none
1 Screen doesn't change 00h 2, 4 or 6 (04h, 10h or 40h): General problem with triangle Top strip: "Problem", 1 beep, red triangle
5 (20h) General problem Top strip: "Problem", 1 beep
3 (08h) Not in Park, and the driver side door is open Full screen: "Caution: Shift to the P position when parked. The batteries will not charge if the shift position is in Neutral (N)."
All others ? none
2 Screen doesn't change 00h 0 (01h) General problem Top strip: "Problem", 1 beep
1 (02h): General problem with triangle Top strip: "Problem", 1 beep, red triangle
All others ? none
3 Screen doesn't change 8Ch 2:0 (00h to 07h) SOC bars number of bars on SOC display: 0 to 7 = 1 to 8 bars
3 (08h) brake depressed none
7 (80h) ? Always set no effect
All others ? none
4 Switch to Energy Monitor screen 00h 6 (40h) EV mode none
7 (80h): EV denied 3 beeps
All others ? none
5 Screen doesn't change 00h 4 (10h) Parking brake problem Full screen: "There's a problem with the transmission 'P' lock mechanism. Park you car on a flat surface, and fully apply the parking brake."
5, 6 or 7 (20h, 40h or 80h): EV denied Top strip: "Cannot change to EV mode now"
All others ? none
6 none 00h All ? none

To override the display, you need to put on the CAN bus that message, in such way the instrument cluster sees your message instead of the original one from the Hybrid ECU. If not done right, the MFD will flicker rapidly between the display that the Prius wants to show, and the one you want to show.

12 V system

Current draw from 12 V battery

When the 12 V battery is first connected, the car draws 1.5 A from it for about 30 seconds, then 0.62 A. That amount is enough to discharge the small 12 V battery in a matter of days.

Charging the 12 V battery

To charge a dead 12 V battery, without disconnecting it from the car, you can't use a trickle charger that provides just a few hundred milliamps. If you do, the car electronics will turn on, attempt to draw 1.5 A, swamping the trickle charger, and no current will get to the battery. Instead, you need a charger capable of more than 1.5 A (say, 2 A minimum), to handle the initial draw from the car electronics, and still have something left to charge the battery.

Alternatively, you can charge the 12 V battery by disconnecting it from the car.

Resetting after reconnecting the 12 V battery

After reconnecting the 12 V battery, you must calibrate the "Auto" function of the driver's window. If you don't do this, you can't open or close the window all the way with the Auto switch.

  • Open window half-way
  • Pull and hold window switch up until window is all the way up, and hold an additional 1 second or more

Limit to continuous EV operation

The Prius relies on the engine running for distribution of lubricant oil on the gears of the CVT (Continuously Variable Transmission). As its stock EV-only operation is limited to at most a couple of miles, after which the engine must run, it ensures that lubrication happens on a regular basis. Which leads to concerns that in a plug-in converted Prius, the larger battery allows longer EV-only operation, without lubrication. Implying that therefore, a plug-in conversion must ensure that it causes the Prius to restart the engine every few miles, then return to EV operation.

However upon further examination it should be noted that in EV-only mode all motive torque is provided by MG2 and thus not transmitted through the CVT or PSD (Power Split Device) which might more accurately be referred to as a TSD (Torque Split Device). There was a related thread implying that lubrication, while not actively circulated without the ICE running, is still present yet not as critical during EV-only mode. A number of converted PHEV Prius are operating in EV-only mode for extended distances of 10 to 30 or more miles without any adverse effects to the CVT, but we will be sure to update this section should that change in the future.

General Disclaimer:   (HV) (DC) injury or death hazard,   use at your own risk,   may void warranty.

HV (High Voltage) DC (Direct Current) Warning: Traction Battery Packs, Motors, Chargers, and other HV sources could cause serious injury or death if proper precautions are not taken while working on or around such High Voltage Direct Current sources.

Use this information at your own risk: There is no warranty expressed nor implied and we are not liable for any of your past, present, nor future actions. Even should you perform these modifications to the letter you could still damage any number of components in your vehicle causing it to no longer function. Even if it appears to function properly your actions may cause it to self destruct with collateral damage to surrounding properties other than your vehicle. By utilizing these ideas and instructions in an attempting to enhance national security, reduce gas consumption, vehicle "emissions", your carbon footprint, or smog, you do so at your own risk & peril.

Warranty: In performing some of these modifications you may void your warranty with the vehicles manufacturer.

See also our My wiki:General disclaimer