Bosch ME7.1.1

From The 07K Wiki

This section is underdevelopment. Feel free to add content.

Reading, writing and checksums

For reading and writing procedures refer to Reading and writing ECU (ME7.1.1)

Most flashing tools fix checksums automatically, if you wish to fix them manually, you can use LSuite

Definition file can be found here. If you are getting started with tuning with recommend consulting : Introduction to tuning

Terminology (Acronyms)

Maps and variables names are identified under acronyms. Knowing some of them will be useful and will help you remember map names.

Here is a list of the useful ones.

List of acronyms
Acronym German English
A Auslaßnockenwelle aktiv Exhaust camshaft active
AB Abregelfaktor Derating factor for acceleration signal
AL Adaptation Lastbereich Adaptation load range
ASR Anti-slip regulation
BB Betriebsbedingungen Operating conditions
BG Berechnete Große Calculated variable
BTS Bauteilschutz Component protection
CW Code word
DFPM Diagnose-Fehlerpad-Managers Diagnostic Faulth Path Manager
DK Drosselklappe Throttle valve
DS-S Pressure sensor (MAP) on intake manifold
E Ersatzwert Substitute value
ESUK Einspritzung Ubergang Kompensation Injection transition compensation
FA Fahrer Driver
FGR FahrgeschwindigKeitsregler Cruise control
FK Faktor Factor
FUEREG Fullungreglers Filling regulators
HFM Hot film air mass sensor
KF Kennfeld Map
KL Kennlinie Curve
KN Klopfereignis Knock event
KR Klopfregelung Knock control
KRA KR-adaptation KR-Adaptation
KUPPL Kupplung Clutch
KW Kurbelvelle Grad Crankshaft degrees
LL Leerlauf Idle
LLK Leerlauf und geoffneter kupplung Idle and open clutch
LLRBB Leerlaufregelung Betriebs dedingungen Idle control operating conditions
LU Laufunruche Unstediness / roughness
LUAR Laufunruhe-Abstandsmass-Referenzwert Rough running distance measure value
LUR Laufunruche-Referenzwert Rough running reference value
MBVH Missbrauchverginderung Abuse prevention
MI Motormoment indiziertes Indicated torque
ML Motor Luftmassendurchsatz Engine air mass flow
MN Minimum
MS Massenstrom Mass flow
MX Maximum
N Normierter Normalized / NM
NW Nockenwellen Camshafts
NWS Nockenwellengsteverrung Camshaft control
OP Optimales Optimal
PVD Pressure vor Drosselklappe Pressure in front of DK
RL relative Luft Relative air filling (load)
RLMIN Relative mimale Luft Relative minimal air (filling)
SA Schubabschatten Fuel cut-off / overrun
SOL Soll Should
SW Schlechtwegstrecke Rough road
TPKHFM TemperaturKorrektur HFM Temperature correction HFM
TUM Umgebungstemperator Ambient temperature
TV Delay time
UGD Ungedroselt Unthrottled
V Verzogert Delayed
WDK DK-Winkel DK angle
WKR Winkelspatverstellung Angle retard KR
WL Warmlauf Warm up
ZUL Zulassig Allowed limit
ZW Zundungs Winkel Ignition angle

Engine management

The ME7.1.1 use a ST10F275 micro-controller. This set it apart from most ME7 ecus that use the Infineon C167_SR.

There are no public funktionsrahmen for the ME7.1.1. You will have to refer to the following funktionsrahmen : ME7.5 Funktionsrahmen, MED9.1 Funktionsrahmen and MED17.5 Funktionsrahmen

For the fuel injection and knock control system, you can refer to ME7.5 / MED9.1 FR.

Intake manifold pressure schemes are will be found on the MED17.5 FR.

Most other modules will be based on the MED9.1 architecture.

This ecu is load-dependent. Most map works with the requested load or the actual load.

Air mass



The ME7.1.1 use a Bosch HFM5 sensor.

