Autor Tema: Distribución bus SPI entre Raspberry y varios nodos esclavos MCP23S17  (Leído 3251 veces)

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

Desconectado genisuvi

  • PIC16
  • ***
  • Mensajes: 114
Bunos días, la verdad es que  no tengo muy claro en qué tema dejar esta duda; pero como es un proyecto basado en Raspberry, supongo que puedo dejarlo aquí.

Tenemos pensado usar una Raspberry3 o Raspberry4 para comunicarnos vía sPI o I2C con unos chips expansores de GPIO16 con la idea de procesar un gran número de GPIOs: escribir estado alto o bajo en algunas IO y leer de otras. Existen dos alternativas de puerto de comunicación: unos expansores se comunican por I2C y otros por SPI. Voy a valorar qué tal resultarían ambas opciones en el laboratorio.

En el caso de SPI:

* Modelo de chip expansor que se empleará: https://www.microchip.com/wwwproducts/en/MCP23S17#additional-features

Por lo que entiendo este tipo de dispositivo comparte las señales SPI procedentes del máster (que seria la Rasp) incluído la señal CS. Estos chips tienen un mecanismo de direccionamiento por hw que permite a los nodos esclavos ignorar el mensaje si la dirección no coincide. Eso le permite usar un mismo CS para esos nodos. Eso sí, puede direccionar hasta 8 chips de estos. Más no.
En total podría tener 8 nodos SPI connectados al mismo bus SPI de las Rasp. Si un expansor son 16 GPIO, con 8 obtienes 128.
Ahora pongamos que además quiero escalarlo y obtener 128xn a modo de tener una matriz de chips de estos tal que tengo n arrays(filas) de 8 chips. Sólo necesitaría multiplexar la señal de CS de n canales y listo. De este modo sólo puedo acceder a un único módulo cada vez, lo cual ya me interesa. Pero también me interesa garantizar que la transmisión de las 4 señales de control sea correcta y pueda llegar al nodo adecuadamente.

Pongamos que tengo n = 2 (por tanto: 2 filas de 8 nodos esclavos SPI = 8 chips expansores GPIO16). LAs 4 señales SPI de la Rasp se disribuirán hasta alcanzar a 8 + 8 chips de estos.
Y aquí está mi duda en cuanto al diseño electrónico de este sistema de comunicación SPI con varios nodos conectados al mismo puerto compartiendo las mismas señales. El tema o cuestión es que si pretendemos tener el puerto SPI de la Raspberry distribuido entre tantos nodos;

* necesito algún tipo de elemento de distribución de señales (buffers trietado o cosas así)? O puedo trazar las pistas directamente sin necesidad de añadir ningún elemento?
* Cómo puede afectar al nodo accedido "i" que las 4 señales eléctricas se estén propagando por el resto de pistas hasta el resto de nodos aunque únicamente sea ese "i" el que va a atenderlo?
* Y si n = 8, donde 8x8 = 64 nodos esclavos?


Adjunto imagen para que se entienda un poco la compartición de señales de la que hablo, pero con ejemplo de cómo sería si sólo fueran dos nodos:



Saludos a todos y gracias por vuestra atención.
« Última modificación: 26 de Mayo de 2020, 07:38:33 por genisuvi »

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1295
Re:Distribución bus SPI entre Raspberry y varios nodos esclavos MCP23S17
« Respuesta #1 en: 26 de Mayo de 2020, 12:35:36 »
Que tal genisuvi,

Has hecho una muy buena pregunta y la verdad la respuesta no es muy sencilla ya que depende de varios factores, entre ellos el más importante es la longitud total del bus SPI que será común para el array de expansores que pretendes realizar.

1) El bus SPI es un bus de muy alta frecuencia de operación, en este caso los MPC23S17 pueden operar hasta una frecuencia de 10MHz, pero esa frecuencia obviamente se verá afectada por los parasíticos creados en el trazo de las pista, por lo que entre más largas, más posibilidad tendrás de que la señal de reloj para esa frecuencia se deforme y no pueda ser reconocida correctamente. Así que la solución es reducir la frecuencia del bus SPI tanto como sea operacional y tolerable para la aplicación.

2) Si existe la necesidad de que los buses SPI sean algo extensos (digamos 10 o más centímetros) y necesitas operar los expansores de puertos a su máxima frecuencia de operación (10MHz), entonces vas a necesitar hacer uso de buffers.

