Consideraciones de terminación de bus SPI

Entonces, en mi pregunta anterior , pregunté sobre el uso del bus SPI en una distancia corta para la comunicación de placa a placa. Me recomendaron probar resistencias de terminación. Coloqué una resistencia cerca del destino (pero no exactamente allí, había una distancia de 1 cm) y la conecté a tierra. (Como se trataba de una placa sin huellas de resistencia de terminación, tuve que improvisar. No pude soldar la resistencia al dispositivo, ya que es un TQFP y tiene pines delicados).

A partir de algunas pruebas básicas, descubrí que una resistencia de 1 kΩ apenas reducía el sobreimpulso. 470 Ω y 180 Ω funcionaron mejor. Cuanto más bajo fui, mejor funcionó. Con 180 Ω, el exceso fue de aproximadamente un voltio o un poco más bajo.

Ahora, desafortunadamente, no puedo bajar mucho más que eso porque la corriente es más de lo que mi MCU puede manejar. Solucioné el problema, en la revisión actual de la placa, usando una resistencia de 330 Ω en serie. Esto llevó el sobreimpulso a 3,7 V y el tiempo de subida fue de 10 u 11 ns. Pero realmente me gustaría una solución 'adecuada' en la próxima revisión. Mis requisitos de frecuencia siguen siendo los mismos: 2 MHz, pero preferiría 4 MHz.

Así que sentí que debería preguntar aquí: en la próxima revisión del tablero, ¿debería colocar amortiguadores robustos en las líneas? Encontrar un búfer no es realmente un problema, pero el consumo actual aumentará significativamente: tengo 8 dispositivos en el SPI que necesitan terminación y 3 líneas que siempre están activas van a cada uno. Un ejemplo, SCK va a los 8 dispositivos. Cada dispositivo tendrá, digamos, una resistencia de terminación de 100 Ω. ¡Eso es un consumo de corriente de 12 * 3.3/100 = 390 mA!

Entonces, ¿cuál es el mejor recurso aquí? ¿Debo optar por la 'terminación activa' usando diodos Schottky como abrazaderas?

EDITAR: Con respecto a la impedancia de línea: como mencioné anteriormente, la intención es conectar 4 placas externas. La distancia pad a pad es la misma para todos (12 pulgadas). Sin embargo, también hay dispositivos en la misma placa que la MCU, pero estos no necesitan terminaciones, las longitudes son de aproximadamente una pulgada (o menos) y hay muy poco sobreimpulso (300 mV). Los rastros que van a las placas externas tienen aproximadamente la misma longitud y anchura. La segunda capa de mi tablero es un plano de tierra continuo.

Un método común es colocar una resistencia en serie que coincida con la impedancia de la línea. Pruebe algo como una terminación en serie de 50 ohmios. Sería útil si diseñara sus trazas y conexiones para que tengan una impedancia fija. Sin embargo, intente con terminaciones en serie más bajas y vea lo que encuentra. Sugirió una terminación a tierra de 32 ohmios, en realidad puede hacer esta potencia mucho más baja, bueno, 3dB menos de potencia, colocando 64 ohmios en el riel de alimentación y 64 ohmios en el riel de tierra.
@Kortuk Una resistencia de 32 ohmios, desafortunadamente, no redujo significativamente el sobreimpulso. Sin embargo, la huella también estaba en el lugar equivocado (nunca tuvo la intención de ser un terminador) y no en la fuente, por lo que podría ser eso, no estoy seguro. En cuanto a la impedancia de línea, todas las líneas tienen, aproximadamente, la misma longitud y anchura. Todos ellos corren sobre un suelo completo un avión, que está en la 2ª capa.
La terminación en serie está en la fuente, si la colocas en la carga no hace nada. Intente colocar un 50 ohmio directamente en su fuente en serie para ver el efecto.
Puede pensar en ello como lo describió stevenvh, hay toda la línea actuando como un capacitor y esa resistencia actúa como la R con ella para un paso bajo, si piensa en ello como un modelo agrupado. Una resistencia coincidente allí, si observa el modelo de línea de transmisión, significa que tiene la mitad del recorrido de la onda de amplitud y luego, cuando golpea el otro extremo y refleja, alcanza su valor total.

Respuestas (5)