The HFM5 return an analog voltage signal to the ECU. The ECU use this sampled voltage value in the MSHFMU map to determine the air mass flow.

Over time voltage drop can happen in the signal wire, this will influence the measured value. For this reason, Bosch switched from a sampled voltage measurement to a sampled period measurement. Sampled period measurement is covered in HFM6.

For more information regarding the HFM5 sensor, refer to HFM5.pdf


The HFM6 is not used on ME7.1.1, but I believe covering this sensor is pertinent and interesting.

The HFM6 use a similar design to the HFM5. The bypass channel is flow-optimized compared to the HFM5.

The HFM6 transmit a digital signal for the measured air mass. The air mass measurement is evaluated by the frequency (period) instead of the signal voltage.

The advantage of using a digital signal is that voltage drop / interference does not influence the measurement, which make it more reliable than the HFM5. If the HFM fails, the ECU will use a substitute air-mass model stored in the ECU, like the BGMSDK module (Calculation from throttle angle)

For more information regarding the HFM6 sensor, refer to HFM6.pdf (this is a great document to get a better grasp of HFM)

Reverse flow / pulsations

On some conditions (like intake valve closing, for example), the air might go back through the HFM and influence the readings. Different displacement elements can influence pulsation. To correct these pulsations, the ECU will rely on pulsation map : KFPU, KFPUKL1

The ECU will select a specific pulsation map depending on which elements are influencing pulsations. When using an aftermarket MAF, if you do not wish to deal with those maps, you can set the pulsation maps to 1.0 to disable the pulsation compensations. It should not have much incidence on the engine safety. Please keep in mind that while the engine is on "boost", the HFM is not affected by reverse flow or pulsations. The pulsation compensations are in place to ensure an accurate air mass reading at all-time which lead to more control for stoichiometric AFR thus resulting in better emissions.

Special notes regarding MSHFMU

The map MSHFMU have a lower resolution compared to its equivalent on ME7.5 ECUs (MLHFM)


The start address of the map MSHFMU is also incorrect in most definition file (A2L), you will need to offset it to have the proper data.

In most instances, you can offset the start address by -0x104 (or -260 in base 10) to fix the start address


BGMSDK (Calculation from throttle valve angle)

This module calculate an air mass flow based of the throttle valve angle, a pressure ratio (intake manifold pressure / the pressure before the throttle valve) and the gas temperature (since it affects air density)

The map KFMSNWDKVP stores the air mass flow depending of the opening angle and the pressure ratio according to the following standards:

  • Pressure in front of throttle valve (before) = 1013 hPa
  • Gas temperature = 0°C

A pressure and a temperature correction factor is applied to to the standardized mass air flow (Respectively, ftvdk and fpvdk).

*Gas velocity is equal to the speed of sound under a pressure ratio of 0.528

Interesting to note the temperature correction factor (ftvdk) formula:

273 Kelvin = 0°C

For the pressure ratio (fpvdk), it would be as simple as :

Maximum cylinder filling (load)

KLRLNMXN : Maximum normalized fresh air charge with an open throttle valve

BGRLMIN (Minimum air filling)

To ensure homogenous mixture, a minimum air filling is required. The minimum filling is a compromise between combustibility (lowest injection time), lowest intake manifold pressure and not set too high to avoid jerky conditions from idle to acceleration.

The minimum air filling is defined by the following characteristic curves :

  • RLMNN : Minimum charge
  • RLMNSAN : Mininmum charge in overrun
  • RLMNSAKT : Minimum charge in overrun at high cat temperature

When you release the accelerator pedal, the throttle valve will not fully close to respect the minimum air charge. Reduce the values in the RLMN tables can help to reduce the "rev-hang".

Fuel injection

ESUK (Transient compensations)

This module adjusts the injection for transient conditions. The map WFRL contains the amount of fuel that is stored stationary in the wall-film (fuel puddle) at the respective load (pressure).

When the load (pressure) change, the difference in the fuel quantity of the wall-film (fuel puddle) is calculated to ensure the correct air/fuel mixture on transient condition.

