I recently acquired a Cyrus Power, and wanted to turn it on and off remotely. I can add a relay in line with its mains power, but it doesn't remember its power state when you turn off the mains - every time you apply power, it comes up in standby. Therefore, I needed to find a way to power it up fully, as happens when you press the button on the front. I suppose I could have rigged up a solenoid to press the button, but that's not very satisfying - especially when the amp has the facility to be controlled by other Cyrus components over a data bus called MC-BUS!
However, I couldn't find any info on the protocol either out on t'internet or from Cyrus themselves, so I borrowed a colleague's Cyrus III and reverse engineered it. I thought I'd post the info here in case it's of any use to anyone else.
Disclaimers: All the below assumes a fairly thorough knowledge of electronics and software development. If you try any of this, all risks are on you as this info could be inaccurate, is certainly incomplete, and comes with no warranty whatsoever!
All observations were made between just two products so there's a pretty small chance of it applying to others, but perhaps other people can fill in the gaps (information about a hardware interface and some demo software that allows monitoring of the bus can be found toward the bottom of this page).
Cyrus MC-Bus notes: #
Made using a Cyrus III integrated amplifier (has normal banana plugs, 1996ish) and a Cyrus Power (has BFA plugs, 1998ish?)
Electrical specification #
Appears to be 5v TTL asynchronous serial: 8data, no parity, 1 stop, 4800bps.
Not sure what level of isolation between the MC-BUS and the audio path exists within the amp, it may be possible to inject noise into the system if there's a ground loop or an otherwise noisy ground point formed when you connect other kit to the MC-BUS.
Data protocol #
All traffic appears to be echoed bytewise by each unit, after the received byte has finished (i.e. it's not a direct electrical connection, it's echoed by each micro after it's been received). If an echo is not received, the sending unit appears to give up for the rest of the transaction - this is why MC-BUS must be connected in a complete loop.
I have not seen any evidence of echoes being anything other than what was received.
Button presses appear to result in the controlling unit sending two groups of two bytes, with a fairly large gap between the two groups (this is presumably to allow for the maximum number of units' echo time?).
From the look of it, for each group, the first byte on the wire always has the MSB set, and the second byte on the wire always has the MSB clear. This makes sense 'cos otherwise you can't tell if you've started receiving a command halfway through.
There may even be more fixed bits, as I've never seen a real message start with anything other than Ax, and the second byte is always 2x or 3x. These may however be reserved bits for later protocol versions, other products, etc.
Let's call these two-byte groups "commands".
What commands do what? #
Whenever a source button or the power button on the III is pressed (not counting tape loop), it sends two commands.
First, the controlling unit sends some kind of source-select command, which is 0xA13x (x varies according to which source is selected) - this is sent regardless of whether the controller is about to send amp-on or amp-off.
Some time later (48.4ms for on, 54.9ms for on, wonder if this difference is critical?) another command is sent, which seems to be to control the power state of some other units. Each source has a different power-on command (presumably because some components don't need to be switched on in some modes) which is sent both when the source button is pressed or when the III is powered on.
The III sends the same power-off message when switched off, regardless of what source was selected. The power-off command is sent thrice (presumably to be extra sure that everything gets the message and switches off!)
The Cyrus Power responds to ON/OFF commands without needing a source select first.
There are probably lots more commands that the III would send in CD or TU mode, if the extra buttons on the remote were used - I didn't have the remote so all I have is the commands sent when using the buttons on the front panel.
All commands herein are written in hexadecimal, with the leftmost byte being the first byte on the wire. The fixed bits are included in the values, so e.g. 0xA000 could be considered to be 0x2000 ignoring the MSB of the first byte, or 0x1000 if you consider the two bytes as 7 bits each and run them together as one 14-bit word. I haven't done any of that, the values are all exactly what you'd see on the wire:
Commands for source selection:
PH: a1 30
CD: a1 31
TU: a1 32
VI: a1 33
AU: a1 34
Commands for power state:
PH: a7 2f
CD: a2 2e
TU: a3 32
VI: a6 3c
AU: a4 27
A hardware interface #
In order to communicate with the bus from your PC, all you really need is a 5V TTL serial port. However, I wanted more functionality than that, such as the ability to wake the PC from standby when the Cyrus rig is turned on (in case I get a Cyrus integrated or pre at some point) so a microcontroller with a UART and a USB port to communicate with the host PC is in order.
As it happened, I had a Minimus AVR USB v1 in stock that I'd bought cheap when they were being discontinued (and replaced with the slightly more powerful Minimus 32 AVR USB). I hooked its UART pins up to half an old phono cable and connected it thus:
If you happen to have a Minimus AVR USB v1 handy (or can find one to buy), here is a hex file to program into it (can be done with dfu-programmer over USB, no need for any programming hardware) that will display any commands that it receives on the bus - plug it into your PC and it should present a virtual serial port, open that port with e.g. PuTTY or minicom and you should see messages.
And here is a hex file that allows you to control an amp: by pressing the HWB button it will do similar to pressing the standby button on a Cyrus III when in Phono mode.
And finally, here is the source code for the above so you build it to do whatever you like.
I'm probably not going to do much more on this 'cos it does what I wanted, but I've put the source here so you can take it and make it your own - just please don't take credit for my work! If you do something cool with it, post a comment here or let me know otherwise, and if you fancy adding to the list of known messages please do so.