Existe un concepto erróneo popular de que los resistores de pull-up son necesarios o imprescindibles en las líneas de un bus SPI. Estoy aquí para decirte de manera inequívoca que los resistores de pull-up no son requeridos en un bus SPI para realizar su función básica de enviar y recibir datos digitales.
El buffer en una interfaz SPI tiene una topología push-pull que (a un nivel alto) involucra MOSFETs de conmutación de lado alto y bajo, formando esencialmente un inversor CMOS. Como veremos en este artículo, la presencia de resistores de pull-up no tiene impacto en la funcionalidad de un bus push-pull.
Dicho esto, hay casos en los que tiene sentido colocar un resistor de pull-up en un bus push-pull, y en algunas hojas de datos un fabricante de componentes lo recomendará o lo exigirá. Examinaremos estas situaciones y cómo afecta al comportamiento de tu sistema. Aunque puede haber soluciones más elaboradas que eliminan la necesidad de resistores de pull-up en estas situaciones, la colocación de un resistor de pull-up puede ser una solución que mantiene tu diseño simple y proporciona un seguro de que la interfaz funcionará correctamente.
Echemos un vistazo al modelo típico de un buffer en una interfaz SPI. Todos los buffers SPI tienen una topología push-pull que consiste en conmutación de lado alto y lado bajo que impulsa una señal en el bus, y cada señal en el bus SPI (CS, MOSI, MISO y SCLK) tendrá esta topología. A continuación, se muestra un ejemplo de este circuito. Note que un buffer SPI real no es tan simple como dos MOSFETs, pero la misma idea se aplica en general.
Inversor CMOS como un controlador SPI. La salida se conecta a un trazo (representado como elementos concentrados) y un circuito de carga (modelo equivalente RC).
La razón completa para usar esta topología es para que las capacitancias de descarga en el circuito del buffer proporcionen tasas de flanco razonablemente rápidas en la salida, que serán mucho más cortas que el período del reloj en el bus. Esto es lo que permite tasas de datos más rápidas que un protocolo de drenaje abierto (por ejemplo, I2C).
Un bus SPI que incluye resistencias de pull-up es esencialmente un controlador inversor CMOS con una resistencia en paralelo con el FET de lado alto en el buffer de salida. Ahora veamos qué sucede durante cada estado de conmutación en el controlador y podemos ver qué sucede en el bus.
Durante el estado de salida de lógica ALTA, el NMOS está APAGADO y el PMOS está ENCENDIDO. VDDIO ahora está suministrando corriente al trazo conectado y la carga. La capacitancia en el trazo y la carga comienzan a cargarse hasta que el voltaje visto en la carga coincide con VDDIO. Aquí, la resistencia ON del PMOS es del orden de mOhm, mientras que la resistencia de pull-up es del orden de 1 a 10 kOhms. Obviamente, la resistencia de pull-up es tan grande que esencialmente está siendo cortocircuitada por el PMOS en el estado de salida de lógica ALTA.
Debido a que toda la corriente fluye a través del PMOS en el estado de lógica ALTA independientemente de la presencia de la resistencia de pull-up, las características de conmutación no se verán afectadas.
Ahora consideremos que el circuito ha cambiado al estado de salida de lógica BAJA. En este estado, el NMOS está ENCENDIDO y el PMOS está APAGADO, por lo que la traza y la capacitancia de carga se están descargando a través del NMOS hacia la red GND. Debido a que el PMOS está apagado, aparece como una resistencia muy alta (orden de MOhms) que es mucho mayor que el valor de la resistencia de pull-up (1 a 10 kOhms).
Dado que el pull-up es la resistencia menor en este caso, permitirá un valor de corriente de VDDIO/R(pu) que fluya hacia el NMOS. Para una resistencia de pull-up de 1 a 10 kOhm y VDDIO = 3.3 V, la corriente de fuga hacia el NMOS sería de 0.33 a 3.3 mA. Esto es mucho menor que la corriente típica de SPI de ~50 mA, por lo que nuevamente no notaremos ningún efecto en las características de conmutación. El tiempo de caída en el bus estará limitado por las capacitancias de carga y de traza, la impedancia resistiva de salida del circuito de búfer y la resistencia en estado ON del NMOS.
Claramente, la colocación de una resistencia de pull-up en una línea SPI no afecta su capacidad para enviar una señal al bus. Por lo tanto, el pull-up debe estar realizando alguna otra función que no esté relacionada con la transmisión de datos, de lo contrario, la resistencia no se utilizaría.
Las razones para usar una resistencia de pull-up en una o más líneas en una interfaz SPI varían dependiendo de la situación propuesta. Algunas situaciones donde se utilizan resistencias de pull-up incluyen:
La razón declarada para la colocación en cualquiera de estas situaciones es establecer el estado lógico en uno de los componentes periféricos en el bus. La recomendación más común es colocar una resistencia de pull-up en el pin CS de un periférico para llevarlo a alto. Si el periférico tiene un pin de habilitación activo en bajo, entonces esto siempre llevará el pin a alto a menos que el lado del controlador establezca el pin en bajo.
Un ejemplo de este uso se muestra a continuación. En el diseño del PCB, la resistencia de pull-up se colocaría cerca del pin CS de este periférico.
Colocación típica de una resistencia de pull-up en el pin CS de un bus SPI.
¿Por qué se utilizaría esto? La razón mencionada es que durante el arranque del sistema, el pin CS podría estar flotando en cualquier estado y esto crearía un riesgo de que el ruido pueda corromper los datos en el bus. Además, si el dispositivo anfitrión se inicia antes que el periférico y el pin CS se activa involuntariamente, el anfitrión podría comenzar a manipular datos en el periférico. Esto a veces se cita como una razón para colocar un pull-up en periféricos de memoria.
Hasta la fecha, no puedo encontrar una razón convincente para colocar una resistencia de pull-up en la línea SCLK (reloj). La razón es que el circuito lógico receptor no se activará si no se cumplen otras condiciones (específicamente el estado de la línea CS) independientemente de la presencia de una señal de reloj. Algunas notas de aplicación y hojas de datos recomiendan las resistencias de pull-up en MISO o MOSI por varias razones, pero probar si esto funciona es simple y la resistencia siempre puede ser desoldada cuando se trabaja en su prototipo.
Debido a que esto es lo que más a menudo se cita como un problema con el estado del pin CS durante el arranque del sistema, creo que la secuenciación de energía entre los periféricos y el host del sistema sería el mejor enfoque para prevenir este problema durante el arranque. En sistemas más pequeños, puede que no haya espacio en el dispositivo disponible para múltiples reguladores o para un secuenciador de energía que pueda pasar la energía requerida. Es una solución más simple colocar una resistencia de pull-up, pero entienda que estas resistencias de pull-up no son necesarias para que la interfaz funcione correctamente.
Ya sea que necesite construir electrónica de potencia confiable o sistemas digitales avanzados, utilice el conjunto completo de características de diseño de PCB y herramientas CAD de clase mundial en Altium Designer. Para implementar la colaboración en el entorno interdisciplinario de hoy, las empresas innovadoras están utilizando la plataforma Altium 365 para compartir fácilmente datos de diseño y poner proyectos en fabricación.
Solo hemos arañado la superficie de lo que es posible con Altium Designer en Altium 365. Comience su prueba gratuita de Altium Designer + Altium 365 hoy.