GTR RaceROM V9 Secondary Injection
The guide is in progress….
Introduction
New for RaceROM version 9 is a fully adjustable secondary injection system, the basic operation is as follows (there are more steps and calculations but these are the basics)
Secondary injection activation is determined based on load, projected secondary inj pw and duty
The desired overall fuel mass for the current stroke is calculated
If secondary injection is active, the total fuel mass is divided between the primary and secondary injections based on the split %
The required secondary fuel mass is converted into an injection time based on calibrated injector flow rate at the measured differential pressure
The calculated secondary injector lag time is determined from calibrated map using differential fuel pressure and voltage
Total secondary injector pw is send to the external device and used to turn on the injector (timing is handled entirely by the external device)
Primary injector effective pulse width is trimmed to compensate for the mass of fuel delivered by the secondary injectors
Tuning
Before attempting to tune the secondary injection, first be absolutely sure the engine is accurately calibrated using only the primary injectors.
Once enabled in SI Control Options there are four key elements to tuning the secondary injection:
Ensure the primary and secondary injector scaling is accurate
Ensure the primary and secondary injector lag times are accurate
Set the proportion of fuel for the secondary injectors to inject using SI Secondary Injection Target (Gasoline)/(Ethanol)
Set the maximum duty cycle you would like to see on the primary injectors using SI Pri Duty Cycle Maximum
We cannot stress enough how absolutely important it is to have the injector flow rates and lag times set accurate for both sets of injectors is. Errors that may not be apparent when using just the primary injectors can become much more significant when using two sets of injectors. Do not rush, do not just assume you can tune a car from scratch at high power using ethanol and secondary injection without first checking the basics.
Datalogging
TBA
CAN Protocol
For the secondary injection to work successfully there are two CAN packets involved, one sent from the ECU to the secondary injection driver and another that is sent back from SI driver to the ecu. This may be subject to change or addition in future.
RaceROM Can Input (received by the ECU from the device)
Baud 500kb/s. 11bit default ID 0x334. Recommend frequency 25 or 50hz
Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | |
Version | Multiplex | Pulsewidth Actual | Fuel Pressure | Ethanol % | Aux Input | Error Flags | Checksum |
Byte | Name | Scaling |
1 | Version (4 bits) Multiplex (4 bits) | Fixed value. Currently 0x11. |
2&3 | Pulsewidth Actual (16 bit big endian) | 0.01ms/bit. |
4 | Fuel Pressure (8 bit) | 10kPa/bit (0.1 bar/bit). |
5 | Ethanol Content (8 bit) | 1%/bit. |
6 | Aux Input (8 bit) | unscaled. |
7 | Error Flags (8 bit) | 0 = good, non-zero indicates error. |
8 | Checksum (8 bit) | CRC8 algorithm. |
RaceROM CAN Output (sent from the ECU to the device)
Baud 500kb/s. 11bit ID Default ID 0x335 default 25Hz
Byte 1 | Byte 2 | Byte 3 | Byte 4 | Byte 5 | Byte 6 | Byte 7 | Byte 8 | |
Version | Multiplex | Pulsewidth Target | Aux Output 1 | Aux Output 2 | Injector Enable | Checksum | ||
 |  |  |  |  |  |  |  |  |
Byte | Name | Scaling |
1 | Version (4 bits) Multiplex (4 bits) | Fixed Value. Currently 0x11. |
2&3 | Pulsewidth Target (16 bit Big Endian) | 0.01 ms/bit. |
4&5 | Aux Output 1 (16 bit Big Endian) | 0.1% per bit |
6 | Aux Output 2 (8 bit) | 1% per bit |
7 | Injector Enable Mask (8 bits) | 1 bit for each injector, 1 = ON |
8 | Checksum (8 bit) | CRC8 algorithm |
CRC8 Algorithm
For some of our EcuTek defined CAN packets, a CRC is employed to validate that the data is sent from the device we are expecting and not some other random device with the same CAN ID. We also send a checksum value that your device can check to validate the data sent by the ECU.
Below is the exact function used which can be replicated by third party device makers.
const uint8 CRC8_TABLE_LO[] = { 0x00, 0x1D, 0x3A, 0x27, 0x74, 0x69, 0x4E, 0x53, 0xE8, 0xF5, 0xD2, 0xCF, 0x9C, 0x81, 0xA6, 0xBB };
const uint8 CRC8_TABLE_HI[] = { 0x00, 0xCD, 0x87, 0x4A, 0x13, 0xDE, 0x94, 0x59, 0x26, 0xEB, 0xA1, 0x6C, 0x35, 0xF8, 0xB2, 0x7F };
uint8 COM_calc_crc8(uint8 *buffer, uint8 len, uint8 skip, uint8 crc)
{
 uint32 j;
 uint8 data;
Â
      for(j=0;j<len;j++)
      {
             if (j != skip)
             {
                    data = buffer[j];
                    data = data ^ crc;
                    crc = CRC8_TABLE_HI[data >> 4] ^ CRC8_TABLE_LO[data & 0x0F];    Â
             }
      }
      return crc;
}
 To use the function:
buffer is a pointer to the 8 bytes of CAN data,
len is the length of the CAN data (normally 8)
skip is the index of the checksum byte which gets excluded from the calculation
crc is the initial value of the checksum, we can define this per device but we normally just use FF