Are pullup resistors necessary for logic conversion?

I always try to make my circuits as low powered as possible. The current project includes 5V to 3.3V logic level conversion on multiple signals. I have attached a typical circuit which is quite popular. I know it works because I have a few breakout boards that I have used in prototyping.
However, are the pullup resistors on the high side or the low side really necessary in the Arduino world? For example, the Arduino uses the internal pullup resistor for SCL and SDA. So... is the 10K pullup attached to HV1 in the schematic necessary?
Most, if not all, I²C modules, have their own pullups on them. So... if I had, for example a 3.3V BMP280 that I wanted to use with a 5V Arduino, is the 10K pullup attached to LV1 in the schematic necessary?

Yes, I realize that the pins are initialized to INPUT and that puts them neither high nor low on the Arduino side. However, since the module on the 3.3V side has its pullup, it should be high on their side.

I don't think the pullups are necessary but what makes me unsure is that the Arduino defaults all pins to INPUT and thus leaves that "HV1" signal floating until it is either explicitly set as an OUTPUT or OUTPUT_PULLUP (which in this case Wire.begin would take care of).

So far I have only talked about I²C. Is SPI any different regarding the pullups for TTL conversion? Reset? The EN pin of an ESP-12?

It isn't the penny saved or the soldering time saved that has me asking. It's the 0.5mA per line and side that I would like to avoid if possible.

Thanks for your input.

It does?

SDA line is bidirectional; whreas, SCL line unidirectional and is an output line from Master to Slave.

The following digarm (Fig-1) says that the internal pull-up resistor (Rpin) of UNO/NANO/MEGA get connected optionally when the line is in input mode.


Now, think if you need external pull-ups for the operation of the open-drain I2C Logic/Interface.

Yes because the internal pull up resistors are too high a value to work correctly. If you have ever looked at the signals on the I2C bus in an oscilloscope you will see the rise time of these signals is very poor. Even 10K is a bit on the low side and 4K7 is often used to give a 1mA current although the specification of the bus state that the current should be 2mA.

Yes and this is a bit silly but most Arduino projects use less that four I2C devices so that would normally be fine. You could run into a lot of problems if you had lots of boards each with a pull up resistor pair.

The biggest limit on I2C bus length is the capacitance of the wires, combatting that needs a low pull up resistor value. So you are stuck with spending that current in getting a reliable interference resistance communications link.

1 Like

GolamMostafa - To tell you the absolute truth, I was tested for Alzheimers in July. It was supposedly negative, but you are of course right. INPUT_PULLUP is what I meant.

Grumpy Mike - Thanks for the very good information. What I hate about all those pullups is the creep voltage. Do you think it would be feasible to connect the pullups to VCC through a transistor? I know that in order for that to work you have to cut the power to SCL/SDA explicitly after any I²C commo and make sure that they are turned back on (which Wire.begin does) before starting any new commo. Does such a trick also work for SPI?

In the case of Reset, it makes no sense because that line is already pulled high.

I guess I have to take each signal and really think it through.

Thanks everyone!

No not really. This would probably destroy some devices or Arduino pins if you got the software wrong.

With SPI when the chip enable pin of a device is high then the chip is in its standby mode of current consumption, see what that is with the data sheet of what you are using. There is no need for any pull up resistors on this bus.

The SPI signalling is by voltage which makes it different to the I2C which is by pulling down signals to ground. The I2C bus sends the address of the device it wants to communicate with to all devices on the bus. Where as with SPI the only device that takes in a signal is the one with its chip enable pin low.

1 Like

Yeah, but on the other hand -active pullups are a real thing. Obviously they're more complex than just a single transistor.

Not on I2C they are not.

I've never seen them on I2C, no. OneWire, yes. Electrically not dissimilar.

Having used both I would disagree with that statement.

Pull up resistors don't dissipate any power when the lines they are attached to are in the HIGH state. That would apply to a standby state.

Sadly, the usual lack of clarity in describing the problem.

So you actually are referring to an I²C system? If so, you are most certainly "barking up the wrong tree". :roll_eyes: There is no problem with the pullups because they are drawing no current until you initiate an I²C transaction at which point you must have the pullups (but as Mike says, not too many :astonished:).

So there is no problem whatsoever with quiescent current.

The same applies for OneWire and SPI.

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.