Print this page

Canon EOS protocol convertor for old Sigma lens Featured

  • font size
Rate this item
(18 votes)

Update 2019

Boards are still in active production to allow everybody restore their lenses. Now new model B is available which is universal for all lenses. So no more problems with selection. Install instruction for cases with very small space under connector is available at the end of article.

I recommend you to inspect white plastic gears on aperture gearbox inside lens, they are often cracked and needs to be replaced to properly working aperture.

If you have problem with AF please see below:
About focus hunting problem and all AF problems in general, there is rubber belt used in transmission gearbox inside older sigma lenses, if you will remove bayonet ring and look inside lens you can see if there is rubber belt (is is tiny, just 15mm in outer diameter) . If rubber belt is used then it can be replaced with silicone o-ring and focus will be good again. In case there is newer gearbox, then problem can be in bad flex cable which tells lens what focal lengths is zoomed (if it is not fixed focal length lens) or some tooth wheel is loose in gearbox. This can be fixed too, but deeper disassembly of lens is required.

Set of o-rings is available for 10EUR or 1EUR/pcs, there are following sizes:


till now they fit every sigma lens I had on my desk. So you can easily choose right size for your lens.
Also plastic gears are available if required for aperture gearbox.

Cause of problem

Because some of lens manufacturers are using communication protocol for Canon EOS cameras which was reverse engineered instead of bought* (which is not bad, because without this expense they can offer cheaper products) they are facing problem with communication protocol changes in newer cameras. In fact it is not change but in older types some protocol commands was not used and marked as reserved of for future use... To be specific, change which made old lenses unusable was in command 0x12 which was changed to 0x13 in newer cameras. As result you will get ERROR 01 or maybe even ERROR 99 (pay attention for ERROR 99 because it is general error which covers "all problems on the world" and there may have nothing to lens, during my tests I observed only ERROR 01 when shooting or when DOF button pressed as only these situations adjust aperture in lens) when you will attach old Sigma lens to you actual Digital EOS camera.

*According to this document Canon doesn't state if protocol specifications was ever released to any third party company. So Canon may be only one who knows complete protocol specifications. Most important information from this document is "buy original Canon lens or ask manufacturer for fix" which is not problem until you have too old lens for free of charge modification by manufacturer. So out goal is still the same, modify lens to make it working as cheap as possible. Thanks to Samppa Tolvanen for this information.

Problem solution

Aside lens change or fixed aperture use options we have quite elegant possibility to add controller which will change this command when it is transmitted to lens so lens can understand it. There is already few implementations for this modification. One which I found on Martin Melchior web page was inspiration for me to do my own implementation. Reason for wheel reinvention was on beginning just desire to try it too. Later I modified code for newer MCU and added some power save functions.

Before you will apply this modification please go through this simply troubleshooting to check if modification could help you.

Digital EOS Protocol

Digital EOS is using modifier SPI protocol. Modified is CLOCK signal where after each packet is CLOCK driven LOW for at least 78us to separate packets. Data are read on CLOCK rising edge and receiving side always drive its data pin LOW during reception.

Below is quoted post from Hans, original link (thanks Elliot for link), anyway it may be useful for deeper protocol commands decoding:

This is the a log from an EOS500 and a EF100LIS lens The lens is much newer than the Body, and it’s therefore expecting a “newer” startup sequence than used by the body
You wil HENCE not find a lens info sequence like the one at the top..

