Autor Tema: Ayuda con incremento de distancia máxima de bus SPI - cableado exterior.  (Leído 253 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado genisuvi

  • PIC12
  • **
  • Mensajes: 97
Buenos días, tengo un dilema.

Estaba trabajando en un diseño cuyas especificaciones eran las de comunicar una raspberry y varios módulos expanser de microchip con interfaz SPI.
El tipo de expanser permite hasta 8 módulos en un único bus.
Yo debía diseñar por un lado una tarjeta con 8 chips expansores de GPIO (8 nodos esclavos SPI). Yo sé que tanto SPI como I2C son buses pensados para distancias máximas de 10cm, comunicar elementos en una misma pcb, etc.. sí sacar un cablecillo plano para comunicar módulo LCD, etc. Pero como se puede jugar con la frecuencia pensé que podría estirar un poco más la distancia máxima.

Queríamos usar un multiplexor de 8 canales, esto sería otra tarjeta, para así poder controlar con el mismo bus SPI de la Raspberry hasta 8 tarjetas de estas.
Este chip tiene un tipo de direccionamiento que permite compartir una sola señal de CS entre 8 módulos. Gracias al multiplexado, no sólo controlaríamos a qué módulo de una fila accederíamos sino a qué tarjeta (qué fila de las 8 disponibles). La accesibilidad y comunicación a estos chips está probada en protoboard y la funcionalidad en proto es correcta. Quiero decir, el control por sw de varios módulos con un único SPI es posible. Aunque no he probado el acceso a tantos chips y tener un bus de distancias definitivas. Tampoco necesitamos trabajar a la velocidad máxima del bus. 1Mhz nos sobra e incluso creo que con KHz también.

El problema gordo lo veo ahora que traen, ahora, una nueva especificación que yo desconocía totalmente. Me comentan que la disposición de estas tarjetas la quieren disponer en un rail y dejar hasta 8 placas en fila india. En plan "tren". Conectarlas en cascada por cable plano lo más corto posible, la primera lleva el bus spi a la segunda y la tercera a la cuarta, etc... Aquí se me han saltado todas las alarmas. Pues entonces se pretendería tener una líniea SPI que puede alcanzar hasta un metro o más desde la Raspberry hasta la última tarjeta.

Ya me dolía tener que sacar el bus SPI por cable plano, pero no quedaba más remedio y pensé que podríamos pagar el precio de disminuir considerablemente la frecuencia de trabajo. Tener 30 cm entre pistas y cable plano. Pensando que las placas las iban a colocar todas a la misma distancia (ubicadas en paralelo), no en fila india.

Total que estoy aquí preguntando si conocéis alguna forma de estirar este bus. He leído en otros foros a gente dando consejos para alargar el bus a distancias que ni me creo. Pero claro, hablo desde el desconocimiento e inexperiencia, a parte de bajar la frecuencia de trabajo. Por ejemplo nombran usar una línea diferencial o un par trenzado UTP. Ambas cosas no sé qué significa aplicarlas al bus spi ni sé si tienen sentido. Se puede trenzar un SPI? no lo veo.

  • Se pueden poner buffers de bus de algún tipo en cada tarjeta? servirían? qué tipo de buffers encajarían?
  • Otras opciones ya sea en pcb o cableado exterior?
  • Algún tipo de 'repetidor' (ya lo dudo; pero a lo mejor me equivoco)?
Gracias de antemano.
Un saludo a todos.

« Última modificación: 01 de Julio de 2020, 08:52:38 por genisuvi »

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1190
Re:Ayuda con incremento de distancia máxima de bus SPI - cableado exterior.
« Respuesta #1 en: 01 de Julio de 2020, 10:15:33 »
Agunos videos sobre Lineas diferenciales.



También puedes leer sobre RS-422. Creo que sería la opción más económica. Pero habría que hacer un análisis.

Espero esto te sirva.

elreypic.
« Última modificación: 01 de Julio de 2020, 10:22:26 por elreypic2 »

Desconectado genisuvi

  • PIC12
  • **
  • Mensajes: 97
Re:Ayuda con incremento de distancia máxima de bus SPI - cableado exterior.
« Respuesta #2 en: 02 de Julio de 2020, 04:59:26 »
Muchas gracias por tu respuesta con estos aportes.

Agunos videos sobre Lineas diferenciales.



También puedes leer sobre RS-422. Creo que sería la opción más económica. Pero habría que hacer un análisis.

Espero esto te sirva.


elreypic.

Sí después de indagar en profundidad ya sé a qué se refieren. Convertir a diferencial RS-422 o bien 485 y trenzar los hilos y después reconvertir a SPI ya que las señales SPI no son diferenciales. Pero por los modelos que existen en el mercado voy a necesitar 2 chips por cada señal y me temo que se desperdiciarían circuitos receptores y circuitos de transmisión. Esto me incrementa sustancialmente los costes previstos. Aunque no la descarto.

Voy a añadir algo más. Hicimos ayer una prueba con cable plano de 3 m y medio con la máxima velocidad que admiten los nodos esclavos: 10Mhz y nos funcionó perfectamente. Sin añadir ningún elemento. Es decir, tenemos margen para reducir la velocidad conforme la aplicación de control se vuelva más exigente. Ahora estamos leyendo y escribiendo por dos pines GPIO.

Hoy repetí la prueba alargando el cable hasta 7 metros. El funcionamiento resultó inestable incluso bajando la frecuencia considerablemente. Una ejecución funcionaba y a lo mejor a la siguiente leía y escribía bien a ratos. Sin embargo, al poner una sola mano sobre el cable el resultado era 100% correcto. Si en vez de una mano tocábamos el cable con 2, volvía a ser inestable. Lo realmente llamativo no es que con 7 metros de cable no funcione correctamente, sino que añadiendo la impedancia de una mano solucione la problemática de un bus a tan larga distancia.

Esto me recuerda algunos comentarios de foros donde se comenta que puede estirarse hasta 2 metros la cosa y a partir de 2 metros bastaría una resistencia de terminación de 120Ohms. Y ya para muchos más metros soluciones más complejas como conversión a comunicación diferencial, etc: https://respuestas.me/q/spi-distancia-ma-xima-60803052706
Quizás este hecho de la mano tenga que ver con la R de terminación que se comenta. Probaré con 120Ohms. Que al no ser diferencial supongo que la tendré que conectar entre la línea de cada señal y masa.

Por último decir que ante tal situación de incertidumbre algunos compañeros han barajado otras posibles opciones que han encontrado navegando de ejemplos que ha compartido gente. Lo que pasa que la idea pasa por cambiar radicalmente todo el desarrollo realizado hasta ahora y obvio que eso echa para atrás. Pero si es garantía de que cumplirá la función correctamente también pesa más en la balanza.. la seguridad o la tranquilidad de garantizar metros de funcionamiento:

1. El mismo chip expansor; pero con interfaz de comunicación I2C (max 8 módulos por bus I2C)
2. Manteniendo cable plano.
3. Emplear un chip extensor de longitud de bus I2C que promete hasta decenas de 10m: https://sites.google.com/site/olewsaa/yacht-server-with-raspberry/i2c-range-extender
4. Usar multiplexores de bus I2C (necesitamos poder multiplexar el bus, para tener más de 8 módulos I2C)

Por otro lado he encontrado un ejemplo de alguien que uso cable plano para comunicar 16 esclavos a 1 metro al parecer sin problemas. Empleando buffers y R terminales.

Así que estoy por indagar en esta última opción. Que al parecer hasta 2 metros se puede trabajar con SPI. 



« Última modificación: 02 de Julio de 2020, 07:20:35 por genisuvi »

Desconectado genisuvi

  • PIC12
  • **
  • Mensajes: 97
Re:Ayuda con incremento de distancia máxima de bus SPI - cableado exterior.
« Respuesta #3 en: 02 de Julio de 2020, 07:09:36 »
Acabo de realizar la siguiente modificación con resultados esperanzadores: añadir R terminales de 120Ohms (una en cada línea de control y datos) entre el pin del chip y masa.

Escenario 1:
  • Para 7 metros de cable
  • Sin buffers de bus
  • Hasta 2.5Mhz funciona perfectamente. Este sería el límite para la aplicación que tengo de prueba.


Escenario 2:
  • Para 3.5 metros de cable
  • Sin buffers de bus
  • Hasta 7.5Mhz funciona perfectamente

En la práctica no pasaríamos de 2 metros y la velocidad de 1Mhz puede incluso sobrar. Pero esto ya depende de las operaciones que la aplicación realice. 7.5Mhz queda próxima al máximo que estos chips toleran (10Mhz).

Lo de los buffers me lo dejo anotado como algo que puede que me haga falta para ayudar a frenar la distorsión en caso de tener un entorno ruidoso. Aunque no sé si incluirlo ya en el diseño o esperar a hacer más pruebas y ver si aparece esta distorsión. No será fácil simular el entorno real tan pronto. Lo que me preocupa es tener el prototipo terminado y que el entorno real sea demasiado para el correcto funcionamiento de la aplicación real, que la consecuencia sea lanzar a la basura todo el trabajo porque simplemente las exigencias estén por encima de lo que se ha podido comprobar aquí. Por eso no sé si anticiparme y comenzar a pensar en buffers para las señales SPI.


Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1190
Re:Ayuda con incremento de distancia máxima de bus SPI - cableado exterior.
« Respuesta #4 en: 02 de Julio de 2020, 10:20:11 »
Que tal genisuvi,

Estoy de acuerdo contigo en que puede funcionar a esa distancia reduciendo la frecuencia de la señal del reloj. Pero lo que si debes considerar es que si ese cable va a estar expuest a ambientes ruidosos, ese ruido electromagnético definitivamente te va a afectar la operación del mismo. Y por la longitud del cable, estas creando antenas con el mismo, de ahí la opción de usar señales diferenciales, no solamente por la distancia, sino principalmente para hacer tu circuito resistente al ruido. Si bien se incrementa el costo de tu proyecto, pero eso te garantiza funcionalidad sin riesgos. Existen muchos circuitos integrados para trabajar con RS422, y su precio varía principalmente por la frecuencia de operación a al que pueden operar y la cantidad de drivers, receivers que contienen. En mi opinión creque que la mejor opción sería que usaras 2 SN65C1168, ya que contiene 2 TX y 2RX por chip, de esta manera podrías usarlos sin problemas, ya que en tu raspberry usarías 3 TX y 1RX, en cada tarjeta  que contiene los esclavos usarías 1TX y 3 RX. Algo que tienes que considerar es que en cada tarjeta de esclavos el transmisor debe ser capaz de ponerse en alta impedancia, esto porque si tienes más tarjetas en el mismo bus al tener un valor definido podrías provocar una colisión, lo que significa que necesitas un detector de tercer estado en el pin MISO de cada tarjeta, que no es nada del otro mundo, pero obviamente es necesario.

Saludos y espero que estos comentarios te ayuden a tomar la mejor decisión para tu aplicación.

elreypic.

Desconectado genisuvi

  • PIC12
  • **
  • Mensajes: 97
Re:Ayuda con incremento de distancia máxima de bus SPI - cableado exterior.
« Respuesta #5 en: 06 de Julio de 2020, 06:24:08 »
Que tal genisuvi,

Estoy de acuerdo contigo en que puede funcionar a esa distancia reduciendo la frecuencia de la señal del reloj. Pero lo que si debes considerar es que si ese cable va a estar expuest a ambientes ruidosos, ese ruido electromagnético definitivamente te va a afectar la operación del mismo. Y por la longitud del cable, estas creando antenas con el mismo, de ahí la opción de usar señales diferenciales, no solamente por la distancia, sino principalmente para hacer tu circuito resistente al ruido. Si bien se incrementa el costo de tu proyecto, pero eso te garantiza funcionalidad sin riesgos. Existen muchos circuitos integrados para trabajar con RS422, y su precio varía principalmente por la frecuencia de operación a al que pueden operar y la cantidad de drivers, receivers que contienen. En mi opinión creque que la mejor opción sería que usaras 2 SN65C1168, ya que contiene 2 TX y 2RX por chip, de esta manera podrías usarlos sin problemas, ya que en tu raspberry usarías 3 TX y 1RX, en cada tarjeta  que contiene los esclavos usarías 1TX y 3 RX. Algo que tienes que considerar es que en cada tarjeta de esclavos el transmisor debe ser capaz de ponerse en alta impedancia, esto porque si tienes más tarjetas en el mismo bus al tener un valor definido podrías provocar una colisión, lo que significa que necesitas un detector de tercer estado en el pin MISO de cada tarjeta, que no es nada del otro mundo, pero obviamente es necesario.

Saludos y espero que estos comentarios te ayuden a tomar la mejor decisión para tu aplicación.

elreypic.

Pues aquí bien. Tras unos días algo más metida en este terreno yo también creo que los entornos de "ruido" y buses tipo I2C o SPI no va a tener un efecto inocuo. Una apuesta segura pasarí por transformar el bus en diferencial y trenzarlo por la naturaleza supresora de ruido que le otorgaría al canal de comunicación. Yo ya lo he hablado y pasado el mensaje.

Me quedo con tus sugerencias. Te las agradezco.

Desconectado Jorge555

  • PIC18
  • ****
  • Mensajes: 491
    • JMN
Re:Ayuda con incremento de distancia máxima de bus SPI - cableado exterior.
« Respuesta #6 en: 07 de Julio de 2020, 13:14:33 »
Como ya habéis dicho lo mejor es tener un par diferencial para mandar señales por cables largos, reduciendo la impedancia del par y haciendolo más inmune al ruido y que radie menos, lo que en este caso supondrá añadir electtrónica adicional y cableado más caro.

Una opción a las resistencias de terminación entre pin y tierra, es poner en su lugar una resistencia de terminación en serie con el pin (donde nace la señal, pin-resistencia-cable), es una resistencia de terminación (si estamos en el caso de que la longitud eléctrica del cable en relación con el ancho de banda es lo suficientemente larga para que sea necesaria añadir resistencias de terminación), con la ventaja de que esta resistencia de terminación no consume corriente, la resistencia de terminación que pones de 120 ohmios entre pin y tierra, te consumirá 3v3/120 = 27.5 mA, que en muchos casos ese consumo de corriente puede ser un problema (y más si todas las señales comparten la misma tierra para el retorno de su corriente en el cable).

Hay varios opciones para las resistencias de terminación: https://resources.pcb.cadence.com/blog/termination-resistors-in-pcb-design

El ancho de banda de una señal, más que la frecuencia del reloj, te lo va a dar el tiempo de bajada o de subida de la señal, por lo general el ancho de banda es igual al 0.35/(tiempo de bajada o de subida). Es decir si tienes una señal de reloj de 1 MHz con un tiempo de subida de 1 ns, el ancho de banda (componentes frecuenciales significativas (con suficiente energía) en esa señal) sería de 350 MHz, una señal digital tiene su frecuencia fundamental y todos sus armónicos, y cuanto más rápido sea el tiempo de subida o de bajada, eso significará que hay armónicos de mayor frecuencia a considerar en la señal.

La necesidad de añadir resistencias de terminación te la da la relación entre la velocidad de propagación de la señal por el cable (es decir la longitud eléctrica del cable) y el tiempo de subida o de bajada de la señal.

Por lo que una estrategía distinta a disminuir la velocidad del reloj, puede ser incrementar el tiempo de subida o de bajada de la señal, es decir añadir un siemple filtro RC en serie con cada pin que generé una señal, con el filtro RC decrementas el ancho de banda, incrementando los tiempos de subida y de bajada de las señales, y por tanto filtrando los armónicos de mayor frecuencia. Con que esté filtro deje pasar el 5 armónico de la señal del reloj es suficiente para, no recuerdo ahora cuál era el armónico que recomendaban tener como mínimo en una señal de reloj.

La ventaja de la resistencia de terminación en serie con el pin (pin-resistencia-cable) frente a la resistencia entre pin y tierra, es que esa resistencia junto a la capacidad parásita del cable incremente o decrementa los tiempos de subida o de bajada, ya que forma un pequeño filtro RC, aunque no tiene comparación con añadir un condensador real en lugar de la capacidad parásita del cable.

Un problema que puedes tener en un cable plano con distintas señales es el crosstalk, problema que se reduce espaciando la distancia entre conductores (o incrementando lo tiempos de subida o bajada como en el caso anterior, o reduciendo la impedancia de la señal y su retorno), por lo que en lugar de poner en el cable señal1 señal2 señal3 tierra alimentación por ejemplo, alterna una tierra entre cada señal , es decir señal1 tierra señal2 tierra señal3 tierra alimentación tierra. De esta forma reducirás el crosstalk aumentando la distnacias, reducirás la impedancia de cada línea, ya que la corriente de retorno de cada señal está más cercana a la señal, y reducirás el ruido de tierra en las conmutaciones de las distintas señales, ya que las señales no comparten todas las misma tierra y por tanto no comparten el mismo camino de retorno.

Si además lo haces de la forma anterior y trenzas cada señal con su tierra, reduciras la impedancia mútua del par a la vez que alejas las distintas señales unas de las otras, y por tanto será más inmune a las emisiones y radiará menos, a menor impedancia de la señal y su camino de retorno los problemas se reducen, a mayor distancia entre señales menor crosstalk, cada señal con su cable de retorno menor ruido de conmutaciones en la tierra.

Siempre que tienes cables que abandonan una placa es bueno añadir ferritas u otros filtros con la señal que sale del conector, ya que los cables son los que te van a hacer de antenas en la mayoría de los casos con las corrientes en modo común que puedas tener en el pcb.

Todos estos temas son largos de explicar, pero si no te queda más remedio que ir con un cable plano, probaría la resistencia de terminación en serie en lugar de la que va a tierra (a ver si obtienes mejores resultados), prueba a alternar una tierra entre señales, y prueba a disminuir el tiempo de subida o de bajada de la señal con un filtro RC con cada pin de salida, y luego considera también añadir filtros (por lo menos una ferrita) en la entrada de cada conector, y si puedes trenzar el cable de cada señal con una tierra mucho mejor.

Aunque lo mejor, como decís, para varios metros de cable lo mejor es un bus diferencial.
« Última modificación: 07 de Julio de 2020, 14:13:03 por Jorge555 »