Fun with CAN Bus

With the Seicane installed I wasn’t sure the Jeep’s subwoofer was working anymore. The sound was very thin compared to the factory unit. I did an A/B test between the two using my phone as the source and could hear a huge difference.

Why doesn’t the sub work?

2015-2017 Wranglers with the Alpine premium audio package have an amplifier that’s controlled by messages sent from the head unit over a CAN bus. The stereo communicates this way to control: gain, fade, balance and the bass/mid/treble frequency equalizer.

The Seicane unit itself doesn’t communicate on the CAN bus directly, it uses a separate box to decode messages and then transmits them to the head unit using traditional voltage signaling. The stereo has to send at least one message to the amp after power-on to tell it how behave. It was fairly obvious this message was constant since there is no way to change fade (or any other amp setting) through the stereo’s GUI.

The CAN bus decoder is the purple box above.

The volume on the Seicane is very loud out of the box even when set to a low volume. My theory was that it was setting the amp gain very high and the bass equalizer lower than the factory stereo. A/B testing seemed to reinforce this. However, the only way to know for sure would be to sniff the CAN bus and I had no way of achieving that.

So I built a sniffer.

I was correct in hypothesizing that the Seicane sends a static message to the amplifier:

3d9 1c 0a 0a 0a 0a 00

0x3d9 – device address
0x1c – amplifier gain (0x0 – 0x26)
0x0a – balance (0x1 – 0x14)
0x0a – fade (0x1 – 0x14)
0x0a – bass (0x1 – 0x14)
0x0a – mid (0x1 – 0x14)
0x0a – treble (0x1 – 0x14)

Overriding

I had originally hoped that I could turn my Raspberry Pi sniffer into a device that could override the Seicane’s messages and regain the amp’s control of fade and bass. I naively thought it would only send the message out once after power on. However, the Seicane sends its messages out every 500ms.

I wrote a simple bash script to send messages out at 100ms intervals to see what would happen. It sorta worked but when I listened closely I could hear the two fighting for control of the amp, be it fade, bass or gain. It wasn’t convinced it would be good enough.

At this point I have two options:

  1. Somehow filter out the Seicane’s message and send my own.  Luckily there exists a CAN bus Pi hat with two interfaces, so this is achievable using off the shelf parts.
  2. Buy a separate amp for the sub and control it directly from the Seicane’s pre-outs. This is probably the easiest solution but what fun would that be?

Future Work

The first option seems feasible but another problem will be the source of power and the Pi’s boot time. As wired, the Pi draws power directly from the Jeep’s battery and is on all the time. I will need to wire it up to ACC power (not a huge obstacle).

The bigger problem is boot time. As configured and running Raspbian, the Pi takes about 30s to boot. The Seicane reads CAN bus messages to know when to turn on. If I stick the Pi in the middle, the Seicane won’t starting booting until the Pi finishes powering up. The Seicane itself takes around 30s when cold. Waiting a minute after the car starts just isn’t acceptable to me.

Some quick research suggests I could get the Pi’s boot time down to maybe 4s using a distro like Arch Linux and stripping everything down. That might work.

Another thought I had was to use relays to control the source of the Seicane’s CAN bus inputs. I could use the “normally open” position of a set of relays to default the Seicane’s CAN bus decoder to read from the Jeep’s unfiltered bus. After the Pi boots, switch those over to the “closed” position which would draw from the Pi’s filtered CAN bus output. This should allow the Seicane and the Pi to boot at the same time.

If I filter out messages from the Seicane and inject my own, then it would be possible to achieve the following:

  • The ability to control fade. I like to set it a little to the rear so I feel like I’m in the middle when driving.
  • Turn up the bass and get something out of the sub.
  • Make use of the call and voice recognition buttons by recognizing those messages on the Pi and sending a command over TCP/IP to a custom Android app running on the Seicane.
  • Update the instrument panel’s LED display with custom messages as per Char Gibbon’s blog.

2 thoughts on “Fun with CAN Bus

  1. J_dxb says:

    I really like your blog on seicane. Fade doesn’t work on my seicane. Door ajar doesn’t work.. sub sounds good.. but again bass can’t be adjusted..

    1. Mark Dodd says:

      Thanks!

      Yeah they did a bait and switch compared to what they claimed on their website. They said the door ajar and steering remap functions would work but that’s not the case. There’s no CAN bus processing being done on the unit itself. Hopefully I have some more time to play around with things in the new year and figure out some solutions.

Comments are closed.