Transient condition

Transient conditions are triggered by acceleration / deceleration. (Any drastic change in manifold pressure)

The transient condition cause a change of pressure that makes the engine run leaner / richer for a short moment until equilibrium is reached again.

Some of the injected fuel forms a fuel film (puddle) on the port. On a steady engine, the fuel film (puddle) evaporate at a constant rate, making it possible to achieve our desired AFR.

On acceleration, the pressure increase. This increased pressure force against the fuel molecules that are trying to evaporate from the fuel film (puddle). This slows the rate of evaporation momentary, making the AFR leaner for that moment. (Remember the engine burn the vapors).

On deceleration, the pressure decrease. The decreased pressure make it easier for the fuel molecules to evaporate. The rate of evaporation is faster momentary, causing the AFR to be richer.

Controlling the AFR

TLAFA : Delay time for lambda driver request active

  • Set to 0

ZKLAMFAW : Time constant filter for enrichment by driver request

  • Although the funktionsrahmen define this constant as a time constant, ZKLAMFAW represent a percentage of change per ECU cycle. Each cycle, the current enrichment value increase by a percentage until the desired value is achieved. To increase the speed of change, you can increase ZKLAMFAW. You can use this correction factor : 0.001525902 Setting the "percentage" over 50 will make the change quicker.


The LAMFA map stores the desired lambda (λ / AFR ratio relative to the stoichiometric ratio) according to the engine (nmot) and the relative desired torque from the FGR (cruise control) and the accelerator pedal (mrfa_w).

The inconvenience with controlling the AFR with this map is that the map does not use the actual load, but the "desired" load. This means that the engine could be on a low load and the driver could request a high loader that would set the AFR really rich on a low load engine, since the AFR is dependent on the driver wish (desired load) and not the current engine load (rl)


The KFLBTS map define which AFR ratio to use when the component protection mode (BTS) is active.

This map has a high resolution that allow to be very precise on multiple engine conditions (load and engine speed).

We can force the engine to go into BTS to use this map at all time to control AFR. One downside of using this method is that we loose one OEM safety feature. It is important to understand why this map exist in the first place. The ECU should use this map to affect the air-mixture only if one component (such as catalytic converter, exhaust gas) reach a temperature threshold. The purpose is to increase the fuel delivery to cool down the components.

Forcing BTS

Set the following threshold to 0 : TKATBTS AND TABGBTS

Zero out KFDLBTS (Delta map for BTS according to ignition angle) and KFFDLBTS (which is the coefficient factor map used with KFDLBTS)

You can set ZLBTS and ZLBTSDLMX higher if you want to smooth out the enrichment (refer to page 2579 of the MED9.1 FR)

Fuel cutoff

KFTVSA : Delay time for overrun cutoff

KFTVSAGI : Delay time for overrun cutoff for "actual gear"

  • Zero out maps

KFTVSAKAT : Delay time for overrun cutoff for high cat temperature

  • You can zero out this one or you can choose to set the delay to 10s on high temp / rpm

RKTI (Injection duration calculation from relative fuel mass)

This module calculates the effective injection time from the relative fuel mass rk_w, rk2_w and the factor frkte before the fine adjustment tevfa_w + tuv_w, tevfa2_w + tvu_w.

In practice, non-linearities in injectors or pulsations in the fuel circuit can cause a lambda deviation to appear. This deviation is corrected via the map FKKVS ( engine rpm, effective injection time). The corrected effective injection time is te_w, te2_w.

The activation time / dead time of the injector is formed by adding the battery voltage correction.

On returnless fuel-rail system (like the 2.5 engines), the code word CWPKAPP is set to 0. This makes possible to apply injection time correction based on the pressure differential. With CWPKAPP set to 1 (return type fuel-rail), the intake pressure is constant since it does not need differential correction. (Flow rate is compensated by the vacuum operated fuel pressure regulator)

