Gaggia Baby Twin front panel protocol

I recently got (and fixed) a broken Baby Twin off ebay. I want to experiment with the extra boiler. Anyway, it turns out the Twin talks to its front panel using a TWI based protocol. Here are my notes (which I made in an ASCII editor – enjoy the ASCII graphics and sorry about the scroll bar at the bottom):

A 14 wire ribbon cable connects the front panel to the controller
board. If we number the wires from 1 to 14, starting at the red end,
then the connector on the board alternates sides:

14  12  10   8   6   4   2
 |   |   |   |   |   |   |
-----------------------------
|                           ]
|                          |
|                           ]
-----------------------------
   |   |   |   |   |   |   |
  13  11   9   7   5   3   1

My best guess is that the controller board has two interfaces on this
cable, one for the Twin and one for the Dose. For the Twin, it is a
TWI interface and for the Dose it is a simple set of lines to LEDs and
switches. The only pins that seem to make any difference for the Twin
are:

1  VCC
9  SDA
7  Button touch notification
11 SCL
14 GND

The front panel pulls pins 9 (SDA), 11 (SCL) and 7 high. When a button
is touched or released, pin 7 pulses low for 50us. This could be used
to respond or you can you poll regularly.

In addition, the controller board pulls the following high: 2, 4, 6,
8, 10. And 3 and 5 are high impedence. And 12 is low or high impedence
(can't remember). None of these are relevant to the Twin front panel.

The controller polls the front panel periodically with the following
protocol:

Poll rate: normally every 48ms. When a button is being touched,
  continuously.
SCL clock speed: 62500Hz.

At each poll, the controller writes the LED state and then reads the
buttons.

To write: write two bytes, the first is address and the second is
value.

To read: write one byte (address) and read one byte (value).

The front panel only responds to the general call TWI address 0.
The address of the LEDs is 0x00 and the address of the buttons is
0x01.

So on the TWI bus, you see:
START, address packet to 0 and W = 0x00, 2 data packets: 0x00, CODE1, STOP,
START, address packet to 0 and W = 0x00, 1 data packets: 0x01, STOP,
START, address packet to 0 and R = 0x01, 1 data packets: CODE2, STOP.

CODE1 is a six bit bitmask plus two parity bits:

| 7        | 6        | 5           | 4         | 3         | 2          | 1         | 0         |
| Parity 1 | Parity 0 | Element LED | Steam LED | Water LED | Manual LED | 2 cup LED | 1 cup LED |

Parity 1 is bit3 XOR bit4 XOR bit5.
Parity 0 is bit0 XOR bit1 XOR bit2.

CODE2 is a pair of 4 bit nibbles where high nibble = 1s complement of
low nibble. Low nibble is a 4 bit bitmask indicating which button is
touched:

| 3     | 2      | 1     | 0     |
| Water | Manual | 2 cup | 1 cup |

Note: if more than one button is touched, this is invalid and
code2 = 0xf0.

 

Leave a Reply

Your email address will not be published. Required fields are marked *