3) Siempre la mejor opción para estos casos es reducir la frecuencia de operación del bus SPI. Creo que esta es la mejor opción para tu caso. De esta manera no tendrás que agregar hardware extra.

elreypic.

Desconectado genisuvi

  • PIC16
  • ***
  • Mensajes: 114
Re:Distribución bus SPI entre Raspberry y varios nodos esclavos MCP23S17
« Respuesta #2 en: 27 de Mayo de 2020, 04:14:09 »
Que tal genisuvi,

Has hecho una muy buena pregunta y la verdad la respuesta no es muy sencilla ya que depende de varios factores, entre ellos el más importante es la longitud total del bus SPI que será común para el array de expansores que pretendes realizar.

1) El bus SPI es un bus de muy alta frecuencia de operación, en este caso los MPC23S17 pueden operar hasta una frecuencia de 10MHz, pero esa frecuencia obviamente se verá afectada por los parasíticos creados en el trazo de las pista, por lo que entre más largas, más posibilidad tendrás de que la señal de reloj para esa frecuencia se deforme y no pueda ser reconocida correctamente. Así que la solución es reducir la frecuencia del bus SPI tanto como sea operacional y tolerable para la aplicación.

2) Si existe la necesidad de que los buses SPI sean algo extensos (digamos 10 o más centímetros) y necesitas operar los expansores de puertos a su máxima frecuencia de operación (10MHz), entonces vas a necesitar hacer uso de buffers.

3) Siempre la mejor opción para estos casos es reducir la frecuencia de operación del bus SPI. Creo que esta es la mejor opción para tu caso. De esta manera no tendrás que agregar hardware extra.

elreypic.

Dos cositas,

pues por suerte no lo necesitamos trabajando a la frecuencia máxima, con 2Mhz incluso puede que nos sobre. Así que parece que este remedio de bajar la frec de trabajo puede venirnos bien. Pero tengo que decir, por contra, por el tema de la longitud es que sí que las línieas van a pasar por 3 connectores. Para hacer mi sistema escalable necesito tener arrays de expansores en tarjetas "independientes" que voy a conectar a una plaquita enlace donde tendré al MUX. Las 4 líneas de control pasarán del conector de entrada al de salida directamente, excepto la señal chip select que lo hará a través del MUX. Este conector de salida tendrá conectado el de entrada de las tarjetas con los arrays. La placa MUX no va a ser muy grande. Trazaré pistas lo más cortas y directas posibles. Pero el tema de los conectores me temo que no va a ayudar aunque las distancias sean inferiores a 10cm.

La segunda es que acabo de ver en un foro que la señal de salida de los expansores es triestado, así que esta línea se descuelga si no recibe CS. Pero del resto de líneas no sé nada. Pero bueno, al menos parece que podría ahorrarme unos cuantos buffers.

Saludos y muchas gracias por aportar y compartir conocimiento.
« Última modificación: 27 de Mayo de 2020, 05:32:38 por genisuvi »

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Distribución bus SPI entre Raspberry y varios nodos esclavos MCP23S17
« Respuesta #3 en: 27 de Mayo de 2020, 05:47:10 »
¿Te refieres a que si pones CS a 1 los puertos se van a alta impedancia?

   Imposible. No serviría para nada el integrado.

Aquí en la página 16 se puede ver como se comanda CS para una comunicación y los puertos.

http://ww1.microchip.com/downloads/en/DeviceDoc/20001952C.pdf


 Triestados son.  Por que si los configuras como entrada quedan en alta impedancia.

  También las líneas de salida de interrupción se pueden configurar para que se pongan en H,L o X  si un pin configurado genera interrupción.

  Lo que SI se va a alta impedancia sería MISO MOSI y CLK en ese dispositivo, pero eso es lógico y tiene que ser así, al menos MISO y MOSI tienen que ser desacoplados de los dispositivos no direccionados con CS.
« Última modificación: 27 de Mayo de 2020, 05:49:16 por remi04 »

Desconectado genisuvi

  • PIC16
  • ***
  • Mensajes: 114
Re:Distribución bus SPI entre Raspberry y varios nodos esclavos MCP23S17
« Respuesta #4 en: 28 de Mayo de 2020, 03:58:36 »
¿Te refieres a que si pones CS a 1 los puertos se van a alta impedancia?

   Imposible. No serviría para nada el integrado.

Aquí en la página 16 se puede ver como se comanda CS para una comunicación y los puertos.