Here are important map / constant to rescale if you change injector size:

  • KRKTE : Conversion of relative fuel mass rk into effective injection time
  • FKKVS : Corrector factor for fueling system

KRKTE calculation

The following formula is taken directly from the funktionsrahmen.

The variables :

  • rho0Luft = 1.293 g / dm³ (Air density at 0°C and 1013hPa)
  • Vhzyl = dm³ (Displacement of a cylinder in dm³)
  • Qstat = g / min (Valve constant at n-heptane)
  • 1.05 = Valve correction for gasoline
  • Lst = 14.7 (Air ratio for lambda)
  • NormK = 0.00001667 min / ms (Unit customization)

The formula :

Simplified formula for gasoline :

You can also use this spreadsheet and fill in the information (has provision for ethanol content) : KRKTE calculator updated.xlsx

NOTE: In some definition file, the factor offset for KRKTE might be wrong. The factor offset will vary depending on the MCU clockspeed:

  • 24 MHz : 0.0001111
  • 32 MHz : 0.0001333 (This is what you would use for a ST10F275 on the ME7.1.1)
  • 40 MHz : 0.0001666

When changing injectors size, you might be interested into editing the constant KVB (consumption display)

Continuous lambda control

LALIUSMN : minimum measurable lambda

You can use the following codeword to change the behavior of the continuous lambda control: CLRS

Configuration bits:

  • Bit 0 : continuous lambda control permitted on bank 1
  • Bit 1 : continuous lambda control permitted on bank 2
  • Bit 2 : additional amplitude active on both bank
  • Bit 3 : not used
  • Bit 4 : not used
  • Bit 5 : If true : if mixture is richer than minimum measurable lambda, the integral part of the controller is regulated with the time constant TAUIDEC. If false : integral part stops
  • Bit 6 : If true : the controller is reset as soon as the setpoint lamsons_w falls below the LALIUSMN threshold (minimum measurable lambda) If false : the controller continues to operate normally
  • Bit 7 : If true : if B_mdarv = true, the continuous lambda control is blocked If false : Not blocked by B_mdarv

You can set CLRS to 1 to disable bit 6 and bit 7. This prevent the ecu from releasing the lambda control if it gets below LALIUSMN (Minimum measurable lambda)

Ignition control

FTOMN : minimum closing time for ignition coil

The following maps are used for ignition advance :

  • KFZW : ignition map variant 1
  • KFZW2 : ignition map variant 2

Variant 1 is used when variable camshaft is inactive. Variant 2 is used when variable camshaft is active.

  • KFZWMS : map with permanently latest possible ignition angle
  • KFZWMN : min ignition angle
  • KFZWWLNM : delta ignition angle during warm-up
  • KFZWWLRL : delta ignition angle during warmp-up

The above maps are load and temp-dependent and are used this way :


Cam phasing control

The 07K engine only have variable cam on the intake side.

  • KFNWWUE : map base angle for camshaft adjustment (intake)
  • KFNWSE : map for camshaft spread (intake)
  • KFWNWSAPE : map for camshaft spread during the intake application phase
  • KFNWWLE : map for camshaft spread during warm-up (intake)
    • cold engine
  • KFNWWLLE : map for camshaft spread during the warmup at idle (intake)
    • cold engine and idling
  • KFNWLLE : warm engine and idling
  • NMKFNWLLE : speed threshold for activating LL target angle maps for intake camshaft
    • Not used on stock ecu, if increasing max engine speed, set this above max engine speed.

Knock control, misfire detection

  • KRANH : knock control adaptation speed hysteris
  • KRAL1N, 2N, 3N : knock control adaptation load range
  • KRFKLN : retard per knock event with slow advance
  • KRFKN : retardation per knock event
    • On turbo application or severe application, it is recommended to use more retardation

DMDLU (Diagnosis misfire detection ; unsteady running)

(Playing with DMDLU is not recommended.)

At each combustion, misfire detection is calculated based on reference points. During the cat heating of the warmup, the lurs threshold is limited by LURKHE and the minimum value is limited by LURMINKHE.

