I want to do one 'universal' or 'multiprotocol'-capable IO block and currently thinking of using 74LVC1T45 level translator to do the communication between two different voltage leveled systems.

I would want to be able to support UART, I2C and any other custom serial that works in a similar manner. So the B side can be push-pull, open drain, with and without pull-ups/-downs...

The hard part to grasp is how to accommodate a certain open-drain use-case where the interface-d system (B) might NOT have their pull-up mounted... What should I add/consider when doing the circuit...

How I imagine it, is that for such open-drain use case:

B to A:

A (receiver) side has to have pull-up(s) enabled. The B side doesn't have a pull-up (for whatever reason).

When B transmits LOW, the A side is also pulled low. When B wants to transmit High - meaning that B is a float (even though the currently non-existent-pullup should otherwise pull the line high), the 74LVC has no way to pull the A line high ? Basically, when floating B doesn't go over a threshold of VCCI× 0.65 (so for 1.8V Vih>1.17V), I cannot assume that when B is a float, the A can go to High ?

1) Does, in that case, the B really is isolated from port A ? and I need to add my own pull-up for the B side ? (as I understand, from A to B direction and open-drain use-case I could get away with the no pull-up on the B side, as when A is high, the B is also pulled high).

or how could I understand it better ? (I have only found a IBIS model(s) for that part, but no idea how to use that).

Circuit as requested:


simulate this circuit – Schematic created using CircuitLab

2) Aha also, remembered: In case of bidirectional serial - in that case I2C, the datasheet mentioned that 'the designer must bear in mind that the bus won't get contention when DIR is flipped". So does this mean that in order to change the DIR, I must first remove either VCCA or VCCB (thus 'disable' the device), change the DIR, enable VCCa or VCCB again, and only then start sending/receiving ?

Assumptions are:

  • Main MCU is @1.8VccA and the expected maximum interface line is @5VccB

  • The expected load on the output line B, when trying to pull High, can be max 1k. (I've read the 74LVC to be specced with 2k load - that's actually good enough for me).

  • With Output as an open-drain transmitter, the transmitter (B) might not have their pull-up implemented.

  • \$\begingroup\$ Please create a schematic for the specific circuit you are asking about. \$\endgroup\$ – CL. Feb 11 at 14:09
  • \$\begingroup\$ @CL. added the schematic - the built-in one was not perfect, so some of the 'block' objects are missing or a bit dispositioned, but on the lefthand MCU GPIO's there should be internal pull-up/-down shown as well. \$\endgroup\$ – crypton Feb 11 at 14:38

When an open-drain signal is inactive without a pull-up resistor, then the B input is floating. This is an invalid state; the input might be read as low, or high, or oscillating, and you might get shoot-through currents (see TI's FAQ).

Furthermore, I²C is a bidirectional bus, and there are times when it is not possible to determine a direction (when no or multiple drivers are active). So it is not possible to use a direction-controlled level shifter like the 74LVC1T45 for I²C; this requires a passive switch like the LSF0101 (or a plain MOSFET).

If you want to be able to switch between UART and I²C, you need both kind of level shifters, and additional switches to connect them appropriately.

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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