CAN bus Mapping

From TechWiki
Revision as of 11:47, 19 October 2026 by Happy.smiler (talk | contribs)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

Introduction

This page documents CAN bus signals and decoding investigations on the Lotus Exige V6 platform. The reference vehicle is a 2021 Lotus Exige 390 Final Edition. Some signals may be shared with other Exige, Evora or Elise models, but such compatibility should not be assumed without testing.

The work uses a passive, listen-only CAN interface to collect standard 11-bit CAN frames from the high-speed vehicle bus. No control or diagnostic frames are intentionally transmitted. The purpose is to support data logging and an iPhone dashboard without altering the vehicle.

Last updated: 19 October 2026.

For discussion, evidence and contributions, see the SELOC CAN Bus Mapping thread.

Evidence classifications

  • Confirmed – Signal behaviour identified through tests on the reference car.
  • Identified in firmware – Working application-level interpretation; exact underlying raw mapping not yet published here.
  • Provisional – Candidate byte, scaling or interpretation requiring additional correlation.
  • Reference – From an earlier third-party mapping, not yet independently validated on this car.
  • Observed – Frame captured but meaning unknown.

Unless specified otherwise, all byte indexes are zero-based (B0 is the first byte); all identifiers and masks are hexadecimal.

Test vehicle and equipment

Item Detail
Vehicle 2021 Lotus Exige 390 Final Edition, 3.5-litre V6
Network High-speed CAN, 500 kbit/s, standard 11-bit frames
OBD-II connection Pin 6 (CAN-H), pin 14 (CAN-L)
Microcontroller ESP32-C3
Transceiver SN65HVD230
Interface mode CAN listen-only (passive capture)
Output BLE connection to iPhone dashboard

The CAN reader is not an OBD-II PID scanner: it listens to native broadcast CAN messages. Generic OBD-II diagnostic requests and responses are a separate mechanism; see On board diagnostics.

Safety: Do not add unnecessary bus termination.

CAN identifier summary

CAN ID DLC Candidate or decoded function Status
0x085 5 Steering angle Confirmed
0x0A2 7 Wheel speed / vehicle speed Reference
0x0A4 8 Additional wheel speeds Reference
0x0A8 3 Mode/status candidate Provisional
0x102 3 Unknown frame Observed
0x114 6 Throttle, clutch, brake, mode button; RPM reference Mixed (see below)
0x0B7 7 Unknown high-rate frame Observed
0x303 7 Chassis dynamics (yaw / lateral acceleration) Provisional
0x400 7 Vehicle status; fuel and temperature hypotheses Observed / provisional

Driving mode: Normal, Sport and Race are identified and displayed correctly by the project firmware and iPhone app. The exact raw source CAN byte or state-machine definition is not yet documented on this page; do not equate the mode-button bit with a direct selected-mode byte.

Detailed CAN mappings

0x085 – Steering angle

DLC: 5

Bytes Encoding Formula Status
B0–B1 Signed 16-bit, little-endian Steering angle (degrees) = raw × 0.09 Confirmed
B2–B4 Undetermined – Unknown

0x0A2 – Wheel/vehicle speed

DLC: 7. An earlier Exige V6 RaceCapturePRO mapping associates this identifier with wheel/vehicle speed. Byte-level decoding has not yet been confirmed on this reference vehicle.

Status: Reference.

0x0A4 – Additional wheel speed

DLC: 8. Earlier RaceCapturePRO material identifies additional wheel-speed information here. Byte-level validation remains outstanding.

Status: Reference.

0x0A8 – Candidate status

DLC: 3

Byte Observations Interpretation Status
B1 0x01, 0x09 Possible vehicle or mode status; not conclusively decoded Provisional

Do not treat these raw values as an established Normal/Sport/Race mapping.

0x102 – Unidentified frame

DLC: 3. Example at standstill: 00 00 9C. Status: Observed.

0x114 – Engine and driver inputs

DLC: 6

Byte/bit Signal Decode Status
B0–B1 Engine RPM Older reference: 16-bit raw × 0.25; endian/order must be checked against captures Reference / calibration tested
B3 Throttle / accelerator Percent = raw × 100 / 255 Confirmed
B4 bits 4–5 (0x30) Clutch input See below Confirmed
B4 bit 7 (0x80) Drive-mode button activity 0 = inactive; 1 = active Confirmed
B5 bit 0 (0x01) Brake pedal 0 = released; 1 = pressed Confirmed

Clutch input

Apply mask 0x30 to B4:

Masked value Observed state
0x00 Released
0x10 Intermediate
0x20 Deeper / fully pressed

Drive-mode button versus selected mode

B4 bit 7 captures activity of the mode selector. It does not directly report the selected driving mode. See Driving modes.

Engine RPM testing

Engine tests have included idle and approximate 2,000 and 3,000 RPM holds. A discrepancy between the dashboard and an initial iPhone display led to subsequent firmware corrections. Publish a final byte order and scaling only after checking the corrected output against recorded raw frames.

0x0B7 – High-rate unidentified frame