On normal conditions, lurs is determined by the KFLURB maps plus a coolant temp-dependent correction value LURKTM maps.

In normal conditions at idle, the map LURBMI is used to determine lur.

KFLURB maps :

  • KFLURB : manual switch or when no control of convert lock-up (auto gearbox)
  • KFLURB1 : W/ B_wk true (converter clutch bridged)
  • KFLURB2 : W/ B_wkr (converter clutch regulated)

KFLURM maps :

  • KFLURM : B_wk = FALSE (converter clutch not bridged)
  • KFLURM1 : B_wk = TRUE (converter clutch bridged)

KFAMAL maps :

  • KFAMAL : B_wk and B_wkr = TRUE
  • KFAMAL1 : B_wk = TRUE and B_wkr = FALSE
  • KFAMAL2 : B_wkr = TRUE

DMDSTP (Diagnosis misfire detection - stop condition)

  • DRLSOLA : load dynamics threshold for suppression
    • Load gradient
    • No interpolation
    • Used to suppress misfire detection at start-up

DMDTSB (Diagnosis misfire detection - segment timing)

  • ZYLKOR : cylinder correction value
    • Used to get zzyldmd which tell which ignition the current segment time tsroh_w belongs to.
  • KAMF2 : start of segment or measurement window for segment time recording

Torque interface (MDBAS)

The MDBAS on the ME7.1.1 is based on the MED9.1. Refer to the MED9.1 FR for further information if needed.

The purpose of MDBAS is to ensure that the actual torque / requested torque never exceeds the maximum torque.

The map KFMIOP store the optimal torque (0-100% range) according to the actual load / engine speed. If the actual torque exceeds KFMIOP, torque will be limited to KFMIOP and might interfere with timing. For NA application, you should not have to edit this map since you will probably never reach or exceeds the optimal torque or the load axis.

The maximum load axis in KFMIOP consequently defines the maximum load request.

Interesting point to note, the map KFMIRL is likely an inverse of KFMIOP. Instead of giving the torque according to the load, it gives the load according to the relative torque (0-100%).

Originally, the load axis on KFMIOP for a 2.5 engine stops at 100, but if we take a look on KFMIRL, load can go up to 133. This means that if we were to rescale the load axis of KFMIOP(for turbo application, for example), we could fill the table with genuine values (up to 133) instead of doing wild guesses with linear extrapolation.

The map KFZWOP and KFZWOP2 contains the optimal ignition angle (MBT) according to the engine speed and load. The ECU will use values between those two maps, depending on the intake cam adjustment. Please note, they are not used to control timing. They are used in conjuncture with the KFMIOP map to determine the actual engine torque based on engine speed, load and timing. (Optimal torque is achieved at optimal ignition angle)

The maps KFZWOPA and KFZWOPA2 are duplicate of KFZWOP and KFZWOP2. (The 2.5 does not have exhaust valve control, the ZWOPA maps are used for exhaust valve control)

* When rescaling axis (such as engine speed and load) on KFMIOP, the following map will need to be adjusted: KFMIRL, KFZWOP, KFZWOP2, KFZWOPA, KFZWOPA2

Accelerator pedal / throttle

*The driver does not request a throttle angle, but a desired relative torque

KFPED : Relative driver desired torque from accelerator pedal

KFPEDL : Relative torque desired at low speed

KFPEDR : Relative torque desired in reverse gear

KFZDASH : Time constant for throttle dashpot

KFZDASH2 : Time constant for throttle dashpot at low clutch torque

TVWDKS : Delay time for desired throttle valve angle

TVDK : Delay time after closing the throttle valve

Idle speed

NLLMG : Target speed for idle steady-state

NLLMGFS : Target speed when set

KFNLLNST : RPM curve after start


Engine speed

NMAX : Engine speed limitation

NMAXFA : Increased speed limit for function request (workshop test)

NMAXGA : Maximum allowable engine speed (stationnary)

