This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

PCA9306: SDA idles at ~1.5V

Part Number: PCA9306

Hello,


I'm having trouble using this level shifter in my design. Below is a wiring diagram for my master/slave and the PCA9306. My I2C driver on the master side is reading the state of SDA line to check if the bus is busy, and because it's idling at ~1.5V (which is < VINHmin), it sees the bus as being busy and aborts trying to send the data.

I believe I followed all of the datasheet recommendations, so I can't figure out what would cause the SDA line to idle at ~1.5V.

Regards,

Jason

  • Hi Jason,

    The wiring you show in your post looks OK to me, although I think you made a typo (or graphical equivalent) in connecting both pull-ups to the SDA line on the slave side.

    Which side is stuck at 1.5 V - master or slave? And, how does the master check the SDA voltage - is it a DC measurement? If so it may be good to confirm with an oscilloscope in case there is some oscillation occurring (since otherwise the master may just be reporting an average DC value).

    Max
  • Hi Max,

    You're correct - I miswired the second pullup. There is one for the SCL and the other for SDA on the slave side.

    The master side is the one that is idling at around 1.5V. I discovered this issue during boundary scan, so I'm not sure how the master's I2C driver works, but I'd imagine it's checking if the SDA line is >VIHmin for a logic 1, or <VILmax for a logic 0. Since it isn't registering as a logic 1, the I2C bus is considered to be busy, so it aborts trying to transmit data.



    If I use my boundary scan software to drive the pins manually, I see a full voltage swing on both the master and slave sides, which is why I believe the issue has to do with the initial state of the SDA line and how the I2C driver interprets the state of the bus.
  • I forgot to mention - I did look at the master's SDA line on a scope and it doesn't appear to be oscillating (at least not at a 40us time scale). Here's a shot of the master (CH3) and slave (CH4) SDA lines with both the master and slave devices powered, and the EN line on the PCA9306 being driven high by the master.

  • Hi Jason,

    That's really strange, since the PCA9306 should not be sinking any appreciable currents when neither side is driven low. Is it possible that there are any leakage paths on the PCB that may be pulling these voltages lower than expected? Or, have you tried decreasing the pull-up resistance values so that each side is more closely biased towards its respective VCC level during high states? It may be good to try something around 1 kOhm - 4.7 kOhms to see if that helps.

    Max
  • Hi Max,

    I don't believe there are any other leakage paths, but even if there were, this irregular idling voltage is only present when the EN line on the PCA9306 is driven high. Oddly enough though, when both sides are powered on and the EN line is low, it's the slave side that idles around its mid voltage:

    I've also tried replacing the PCA9306, just in the off chance that it was damaged, but I've seen the same behavior from two chips now.


    Unfortunately, the slave device is only able to pull on the data line very weakly. I originally had another I2C level shifter in my design that pulled the SCL/SDA lines high through internal 10k resistors, and the result was flaky I2C communication. Some boards would work, though you could still see that SDA wasn't being pulled all the way to ground during an ACK or when data was sent back to the master. Other just outright haven't worked. I had hoped that wiring in another I2C level shifter that didn't have internal pullups would allow me to use weaker external pullups, thus enabling the slave to pull SDA all the way to ground.


    From the datasheet, the master side has internal pullups as well as the 10k externals that I added, so the overall pullup resistance is more likely on the order of the 1k-4.7k that you suggested. I can try changing out pullup values on either side to see if I can get something that idles a bit closer to the rails.

    Regards,

    Jason

  • Jason,

    What I think is happening is the weak pull-up on the slave side is causing the voltage on that side to be a little bit lower than the 1.8-V reference level. This is causing the part to act as if the slave is pulling the bus low, meaning the pass element is active and the master side voltage matches the slave side voltage. That would explain why the master level returns back to a higher level when the device is disabled. I'm not totally sure what kind of pull-down leakage might be occurring on the slave side to cause this lower level, though.

    Did you have a chance to try decreasing the slave-side pull-up? One thing I want to mention (since you said the slave's pull-down strength is fairly weak) is that since this is device does not re-drive the low levels, the slave will need to pull against not just the 100-kOhm pull-up but the 10-kOhm on the master side as well (plus whatever internal pull-ups are there). That being the case, if you decrease the slave side pull-up you might want to increase it on the master side if you encounter issues hitting a low enough "low" level.

    Regards,
    Max