I have the following issue:

I2C data from various devices with VCC/IO levels from 1.8 V to 5 V should be handled from my controller, but it only tolerates voltages up to 3.3 V on its IO pins.

I had a look at different level-shifter ICs, but all I found have the constraint that the lower voltage needs to be smaller than the voltage on the other side.

So I came up with this idea:

enter image description here

Is there any issue with this solution? Does anyone know a better solution?

  • \$\begingroup\$ Is there a reason you cannot go for the easy solution of having one central level and have all non-compliant ICs shifted to that one? \$\endgroup\$
    – DonFusili
    Commented Jan 10, 2020 at 11:49
  • \$\begingroup\$ No I can't because the devices that can be pluged to IO can have one fixed level between 1.8 and 5.0 \$\endgroup\$
    – Steve
    Commented Jan 10, 2020 at 12:47
  • \$\begingroup\$ Related: BJT bidirectional level shift. \$\endgroup\$
    – jonk
    Commented Jan 10, 2020 at 13:02
  • \$\begingroup\$ Try simulating it and pay concern to the high frequency capabilities of the shifter. \$\endgroup\$
    – Andy aka
    Commented Jan 10, 2020 at 13:04

2 Answers 2


If VCC is able to go as low as 1.8V, then the BSS138 may not be a great choice.

Lets say IO_3.3 goes low - and is 0V.

In this case, the right transistor will see VGS of 3.3V, easily enough to switch it on, and it will pull down the middle resistor, from 5V to 0V.

IO is being pulled up to 1.8V, through the 10K resistor, so now the body diode of the left transistor starts to conduct. For the BSS138, this diode has a maximum forward voltage of 1.4V - so IO is not pulled to GND, but to the diode voltage ( worst case to 1.4V )

For the left transistor, this then sees a VGS of only (1.8-1.4) = 0.4V. Not enough to switch it on - so IO is left sitting at 1.4V, and does not reach the low voltage threshold for I2C.

If you are lucky, the body diode forward voltage will be close to it's 'typical' value of 0.8V. This will produce a VGS of (1.8-0.8) = 1V. This might be enough to turn on the transistor ( VGS(th) is specified as needing 0.8 to 1.5V ), and it might work. For that particular diode, and at that particular temperature. For a while.

Other transistors are available, with lower VGS(th) and lower diode voltages.. but finding one where VGS(th) + VSD < 1.8V is challenging.

Using a dedicated I2C level shifter, something like the PCA9306, is going to be a more reliable solution, unless you can find a transistor that satisfies those voltage requirements.


Adding to an answer above.

The selection of R? on the left side is important. If you make it large enough that the current is small so left FET body diode forward drop is small you can probably turn on BSS138, but large R? will reduce bandwidth. That is the tradeoff.


Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.