Hablar de terminación de señal es como abrir una lata de gusanos. Este es un tema ENORME que es difícil de resumir en solo un par de cientos de palabras. Por lo tanto, no lo haré. Voy a dejar una gran cantidad de cosas fuera de esta respuesta. Pero también le daré una gran advertencia: hay mucha información errónea sobre las resistencias de terminación en la red. De hecho, diría que la mayor parte de lo que se encuentra en la red es incorrecto o engañoso. Algún día escribiré algo grande y lo publicaré en mi blog, pero no hoy.

Lo primero que debe tener en cuenta es que el valor de la resistencia a utilizar para su terminación debe estar relacionado con su impedancia de seguimiento. La mayoría de las veces, el valor de la resistencia es el mismo que la impedancia de su traza. Si no sabe cuál es la impedancia de traza, entonces debe averiguarlo. Hay muchas calculadoras de impedancia en línea disponibles. Una búsqueda en Google mostrará docenas más.

La mayoría de las trazas de PCB tienen una impedancia de 40 a 120 ohmios, por lo que descubrió que una resistencia de terminación de 1k no hacía casi nada y una resistencia de 100 ohmios era mucho mejor.

Hay muchos tipos de terminación, pero podemos clasificarlos aproximadamente en dos categorías: terminación de origen y final. La terminación de origen está en el controlador, la terminación final está en el otro extremo. Dentro de cada categoría, hay muchos tipos de terminación. Cada tipo es mejor para diferentes usos, sin que un tipo sea bueno para todo.

Su terminación, una sola resistencia a tierra en el otro extremo, en realidad no es muy buena. De hecho, está mal. La gente lo hace, pero no es ideal. Idealmente, esa resistencia iría a un riel de alimentación diferente en la mitad de su riel de alimentación. Entonces, si el voltaje de E/S es de 3.3v, entonces esa resistencia no irá a GND, sino a otro riel de alimentación a la mitad de 3.3v (también conocido como 1.65v). El regulador de voltaje para este riel tiene que ser especial porque necesita generar Y absorber corriente, donde la mayoría de los reguladores solo generan corriente. Los reguladores que trabajan para este uso mencionarán algo sobre la terminación en la primera página de la hoja de datos.

El gran problema con la mayoría de las terminaciones finales es que consumen mucha corriente. Hay una razón para esto, pero no entraré en eso. Para uso de baja corriente, debemos mirar la terminación de la fuente. La forma más fácil y común de terminación de fuente es una resistencia en serie simple en la salida del controlador. El valor de esta resistencia es el mismo que la impedancia de traza.

La terminación de origen funciona de manera diferente a la terminación final, pero el efecto neto es el mismo. Funciona controlando los reflejos de la señal, sin prevenir los reflejos en primer lugar. Debido a esto, solo funciona si la salida de un controlador está alimentando una sola carga. Si hay múltiples cargas, entonces se debe hacer algo más (como usar resistencias de terminación de terminación o de terminación de fuente múltiple). El gran beneficio de la terminación de origen es que no carga el controlador como lo hace la terminación final.

Dije antes que su resistencia en serie para la terminación de la fuente debe estar ubicada en el controlador y debe tener el mismo valor que su impedancia de seguimiento. Eso fue una simplificación excesiva. Hay un detalle importante que debe saber sobre esto. La mayoría de los controladores tienen cierta resistencia en su salida. Esa resistencia suele estar en el rango de 10-30 ohmios. La suma de la resistencia de salida y su resistencia debe ser igual a su impedancia de traza. Digamos que su rastro es de 50 ohmios y su controlador tiene 20 ohmios. En este caso tu resistencia sería de 30 ohmios ya que 30+20=50. Si las hojas de datos no indican cuál es la impedancia/resistencia de salida del controlador, entonces puede suponer que es de 20 ohmios; luego mire las señales en la PCB y vea si es necesario ajustarla.

Otra cosa importante: cuando mira estas señales en un o-scopio, DEBE sondear el receptor. Sondear en cualquier otro lugar probablemente le dará una forma de onda distorsionada y lo engañará para que piense que las cosas son peores de lo que realmente son. Además, asegúrese de que su clip de tierra sea lo más corto posible.

Conclusión: cambie a la terminación de fuente con una resistencia de 33 a 50 ohmios y debería estar bien. Se aplican las advertencias habituales.

