Low-speed signals in electronic components essentially use two types of circuit architectures to drive signals onto a bus. These are open-drain and push-pull protocols. Push-pull uses a CMOS buffer to drive signals, and there is sometimes a question of whether to place pull-up resistors on a push-pull bus. This tends to arise because someone has observed noise on the bus, and adding pull-up resistors on the signal lines is seen as a solution to the noise.
In reality, pull-up resistors do not help with noise on a push-pull bus. There is a particular situation where they are used, but it has nothing to do with suppressing ringing. In this article, we’ll look at the structure of push-pull protocols and how they compare to open-drain buses. From this comparison, it should be clear why pull-up resistors are not needed on a push-pull bus except in the case of level shifters or interface converters.
Push-Pull Protocols and Pull-up Resistors
A push-pull protocol refers to the driver element used to source a signal into an interconnect. This is done using the push-pull circuit shown below (CMOS buffer). The driver essentially sources or sinks current through a pair of transistors in series.
Push-pull driver circuit with pull-up resistor.
The effect of the pull-up resistor can be determined by comparing its resistance with the resistance of the FETs in the ON state vs. OFF state.
Pull-up Resistor During Switching
As we can see, when the push-pull buffer is sourcing current (green arrow), the pull-up resistor is in parallel with a low-resistance transistor channel, so it should have minimal effect on the current being sourced by the buffer circuit. When the buffer is sinking current, there is a path from the power rail to ground, but the pull-up resistor limits the current.
If the designer tries to treat the push-pull circuit like an open-drain circuit and tries to use a pull-up for termination, the typical value that gets recommended may be in the range of 1k to 10k. Typical values of current being pulled through the pull up resistor are 10-100 uA, which is much lower than the typical drive strength (~10 mA) of a push-pull driver working at logic levels.
For Comparison: Open-Drain Protocols
An open-drain protocol (like I2C) does not use a CMOS buffer to source/sink a signal onto a copper trace. Instead, the protocol charges up the bus capacitance by switching the bus connection to either VCC or GND with a transistor at the driver side of the bus. When the receiver side also has a transistor on its side of the bus, it can be used to toggle the driver side, so these buses can be bidirectional.
When the bus capacitance is charged up and the voltage seen at the receiver exceeds the high or low logic threshold, the signal will toggle the receiver and it will switch logic states. Because current is basically coming from a charging/discharging a capacitor (this is the bus capacitance), the rise time of the signal on the bus is proportional to the RC time constant for this bus. The “R” value here is effectively equal to the pull-up resistor value because the internal transistor’s ON-state resistor is very small (mOhm values for MOSFETs), so it can be ignored.
Example open drain circuit with pull-up resistor and bus capacitance.
When to Use Pull-up Resistors
There are three good instances to put pull-up resistors on a push-pull protocol like SPI. These are outlined below.
Some pins on an MCU or FPGA can be configured to be used either for SPI or I2C. With I2C being open drain, it needs to have a pull-up resistor. As we saw above, placing the pull-up on a push-pull line (SPI) will not affect is driving capabilities or logic level. Therefore, it is appropriate to place pull-up resistors on these particular lines and configure the driver for either mode in the firmware.
Hold a Peripheral’s Enable/Disable State During Startup
Another function of a pull-up resistor is to hold the enable/disable state of a peripheral component when a system starts up. When placed on an active-low enable pin (or CS in SPI), this will hold the peripheral in the OFF state while the system starts up and the main power rail reaches a stable voltage. The enable pin can then be toggled to the LOW state as normal once the system has powered on.
Pull-up resistor on a CS pin for an SPI device.
Bi-directional Level Shifters
The idea behind level shifters is simple: they shift the signal level on a digital bus from one voltage value to another value. This need to shift levels is common when routing signals between two components that operate with different core or I/O voltages (for example, an application processor and a peripheral). This is common in embedded systems, and it underscores the need for embedded developers to intimately understand the hardware specs for their chips.
Level shifters operate with a simple process for signal conversion:
- They detect when a signal arrives at the input side of the interface
- The output voltage is held to the required output level through the pull-up resistor connection
- The pull-up limits the current drawn into the bus directly from the power rail
The resistors in this case with push-pull protocols do not affect rise/fall times because the driving buffers are already push-pull, they only provide this holding action on the bus voltage level.
When you’re ready to design and simulate components that use push-pull signaling, you can simulate pull-up resistors and signal behavior with the industry’s best circuit design and simulation tools in PSpice from Cadence. PSpice users can access a powerful SPICE simulator as well as specialty design capabilities like model creation, graphing and analysis tools, and much more.