How would you like...working factory traction control? For a low price of $ at my website...it can be yours! (Only half kidding). I do have a product aimed at the E46 chassis, so here we go...
One of the pieces of information that is both well documented and hilariously inaccurate at the same time is BMW E46 CAN messages. The basic stuff is indeed super simple, and you've gotten some of it already. Other pieces, unless you've gotten a good disassembly you'll probably never see the info.
DME 1: (0x 3 1 6)
Byte 0
- Bit 0 Is indeed Ignition Key status (1 for run, 0 for when key is out and you're still in power hold mode. The DME relay is active for a few seconds (I want to say 5 or 7) after keyoff to allow a quick restart if necessary.)
- Bit 2 is ABS / TC messages missed. Set it to 4 if you haven't missed any messages.
So normal operation of Byte 0 for you is 0x5.
Byte 1, 4, 5, 7 are torque values. Byte 1 is target torque with external interventions, 4 is from the 'driver' (but that also includes idle, so that gets to be fun), 7 is target torque without interventions. Byte 5 is frictional torque. These are 0-99.6% (0-254, 255 = error).
You can ignore byte 6. I can't, and it's been the bane of my existence for a while.
DME 2: (0x 3 2 9)
Byte 0:
- Multiplexed data stream. 0x3F is data, rest is identifier.
0 -> 0x11 -> CAN version. "11h CAN"
1 -> 0x40 usually...Though I don't see that in your data
2 -> 0x80 usually - 0x86 implies some OBD Drive cycle stuff
3 -> This is where the magic is. 0xD9 is.. 0xD9 & 0x3F = 0x19. 0x19 = 25 Decimal. 25 Decimal * 16 = 400 Nm Tq.
This is what the torque values are divided by. "Torque Normalizer" I'm guessing the original car in the 5 series was a 3 Liter M54? (Aka 530i?)
Byte 1 is Coolant Temperature
-B1 is Temp [Temp in C = .75 * hex2dec(byte01) - 48]
-B2 is atmospheric pressure -- mbar = 2x + 597.
-B3
0 - Clutch Switch (1 = engaged)
1 - NONE
2 - NONE
3 - Warmup Bit - If temperature is >= 60 degrees C
4 - Not in Engine Stop or Start state (running)
5 - 7 - Cruise Control bits from Steering Wheel Controls
-B4 Pedal position (00 - FE) // Cruise only
-B5 Pedal position (00-FE). // Max of Cruise or Pedal
-B6 kickdown switch depressed is 4 (bit 2 = 1), Brake light switch error is 2 (bit 1 = 1), Brake pedal depressed is value 1 (bit 0 = 1), (8 is state_cru_can)
-B7 Zero
DME 4: (0x5 4 5)
B0 Check engine light (binary 10), Cruise light (binary 1000), EML (binary 10000), Check gas cap 2002+ cars (hex 40).
B1 Fuel consumption LSB
B2 Fuel consumption MSB. Value is fuel used in Microliters % 65535
B3 Overheat light (binary 1000, Hex 08), (Another oil level is 1), oil level (yellow) 2002+ cars, (binary 0010, hex 02), On M3's 0x10 7K and Up RPM lights, 0x20 6.5K and up RPM lights, 0x40 5.5K and up RPM lights.
B4 Oil Temp [Temp in C = hex2dec(byte04) - 48]
B5 Charge light, 2002+ cars (Binary 0001)
B6 Unused.
B7 Oil Pressure (Red), hex 0x80
And... if you want traction control, you need to listen for the messages on..
ASC 1 (0x 1 5 3):
/* Byte 0 is data bits:
0x01 - ASR Active [Anti-Skid Regulation in German]
0x02 - MSR Active [Engine Drag Torque regulation in German]
0x04 - Active during 'uninit' at poweron. (Torque Intervention not possible?)
0x08 - ?
0x10 - Brake pedal depressed.
0x20 - Active during 'uninit' at poweron. (Torque Intervention not possible?)
0x40 - Active during 'uninit' at poweron.
0x80 - Active during 'uninit' at poweron.
Byte 1 - LSB of Speed } (Bits 3-7)
- Bit 0 - CAN Error?
- Bit 1 - Plausible ASC Control
- Bit 2 - Vehicle Speed Error
Byte 2 - MSB of Speed } (Bits 0-7)
Byte 3 - ASC Torque Intervention (Ignition Angle - "Fast path" - Short interventions)
Byte 4 - ASC Torque Intervention on MSR (Usually 0, but not always - Byte 0 0x02 when non-zero)
Byte 5 - I think this is the compliment of byte 4 during an MSR intervention. (255-Byte4)
Byte 6 - ASC Torque Intervention (Filling - Throttle body based - Long interventions because the short one didn't fix the problem)
Byte 7 - 0x80 normal, 0x02 "Uninit"
*/
Byte 3 and 6 are scaled by..you guessed it..the torque normalizer _you send out_ on 0x3 2 9.
Basically look for it to say ASR active, the requested torque on byte 3, reduce torque command to inverter, report out what you've commanded on 0x3 1 6...and you should have a working traction control.
While other 3rd party manufacturers have put out "Plug and play" kits with pretty terrible quality, I try to get my stuff as correct as possible. Even though this may eat into my sales if someone finds it here, I'm OK with that, as the really hard stuff (SMG gearbox integration) is much harder than this. I've spaced out the IDs to to combat some of these manufacturers finding it.
So for everyone else, hopefully this info is useful in getting your EV driveline working in your E46 chassis BMW.
-Matt