The index page.
A page about a ring-flash I am working on.
My old old page about the flash connector.

The E-TTL Protocol

Ever since I got my Canon Powershot G3 I have tried to find some documentation on the protocol used on the "hot shoe" flash connector. Fortunately, I was recently able to borrow a Speedlite 550EX flash unit and an EOS 50 (non-digital) camera from colleagues at work, so documenting at least parts of the protocol was simply a matter of hooking up a camera and the flash to an oscilloscope and monitoring the data. Note that the following text only applies to what I observed in the communications between the 550EX and either the PS G3 or the EOS 50, Canon is notorious for changing something with each new camera version with odd behavior in 3rd party flash units as a result.

The connector

There is a small switch on the right hand side, below the spring below the rail. Pushing it down turns the internal flash off, and changes the flash- settings scale in manual mode. The preferred point for connecting to ground seems to be the insides of the "rails". The small hole is for a locking pin (The speedlite implements this).

   (STSPC)     (EFIDO)
   (AVEFI)      (CCC)

The electrical interface

X signal is used for trigging the main flash, the high level is 3-5V, the low level is ground. When using 1st curtain sync X remains low while the shutter is open.

CCC (or whatever) is, as far as I can tell only used for enabling the pilot lamp in the flash unit. Keeping it at ground seems fine (the PS G3 does this), the EOS 50 keeps it at about 1.25V idle and raises it to about 3.2V to turn on the pilot lamp.

The remaining 3 pins (STSPC, AVEFI, EFIDO) are used for data transfer, the low level of all 3 pins is about 2.2V (ie, the do _not_ go to ground during normal signaling), with high levels of 5V, 3.7V and 3.3V respectively.
The exception is STSPC which is driven to ground by the PS G3 when trigging the preflash (the EOS 50 only drives it "low", but instead twice, see command B4). Apparently the protocol (the B4 command with some argument?) instructs the flash to interpret the next transition on STSPC as a trigger. The EOS 50 pulls STSPC low slightly before X (when it physically releases the shutter?), the PS G3 keeps STSPC high during the main flash.

AVEFI is driven by the flash and EFIDO by the camera. The presence of a E-TTL flash is recognized by a "high" level on AVEFI (the idle state), otherwise the camera (G3) keeps STSPC high and EFIDO low, (their idle states), without attempting to transmit any data.

Data is driven on falling edges and latched on rising edges, MSB is sent first on both lines. Clock rates seem to be in the order of 50 to 100kHz.

A byte:

Blue: STSPC, red: AVEFI and green: EFIDO.

Note that the flash keeps AVEFI low for a while (usually about 100us), presumably to indicate "busy" on a link level. In case the last bit on AVEFI is 1, the AVEFI line goes low about 10us after the last rising edge. This agrees well with the camera never tries to clock any data when no voltage is applied at AVEFI (i.e, a non-E-TTL flash is connected).

EFIDO is driven high a few us before the transmission of a byte, even if the first byte on EFIDO is 0. If the last bit on EFIDO is 1 the camera holds that state for about 40us after the last rising edge before returning EFIDO low.

Note that the flash occasionally interprets STSPC going low or ground (trigging a preflash) as a clock transition and outputs the first bit of a pending data byte. This error is handled somehow (timeout between bit clks?), i.e, when clock later has gone back high and the camera starts clocking everything works fine. Also, only the PS G3 keeps all lines at their idle states at all times, and only when the display is on, otherwise all lines except X are kept at ground and rises to their idle levels when the camera becomes active (when taking a picture or otherwise activating it in a way that makes it reasonable to transfer new settings), then returning the lines to ground. Consecutive bytes are usually separated by 500us or more.

Taking a picture with the EOS 50:

Blue: STSPC, red: AVEFI, green: EFIDO and black: CCC.
The pilot lamp is used in two pulses. The X signal is not shown in this figure, but should almost coincide with STSPC going to ground. The whole figure is about 2.8s.

Another picture with the EOS 50:

Blue: STSPC, red: AVEFI, green: EFIDO and black: X.
Note STSPC going low slightly before X (and going high some time before X goes high). The whole figure is about 2.2s and the shutter is 1/5s. Also note that the camera keeps repeating a small set of commands while focusing etc, and keeps doing this until the trigger is pressed fully.

The protocol

The camera controls clocking and sends commands/data, the flash sends the reply when the camera clocks the next command.

