Recipe
Connect a 3.3 V part and a 5 V part
Use when: two chips that run at different supply voltages share one or more signal wires
Goal: every signal read reliably in both states, with no input pushed past its absolute maximum
Taught in 3.3 V vs 5 V and level shifting
Quick recipe
-
1
Note which chip drives each wire, and whether any wire is driven from both ends.
Example
Uno R4 TX → ESP32-S3 RX (down); ESP32-S3 TX → Uno R4 RX (up); a shared I²C data line (both).
Why: down and up need different fixes, and a both-ways wire needs a third.
-
2
For each direction compare the driver's highest HIGH with the input's maximum, then V_{OH} with V_{IH} and V_{OL} with V_{IL}.
- over the maximum — shift down.
- a negative HIGH margin — shift up.
- both margins positive and under the maximum — connect directly.
Why: the maximum protects the chip; the margins make the reading reliable.
-
3
Down only: a divider for slow signals, a 5 V-tolerant buffer for fast ones. Up: a buffer powered from 5 V, or a MOSFET shifter. Both ways: a MOSFET shifter or an auto-direction chip.
Why: a divider can only lower a voltage, and pull-up shifters are slower than driven ones.
-
4
Recompute the HIGH, the LOW and the worst case at the receiving pin.
Why: a shifter that lands below the HIGH threshold is a new fault, not a fix.
Common mistakes
- Trusting "it works on my desk" for a negative margin.
- Assuming a pin is 5 V tolerant because the chip family is.
- Using a divider on a wire that is driven from both ends.