Overview
The TXS0108E is an 8-channel bi-directional logic level converter that lets 3.3V and 5V devices talk to each other safely on up to eight digital lines at once. Built around the Texas Instruments TXS0108E translator IC, it auto-senses signal direction (no DIR pin to manage) and supports both push-pull and open-drain signalling, so it works for everything from plain GPIO and PWM to I2C and SPI.
This is the go-to module any time you mix a 3.3V controller (Raspberry Pi, ESP32, Pico) with 5V parts like classic Arduino shields, character LCDs, ultrasonic sensors, or 5V relay boards. Because it has eight channels, you can route a full SPI bus plus a couple of GPIOs through a single board instead of stacking individual level shifters.
Each side of the board has its own VCC pin so you set the voltages independently — for example VA = 3.3V and VB = 5V — and an Output Enable (OE) pin that lets you cleanly disable the outputs from your microcontroller at power-up.
At a Glance
Specifications
| Parameter | Value |
| Translator IC | Texas Instruments TXS0108E |
| Number of Channels | 8 (bi-directional, independent) |
| Low Side Voltage (VA) | 1.4V to 3.6V |
| High Side Voltage (VB) | 1.65V to 5.5V |
| Voltage Rule | VA must be less than or equal to VB |
| Max Data Rate (Push-Pull) | 110 Mbps |
| Max Data Rate (Open-Drain) | 1.2 Mbps |
| Direction Control | Automatic (no DIR pin) |
| Output Enable | OE pin, active HIGH |
| Architecture | Pass-gate with edge-rate accelerators |
| Pin Count | 20 pins (10 per side) |
| Operating Temperature | -40 to +85 degrees C |
Pinout Diagram
Wiring Guide
Arduino 5V to 3.3V I2C Sensor
Use the TXS0108E to safely connect a 3.3V I2C sensor (BMP280, MPU6050, etc.) to a 5V Arduino Uno. The B side connects to Arduino at 5V, the A side connects to your 3.3V sensor. Pull-ups on each side go to that side's VCC.
| TXS0108E Pin | Connect To | Details |
|---|---|---|
| VA | Arduino 3.3V | Low side reference |
| VB | Arduino 5V | High side reference |
| GND | Arduino GND | Common ground |
| OE | Arduino 3.3V (or any digital pin) | Must be HIGH to enable |
| A1 / A2 | 3.3V Sensor SDA / SCL | 4.7k pull-ups to 3.3V |
| B1 / B2 | Arduino A4 (SDA) / A5 (SCL) | 4.7k pull-ups to 5V |
ESP32 to a 5V Sensor or Display
The ESP32 GPIO is 3.3V. Use the TXS0108E to drive 5V devices (HC-SR04 Echo line, 5V character LCD enable line, classic 5V shift registers) without frying the ESP32. Wire VA to 3.3V and VB to 5V.
| TXS0108E Pin | Connect To | Details |
|---|---|---|
| VA | ESP32 3.3V | Low side reference |
| VB | ESP32 VIN (5V) or external 5V | High side reference |
| GND | ESP32 GND | Common with 5V supply |
| OE | ESP32 3.3V or GPIO 4 | Tie HIGH to enable |
| A1 - A4 | ESP32 GPIO 18, 19, 21, 22 | 3.3V side |
| B1 - B4 | 5V Device Logic Pins | Translated to 5V |
Raspberry Pi to 5V SPI Device
Raspberry Pi GPIO and SPI pins are 3.3V. To drive a 5V SPI device (5V SD card breakout, classic shift register, 5V OLED), use four channels of the TXS0108E for MOSI, MISO, SCLK, and CS.
| TXS0108E Pin | Raspberry Pi Pin | Details |
|---|---|---|
| VA | Pin 1 (3.3V) | Low side reference |
| VB | Pin 2 (5V) | High side reference |
| GND | Pin 6 (GND) | Common ground |
| OE | Pin 1 (3.3V) | Always HIGH |
| A1 / A2 / A3 / A4 | GPIO 10 / 9 / 11 / 8 | MOSI / MISO / SCLK / CE0 |
| B1 / B2 / B3 / B4 | 5V Device MOSI / MISO / SCLK / CS | Translated to 5V |
Raspberry Pi Pico GPIO to 5V Logic
The Pico runs at 3.3V and is not 5V tolerant. Use the TXS0108E to interface its GPIO with 5V devices like classic logic chips, 5V relay modules without input shifting, or older shift registers.
| TXS0108E Pin | Pico Pin | Details |
|---|---|---|
| VA | Pin 36 (3.3V OUT) | Low side reference |
| VB | Pin 40 (VBUS / 5V) | High side, USB powered |
| GND | Pin 38 (GND) | Common ground |
| OE | Pin 36 (3.3V OUT) | Tie HIGH |
| A1 - A8 | GP2 - GP9 | 3.3V Pico side |
| B1 - B8 | 5V Device Pins | Translated to 5V |
Code Examples
The TXS0108E is transparent to your code - signals just pass through translated. The examples below show a typical "hello world" use: an Arduino reading an ultrasonic sensor through the level converter on a 3.3V system.
Arduino - GPIO Toggle Through TXS0108E
// TXS0108E Logic Level Converter - Arduino Test
// Toggles a 5V output line driven from Arduino through channel B1.
// Wire: Arduino D8 -> A1, B1 -> 5V LED through 220 ohm resistor to GND
// VA = 3.3V, VB = 5V, OE = 3.3V
const int signalPin = 8;
void setup() {
Serial.begin(9600);
pinMode(signalPin, OUTPUT);
Serial.println("TXS0108E ready - toggling B1 at 1 Hz");
}
void loop() {
digitalWrite(signalPin, HIGH); // Drive A1 HIGH -> B1 outputs ~5V
Serial.println("HIGH");
delay(500);
digitalWrite(signalPin, LOW); // Drive A1 LOW -> B1 outputs 0V
Serial.println("LOW");
delay(500);
}
Raspberry Pi (Python) - I2C Through TXS0108E
#!/usr/bin/env python3
# TXS0108E - Reading a 5V I2C device from a Raspberry Pi
# Pi SDA (GPIO 2) -> A1, Pi SCL (GPIO 3) -> A2
# B1, B2 -> 5V device SDA/SCL with 4.7k pull-ups to 5V
# VA = 3.3V (Pin 1), VB = 5V (Pin 2), OE = 3.3V
from smbus2 import SMBus
import time
I2C_BUS = 1
DEVICE_ADDR = 0x48 # example: PCF8591 5V ADC
with SMBus(I2C_BUS) as bus:
while True:
try:
# Read one byte from the 5V device
value = bus.read_byte(DEVICE_ADDR)
print("Read from 0x{:02X}: {}".format(DEVICE_ADDR, value))
except OSError as e:
print("I2C error - check pull-ups and OE pin:", e)
time.sleep(1)
Raspberry Pi Pico (MicroPython) - PWM Through TXS0108E
# TXS0108E - Drive a 5V LED strip enable line from Pico
# Pico GP15 -> A1, B1 -> 5V LED strip enable
# VA = 3V3 (Pin 36), VB = VBUS (Pin 40), OE = 3V3
from machine import Pin, PWM
import time
# 5V output via TXS0108E channel 1
led_enable = PWM(Pin(15))
led_enable.freq(1000)
# Sweep brightness 0% -> 100% -> 0%
while True:
for duty in range(0, 65536, 1024):
led_enable.duty_u16(duty)
time.sleep_ms(10)
for duty in range(65535, -1, -1024):
led_enable.duty_u16(duty)
time.sleep_ms(10)
ESP32 (Arduino) - Serial Bridge Through TXS0108E
// TXS0108E - Talk to a 5V serial device from a 3.3V ESP32
// ESP32 TX (GPIO 17) -> A1, A2 <- ESP32 RX (GPIO 16)
// B1 -> 5V device RX, B2 <- 5V device TX
// VA = 3.3V, VB = 5V, OE = 3.3V
#include
HardwareSerial Serial5V(2); // UART2 on ESP32
void setup() {
Serial.begin(115200);
Serial5V.begin(9600, SERIAL_8N1, 16, 17);
Serial.println("TXS0108E serial bridge ready");
}
void loop() {
if (Serial.available()) {
Serial5V.write(Serial.read());
}
if (Serial5V.available()) {
Serial.write(Serial5V.read());
}
}