http://ww1.microchip.com/downloads/en/DeviceDoc/20001952C.pdf


 Triestados son.  Por que si los configuras como entrada quedan en alta impedancia.

  También las líneas de salida de interrupción se pueden configurar para que se pongan en H,L o X  si un pin configurado genera interrupción.

  Lo que SI se va a alta impedancia sería MISO MOSI y CLK en ese dispositivo, pero eso es lógico y tiene que ser así, al menos MISO y MOSI tienen que ser desacoplados de los dispositivos no direccionados con CS.

Y no, no me refería a los puertos. No sé si te estoy entendiendo bien a ti. Aquí sólo habrá un puerto compartido de 4 líneas (un único CS por la pecualiridad de estos módulos) con varios chips/nodos y lo que decía es que por una línea, al menos en MISO, los chips no seleccionados se descuelgan por que los pins de estos devices son triestado.

Me refiero a esto que dicen aquí:

https://www.microchip.com/forums/m415294.aspx

en concreto en esta frase: "All spi devices should work this way. I have used the MCP23S17 and it is tri-stated when not selected. You may include it in a spi chain with no problem."

Quizás al decir "not selected" no se refería a la señal CS. Quizás a que no se ha seleccionado su dirección hw y yo he interpretado que se referían a esa señal.


Gracias por tu respuesta y los aportes. Voy a revisar ese pdf.
« Última modificación: 28 de Mayo de 2020, 04:09:43 por genisuvi »

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Distribución bus SPI entre Raspberry y varios nodos esclavos MCP23S17
« Respuesta #5 en: 28 de Mayo de 2020, 04:20:12 »
 Not selected efectivamente se refiere a que tiene su señal CS a nivel alto. En ese caso, como ya indiqué, las líneas MOSI y MISO,  y en ocasiones, también CLK, quedan en alta impedancia, aunque lo realmente importante es MISO. Esa es la que tiene que garantizar que quede en alta impedancia.  Pero eso es así en todos los dispositivos SPI que soporten conexión en un bus multislave.

 Para conectar varios dispositivos, todos ellos deben llevar en común MISO, MOSI y CLK.

  CS debe llevar cada uno el suyo, si no, lo que mandes a un ic lo harán todos a la vez y eso puede provocar colision en MISO cuando todos empiecen a responder a la vez.
« Última modificación: 28 de Mayo de 2020, 04:26:03 por remi04 »

Desconectado genisuvi

  • PIC16
  • ***
  • Mensajes: 114
Re:Distribución bus SPI entre Raspberry y varios nodos esclavos MCP23S17
« Respuesta #6 en: 28 de Mayo de 2020, 07:58:17 »
Not selected efectivamente se refiere a que tiene su señal CS a nivel alto. En ese caso, como ya indiqué, las líneas MOSI y MISO,  y en ocasiones, también CLK, quedan en alta impedancia, aunque lo realmente importante es MISO. Esa es la que tiene que garantizar que quede en alta impedancia.  Pero eso es así en todos los dispositivos SPI que soporten conexión en un bus multislave.

 Para conectar varios dispositivos, todos ellos deben llevar en común MISO, MOSI y CLK.

  CS debe llevar cada uno el suyo, si no, lo que mandes a un ic lo harán todos a la vez y eso puede provocar colision en MISO cuando todos empiecen a responder a la vez.

Sí, tengo entendido que estos dispositivos funcionan así, para que con un único CS puedas encadenar varios (hasta 8 ). Por lo que entiendo, hay 3 bits de dirección que el máster envía donde indicaría el nodo receptor, así hasta 8. Cada nodo tiene 3 pines de dirección hw, palabra de 3 bits, que le asignas mediante VDD o GND. Lo que no sé es qué mecanismo de rechazo o filtrado de mensaje realizan cuando las direcciones no coinciden. Creo que eso no viene en el datasheet. Pero la mayoría de circuitos que circulan por ahí me corroboran que comparten el mismo CS. La gente le mete un único CS. No he encontrado más información en microchip al respecto. Tal vez estoy equivocada. Ahora dudo ya.

