BMW I-Bus Reader Project
I'm working on a little project to interface to the I-BUS in my E46. This project will go in between the radio head unit and the CD changer. It will intercept messages meant for the CD changer and only forward messages when the CD changer is selected. When Aux Audio is selected the CD Changer messages will be intercepted and my board will respond to the head unit like it was a CD changer. I've seen a few other devices out there, like the DICE, that allow you to hook an iPod (MP3 player) to the stock radio, but, they require you to disconnect the CD changer. My project will keep the CD changer. I intent to use the R/T steering wheel button meant for the cell phone to select between the MP3 player and the CD Changer. I am thinking about having multiple inputs that can be rolled through with each press of the R/T button. This will allow MP3 player, Satellite radio or HD Radio to be routed in through the stock radio.
At this moment I haven't picked a processor, but, it's going to be a Microchip PIC device with dual UARTs, probably something in the PIC24F series. I have picked an I-Bus interface chip and it's NOT the Melexis TH3122. I'll explain a bit later.
Below is picture of my I-Bus reader that I build just to see what's on the bus and if I can write code to capture the message and interpret them. I used an old board from work, a PIC16F886A and a 4-line LCD Display. I am able to capture and display in hex the IBUS messages. For example the top line is 0x50 0x04 0x68 0x3B 0x28 0x2F. The first byte is the source ID, in this case 0x50 which is the MFL or Steering wheel, the 2nd byte 0x04 is the length meaning there are 4 more byte in the message. The 3rd byte is, 0x68 which is the radio. The 4th byte and 5th byte are the message, in this case 0x3B and 0x28 which means Button Previous was released and the 6th byte is the checksum. So XOR'ing 0x50, 0x04, 0x68, 0x3B and 0x28 equal 0x2F, the checksum value. If you XOR the checksum with the rest of the message you get 0x00. Anything other than zero means the checksum doesn't match and the whole message should be ignored. I have two LEDs on the board, a red one and a green one. I have the red one blink everytime the checksum doesn't match and the green one blink when it does match. I also have a DIP switch to change the mode of the LEDs so that it only blinks when MFL to Radio messages are detected. I am most interested in steering wheel commands. The next command 50 05 68 3B 08 0F for Previous button-Pressed and then Previous button-Released again.
Below is the schematic minus most of the stuff on the board that I didn't use. Pretty standard, PIC microcontrollers, some buttons & switches, some LEDs and voltage regulator. The part you might find interesting is my I-Bus interface. I didn't use the Melexis TH3122 chip which everyone seems to think is the way to go. I looked at that chip and thought, why do I need all this, plus the chip is hard to get and 16 Euros from Rolf Reseler in Germany. Screw that, I can do it with discrete components. I found a three transistor circuit which did the job, but, I didn't like the fact that it drew current from the bus when the bus was high. In a multidrop bus like the I-Bus you should not draw current from the bus when it's floating and passively pulled up. Plus that circuit used two transistors for receive. The first transistor inverts the signal and the second transistor is there to invert it again to get the proper polarity. I thought about it some more and came up with the circuit below. One schottky diode and a pull up resistors, there only $0.16 worth of components. My circuit presents no load to the I-Bus when the bus is high even if my circuit is unpowered, except for minimal diode leakage. When the I-Bus is low the diode is forward biased and pulls the PIC's receive pin low. The 10K resistor pulls the line to +5V when the I-Bus is high. As you can see in the picture above I have built this circuit, written code and it works great. Now this circuit only sits on the bus and snoops. It does not transmit. To add transmit capability I just need to add one more resistor and a transistor. Of course the microcontroller would then need to do collision detection and hold off, which is one benefit of the Melexis chip, but, I'm not scared of that. I like my circuit, but, for my next board I'm going to want transmit capability so I'm going to use the ON Semiconductor AMIS30600. It's in stock at Mouser for only $1.46, not half way around the world for 10 Euros plus 6 Euros shipping.
My project has taken many twists and turns. First I wanted to use the stock head unit to interface to multiple audio sources then I wanted to change the head unit to a Pioneer Premier head unit which I could control using the BMW steering wheel controls. Then back to using the stock head unit. Now I'm not sure what I want to do and the project is on hold while I work on some other projects. I might get back to this project when I get some time or when I decide what I want to do with my car audio. In the mean time I'm going to leave this web page up with some of my notes and earlier work.
If interested contact me at: SCOTT@BMWGM5.COM
I have posted a couple web pages on my stereo install.
Front left door speaker location.
Factory BMW 10-channel Amp
Pinout of the Pioneer IP-Bus Connector
Cool web page on CD Changer Protocols
Kenwood CD Changer Protocol http://www.adriangame.co.uk/kenw-dc-pro.html
iPod 30-pin Connector http://www.adriangame.co.uk/ipod-acc-con.html
iPod Serial Protocol http://www.adriangame.co.uk/ipod-acc-pro.html
Got door locks problems? Doors refuse to unlock? It could be your General Module. Check out my web site for more information. www.bmwgm5.com
I can be reached at firstname.lastname@example.org
GM5 Repair Service