*Telegram DCL DLC
0x000000 0A FF ;Sync command
0x000001 00 AA ;Sync reply
0x000002 90 FF ;Note the lens ignores
0x000003 B9 FF ;all further coms until
0x000004 00 FF ;the second sync command
0x000005 12 FF ;@ telegram #13
0x000006 80 FF
0x000007 B0 FF
0x000008 00 FF
0x000009 00 FF
0x00000A 00 FF
0x00000B A0 FF
0x00000C 00 FF
0x00000D 00 FF
0x00000E B2 FF
0x00000F 00 FF
0x000010 00 FF
0x000011 00 FF
0x000012 80 FF ;The body tries to ask for lens info
0x000013 0A FF ;using 80 0A 00 00 00 00 00 00
0x000014 00 AA ;but since the lens is not correctly
0x000015 00 00 ;initiated according to a newer
0x000016 00 00 ;version of the EOS protocol
0x000017 00 00 ;it mistakes the 0A for a sync
0x000018 00 00 ;command, replies with an AA
0x000019 00 00 ;and starts up (replies with 00)
0x00001A A0 00 ;The body ask for current Fl
0x00001B 00 00 ;
0x00001C 00 64 ;Lens answers 00 64 = 100mm
0x00001D B2 00 ;Don’t know what the B2 command
0x00001E 00 60 ;is but it relates to change
0x00001F 00 00 ;in aperture on zooms
0x000020 00 01
0x000021 0C 00
0x000022 C0 0C ;Request current position of focus group
0x000023 00 00 ;reply is 16 bit signed int
0x000024 00 00
0x000025 F0 00 ;Unknown
0x000026 00 60
0x000027 0E 00 ;Some sort of init sequence id
0x000028 0F 0E ;same…
0x000029 0A 0F ;Sync command
0x00002A 00 AA
0x00002B 90 00 ;Status request command first byte
0x00002C B9 00 ;same.. second byte
0x00002D 00 00
0x00002E B0 00 ;Aperture info
0x00002F 00 30 ;Display Av
0x000030 00 20 ;Min Av
0x000031 00 58 ;Max AV
0x000032 A0 00 ;Request Fl
0x000033 00 00
0x000034 00 64
0x000035 B2 00 ;Unknown
0x000036 00 60
0x000037 00 00
0x000038 00 01
0x000039 0C 00
0x00003A C0 0C ;Request focus position
0x00003B 00 00
0x00003C 00 00
0x00003D F0 00
0x00003E 00 60
0x00003F F8 00 ;Best Focus Correction value
0x000040 00 D3
0x000041 50 00 ;Set speed
0x000042 2D 50
0x000043 0C 50
0x000044 06 0C
0x000045 0F 06 ;Search toward MFD @ set speed
0x000046 0A 0F ;Sync command
0x000047 00 AA
0x000048 90 00 ;Status request command first byte
0x000049 B9 00
0x00004A 00 10 ;status reply: lens at end stop
0x00004B B0 00
0x00004C 00 30
0x00004D 00 20
0x00004E 00 58
0x00004F A0 00
0x000050 00 00
0x000051 00 64
0x000052 B2 00
0x000053 00 60
0x000054 00 00
0x000055 00 01
0x000056 F0 00
0x000057 00 60
0x000058 90 00 ;Status request command first byte
0x000059 B9 00
0x00005A 00 10 ;status reply: lens still at end stop
0x00005B 0C 00
0x00005C 05 0C
0x00005D 0F 05 ;Search toward INF @ set speed
0x00005E 0A 0F ;Sync command
0x00005F 00 AA
0x000060 90 00 ;Status request command first byte
0x000061 B9 00
0x000062 00 24 ;focus group is moving and accelerating
0x000063 B0 00
0x000064 00 30
0x000065 00 20
0x000066 00 58
0x000067 A0 00
0x000068 00 00
0x000069 00 64
0x00006A B2 00
0x00006B 00 60
0x00006C 00 00
0x00006D 00 01
0x00006E F0 00
0x00006F 00 60
0x000070 90 00
0x000071 B9 00
0x000072 00 04
0x000073 C0 00 ;Request focus position
0x000074 00 00 ;
0x000075 E0 5E ;focus position = 00 5E
0x000076 00 BC
0x000077 00 15
0x000078 C0 00 ;Request focus position
0x000079 00 01 ;focus position = 01 CB
0x00007A E0 CB ;Lens extension correction
0x00007B 00 BC
0x00007C 00 E4
As for the 44 command not being used (a bit further down in the same log):