Otra cosa que no sé, y no sé si tú los has usado estos chips, es qué pasa con el estad de estos pines GPIO cuando el chip deja de ser accedido/seleccionado; se mantiene el último estado de las salidas por ejemplo? o se quedan al aire en alta impedancia?




Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Distribución bus SPI entre Raspberry y varios nodos esclavos MCP23S17
« Respuesta #7 en: 28 de Mayo de 2020, 11:10:09 »
Not selected efectivamente se refiere a que tiene su señal CS a nivel alto. En ese caso, como ya indiqué, las líneas MOSI y MISO,  y en ocasiones, también CLK, quedan en alta impedancia, aunque lo realmente importante es MISO. Esa es la que tiene que garantizar que quede en alta impedancia.  Pero eso es así en todos los dispositivos SPI que soporten conexión en un bus multislave.

 Para conectar varios dispositivos, todos ellos deben llevar en común MISO, MOSI y CLK.

  CS debe llevar cada uno el suyo, si no, lo que mandes a un ic lo harán todos a la vez y eso puede provocar colision en MISO cuando todos empiecen a responder a la vez.

Sí, tengo entendido que estos dispositivos funcionan así, para que con un único CS puedas encadenar varios (hasta 8 ). Por lo que entiendo, hay 3 bits de dirección que el máster envía donde indicaría el nodo receptor, así hasta 8. Cada nodo tiene 3 pines de dirección hw, palabra de 3 bits, que le asignas mediante VDD o GND. Lo que no sé es qué mecanismo de rechazo o filtrado de mensaje realizan cuando las direcciones no coinciden. Creo que eso no viene en el datasheet. Pero la mayoría de circuitos que circulan por ahí me corroboran que comparten el mismo CS. La gente le mete un único CS. No he encontrado más información en microchip al respecto. Tal vez estoy equivocada. Ahora dudo ya.

Otra cosa que no sé, y no sé si tú los has usado estos chips, es qué pasa con el estad de estos pines GPIO cuando el chip deja de ser accedido/seleccionado; se mantiene el último estado de las salidas por ejemplo? o se quedan al aire en alta impedancia?

  Si, pero eso es para I2C.  No Spi.

  En SPI la única forma de direccionar es mediante CS.
« Última modificación: 28 de Mayo de 2020, 11:16:26 por remi04 »

Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1295
Re:Distribución bus SPI entre Raspberry y varios nodos esclavos MCP23S17
« Respuesta #8 en: 28 de Mayo de 2020, 11:19:16 »
Que tal geniusuvi,

Efectivamente como mencionas, esa es la operación de estos expansores de puertos. Es decir con un solo CS puede seleccionar cada uno de ellos, ya que estos cuentan con un mecanismo de detección de dirección basado en tres pines externos (A0, A1 y A2), pudiendo así accesar a cada uno de ellos de manera individual en un array de hasta 8 en el mismo bus, compartiendo CS, MOSI, MISO y SCLK.

Ahora bien, una vez que configuras el expansor MCP23S17, si los puertos que configures como salidas serán de salida y si sacaste un dto por ahí, entonces el dato se mantiene despues de qeu ya no esté seleccionado. Lo mismo sucede si el puerto es de entrada, será de entrada y se quedará así a menos que le indiques otra cosa.

Con respecto a cómo es que cada dispositivo reconoce su dirección, bueno es muy muy simple: Despues de poner el CS en estado bajo, todos tus MCP23S17 están quasi habilitados, por así deciro, ya que en ese momento todos están listos a recibir los primeros 8 bits los cuales sirven para saber que los estas llamando, en eseos 8 bits están los tres bits de dirección externa (A0, A1 y A2) y si estos concuerdan entonces en ese momento se habilita o activa solamente uno, los demas se mantienen inactivos. Todo esto se explica en la página 15 del datasheet. El primer dato que debes enviar es: 1010(A2)(A1)(A0)R/W. En el últomo bit le dices si vas a leer o a escribir un registro interno, páagina 16 del datasheet.

Ahora bien, por default no reconocen la dirección necesitas habilitar el reconocimiento de la dirección. Lo cual se logra colocando en 1, el bit HAEN del registro de configuración interno (que tiene la dirección de registro 0x05). Una vez activado este registro entonces cada exoansor MCP23S17 únicamente responderá si concuerda la dirreción, de lo contrario, si no lo habilitas todos los MCP23S17 se activarán al mismo tiempo. Esto está en las páginas 20 y 21 del datasheet.

Cabe recordar que la configuración de los MCP se mantiene mientras están energizados, si por alguna razón estos se desconectan del voltaje de alimentación, su configuración se pierde.

Espero y esto te ayude a responder tus preguntas.

elreypic.



Desconectado elreypic2

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1295
Re:Distribución bus SPI entre Raspberry y varios nodos esclavos MCP23S17
« Respuesta #9 en: 28 de Mayo de 2020, 11:24:41 »
  Si, pero eso es para I2C.  No Spi.

  En SPI la única forma de direccionar es mediante CS.