There seems to be two categories of commands: Setting stuff (0xBn and reading stuff 0xFn, in the following text Bn commands are assumed to take one byte arguments and Fn command no arguments, unless a number of bytes is stated explicitly (thus, numbers in the "descriptions" refers to these argument bytes and replies, respectively).

Setting stuff (all numbers except those in brackets are in HEX):

B0: set desired flash intensity, the EOS uses A0 for preflash and the PS G3 90, 
    full intensity seems to be C0
    reply: 86, 86 (i.e. 86 is clocked out when the intensity is sent and
           86 is clocked out during the next (whatever) command
B1: unknown, PS G3:
           05 usually, sent before the preflash
           2C seen when using HS-flash in manual mode

         EOS 50: 
           AF: shutter time selected to less than 1/125
           FE: shutter time of some number of seconds
           5C: high speed sync (HS), 1/4000
           67: HS, 1/750
           f6: "normal" shutter times
    reply: 86-86           
B2: only seen with the PS G3, when IR-master mode is selected on the flash.
    (not investigated further)
B3: unknown, 2 _or_ 3 bytes of data:
             PS G3: 02-06-03 or 02-46-03 sent now and then, 
                 06-02 sent shortly before main flash (in auto mode)
         EOS 50: 02-00 sent now and then
                 22-00 sent after preflash
                 26-00 sent before main flash

    reply 00-00(-00)
B4: set trigger/enable flash? always sent before a preflash or a main flash
    is triggered, 1D often sent when not preparing for trigging.
    typical sequence: many 1D's, 3 before selecting intensity of the
    preflash and reading F2, 23 before trigging the preflash with STSPC, 
    1D again after the preflash, followed by 3D before trigging the main
    This is modified when HS flash is enabled: 05 while idle, 03 before
    setting preflash intensity and checking F2. 23 before preflash, 
    25 before main flash.

    Note that the EOS 50 pulses STSPC low twice about when the preflash is
    expected. I have not verified which of them triggers the preflash, 
    but my guess is the later, based on the protocol.
    With the PS G3 in manual mode the sequence becomes:
    19 before command F2 (max avail flash?), followed by 39 before trigging 
    the main flash.
    reply: 86-86
B5: sent first in each "batch" of commands, 4D on the PS G3, 48 on the EOS 50
    (protocol version/camera features?)
    reply: c6-86
B7: aperture, 00 sent by the PS G3 in manual mode, otherwise:
    18->F2.0 1A->F2.2 23->F3.2 28->F4.0 2D->5.0
    30->F5.6 33->F6.1 34->F6.7 35->F7.1 38->F8.0
    3c->F9.5 40->F11  44->F13  48->F16 4c->F19 50->F22  
    reply: 86-86

B8: shutter time, examples:
    2B->3.2s 38->1s 4a->1/5 60->1/30 68->1/60 
    6A->1/80 6F->1/125 78->1/320 96->1/4000

B9: camera mode, always 80 with the PS G3, with the EOS 50:
    bit 7: Manual mode
    bit 6: Aperture priority
    bit 5: Time priority
    bit 3: fast shooting mode enabled
    bit 1: auto-focus enabled

    "P" mode results in neither of bits 5-7 being set

    reply byte 0: flash exposure compensation set in the flash: 
    00-> +-0, 04->-0.5, 8->-1.0, FC->+0.5
    reply byte 1: 86

BB: ISO/sensitivity, with the EOS 50 these numbers are modified up 4 for a 
    flash exposure compensation (either camera or flash) of -0.5, 
    down 4 for positive compensations.
    40->ISO 50, 48->ISO 100, 4B->ISO 125, 50->ISO 200, 55-> ISO 320, 
    58->ISO 400, 78->ISO 6400

BD: set zoom, usually 2 data bytes, but on the EOS 50 a 3rd byte follows
    the first time the command in a sequence. Byte 0 is always 00.
    Byte 1: zoom in millimeters (or something very close).
    Byte 2, when present: 28
    18-69- if the zoom is changing,
    aa-59-00 if the zoom didn't change. 
One can speculate that 86 returned by most commands is some type of status.

Reading stuff:
F2:  Max available flash intensity? (max C0 for main, A0 for preflash), 
     PS G3: Up to 4 bytes (read using FF) (ok to read less)
         53-41-14-00 normal
         53-40-14-00 with flash in manual mode
         57-         with flash in HS-mode
         53-41-15-00 if IR-master enabled
     EOS 50: Up to 3 bytes read
         53-01-00 normal,
         57-01-00 with HS
         other combinations not tested
F7: checked by the PS G3 before command B0, reply: 7B
F8: directly after preflash, actual intensity used?
    typical numbers around 4B to 55, ff when IR-master enabled.                 
    Affected by charge status but not by covering the flash.
F9: status?
    55 normal with the flash head pointing straight forward (or 7deg down)
    5d normal if pointing in any other direction (only tested on PS G3)
    54 not enough energy to flash
    57 2nd curtain sync selected on the flash (only tested on PS G3)
    75 if the flash changing the zoom (busy)

FB: flash mode: 02 if normal, 00 if manual or strobe

FF: Dummy command for reading more reply bytes from other commands
    This command is also sent after STSPC has been pulsed low once
    (to trig a preflash), by the EOS 50. (The PS G3 continues with a F8)

Example files:

Ascii byte lists, first column is the byte clocked out of the flash, the second is the command sent by the camera. As explained earlier, replies appear one byte later.
Taking a picture with the PS G3, Av mode. annotated Ascii plain ascii binary
Taking a picture with the PS G3, manual mode, (1/50,F3.5). plain ascii Zooming in with the PS G3. plain ascii Taking a picture with the EOS 50. plain ascii binary
Taking a picture with the EOS 50 with high speed sync (HS). plain ascii
Taking 3 pictures in "rapid" mode with the EOS 50, flash only firing on the first 2. plain ascii

I have several more files which I will consider making available to individuals on request. Most files are quite boring variations designed to find out the scales of things like aperture. Please state which condition you are interested in and I'll check if I have anything relevant.


The standard disclaimer apply, if you break things, you get to keep both halves. Do not assume that "keeping" both halves is trivial. This is especially true in (but not limited to) cases such as gaseous products (blue smoke), and matter annihilation. The owner of this site will definitely not help you put the parts back together, but feel free to contact him in advance if you expect annihilation of substantial amounts of matter to take place. Canon, Powershot, Speedlite, EOS, E-TTL, etc are trademarks property of their receptive owners.