0x00014E 90 00 ;Status request command first byte
0x00014F B9 00
0x000150 00 00 ;status reply: focus group at rest
0x000151 F8 00
0x000152 00 AC
0x000153 E0 00
0x000154 00 BD
0x000155 00 11
0x000156 EA 00
0x000157 00 A3
0x000158 00 D7
0x000159 00 8C
0x00015A 00 04
0x00015B 00 00
0x00015C 00 00
0x00015D E4 00 ;Lens extension factor
0x00015E 00 A1
0x00015F 00 C6
0x000160 44 00 ;Move focus group
0x000161 06 44 ;06 01 = 1537 steps
0x000162 01 44 ;toward INF
0x000163 0F 44
0x000164 0A 0F
0x000165 00 AA
0x000166 90 00 ;Status request command first byte
0x000167 B9 00
0x000168 00 24 ;status reply: focus group moving + acc

For comparison here’s the start up of the same lens with a 650D DSLR body The key difference is that this body does not send the lens info 80 0A command until after it has sent the 0A sync command twice and the lens therefore does not mistake the second byte of the 80 0A telegram for a sync command…

0x000000 00 FF
0x000001 0A AA
0x000002 00 AA
0x000003 0A 00
0x000004 00 AA
0x000005 80 00
0x000006 0A 81
0x000007 98 FE
0x000008 01 00
0x000009 00 64
0x00000A 00 00
0x00000B 00 64
0x00000C 00 77
0x00000D 00 9A
0x00000E 14 00
0x00000F 7F 02
0x000010 01 72
0x000011 00 B9
0x000012 94 00
0x000013 41 FF
0x000014 B0 00
0x000015 00 21
0x000016 00 20
0x000017 A0 58
0x000018 00 00
0x000019 E4 64
0x00001A 00 A1
0x00001B 68 C6
0x00001C 93 F0
0x00001D 04 93
0x00001E 05 93
0x00001F 0A 93
0x000020 91 93
0x000021 86 00
0x000022 00 00
0x000023 00 04
0x000024 0C 00
0x000025 0F 0C
0x000026 0A 0F
0x000027 00 AA

And btw, I do not think you are really seeing a C2 command as it relates to the TTL2
distance used by much newer bodies than the EOS500
~ hans ~


Following informations, software, hardware and procedures are not official and can damage your equipment or cause injury. Be aware of this as I'm not responsible of how you will use following material. I made this based on my own requirements to bring my old lenses (most of them from ebay) back to life. Till now nothing was damaged by this modification in my hands, but I can guarantee any third party usage.

Also please note that this SW was tested on my lenses and camera body which I had in time of writing, I can't guarantee that it will work on every combination of equipment on the world. I will be happy to cooperate with others and tune SW for maximum performance but at moment it is doing what I need.


sigma aperture command convertor

Logic analyzer output using SW v.1.0.0 . Trace 1 - clock, trace 2 - data from camera to interface, trace 3 - data from interface to lens

Because camera is powering MCU even turned off, it was important for me to reduce power consumption. To achieve this I choose newer low power MCU and add sleep timer, if there are no incoming data for 5sec MCU is put into power down mode.

Important part of program is timeout value which depends on bus speed and duration between packets. For EOS 450D, 550D and 50D which I was able to test was CLOCK frequency 78kHz and duration between packets was 230us. For proper packet separation was chosen 150us. But if there are some "faster" cameras from Canon it will be necessary to lower this value.







Interface development, EOS 450D, Sigma 28-70, Saleae analyzer, AVR Dragon and one mad man.

I choose smallest MCU from Atmel to fit hardware into most lenses (and some of them really lacks some free space) ATTINY10. It have also much smaller power consumption in active state against ATTINY24A and in power down mode it consumes few uA. As you can see below, difference is significant. Oscilloscope plot of VDD voltage is here if someone will be interested.

Power consumption measurement fclk=8MHz:

ATTINY24A - 7.3mA active, 3mA sleep.

ATTINY10 - 2.85mA active, 0.022mA sleep.


Because this MCU have size 3x3mm including leads it is nearly impossible to produce reliable design only with wire work. Because of this I created two versions of PCB (model A for vertical and model B for horizontal installation).