DLC: 7. B3 and B6 change frequently. Status: Observed.

0x303 – Vehicle dynamics

DLC: 7. A strong candidate for yaw-rate and lateral-acceleration data. B4 has been investigated for lateral acceleration, but signedness, offsets and scale factors are not yet validated.

Status: Provisional.

0x400 – Vehicle status, coolant and fuel candidates

DLC: 7

Recorded example: 00 00 00 02 C4 81 18

The following assignments were investigated during firmware development and are not yet a validated decoding of this entire frame:

Byte Candidate signal Proposed calculation Status
B4 Fuel level Percent = raw × 100 / 255 Provisional; exact byte/source needs correlation
B6 Coolant temperature Degrees C = raw − 40 Provisional; raw frame correlation required

Consistency check: In the example frame B6 is hexadecimal 0x18 (decimal 24), giving −16°C under the proposed temperature formula. That is not a plausible warm-engine reading. Accordingly, the example does not validate this coolant mapping. Similarly, B4 is 0xC4 (decimal 196), not the separately observed fuel candidate raw value 137. Avoid combining measurements taken at different times into a single supposedly validated frame.

Driving modes – Normal, Sport and Race

Status: Identified and working in firmware / iPhone application.

The three selected drive modes have been identified in project testing. The firmware distinguishes the states and passes the result to the iPhone display.

Decoded state Displayed mode Project status
0 Normal Identified
1 Sport Identified
2 Race Identified

These values are decoded application states. They are not presented as raw values from a specific CAN byte until the underlying message, byte/bit and test captures are documented here.

Related known signal: 0x114, B4 bit 7 (0x80) = drive-mode button input. This is separate from the selected-mode value.

Coolant temperature – test record

Dashboard readings from one stationary warm-up/cool-down test:

Time Dashboard temperature Condition
19:09 46°C Engine running
19:14 68°C Engine running
19:17 78°C Engine running
19:19 84°C Engine running
19:21 84°C Engine stopped; ignition on
19:39 68°C Engine off; ignition switched off after observation

The dashboard trace is a useful ground-truth comparison for raw CAN captures. A conventional raw − 40 temperature decoding has been investigated. A definitive ID/byte assignment cannot be claimed solely from these dashboard observations.

Fuel-level candidate

A provisional fuel-level calculation is:

Fuel (%) = raw × 100 / 255

For an observed raw value of 137, the calculated level is 53.7%, broadly consistent with a dashboard gauge near half full. This is an initial plausibility check only, not proof of the byte assignment or a linear relationship over the entire tank range. Further measurements while refuelling and driving are needed.

Calculated gear position

The Exige uses a manual gearbox. A gear estimate can be derived by comparing engine RPM with vehicle speed and matching the RPM/speed ratio against expected ratios for each gear. Neutral, clutch operation, low speed and wheel slip require special handling.

Status: Algorithm tested successfully with simulated inputs on the bench; in-car driving validation outstanding.

iPhone display project

An ESP32-C3 sends decoded data over BLE to an iPhone application. The iPhone app was at version 1.1 during this work; the ESP32 firmware has an independent version history.

Information Status
Steering angle Confirmed CAN signal
Accelerator input Confirmed CAN signal
Clutch and brake switches Confirmed CAN signals
Normal / Sport / Race mode Identified and displayed by app
Engine RPM Display/calibration tested
Coolant temperature Temperature observations recorded; byte map provisional
Fuel level Provisional decoding
Vehicle speed / wheel speeds Reference mapping, road validation pending
Calculated gear Bench tested, road validation pending
Yaw/lateral acceleration Candidate signal
Exhaust valve state Not yet identified
TPMS values Not yet identified on the CAN bus

Open investigations

  • Publish raw CAN evidence and exact byte/bit decoding for the selected driving-mode state (modes themselves have been identified).
  • Confirm coolant-temperature CAN ID, byte and scaling against dashboard reference values.
  • Confirm fuel-level source, scaling and tank-gauge behaviour.
  • Validate wheel speeds and calculated gear while driving.
  • Validate yaw rate and lateral acceleration, including scale and sign.
  • Investigate exhaust-valve state and whether TPMS information is broadcast on the accessible bus.
  • Check mappings on other Lotus models and model years.

Contributing a new mapping

Please include the vehicle model/year, CAN ID, DLC, zero-based byte/bit, raw sample frame(s), interpretation, formula, units, capture/test conditions and whether the finding was independently confirmed. Avoid marking a value as confirmed based on a single static frame or a coincidental numerical match.

Field Example
Vehicle Exige 390 FE, 2021
CAN ID 0x085
DLC 5
Data location B0–B1
Data type Signed 16-bit, little-endian
Conversion raw × 0.09°
Test Turn steering wheel and compare observed changes
Status Confirmed

References and further reading

Disclaimer

This is independent enthusiast reverse engineering, not an official Lotus specification. Differences may exist between ECUs, model years, variants and firmware. Provisional definitions should not be relied upon for safety-critical uses or used to control vehicle functions.