- 1 Memory Layout
- 2 Checksums
- 3 Fueling
- 4 Timing
- 5 Vanos
- 6 Drive-By-Wire
- 7 Full load detection
- 8 Idlespeed
- 9 DTC Suppression
- 10 Extra Features
- 10.1 Idle Control Valve Delete
- 10.2 Exhaust Pop Modifications
- 10.3 Forced OBD Readiness
- 10.4 Engine coolant temperature control
- 10.5 Secondary Air Pump Delete
- 10.6 Lambda Sensor Configuration
- 10.7 MAF Sensor Scalar Adjustments
- 10.8 RPM limiter
- 10.9 VMAX limiter
- 10.10 Fake Race Camshafts / Lumpy Idle Mod
- 11 Safety Features
- 12 Special Functions
The MS43 can be seperated into three major sections, first comes the bootloader, then the program code, and last the calibration data.
See this table for file locations:
|00000||0FFFF||Bootloader Code||64 kByte|
|10000||1FFFF||Program Code||384 kByte|
|70000||7FFFF||Calibration Data||64 kByte|
The bootloader code section is the most important section of the MS43 and doesnt have to be touched for at least 99% of all use cases.
This section is 64 kByte in size and contains the interrupt setups, input and output initializations, as well as immobilizer information and the UIF (user information fields).
The significant difference between the bootloader section and the others is, that it's only one time programmable under normal operation. That means once a byte has been changed from FF to another value, it is not changeable again.
Unlimited write access to the bootloader section can only be archieved through JMGarage Flasher and is ONLY needed for virginizing the ECU to pair it with a different EWS module or to alter the UIF without increasing the flashcounter.
The newest version of immobilizer and checksum delete will not need bootmode flashing.
Programm Code Section
All of the MS43 program code is located here.
Calibration Data Section
Checksums are used to verify that the data written to the ROM has not become corrupt.
The MS43 uses three CRC16 checksums that covers the boot, program and calibration sections and two addition checksums that covers the data for the monitoring (_mon_) routines.
The variables that the ECU uses to calculate the addition checksum is located in the program section so tools like Ultimo Checksum Corrector can only correct this checksum in a 512KB file.
Both addition checksums have to be corrected before the CRC16 checksums, as the addition checksums are located inside the CRC16 checksum areas.
The checksums are located at the following addresses:
|Program Part 1||0x6FDAE|
|Program Part 2||0x6FD80|
|Calibration Part 1||0x72FFC|
|Calibration Part 2||0x72FFE|
Disabling Calibration Checksums
Disable CRC16 Checksum
To disable the CRC16 calibration checksum on all firmwares do the following.
- 1. Set Word at 0x73FFE to 0xFFFF
- 2. Set Byte at 0x6FFB0 to 0xA8
Disable Addition Checksum
To disable the addition calibration checksum use one of the following methods.
- 1. Set lc_swi_cal_mon_cks to 165
- 1. Set the Byte in the table to 0xA5
Firmware Location 430037 0x70CE3 430055 0x70D7C 430056 0x70D7E 430064 0x70DA0 430066 0x70E0A 430069 0x70E07
Fuel Injection Maps
The injection maps are based on "engine load (mg/stroke) vs. engine speed (rpm)" and the lookup is injection time in milliseconds.
The lambda sensors for closed loop operation are narrowband. Fuel trim learning only happens during closed loop operation, but the learned fuel trims do affect full throttle fueling as well.
When there is no VANOS fault, the engine interpolates between "Injection time at part-load, cold engine, Vanos I/II" and "Injection time at part-load, warm engine, Vanos I/II", where the numbers I or II indicate the two banks of the straight six engine.
Under VANOS fault conditions, the map "Basic Injection Time (ip_tib)" is used.
"Full load enrichment (ip_ti_fl)" is a multiplier of the part load calculations and added to them.
Blending between cold and warm injection maps is done by weighting factor "ip_fac_pl_ivvt__tco__tco_st" for partload and "ip_fac_is_ivvt__tco__tco_st" for idlespeed
Non Stock Injector Maps
Changing the fuel injectors may be needed when supercharging your engine and therefore some constants and maps need to be tweaked.
You will have to calculate the difference in percentage of volume flow between stock and your new injectors.
The following scalars need to be adjusted accordingly:
Depending on the injectors you will have to finetune the injector latency compensation (injector dead times) as well:
Attention: This table has a wrong correction factor in almost all available definition files. Change this to "X * 0.032".
If you happen to have stuttering or unclean combustion when stepping on the gas, rescale the cylinder rewetting tables as well:
Correcting Fuel Consumption Gauge
When changing injectors you will discover that the MPG reading on your cluster or other monitoring apps is off.
The table ip_fco_map_cor__pq_main_col handles injection reporting towards the cluster.
For example: If you lowered your fueling tables by MULTIPLIYING them with 0.3, you must DIVIDE the mentioned table by 0.3 to fix MPG reading.
Upgraded fuel pumps
Under some circumstances, like going forced induction, the OEM fuel pump can't deliver enough fuel to the engine and needs to be upgraded.
Most aftermarket fuelpumps like the Walbros or Deatschwerks don't have a check valve inside and the fuel flows back into the tank once the vehicle is turned off.
The MS43 has two time values (in seconds) for controlling the fuelpump before starting and after stopping the engine:
- C_T_EFP_PREV: Time the electronic fuel pump relay is on after ignition key ON
- C_T_EFP: Time delay to shut off the electric fuel pump relay after ignition key OFF
Slightly rising these values may eliminate starting issues.
Basic Timing Maps
The MS43 uses several ignition maps depending on the engine state and quality of fuel used. Like the injection maps, they are also based on "engine load (mg/stroke) vs. engine speed (rpm)" but obviously the lookup is ignition timing in degrees BTDC (before top dead center).
"Ignition at part-load, RON98 (16x20) Airflow -vs- Engine speed" is the main table used with a healthy engine (so no VANOS fault codes, normal warmed up operating temperature) running RON98/PON93 gasoline.
There is a knock based interpolation between the RON91 and RON98 RON tables. The other tables should be kept safe.
"Ignition at part-load, cold engine (16x20) Airflow -vs- Engine speed" is used on a cold engine, and blended/interpolated towards "Ignition at part-load, RON98 (16x20) Airflow -vs- Engine speed" during warm up.
Catalyst heating "_CH_" in maps retards ignition during warm up.
Antijerk "_AJ_" retards ignition during rapid throttle opening to smooth out torque (can be removed by increasing c_tco_min_aj to 142.5C. Reported to sometimes cause transitional knock on boosted engines, if so consider adjusting other tables designed for this (tra_knk).
Experience on standard or near standard European 330ci in cool climate and with 99 RON fuel suggested sporadic pulling of timing here and there up to a few degrees is common, but rarely sufficient even in hard track use to produce more than 1 degree of learned ignition retard from the 98 RON base map. Shows the RON98 map on a standard car is quite good. Question if fueling could be richened to allow more ignition timing and torque/power.
This section contains information on how the dual vanos system is actuated by the DME and how to modify it. Both, intake and exhaust, camshaft can be set independently in relation to the crankshaft.
The aim of that system is to optimize emission, produce better torque at low engine speeds and have better top end power.
The system uses engine oil to pressurize a set of gears at the end of each camshaft.
Even though the variation of °crk is pretty limited, it can be used to compensate for different intakes, different camshafts and even turbo application may be benefitting from perfectly tweaked camshafts.
Basic Vanos Maps
The main maps used for intake camshaft are:
The main maps used for exhaust camshaft are:
Blending between cold engine and warm engine is done by:
idlespeed ip_fac_cam_sp_in_is__tco__tco_st ip_fac_cam_sp_ex_is__tco__tco_st
partload ip_fac_cam_sp_in_pl__tco__tco_st ip_fac_cam_sp_ex_pl__tco__tco_st
VANOS Tweak for little extra midrange power
Insert the following tables into the desired part-load map where you need the effect ( part-load cold / part-load warm / both).
*ATTENTION: Only Suitable for M54B30 M54B30 M54B30 M54B30 *
Credits to e46fanatics.com member DoCR ONLY FOR 3L engine M54B30
|Exhaust cam setpoint part-load||Intake cam setpoint part-load|
*ATTENTION: Only Suitable for M54B30 M54B30 M54B30 M54B30 M54B30 M54B30 M54B30 M54B30 M54B30*
For stock engine with stock exhaust and intake flow, above vanos tune works best in that form. For a moded engine,or even stock,but with free flow exhaust (really free flow) and CAI type intake, cams overlap can help increase volumetric efficiency in the hi revs (over disa switch point ~4000rpm and up ),resulting in more power! Taking as a base M54B30 engine with Intake cam 126 for max, and 86 for min ; exhaust cam -105 for max ,and -80 for min 126 represent intake cam in its max retard form, and 86 in its max advance position -105 represent exhaust cam in its max advance position, and -80 in its max retard stage
General rule for overlap : Advancing both cams - more low end torque and less top end power
Retarding both cams - less low end torque and more top end power
TIPS for full load vanos maps : Begin from low rpm with max number for your cam (intake 126 ,exhaust -105) and progressively reduce number until you reach 4000rpm and lowest cam number (intake 86,exhaust -80) From 4000rpm and up to max ,use inverse technique, start to rise again numbers, progressively. (every engine responds different by exhaust config) Test combinations until you are happy. Also, do changes for intake only, leave exhaust alone if you are on stock exhaust manifold.
note Theoreticaly, there is no risk of damaging engine ( valve hit piston) if you stay within specified range for your particular cams. (m54b30 intake 126/86 ,exhaust -105/-80)
example of random overlap for full load and partload maps
This section contains information on how the Drive-By-Wire system is controlled by the DME and how it can be modified.
Drivers Wish Tables
The Drive-By-Wire system is setup so that the ecu uses both the throttle valve and the idle control valve to control how much air is going into the engine.
- ip_tps_sp_pvs is used by the ecu to decide how much it should open the throttle for a given pvs input.
- ip_isapwm_pvs is used by the ecu to decide how much idle control valve duty cycle should be used for a given pvs input.
If we look at these tables side by side we can see that a stock ecu is setup to primarily use the idle control valve to control airflow when the pvs input is in the range between 0° and 15° and when the pvs input is higher the ecu will switch over to the throttle valve.
Drivers Wish Input Correction
The MS43 actively limits how fast the drivers requested pvs input can increase to provide a smoother driving experience.
ip_pvs_cor_max_rpl_[gear] is used by the ecu to decide if the drivers requested pvs input should be limited. The values in the table is the lower limit and the X-axis is the upper limit. If the drivers requested pvs input is between these values then the ecu will start limiting the pvs input.
If the following conditions are met then the ecu will not try to start limiting the pvs input:
- The driver requested pvs input is decreasing.
- The driver requested pvs input change gradient is larger than c_pvs_grd_max_rpl(59,99° pvs).
- The clutch is pressed.
- The driver requested pvs input is higher than c_pvs_cor_max_rpl(42,5° PVS)
When the ecu starts limiting the pvs input then the pvs input will be increased by the value taken from ip_pvs_cor_rpl_lgrd_[gear] until the following conditions are met:
- The limitation duration specified in ip_t_pvs_cor_rpl_[gear] has expired.
- The driver requested pvs input change gradient is larger than c_pvs_grd_max_rpl(59,99° pvs).
- The limited pvs input is larger than the driver requested pvs input.
If any of those conditions are met then the ecu will use the driver requested pvs input and will not start limiting the pvs input again until the time specified in c_t_dly_pvs_cor_rpl(0,2s) has expired.
The easiest way to disable this function is to set either c_pvs_cor_max_rpl or c_pvs_grd_max_rpl to zero.
Full load detection
Full load detection is the threshold when the ecu stops trying to be economical/ecofriendly and instead focuses on producing power.
The full load detection thresholds are pvs based and are defined in the following tables:
- id_pvs_fl__n When this threshold is exceeded the injection will operate in open loop and the full load enrichment map is applied to the injection time.
- id_pvs_fl_ivvt__n When this threshold is exceeded the Vanos will use the full load maps.
- id_pvs_fl_vim__n_vim_ When this threshold is exceeded the DISA will use the full load maps.
This section contains information on how the idle is controlled by the DME and how it can be modified.
MS43 has a few different tables that affect the nominal idle speed
- ip_n_sp_is Nominal idle speed without additional load on the engine.
- ip_dri_n_sp_is Nominal idle speed with drive engaged for AT gearbox.
- ip_acin_n_sp_is Nominal idle speed with air conditioner switched on.
- ip_dri_acin_n_sp_is Nominal idle speed with air conditioner switched on and drive engaged for AT gearbox.
The idle setpoint is modified from the nominal speed above by
- ip_n_sp_add_cha_cdn_bat Nominal idle speed offset for battery charge state.
- ip_n_sp_add_heat Nominal idle speed offset with catalyst heating function active.
In addition, the idle speed change rate can be changed with c_n_sp_lgrd_is.
DTCs can be suppressed in the MS43 by zeroing out the c_abc_... specific codes. The full list of DTCs can be found here:
|c_dtc_ad_mec_ref_ivvt_ex||P0014||B Camshaft Position - Timing Over-Advanced or System Performance (Bank 1)|
|c_dtc_ad_mec_ref_ivvt_in||P0011||A Camshaft Position - Timing Over-Advanced or System Performance (Bank 1)|
|c_dtc_amp||P0107||Manifold Absolute Pressure/Barometric Pressure Circuit Low Input|
|P0108||Manifold Absolute Pressure/Barometric Pressure Circuit High Input|
|c_dtc_bls_plaus||P0571||Cruise Control/Brake Switch A Circuit Malfunction|
|c_dtc_cam||P0340||Camshaft Position Sensor Circuit Malfunction|
|P0344||Camshaft Position Sensor Circuit Intermittent|
|c_dtc_cam_ex||P0365||Camshaft Position Sensor 'B' Circuit Bank 1|
|P0369||Camshaft Position Sensor 'B' Circuit Intermittent Bank 1|
|c_dtc_cam_ex_ivvt||P1529||"B" Camshaft Position Actuator Control Circuit Signal Low Bank 1|
|P1530||"B" Camshaft Position Actuator Control Circuit Signal High Bank 1|
|P1531||"B" Camshaft Position Actuator Control Open Circuit Bank 1|
|c_dtc_cam_in_ivvt||P1523||"A" Camshaft Position Actuator Signal Low Bank 1|
|P1524||"A" Camshaft Position Actuator Signal High Bank 1|
|P1525||"A" Camshaft Position Actuator Control Open Circuit Bank 1|
|c_dtc_cat_diag_1||P0420||Catalyst System Efficiency Below Threshold (Bank 1)|
|c_dtc_cat_diag_2||P0430||Catalyst System Efficiency Below Threshold (Bank 2)|
|c_dtc_cat_eff_1||P0421||Warm Up Catalyst Efficiency Below Threshold (Bank 1)|
|c_dtc_cat_eff_2||P0431||Warm Up Catalyst Efficiency Below Threshold (Bank 2)|
|c_dtc_cps||P0443||Evaporative Emission Control System Purge Control Valve Circuit Malfunction|
|P0444||Evaporative Emission Control System Purge Control Valve Circuit Open|
|P0445||Evaporative Emission Control System Purge Control Valve Circuit Shorted|
|c_dtc_crk||P0335||Crankshaft Position Sensor A Circuit Malfunction|
|P0339||Crankshaft Position Sensor A Circuit Intermittent|
|c_dtc_diagcps||P0441||Evaporative Emission Control System Incorrect Purge Flow|
|c_dtc_dmtl||P1444||Diagnostic Module Tank Leakage (DM-TL) Pump Control Open Circuit|
|P1445||Diagnostic Module Tank Leakage (DM-TL) Pump Control Circuit Signal Low|
|P1446||Diagnostic Module Tank Leakage (DM-TL) Pump Control Circuit Signal High|
|c_dtc_dmtl_leak||P0455||Evaporative Emission Control System Leak Detected (gross leak)|
|P0456||EVAP Leak Monitor Small Leak Detected|
|c_dtc_dmtlm||P1447||Diagnostic Module Tank Leakage (DM-TL) Pump Too High During Switching|
|P1448||Diagnostic Module Tank Leakage (DM-TL) Pump Too Low During Switching|
|P1449||Diagnostic Module Tank Leakage (DM-TL) Pump Too High|
|c_dtc_ecf||P0480||Cooling Fan 1 Control Circuit Malfunction|
|c_dtc_ect||P1619||MAP Cooling Control Circuit Signal Low|
|P1620||MAP Cooling Control Circuit Signal High|
|c_dtc_ect_mec||P0128||Range/Performance Problem In Thermostat|
|c_dtc_ecu||P0604||Internal Control Module Random Access Memory (RAM) Error|
|c_dtc_ef||P0477||Exhaust Pressure Control Valve Low|
|P0478||Exhaust Pressure Control Valve High|
|c_dtc_igcfb_0||P0351||Ignition Coil 1 Primary/Secondary Circuit Malfunction|
|P1301||Misfiring Cylinder 1|
|c_dtc_igcfb_1||P0355||Ignition Coil 5 Primary/Secondary Circuit Malfunction|
|P1305||Misfiring Cylinder 5|
|c_dtc_igcfb_2||P0353||Ignition Coil 3 Primary/Secondary Circuit Malfunction|
|P1303||Misfiring Cylinder 3|
|c_dtc_igcfb_3||P0356||Ignition Coil 6 Primary/Secondary Circuit Malfunction|
|P1306||Misfiring Cylinder 6|
|c_dtc_igcfb_4||P0352||Ignition Coil 2 Primary/Secondary Circuit Malfunction|
|P1302||Misfiring Cylinder 2|
|c_dtc_igcfb_5||P0354||Ignition Coil 4 Primary/Secondary Circuit Malfunction|
|P1304||Misfiring Cylinder 4|
|c_dtc_is||P0505||Idle Control System Malfunction|
|c_dtc_isa_1||P1506||Idle Speed Control Valve Open Solenoid Control Circuit Signal High|
|P1507||Idle Speed Control Valve Open Solenoid Control Circuit Signal Low|
|P1508||Idle Speed Control Valve Opening Solenoid Control Open Circuit|
|c_dtc_isa_2||P1502||Idle Speed Control Valve Closing Solenoid Control Circuit Signal High or Low|
|P1503||Idle Speed Control Valve Closing Solenoid Control Circuit Signal Low|
|P1504||Idle Speed Control Valve Closing Solenoid Control Open Circuit|
|c_dtc_iv_0||P0201||Injector Circuit Malfunction - Cylinder 1|
|P0261||Cylinder 1 Injector Circuit Low|
|P0262||Cylinder 1 Injector Circuit High|
|c_dtc_iv_1||P0205||Injector Circuit Malfunction - Cylinder 5|
|P0273||Cylinder 5 Injector Circuit Low|
|P0274||Cylinder 5 Injector Circuit High|
|c_dtc_iv_2||P0203||Injector Circuit Malfunction - Cylinder 3|
|P0267||Cylinder 3 Injector Circuit Low|
|P0268||Cylinder 3 Injector Circuit High|
|c_dtc_iv_3||P0206||Injector Circuit Malfunction - Cylinder 6|
|P0276||Cylinder 6 Injector Circuit Low|
|P0277||Cylinder 6 Injector Circuit High|
|c_dtc_iv_4||P0202||Injector Circuit Malfunction - Cylinder 2|
|P0264||Cylinder 2 Injector Circuit Low|
|P0265||Cylinder 2 Injector Circuit High|
|c_dtc_iv_5||P0204||Injector Circuit Malfunction - Cylinder 4|
|P0270||Cylinder 4 Injector Circuit Low|
|P0271||Cylinder 4 Injector Circuit High|
|c_dtc_knk_1||P0327||Knock Sensor 1 Circuit Low Input (Bank 1 or Single Sensor)|
|c_dtc_knk_2||P0332||Knock Sensor 2 Circuit Low Input (Bank 2)|
|c_dtc_lam_dly_down_1||P0096||Intake Air Temperature Sensor 2 Circuit Range/Performance|
|P0097||Intake Air Temperature Sensor 2 Circuit Low|
|c_dtc_lam_dly_down_2||P0098||Intake Air Temperature Sensor 2 Circuit High|
|P0099||Intake Air Temperature Sensor 2 Circuit Intermittent/Erratic|
|c_dtc_lam_dly_up_1||P1090||Pre-Catalyst Fuel Trim Too Lean Bank 1|
|P1092||Pre-Catalyst Fuel Trim Too Lean Bank 2|
|c_dtc_lam_dly_up_2||P1091||Pre-Catalyst Fuel Trim Too Rich Bank 1|
|P1093||Pre-Catalyst Fuel Trim Too Rich Bank 2|
|c_dtc_lam_lim_1||P1083||Fuel Control Mixture Lean (Bank 1 Sensor 1)|
|P1084||Fuel Control Mixture Rich (Bank 1 Sensor 1)|
|P1314||Fuel System Error|
|c_dtc_lam_lim_2||P1085||Fuel Control Mixture Lean (Bank 2 Sensor 1)|
|P1086||Fuel Control Mixture Rich (Bank 2 Sensor 1)|
|P1314||Fuel System Error|
|c_dtc_lam_stop_1||P0171||System too Lean (Bank 1)|
|P0172||System too Rich (Bank 1)|
|P1314||Fuel System Error|
|c_dtc_lam_stop_2||P0174||System too Lean (Bank 2)|
|P0175||System too Rich (Bank 2)|
|P1314||Fuel System Error|
|c_dtc_leak_big||P0441||Evaporative Emission Control System Incorrect Purge Flow|
|c_dtc_leak_small||P0442||Evaporative Emission Control System Leak Detected (small leak)|
|c_dtc_ls_frq_1||P0133||O2 Sensor Circuit Slow Response (Bank 1 Sensor 1)|
|P1087||O2 Sensor Circuit Slow Response in Lean Control Range (Bank 1 Sensor 1)|
|P1088||O2 Sensor Circuit Slow Response in Rich Control Range (Bank 1 Sensor 1)|
|c_dtc_ls_frq_2||P0153||O2 Sensor Circuit Slow Response (Bank 2 Sensor 1)|
|P1089||O2 Sensor Circuit Slow Response in Lean Control Range (Bank 1 Sensor 2)|
|P1094||O2 Sensor Circuit Slow Response in Rich Control Range (Bank 2 Sensor 1)|
|c_dtc_lsh_down_1||P0036||HO2S Heater Control Circuit Bank 1 Sensor 2|
|P0037||HO2S Heater Circuit Low Voltage Bank 1 Sensor 2|
|P0038||HO2S Heater Circuit High Voltage Bank 1 Sensor 2|
|c_dtc_lsh_down_2||P0056||HO2S Heater Circuit Bank 2 Sensor 2|
|P0057||HO2S Heater Circuit Low Voltage Bank 2 Sensor 2|
|P0058||HO2S Heater Circuit High Voltage Bank 2 Sensor 2|
|c_dtc_lsh_obd_down_1||P0141||O2 Sensor Heater Circuit Malfunction (Bank 1 Sensor 2)|
|c_dtc_lsh_obd_down_2||P0161||O2 Sensor Heater Circuit Malfunction (Bank 2 Sensor 2)|
|c_dtc_lsh_obd_up_1||P0135||O2 Sensor Heater Circuit Malfunction (Bank 1 Sensor 1)|
|c_dtc_lsh_obd_up_2||P0155||O2 Sensor Heater Circuit Malfunction (Bank 2 Sensor 1)|
|c_dtc_lsh_up_1||P0030||HO2S Heater Control Circuit Bank 1 Sensor 1|
|P0031||HO2S Heater Circuit Low Voltage Bank 1 Sensor 1|
|P0032||HO2S Heater Circuit High Voltage Bank 1 Sensor 1|
|c_dtc_lsh_up_2||P0050||HO2S Heater Circuit Bank 2 Sensor 1|
|P0051||HO2S Heater Circuit Low Voltage Bank 2 Sensor 1|
|P0052||HO2S Heater Circuit High Voltage Bank 2 Sensor 1|
|c_dtc_maf||P0102||Mass or Volume Air Flow Circuit Low Input|
|P0103||Mass or Volume Air Flow Circuit High Input|
|c_dtc_maf_mafm||P0101||Mass or Volume Air Flow Circuit Range/Performance Problem|
|c_dtc_mec_isa||P1500||Idle Speed Control Valve Stuck Open|
|P1501||Idle Speed Control Valve Stuck Closed|
|c_dtc_mec_ivvt_ex||P0015||B Camshaft Position - Timing Over-Retarded (Bank 1)|
|c_dtc_mec_ivvt_in||P0012||A Camshaft Position - Timing Over-Retarded (Bank 1)|
|c_dtc_mec_sav||P0411||Secondary Air Injection System Incorrect Flow Detected|
|c_dtc_min_saf||P0491||Secondary Air Injection System Insufficient Flow Bank 1|
|c_dtc_mis_0||P0301||Cylinder 1 Misfire Detected|
|P0313||Misfire Detected With Low Fuel Level|
|P1342||Misfire During Start Cylinder 1|
|P1343||Misfire Cylinder 1 With Fuel Cut-off|
|c_dtc_mis_1||P0305||Cylinder 5 Misfire Detected|
|P0313||Misfire Detected With Low Fuel Level|
|P1350||Misfire During Start Cylinder 5|
|P1351||Misfire Cylinder 5 With Fuel Cut-off|
|c_dtc_mis_2||P0303||Cylinder 3 Misfire Detected|
|P0313||Misfire Detected With Low Fuel Level|
|P1346||Misfire During Start Cylinder 3|
|P1347||Misfire Cylinder 3 With Fuel Cut-off|
|c_dtc_mis_3||P0306||Cylinder 6 Misfire Detected|
|P0313||Misfire Detected With Low Fuel Level|
|P1352||Misfire During Start Cylinder 6|
|P1353||Misfire Cylinder 6 With Fuel Cut-off|
|c_dtc_mis_4||P0302||Cylinder 2 Misfire Detected|
|P0313||Misfire Detected With Low Fuel Level|
|P1344||Misfire During Start Cylinder 2|
|P1345||Misfire Cylinder 2 With Fuel Cut-off|
|c_dtc_mis_5||P0304||Cylinder 4 Misfire Detected|
|P0313||Misfire Detected With Low Fuel Level|
|P1348||Misfire During Start Cylinder 4|
|P1349||Misfire Cylinder 4 With Fuel Cut-off|
|c_dtc_mis_f||P0313||Misfire Detected With Low Fuel Level|
|c_dtc_mis_mul||P0300||Random/Multiple Cylinder Misfire Detected|
|c_dtc_mis_t_s||P0336||Crankshaft Position Sensor A Circuit Range/Performance|
|c_dtc_mon_plaus||P1602||Control Module Self Test, Control Module Defective|
|c_dtc_mon_tqi_av||P1603||Control Module Self Test, Torque Monitoring|
|c_dtc_mon_tqi_n_max||P1604||Control Module Self Test, Speed Monitoring|
|c_dtc_msw_2||P1565||Multifunction Steering Wheel|
|c_dtc_msw_3||P1565||Multifunction Steering Wheel|
|c_dtc_msw_tog||P1567||Multifunction Steering Wheel, toggle bit|
|c_dtc_mtc_ctl_1||P1638||Throttle Valve Position Control; Throttle Stuck Temporarily|
|c_dtc_mtc_ctl_2||P1639||Throttle Valve Position Control; Throttle Stuck Permanently|
|c_dtc_mtc_ctl_3||P1637||Throttle Valve Position Control; Control Deviation|
|c_dtc_mtc_dr||P1636||Throttle Valve Control Circuit|
|c_dtc_otcc||P1477||Leakage Diagnostic Pump Reed Switch Did Not Open|
|c_dtc_pvs_1||P1122||Pedal Position 1 Low Input|
|P1123||Pedal Position 1 High Input|
|c_dtc_pvs_2||P1222||Pedal Position Sensor 2 Low Input|
|P1223||Pedal Position Sensor 2 High Input|
|c_dtc_pvs_bls||P0xxx||Simultaneous activation of accelerator pedal and brake pedal|
|c_dtc_pvs_bls_bts_plaus||P0xxx||Brakelight switch and brake test switch not plausible|
|c_dtc_pvs_pvs||P1120||Pedal Position Sensor Circuit|
|c_dtc_pvs_ratio||P1121||Pedal Position 1 Range/Performance Problem|
|c_dtc_r_igcfb||P0350||Ignition Coil Primary/Secondary Circuit Malfunction|
|c_dtc_rly_accout||P0532||A/C Refrigerant Pressure Sensor Circuit Low Input|
|P0533||A/C Refrigerant Pressure Sensor Circuit High Input|
|c_dtc_rly_efp||P0231||Fuel Pump Secondary Circuit Low|
|P0232||Fuel Pump Secondary Circuit High|
|c_dtc_rly_main_dly||P0xxx||Delay in main relay|
|c_dtc_sa_1||P0491||Secondary Air Injection System Insufficient Flow Bank 1|
|c_dtc_sa_2||P0492||Secondary Air Injection System Insufficient Flow Bank 2|
|c_dtc_sa_conf||P0411||Secondary Air Injection System Incorrect Flow Detected|
|c_dtc_safm||P1419||Secondary Air System Air Mass Flow Sensor Disconnected or Stuck Signal|
|c_dtc_sap||P1413||Secondary Air Injection Pump Relay Control Circuit Signal Low|
|P1414||Secondary Air Injection System Monitor Circuit High|
|c_dtc_sap_safm||P0411||Secondary Air Injection System Incorrect Flow Detected|
|c_dtc_sav||P0413||Secondary Air Injection System Switching Valve A Circuit Open|
|P0414||Secondary Air Injection System Switching Valve A Circuit Shorted|
|c_dtc_sav_1_safm||P0411||Secondary Air Injection System Incorrect Flow Detected|
|c_dtc_sav_safm||P0411||Secondary Air Injection System Incorrect Flow Detected|
|c_dtc_t_igcfb_2||P0350||Ignition Coil Primary/Secondary Circuit Malfunction|
|c_dtc_t_lam_act||P0125||Insufficient Coolant Temperature for Closed Loop Fuel Control|
|c_dtc_tco||P0117||Engine Coolant Temperature Circuit Low Input|
|P0118||Engine Coolant Temperature Circuit High Input|
|c_dtc_tco_ex||P1111||Engine Coolant Temperature Radiator Outlet Sensor Low Input|
|P1112||Engine Coolant Temperature Radiator Outlet Sensor High Input|
|c_dtc_tco_max||P0116||Engine Coolant Temperature Circuit Range/Performance Problem|
|c_dtc_teg_down_1||P0xxx||Exhaust gas temperature post-cat, bank1|
|c_dtc_teg_down_2||P0431||Exhaust gas temperature post-cat, bank2|
|c_dtc_teg_up_1||P0431||Exhaust gas temperature pre-cat, bank1|
|c_dtc_teg_up_2||P0431||Exhaust gas temperature pre-cat, bank2|
|c_dtc_tia||P0112||Intake Air Temperature Circuit Low Input|
|P0113||Intake Air Temperature Circuit High Input|
|c_dtc_toil||P0197||Engine Oil Temperature Sensor Low|
|P0198||Engine Oil Temperature Sensor High|
|c_dtc_tout_amt_1||P1611||Serial Communicating Link Transmission Control Module|
|c_dtc_tout_cng_ecu_1||P0xxx||Time-out CNG ECU|
|c_dtc_tout_etcu_1||P0600||Serial Communication Link Malfunction|
|c_dtc_tout_icl_2||P1612||Time-out instrument cluster2|
|c_dtc_tout_icl_3||P1612||Time-out instrument cluster3|
|c_dtc_tout_imob||P1661||Time-out EWS system|
|P1662||Time-out EWS system|
|c_dtc_tps_1||P0122||Throttle/Pedal Position Sensor/Switch A Circuit Low Input|
|P0123||Throttle/Pedal Position Sensor/Switch A Circuit High Input|
|c_dtc_tps_2||P0222||Throttle/Pedal Position Sensor/Switch B Circuit Low Input|
|P0223||Throttle/Pedal Position Sensor/Switch B Circuit High Input|
|c_dtc_tps_ad||P1632||Throttle Valve Adaptation; Adaptation Condition Not Met|
|P1633||Throttle Valve Adaptation; Limp Home Position|
|P1634||Throttle Valve Adaptation; Spring Test Failed|
|P1635||Throttle Valve Adaptation; Lower Mechanical Stop Not Adapted|
|c_dtc_tps_maf_1||P0121||Throttle/Pedal Position Sensor/Switch A Circuit Range/Performance Problem|
|c_dtc_tps_maf_2||P0221||Throttle/Pedal Position Sensor/Switch B Circuit Range/Performance Problem|
|c_dtc_tps_st_chk_1||P1675||TPS stuck, sensor 1 check condition|
|c_dtc_tps_st_chk_2||P1694||TPS stuck, sensor 2 check condition|
|c_dtc_tqi_amt_1||P1653||Indicated torque not matching AMT gearbox request|
|P1654||Indicated torque not matching AMT gearbox request|
|P1670||Indicated torque not matching AMT gearbox request|
|c_dtc_tqi_lim||P1605||Limiting criteria for indicated torque|
|c_dtc_tqi_n_max_nvmy_mon||P1604||Control Module Self Test, Speed Monitoring|
|c_dtc_var_amp||P1171||Ambient Pressure Sensor Learned Value Error|
|P1172||Ambient Pressure Sensor Rationality Check|
|P1173||Ambient Pressure Sensor Rationality Check|
|c_dtc_vcc_poti_1||P1624||Pedal Position Sensor Potentiometer Supply Channel 1 Electrical|
|c_dtc_vcc_poti_2||P1625||Pedal Position Sensor Potentiometer Supply Channel 2 Electrical|
|c_dtc_vdmtl||P1451||Diagnostic Module Tank Leakage (DM-TL) Switching Solenoid Control Circuit Signal Low|
|P1452||Diagnostic Module Tank Leakage (DM-TL) Switching Solenoid Control Circuit Signal High|
|c_dtc_vim||P1512||DISA Control Circuit Signal Low|
|P1513||DISA Control Circuit Signal High|
|c_dtc_vls_down_1||P0137||O2 Sensor Circuit Low Voltage (Bank 1 Sensor 2)|
|P0138||O2 Sensor Circuit High Voltage (Bank 1 Sensor 2)|
|P0140||O2 Sensor Circuit No Activity Detected (Bank 1 Sensor 2)|
|c_dtc_vls_down_2||P0157||O2 Sensor Circuit Low Voltage (Bank 2 Sensor 2)|
|P0158||O2 Sensor Circuit High Voltage (Bank 2 Sensor 2)|
|P0160||O2 Sensor Circuit No Activity Detected (Bank 2 Sensor 2)|
|c_dtc_vls_down_afl_1||P0139||O2 Sensor Circuit Slow Response (Bank 1 Sensor 2)|
|c_dtc_vls_down_afl_2||P0159||O2 Sensor Circuit Slow Response (Bank 2 Sensor 2)|
|c_dtc_vls_down_post_puc_1||P1097||O2 Sensor Circuit Slow Response after Coast Down Fuel Cutoff (Bank 1 Sensor 1)|
|c_dtc_vls_down_post_puc_2||P1098||O2 Sensor Circuit Slow Response after Coast Down Fuel Cutoff (Bank 2 Sensor 2)|
|c_dtc_vls_down_t_1||P0139||O2 Sensor Circuit Slow Response (Bank 1 Sensor 2)|
|c_dtc_vls_down_t_2||P0159||O2 Sensor Circuit Slow Response (Bank 2 Sensor 2)|
|c_dtc_vls_jump_1||P1088||O2 Sensor Circuit Slow Response in Rich Control Range (Bank 1 Sensor 1)|
|P1178||O2 Sensor Signal Circuit Slow Switching From Rich to Lean (Bank 1 Sensor 1)|
|c_dtc_vls_jump_2||P1095||O2 Sensor Circuit Slow Switching From Lean to Rich (Bank 1 Sensor 1)|
|P1096||O2 Sensor Circuit Slow Switching From Lean to Rich (Bank 2 Sensor 1)|
|c_dtc_vls_stk_1||P0136||O2 Sensor Circuit Malfunction (Bank 1 Sensor 2)|
|c_dtc_vls_stk_2||P0156||O2 Sensor Circuit Malfunction (Bank 2 Sensor 2)|
|c_dtc_vls_up_1||P0131||O2 Sensor Circuit Low Voltage (Bank 1 Sensor 1)|
|P0132||O2 Sensor Circuit High Voltage (Bank 1 Sensor 1)|
|P0134||O2 Sensor Circuit No Activity Detected (Bank 1 Sensor 1)|
|c_dtc_vls_up_2||P0151||O2 Sensor Circuit Low Voltage (Bank 2 Sensor 1)|
|P0152||O2 Sensor Circuit High Voltage (Bank 2 Sensor 1)|
|P0154||O2 Sensor Circuit No Activity Detected (Bank 2 Sensor 1)|
|c_dtc_vs||P0500||Vehicle Speed Sensor Malfunction|
Idle Control Valve Delete
Removing the idle control valve (ICV) / idle speed actuator (ISA) is possible due to the motorized throttle body the M54 engine uses.
Disconnect the idle control valve connector and either remove the idle control valve and plug the hole in the intake manifold (preferred) or use something to seal the idle control valve air tight.
The way the ICV delete works is by utilizing the ip_pvs_isa_isapwm table. This table dictates how much pvs input should be added to the drivers requested pvs input for a given idle control valve load.
In a stock engine this table is used to extend the idle control valve load so when the idle control valve load goes above 100% the throttle will start to open to deliver more air into the engine.
By rescaling this table we are able to completely remove the idle control valve.
But be aware that the values in ip_pvs_isa_isapwm is dependent on the values in ip_tps_sp_pvs so if ip_tps_sp_pvs is modified then ip_pvs_isa_isapwm also needs to be re-scaled accordingly to maintain a stable idle.
The ip_pvs_isa_isapwm values in the picture are made for a M54B30 so the values may need to be modified to get a stable idle with M54B25 and M54B22 as these engines have a smaller throttle body.
This modification modifies a monitoring table so the calibration addition checksum needs to be corrected or disabled after applying the changes.
Exhaust Pop Modifications
The current solution for forced exhaust pop is to change the overrun fuel cutoff detection from the ECU. This is accomplished by raising the minimum RPM threshold to a number of revolutions the engine can't reach.
This behaviour can be set different depending on your air condition is turned on or off, because the MS43 has two seperate tables for overrun fuel cutoff handling depending on the engine state ACCIN.
Note: Theorethically every engine state can be used to switch between the two tables. Another one that could be handy is CRU_MAIN_SWI, this state is also represented by the green cruise control light in the cluster. Requires program code editting.
Exhaust pops with activated A/C
This screenshot shows the values to have pops when A/C is on. To get exhaust pops with the A/C disabled leave the lower tables stock and only edit the uper ones.
Using these settings B25 engine users have reported throttle hang, poor idling, and decreased performance. Test these settings at your own responsibility.
Timer configurable exhaust pops
It is also possible to tweak gear related timers that will let the engine pop for a given time. After this timer is zero, the engine will go back into overrun-fuelcut. So it's pretty easy to have 2 or 3 pretty loud pops followed by "silence".
The following screenshot is an example for the values at M54B30 which give 3 loud pops.
If you want to relay fuel cutoff while standing, adjust c_t_puc_deacc_vs to your desired time.
For anyone wanting the best of both worlds:
Forced OBD Readiness
Common solution for forced OBD readiness monitors seems to be setting the following config switches
- c_conf_eobd If this value is set to one then the ECU will be able to report the traveled distance with the MIL active.
- c_obd_diag_state This value represents which OBD standard that the ecu complies to. If set to one the ecu will report that it complies to the OBD-II standard as defined by CARB. A full list of what the values corresponds to can be found here under the "Service 01 PID 1C" section.
Engine coolant temperature control
The M54 engine family is fitted with an e-thermostat that the ecu can control to alter the engine coolant temperature. By altering these values we can change how hot the engine will run in different conditions.
- c_tam_min_ect - Minimum ambient temperature threshold for e-thermostat activation
- c_tia_min_ect - Minimum intake air temperature threshold for e-thermostat activation
- c_toil_min_ect - Minimum oil temperature threshold for e-thermostat activation
- c_tia_max_ect - Maximum intake air temperature threshold. When exceeded target coolant temperature will be set to c_tco_sp_tia_max
- c_tco_ex_max_ect - Maximum radiator outlet temperature threshold. When exceeded target coolant temperature will be set to c_tco_sp_tco_ex_max
- c_toil_max_ect - Maximum oil temperature threshold. When exceeded target coolant temperature will be set to c_tco_sp_tia_max
- c_tco_sp_toil_min - Target coolant temperature until the thresholds set by c_toil_min_ect, c_tam_min_ect, and c_tia_min_ect are exceeded.
- c_tco_sp_tco_ex_max - Target coolant temperature if c_tco_ex_max_ect is exceeded
- c_tco_sp_tia_max - Target coolant temperature if c_toil_max_ect or c_tia_max_ect are exceeded
- c_tco_bol_ect - Target coolant temperature if an external low coolant temperature request has been received
- c_tco_min_ect - Minimum coolant temperature threshold for full energization of the e-thermostat
- id_tco_sp_ect__n__maf_sub - Target coolant temperature when c_toil_min_ect, c_tam_min_ect, and c_tia_min_ect are exceeded - AC off
- id_tco_sp_ect_acin__n__maf_sub - Target coolant temperature Target coolant temperature when c_toil_min_ect, c_tam_min_ect, and c_tia_min_ect are exceeded - AC on
- ip_ectpwm_i__tco_dif - e-thermostat I component
- ip_ectpwm_p__tco_dif - e-thermostat P component
- id_ectpwm_add__n__tco_sp - Required e-thermostat duty cycle to achieve coolant temperature setpoint
Secondary Air Pump Delete
For forced OBD Readiness set C_CONF_SAP: "1"
Lambda Sensor Configuration
Constant "c_conf_cat" has five different options which represent the ecu´s ability to work with different lambda probe setups.
Set the following values that suit you needs:
- 0: Single bank with one pre-cat lambda sensor or cat-preparation (SA199)
- 1: Twin bank with two pre-cat lambda sensors or cat-preparation (SA199) and automatic learning of postcat sensors
- 2: Single bank with one precat lambda sensor and one post-cat lambda sensor
- 3: Twin bank with two pre-cat lambda sensors and one post-cat lambda sensors
- 4: Twin bank with two pre-cat lambda sensors and two post-cat lambda sensors
The automatic learning process of post-cat lambda sensors starts after deleting "learned variants" with INPA.
After installing catless headers, it could be useful to eliminate post-cat sensors with setting "c_conf_cat" to "1".
MAF Sensor Scalar Adjustments
The standard MAF sensor map is a non-interpolated 16*16 lookup table, that can also be shown as 1*256 "voltage (v) vs. airflow (kg/h)" table. The 10 bit analog to digital conversion is reduced to 8 bits and 4 bits of each are used to lookup the MAF value.
There are differences in flow between the M54B22/M54B25 and M54B30 MAF sensors, as the diametre is different. Differences in cross sectional area would be expected to rescale the values, but the sensor is part of the tube and not easily modified.
Replacement slot type sensors (Ford based) are often used in high output blow through configurations for turbocharging, as the BMW OEM sensors are not well suited to boost in blow through setup.
"Engine load (mg/stroke) is proportional to "airflow (kg/h)" divided by RPM and is used to reference most of the important injection and ignition tables.
There is a factory airflow limit of 1024kg/h that can be doubled or quadrupled with a patch that has undergone basic testing, but the maximum engine load is still limited to 1389mg/stroke, unless there are massive code rewrites.
A M54B30 pulls about 600mg/stroke in cold conditions with a maximum airflow of about 630kg/h.
Changes to MAF tables should be kept smooth and progressive. Fuel trims plotted against MAF voltage can be used to fine tune the closed loop areas.
The Siemens MS43 has two gear dependant rpm limiters, a softlimiter and a hardlimiter for each gearbox type (manual or automatic transmission).
The softlimiter works by cutting injectors based on fuelcut pattern, whereas the hardlimiter immediately cuts off all cylinders.
- ID_N_MAX_AT: softlimiter for AT gearbox
- ID_N_MAX_MAX_AT: hardlimiter for AT gearbox
- ID_N_MAX_MT: softlimiter for MT gearbox
- ID_N_MAX_MAX_MT: hardlimiter for MT gearbox
In addition to that, you will want to raise "ID_N_MAX_VS_MAX_AT" or "ID_N_MAX_VS_MAX_MT" slightly above the hardlimiter.
The Siemens MS43 gets it's vehicle speed signal (_VS) from the ABS control unit and not from a sensor inside the differential, like older chassis.
In case the ECU doesn't get a valid vehicle speed signal, for example when you put an M54 engine in an older chassis, or strip out the ABS block for weight reasons, a third RPM limiter is applied:
- C_N_MAX_VS_DIAG: RPM limiter in case of missing vehicle speed
The Siemens MS43 has two gearbox dependant speed limiters, set them to 255 to have unrestricted vehicle speed.
Fake Race Camshafts / Lumpy Idle Mod
Faking some serious camshafts is pretty easy as M54 engine has adjustable camshafts. So basically whats happening when going camshafts is, the valve overlap will be increased by a huge amount. This means, intake and exhaust valves are open at the same time.
- c_n_min_er >idlespeed, to not trigger during when engine idles lumpy.
Max adjustable value for the different engine specs:
The biggest valve overlap will be achieved when using the lowest adjustable value on the intake side (80° respectively 86°) and the lowest adjustable value on the exhaust side (-80°)
A good starting point for further optimization could be:
The following information need to be handled with care as you´re able to turn off safety features! This can lead to severe damage and you´re doing so at your own risk!
- c_n_min_er: minimum engine speed for detection of misfire!
- c_n_max_er: maximum engine speed for detection of misfire!
- id_iga_dec_knk_1__n: ignition angle reduction based on knock stage1
- id_iga_dec_knk_2__n: ignition angle reduction based on knock stage2
- c_n_ti_ad_fac_min: min engine speed to allow adapation of fuel trim, multiplicative
- c_n_ti_ad_add_max: max engine speed to allow adapation of fuel trim, additive
Please look here for the special functions that need licencing: Daniel_F._Special_Functions
Here are some handy mods when going forced induction Forced_Induction_Upgrades
M Cluster LED Control
After swapping in an M3 cluster into a E46 or M5 cluster into E39, there is no more ecometer displaying the momentary fuel consumption, but a more useful oiltemperature gauge.
Using this cluster and some additional code we can also control the LEDs around the RPM gauge to work similar to the E46 M3 and also manage shiftlights behaviour.
Following maps are used:
- id_icl_led__n - Warmuplights - LED switchpoints for the given temperature
- ldpm_toil_led - Warmuplights - axis defining the oiltemperature range in °C
- id_icl_led__n - Shiftlights - LED switchpoints for the given temperature
- ldpm_toil_led - Shiftlights - axis defining the rpm range
Explaination for the decimal values used:
- 112 - all LEDs lit
- 96 - 4500 and upwards
- 80 - 5000 and upwards
- 64 - 5500 and upwards
- 48 - 6000 and upwards
- 32 - 6500 and upwards
- 16 - 7000 and upwards
- 00 - 7500 lit
- 01 - oil warning LED yellow (M5)
- 02 - oil warning LED yellow
- 04 - coolant warning LED
Download the warmup and shiftlights patch for TunerPro depending on your software version:
- 430056: Siemens_MS43_MS430056_Cluster_LED_Mod_v2.zip
- 430066: Siemens_MS43_MS430066_Cluster_LED_Mod.zip
Use with 512kByte file only. Checksum correction required!
Setting up LC:
Set the following maps in TunerPro:
Configuration Launch Control
- Launch_PVS_min (i suggest to set this switch over 50% and UNDER 70%. Anything different may lead to non-working LC)
- Launch_TCO_min (and this to "-48" )
- Launch_VS_max (set to "1")
- Make sure coolant temp is equal or above the threshold and ASC/DSC is turned off
- Depress the clutch pedal
- Put car into first gear
- Floor the accelerator pedal! (At least that °PVS matches the threshold!)
- Engine speed should bounce at chosen rpm setpoint. There may be offset which engine speed bounces, like +/- 200rpm
- Release clutch pedal while holding accelerator pedal down.
- Engine speed will be reduced until vehicle speed exceeds chosen threshold (currently not working!)
Engine RPM setting may be adjusted according to road conditions/tire setup, in order to minimize wheel spin.
For additional aggressiveness set "c_n_max_hys_max" to 32 or 64, then LC is much less bouncy
Alternative for non working LC
Map reduction "fewmaps"
The _fewmaps file reduces the number of used maps to the following ones:
- Idlespeed: ip_ti_tco_1_is_ivvt__n__maf
- Part load: ip_tib__n__maf
- Full load:
- Idlespeed: ip_igab_is__n__maf
- Part- & full loadip_igab__n__maf
- Idle speed: IP_CAM_SP_tco_1_IN_IS / IP_CAM_SP_tco_1_EX_IS
- Part load: IP_CAM_SP_tco_1_IN_PL / IP_CAM_SP_tco_1_EX_PL
- Full load: IP_CAM_SP_tco_1_IN_FL / IP_CAM_SP_tco_1_EX_FL
This is great for finding basemaps.