NMAXOGGA : Maximum permissible engine speed (temporary increase)

NMXBENOT : Maximum speed with gearbox emergency operation

NMAXTMM : RPM limitation at high engine temperature

NMAXTO : RPM limitation at high oil temperature

NMAXDVG : Speed limit for automatic transmission in the event of speed failure

  • Set those maps to the RPM limit you wish (for example 7500rpm)

You can also adjust those map if you want to.

NDNWMX : Maximum speed for camshaft control diagnosis

NNWMX : Max. threshold for switching off the NW adjustement

  • Set them over your RPM limit

NMINMBVH : Minimum engine speed to activate the MBVH anti-misuse system

  • Set higher than your RPM limit to desactive this system

Vehicule speed

VMAXESP : Maximum permissible speed in the event of ESP failure VMAXNB : Maximum permissible speed in normal operation

  • Max them out (FF FF) to disable the vehicule speed limiter

Brake boost

WPMXBR : Maximum permissible pedal value when brake is actuated

  • Max out (FF FF)

Oxygen sensors

CDKATSPF : Cat diagnosis

CDHSHE : Diagnosis of heating probe of o2 after cat

CDLASH : Lambda probe aging diagnosis

CLAHSHE : Error class for output stage heating of o2 after cat

  • Set to 0x0 to disable diagnosis

Secondary air injection

CDSLS : SAI diagnosis

CLASLPE : Error class for SAI pump

  • Set to 0x0 to disable diagnosis

Disabling DTC

The DTC are stored under error class that are defined in a "DTC table". The index at which a certain error class/DTC is stored in the DTC table can be calculated with a simple formula.

Before getting started, you should define the following address that you will use for calculations:

  • CDC (CARB codes, OBD2 generic) start address : CDCAAA
  • CDK (Kundle (Customer) / Manufacturers codes) : CDKAAA
  • CLA (Error class aka DTC table) : CLAAAA

You can use the .A2L file that match your ECU:

Cdc address.png

In this case the CDC start address would be 0xE59C2. (The offset of 0x800000 has been substracted from the address)

Once the start address are defined, we can proceed to the calculation of the DTC index.

For generic codes (Starts with P0XXX):

We will use the table CDC

For manufacturer code:

We will use the table CDK

Finding the index

Let's assume we want to remove the code P0302, this is a generic code, so we will be using the table CDC.

In WinOLS (or your map editor of choice), set the view in 16bits, FF, LoHi

Go to (Control-G) the start address of CDC, in this example it would be 0xE59C2

Search for an hexadecimal (using Control-F) with the DTC code : 0302

You should see 0302 repeating 4 times, we want the address of the first occurence of the block of 4. If you see a block of 6, ignore the first two occurences.

CDC table.png

The address of the first occurence of 0302 would be 0xE5DE2.

Now to get the index we use this formula :

Index = (address of the first occurence - start address of the table) / 8

In our example it would be :

(0xE5DE2 - 0xE59C2) / 8 = 0x84

Index is 0x84

Locating the error class in the CLA table

Using the start address provided by CLAAAA, use the following formula:

CLA error class address = CLA start address (CLAAAA) + index

In our example it would be :

CLA error class address = 0xE05B1 + 0x84 = 0xE0635

The address 0xE0635 contains the error class for the DTC P0302.

To disable the DTC set the byte at the address 0xE0635 to 0.

ASM Patch for P1681 - Control Module Programming Not Finished

On older ME7.1.1 with the C167 microcontroller, the ECU can prevent engine start if a diagnostic / programming session has been interrupted. This usually happens during logging session. The following patch prevent the P1681.

Search for the following to locate the subroutine:

E6 ?? 0F 5A

The subroutine looks like this:


We need to bypass the jnb instruction, in this example, we replace:

jnb r1.7, loc_876D48 -> 9A F1 10 70


jmpr cc_UC, loc_876D48 -> CC 00 0D 10

Subroutine should now looks like this: