ECU Software V1 Service Commands

When using software SW1 (efi_davide_20160131_v1), it is possible to request information to the ECU in real time, using the serial communication provided by the Arduino Micro Serial1 port.

SW1 supports 8 bytes ASCII format commands (from PC, service tool, or logger), and they are interpreted by the following function, which is called every time 8 characters are received on the serial communication.

The supported ASCII commands are written below:

  • "rxxyy000": reads the injection correction parameter inside the ECU 2D map at rpm position "xx" (0-15 range) and throttle position "yy" (0-15 range). At the moment, instead of a 2D map, a 1D array is used, and the injection time correcting parameter value depends only to the rpm; for this reason, any value can be put as "yy" (from 0 to 15). When the ECU receives this command, it reads the increment value inside the RAM memory and outputs an 8 byte ASCII reply in the format "rxxyyzzz", in which "zzz" is the value of increment at rpm "xx". Example: in case it is asked the value at 3000rpm, and the increment is 20% at 3000rpm, the request will be "r0300000", and the reply will be "r0300020".
  • "r1616000": when the ECU receives this command, it outputs the complete info inside the array, in the following order: "r0000xyz", "r0100xyz", "r0200xyz", ..., "r1500xyz", in which "xyz" is the increment value for each array component, in percentage.
  • "r1616001": performs EEPROM check, to verify if there is any corruption inside the data written in EEPROM memory. In case any error is found, the standard values are written in EEPROM.
  • "w1616000": used to write standard values (array incrementi_rpm_std[]) in the EEPROM.
  • "wxxyyzzz": it writes the increment value "zzz" on rpm index "xx" (0-15 range) and throttle index "yy" (0-15 range) of the 2D map. The value is also saved in EEPROM.

In addition, a special command is described below. This command is "d1616000" and it is used to read the real time data snapshot from the ECU. When the ECU receives this command, it replies with a series of 16 bytes, which have the following structure:

  • Byte 0. Constant value "d" (data).
  • Byte 1. Constant value binary "14" (the following data are 14 bytes)
  • Byte 2-5. "delta_time_buffer" variable. It is the time, in microseconds, between one injection and the following (2 crankshaft rotations). These 4 bytes have little endian format.
  • Byte 6-9. "delta_inj_buffer" variable. It is the time, in microseconds, of the injection commanded by the Original Honda ECU. These 4 bytes have little endian format.
  • Byte 10-11. "throttle_buffer" variable. It is the throttle position sensor value acquired by the ADC (0-1023). These 2 bytes have little endian format.
  • Byte 12-15. "crc_somma" variable. It is the CRC check value to determine if previous data can be considered correct or not (there might have been any data corruption due to noise in serial communication, for example). It is the sum of the previous data fields. These 4 bytes have little endian format.

This command can be used to log data continuously when the motorcycle is running, for example by polling this command once every 100ms. The logged data can be then analyzed using other tools, such as Office Excel or Mathworks Matlab.

Author: Davide Cavaliere

I am an Italian Electrical Engineer graduated at Politecnico di Milano. My interests are motorcycles and cars, electronics, programming, Internet of Things, and Japanese culture.

Leave a Reply

Your email address will not be published. Required fields are marked *