David, muchas gracias por una respuesta exhaustiva. Todo tenía perfecto sentido, pero creo que hay una complicación más en mi sistema: las líneas SPI van de una placa a otra. Por lo tanto, estimar la impedancia de la línea puede ser difícil: la señal atraviesa aproximadamente 3" en la placa principal, pasa por un cable plano de 6" y luego vuelve a viajar a lo largo de un trazado de 3" hasta que llega a su destino. Los cables del cable plano son alternos tierra (como SCK, GND, MOSI, GND, etc.) ¿Sigue en pie su recomendación de 30-20 ohmios?
@Saad Lo que he hecho en casos como ese (y lo he hecho mucho) es usar una sola resistencia en el controlador y modificar su valor una vez que se construye el prototipo. Es un compromiso, pero funciona. De hecho, tengo varios sistemas en este momento que ejecutan SPI en cables de 1 pie con 3-6 pulgadas de pistas en cada PCB. ¡Algunos de ellos funcionan a 30 MHz! Sí, comience con 33 o 47 ohmios y ajuste desde allí.
+1 ya, pero sería muy útil un diagrama que muestre cómo conectar una terminación de fuente (es decir, en serie, no de la línea a tierra).
Su enlace para la calculadora ya no funciona, para su información
¿Por qué puede suponer que la impedancia/resistencia de salida es de 20 ohmios?

Dado que va a recorrer distancias cortas, no creo que las resistencias de terminación sean una buena idea. Como descubrió, tienen que ser bastante bajos para hacer el trabajo, y luego la línea consume mucha corriente y el voltaje se atenúa en 2 si también conduce la línea con la misma impedancia.

Su frecuencia de reloj no es tan alta, por lo que las frecuencias que necesita para admitir incluso una velocidad de bits de 4 MHz no son las que causan el problema. El problema es que tiene flancos rápidos que conducen las líneas, que tienen armónicos en los 100 de MHz, que causan el problema. En sus frecuencias deseadas, tiene un sistema agrupado, no una línea de transmisión. Esto facilita considerablemente las cosas.

Por lo tanto, la solución es atenuar las frecuencias altas que realmente no necesita pero que causan problemas. Esto se puede hacer con un filtro de paso bajo RC simple inmediatamente después de cualquier cosa que impulse una línea. Esto es en parte lo que están haciendo ahora las resistencias de 330 Ω. Forman un filtro de paso bajo con la capacitancia parásita de la línea. Aparentemente eso no es suficiente y/o no es lo suficientemente predecible. Esto se puede arreglar con alguna capacitancia deliberada en cada línea.

Desea ejecutar el bus a 4 MHz, lo que significa que la señal más rápida que necesita admitir es una onda cuadrada de 4 MHz. Eso significa que la longitud de cada nivel es de 125 ns. Digamos que queremos que sean al menos 4 constantes de tiempo, lo que implica un tiempo de asentamiento del 98%. Eso significa que la constante de tiempo máxima que queremos permitir es 31 ns. 31ns / 330Ω = 94 pF. Esa es la carga total en las resistencias en serie de 330 Ω que necesita para obtener la constante de tiempo de 31 ns. Siempre habrá alguna capacitancia parásita que no puedes predecir, así que vería cómo se ven las cosas con 47 pF. Eso deja espacio para 10-20 pF de capacitancia oculta sin exceder nuestra constante de tiempo máxima permitida.

Las resistencias en serie deben estar lo más cerca posible de todos los pines que controlan el bus. Esto supone que todos los demás pines en el bus serán entradas CMOS cuando uno esté conduciendo. Para las líneas que solo son impulsadas por un solo pin (como la línea del reloj, que solo es impulsada por el maestro), coloque los 47 pF lo más cerca posible después de la resistencia. Para las líneas que pueden ser impulsadas por diferentes pines en diferentes momentos (como MISO), coloque los 47 pF en algún lugar cerca del medio de todos los controladores. Cada línea recibe un solo capacitor de 47 pF sin importar cuántos controladores, pero hay una resistencia para cada controlador.

Los cálculos anteriores pretenden ser una buena guía para empezar. Algunos parámetros no se pueden conocer y, por lo tanto, no se pueden contabilizar por adelantado. Comience con 330 Ω en serie y 47 pF a tierra, pero no tenga miedo de cambiar las cosas según los resultados reales observados.

En ausencia de una terminación, cuando se envía una señal desde una fuente de muy baja impedancia a un receptor de muy alta impedancia, la señal rebotará de un lado a otro repetidamente; la fase de la señal se invertirá 180 grados en cada viaje de ida y vuelta.