If you like you can order boards on e-mail .

Both models are available with programmed MCU. You will get PCB board assembled with programmed MCU and capacitors, I'm not responsible for installation into lens and effect of this board on lens or camera body. This is very tiny board which can be very easily soldered improperly which could cause camera or lens damage. 

Total price is 14EUR for 1 board including regular shipping (Or 17EUR including registered shipping with tracking number). Outside EU is shipping +1EUR. Paypal fee is paid by buyer. Shipping is combined for multiple boards and quantity discount for larger volumes, please ask for price.

Of course it is possible to send your lens to me and I can do modification for you. Please contact me on e-mail above for more details.

This is not a business, I'm offering boards for nearly production costs for others to give them possibility to modify their lenses, please keep that in mind.

Model B


Atmel ICE Basic programmer/debugger

Both boards are double sided and designed to solder directly to lens connector pins. Actual size and photos of installed boards will be as soon as board will arrive from manufacture.

Because ATTINY10 supports only TPI interface for programming (not PDI), you have to check if your actual programmer supports that in case you want to program MCU by yourself. As far as I found following programmers should support it:

  • Atmel ICE Basic
  • STK600



I have to remind you again, boards are as tiny as was possible, proper soldering skills are required to accomplish this successfully.

For detailed board model B installation manual click HERE.

For detailed board model B installation manual for low profile lenses click HERE.

Model A board installation on Sigma 28-70 2.8-4:

1. First contacts needs to be prepared for board placement.  If there is too much solder (board cannot be fit) remove it with solder wick.
2. Data IN to lens need to be disconnected and gap needs to be created by sharp knife or scalpel between flex contact and pin.
3. Installed model A board on connector.
4. Board is soldered directly on pins.

Disconnected IN signal is connected on bottom side of board.


Model B board installation on Sigma 28-70 2.8-4:

1. First contacts needs to be prepared for board placement.  If there is too much solder (board cannot be fit) remove it with solder wick.
2. Data IN to lens need to be disconnected and gap needs to be created by sharp knife or scalpel between flex contact and pin.
3. Placement of board. pins are connected with board by solder bridges, if there is too big gap for bridge, solder by bridge only first and last pin and rest connect by thin wire. Here DATA from board to lens was connected by wire.
4. Detail of board height on connector.

Detail of build in board on connector. There is much space inside for more than one modification boards :).


Model B board installation on Sigma 28-70 2.8:

1. First contacts needs to be prepared for board placement.  If there is too much solder (board cannot be fit) remove it with solder wick.
2. Data IN to lens need to be disconnected and gap needs to be created by sharp knife or scalpel between flex contact and pin.
3. Placement of board. pins are connected with board by solder bridges, if there is too big gap for bridge, solder by bridge only first and last pin and rest connect by thin wire. Here DATA from board to lens was connected by wire and also DATA to board was connected by wire, because gap between pin and board was too large for solder bridge.
4. Installed board, there is even more space than in 28-70 2.8-4 lens. So no problem at all.

One more photo from above to be sure than inner barrel will not collide with board.

For more photos CLICK HERE.


Till now was successfully installed 15 boards. I want to thank all the people who share their experiences with my boards and allow me to do this compatibility chart:

Canon EOS body
1N (film)
5D mk II
Sigma 28-70mm f2.8
Sigma 28-70mm f2.8-4
Sigma 70-210mm f2.8
Sigma HSM APO Macro 400mm f5.6
Sigma APO AF Macro 400mm f5.6
Sigma APO AF 500mm f4.5
Quantaray macro 50mm f2.8
Sigma APO AF 500mm f7.2
Sigma AF 18mm f3.5
Sigma APO AF Macro 300mm f4
Sigma APO HSM AF Macro 300mm f4
Sigma 100-300mm f/4.5 –f/6.7 UC Zoom
Sigma 28-105mm f/4-f/5.6 UCII


233200 Last modified on %AM, %18 %444 %2019 %10:%bře
Rampa McKvak

Latest from Rampa McKvak