Que tal remi04,

Para este dispositivo en particular sí puedes y repito sí puedes seleccionar hasta 8 dispositivos en el mismo bus; y todos ellos compartiendo un solo CS, MISO, MOSI y SCLK. Como lo expliqué en el post anterior, estos cuentan con un mecanimso de detección de dirección basdo en los tres pines externos A2, A1 y A0. Y una vez configurado para que detecte la dirección, que son los primeros 8 bits inmediatos al bajar el CS.

Saludos,

elreypic.

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Distribución bus SPI entre Raspberry y varios nodos esclavos MCP23S17
« Respuesta #10 en: 28 de Mayo de 2020, 13:29:34 »
Ok, aclarado entonces que si se puede.

Desconectado genisuvi

  • PIC16
  • ***
  • Mensajes: 114
Re:Distribución bus SPI entre Raspberry y varios nodos esclavos MCP23S17
« Respuesta #11 en: 01 de Junio de 2020, 03:03:16 »
Ok, aclarado entonces que si se puede.

Sí, buenas Remi y compañía, iba a confirmarlo pero os habéis adelantado, justo encontraba esta aclaración en la última página de uno de sus application notes en un paragrafito.

Saludos y muchas gracias a ambos por vuestros aportes que han sido muy útiles para mí.

Desconectado genisuvi

  • PIC16
  • ***
  • Mensajes: 114
Re:Distribución bus SPI entre Raspberry y varios nodos esclavos MCP23S17
« Respuesta #12 en: 01 de Junio de 2020, 03:11:56 »
Que tal geniusuvi,

Efectivamente como mencionas, esa es la operación de estos expansores de puertos. Es decir con un solo CS puede seleccionar cada uno de ellos, ya que estos cuentan con un mecanismo de detección de dirección basado en tres pines externos (A0, A1 y A2), pudiendo así accesar a cada uno de ellos de manera individual en un array de hasta 8 en el mismo bus, compartiendo CS, MOSI, MISO y SCLK.

Ahora bien, una vez que configuras el expansor MCP23S17, si los puertos que configures como salidas serán de salida y si sacaste un dto por ahí, entonces el dato se mantiene despues de qeu ya no esté seleccionado. Lo mismo sucede si el puerto es de entrada, será de entrada y se quedará así a menos que le indiques otra cosa.

Con respecto a cómo es que cada dispositivo reconoce su dirección, bueno es muy muy simple: Despues de poner el CS en estado bajo, todos tus MCP23S17 están quasi habilitados, por así deciro, ya que en ese momento todos están listos a recibir los primeros 8 bits los cuales sirven para saber que los estas llamando, en eseos 8 bits están los tres bits de dirección externa (A0, A1 y A2) y si estos concuerdan entonces en ese momento se habilita o activa solamente uno, los demas se mantienen inactivos. Todo esto se explica en la página 15 del datasheet. El primer dato que debes enviar es: 1010(A2)(A1)(A0)R/W. En el últomo bit le dices si vas a leer o a escribir un registro interno, páagina 16 del datasheet.

Ahora bien, por default no reconocen la dirección necesitas habilitar el reconocimiento de la dirección. Lo cual se logra colocando en 1, el bit HAEN del registro de configuración interno (que tiene la dirección de registro 0x05). Una vez activado este registro entonces cada exoansor MCP23S17 únicamente responderá si concuerda la dirreción, de lo contrario, si no lo habilitas todos los MCP23S17 se activarán al mismo tiempo. Esto está en las páginas 20 y 21 del datasheet.

Cabe recordar que la configuración de los MCP se mantiene mientras están energizados, si por alguna razón estos se desconectan del voltaje de alimentación, su configuración se pierde.

Espero y esto te ayude a responder tus preguntas.

elreypic.

Jjeje sí, hasta ahí llegué leyendo el datasheet, me refería a cómo filtra o compara esa dirección que lee. Si por ejemplo era una AND u OR entre dos registros donde guarde ambos valores, tipo lo que hace un driver CAN con sus máscaras de dirección de mensajes. Pero bueno, que tampoco sería algo que nos tendría que preocupar para usar y direccionar este chip. Ya que haciéndolo tal como dices es suficiente. Este nivel de abstracción es justa y no hace falta complicarse más la vida; a menos que estés diseñando el dispositivo internamente.

Saludos que tengas buen día. Gracias por todo.