Si no se desea que las señales se reflejen cuando lleguen al destino, se puede utilizar la terminación final. Esto hará que la señal se absorba limpiamente en el destino sin reflejarse, pero muchas implementaciones comunes harán que la fuente vea una carga de CC significativa.

En muchos casos, se pueden lograr resultados que son igualmente útiles en la práctica si, en cambio, se inserta una resistencia en serie en la fuente de la señal. Si no hay un receptor en el otro extremo de la línea, la señal se reflejará cuando llegue allí, pero dicha reflexión será absorbida por la fuente en lugar de volver a reflejarse. Tenga en cuenta también que la terminación de la fuente no impone una carga de CC en el dispositivo que conduce la línea.

En ausencia de terminación, si una línea es impulsada por una impedancia baja y recibida con una impedancia alta, el dispositivo receptor puede ver un voltaje mayor que el voltaje de activación (en teoría, hasta el doble del voltaje, si la impedancia de activación de la fuente es cero y la impedancia de recepción es infinita). Si la fuente o el receptor están correctamente terminados, el voltaje recibido será casi igual al voltaje de excitación (si una fuente de impedancia cero estuviera excitando un receptor de impedancia apropiada, o una fuente de impedancia apropiada estuviera excitando un receptor de impedancia infinita, voltaje recibido será igual al voltaje de accionamiento). Si ambos están correctamente terminados, el voltaje de recepción será la mitad del voltaje de activación.

La simulación aquí demuestra esto. Incluye un generador de impulsos que produce una cadena de impulsos aproximadamente 49 veces por segundo, dos líneas de retardo de 5 ms en serie (tiempo de ida y vuelta de 1/50 de segundo) y resistencias de terminación conmutables en ambos extremos.

El circuito incluye tres interruptores SPDT; haga clic en uno para cambiar su estado. Los dos interruptores inferiores controlan la fuente y la terminación de destino. Para aquellos, "arriba" representa una buena terminación y "abajo" representa una mala. El interruptor superior controla si la línea debe ser accionada por un generador de impulsos automático o por una entrada lógica manual. Para enviar pulsos por la línea manualmente, cambie el interruptor superior a "abajo" y luego marque la "L" al lado.

Las señales que lleguen al destino estarán limpias si la fuente o el destino están correctamente terminados. Si ambos están debidamente terminados, el voltaje de la señal recibida será la mitad del voltaje del controlador. Si uno está correctamente terminado pero el otro no, el voltaje recibido será aproximadamente el 91% del voltaje del controlador (las resistencias "defectuosas" están "incorrectas" por un factor de diez y, por lo tanto, no pueden absorber aproximadamente (10/11) de la energía). Si ninguno está terminado, el voltaje recibido inicialmente será aproximadamente 1,656 veces el voltaje del controlador, pero aparecerán reflejos extraños cada 20 ms.

Pruebe una terminación de CA (por ejemplo, un condensador de 470 pF en serie con una resistencia de 110 ohmios) y conecte esta combinación en serie desde la salida del destino del reloj SPI a tierra. La terminación consumirá alrededor de 30 mA durante el tiempo de borde, algo que puede hacer fácilmente, pero de lo contrario, cero corriente. Para la línea de datos bidireccional se vuelve un poco más complicado. Puse una terminación de CA de 470 pF, 220 ohmios en el extremo maestro y esclavo de la línea de datos SPI y eso funciona, es decir, sobreimpulso y subimpulso aceptables.

Acepto comentarios al respecto.

No profundizando demasiado en los detalles, ya que las publicaciones anteriores dieron en el clavo. Todo se reduce a que SPI son líneas desequilibradas. Incluso si tiene una frecuencia de reloj baja, se deben respetar los bordes de reloj de ns rápidos. En mi caso encontré una resistencia de 470 ohm en serie con la línea SPI CLK en el lado del Master. Al eliminar esa resistencia e implementar la solución recomendada para líneas desequilibradas de Lattice y las sugerencias publicadas anteriormente (solo pude implementar la mitad de la solución desde el lado Esclavo, ajusté las tapas del filtro en consecuencia) pude extender la longitud de mi cable de comunicaciones de cinta SPI desde 10 cm a 160 cm sin errores de comunicación:

Mejora de la inmunidad al ruido para la interfaz serial : un informe técnico de semiconductores de celosía (julio de 2014)

Editar: el enlace original ya no es válido; el documento al que se hace referencia permanece disponible para su descarga desde Lattice Semiconductor aquí .