I²C level shifting gone wrong

2017-03-09

In a recent project I had to connect a 3.3 V I²C bus segment to a 1.8 V I²C bus. Therefore, I decided to use a PCA9306 Dual Bidirectional I²C Bus and SMBus Voltage-Level Translator as it is a device specifically designed for the job and PCB space was valuable in this particular project. Strangely the I²C communication only worked intermittently. So I got out my oscilloscope and probed the SDA line on the 1.8 V side. I could see strange dips during the high phases.

The wrong looking trace of SDA on the 1.8 V side of the level translator
The wrong looking trace of SDA on the 1.8 V side of the level translator

The screen capture above shows the wrong looking trace of SDA on the 1.8 V side of the level translator. After probing some more, I found that the dips during the high phases coincided with the SCL line edges. There had to be some interaction between SDA and SCL inside the level translator.

It turns out that I just assumed that the PCA9306 had to be wired up the same way as push-pull level translators such as the TXB0104. Specifically, I hooked up VREF2 directly to 3.3 V. After some rework on the board featuring bodge wire I shorted VREF2 to EN which in turn is connected to 3.3 V through a 200 kOhm resistor. This is the way that the datasheet wants us to use the part.

After this both SDA and SCL looked much more sensible on both sides of the voltage translator, d’oh!