Hacer que el bus compartido actúe como OR

10

Para los impacientes, puedes omitir el fondo.

Fondo

Estoy programando un conjunto de microcontroladores que se comunican con SPI. Hay un maestro y n esclavos que comparten el bus. No hay chip seleccionado. (No es un mal diseño, pero n es grande y no hay suficiente espacio para n líneas extra).

Por lo tanto, es responsabilidad de los esclavos mantener su MISO en alta impedancia y, como máximo, hablar. Esto se hace respondiendo solo cuando su id es encuestado.

Ahora nos gustaría tener una fase de descubrimiento inicial en la que el maestro descubra esclavos con las identificaciones que se le adjuntan. Para hacer la vida más fácil (en algunos aspectos), nos gustaría que el ID sea único (y por lo tanto, por ejemplo, 32 bits). Esto hace que sea imposible para el maestro simplemente sondear los identificadores uno por uno y ver quién responde (hay demasiadas posibilidades).

Para resolver este problema, ideé una variación de la búsqueda binaria en la que los esclavos responden colectivamente y el maestro puede encontrar rápidamente la identificación mínima. Al esclavo con esa identificación se le dice que no participe más y el algoritmo se repite. (Los detalles no son importantes).

Sin embargo, hay un problema. La respuesta colectiva debe ser el OR lógico (o Y lógico) de todas las respuestas. Me han dicho que la línea se puede configurar de tal manera que el bus MISO pueda actuar como un OR lógico. Lo que me han dicho es:

  • Establezca MISO en el master como Pull-up y
  • Establezca MISO en cada esclavo como Desagüe abierto.

He intentado esto, pero incluso con un solo esclavo, esta configuración no funciona (el osciloscopio muestra un cero constante en la línea). Si configuro MISO en el maestro como entrada de alta impedancia, puedo ver con el osciloscopio que el voltaje se reduce a la mitad donde difieren los bits de las salidas de dos esclavos (básicamente, cortocircuito, supongo).

Nota: configurando MISO en el maestro como de alta impedancia y esclavos cada uno como push-pull, puedo hablar con cada uno de ellos individualmente, incluso si hay muchos de ellos en el mismo bus. Quiero decir, dudo que sea un problema de la propia línea.

Pregunta

Mi pregunta es, si esto es posible, y si es así, ¿cómo puedo configurar los pines de entrada y salida del maestro y los esclavos para que la línea MISO compartida actúe como OR lógica (o AND lógica)?

Editar

  1. Resultó que se convierte en un OR con lógica negativa-verdadera (básicamente un AND).

  2. El problema con el esclavo único se resolvió escribiendo 1 en el pin de recuperación en el maestro. Anteriormente tenía un estado inicial de 0.

Editar 2

Resultó que el esclavo ST anula mi configuración GPIO de MISO como de drenaje abierto y la estaba forzando cuando se escribió una. Resolví silenciar SPI y generar MISO en este caso particular de forma manual.

    
pregunta Shahbaz

4 respuestas

5

Su SPI sin selección es lo que Microchip usa en sus chips MCP23017 (y otros). No hay nada malo con ese enfoque.

Sí, lo que quieres es posible, pero debes conseguir que los esclavos tengan el drenaje abierto. Podría hacer trampa colocando un diodo (schottky) en serie con cada salida si no puede hacer que se comporten como drenaje abierto.

Su enfoque de enumeración es el mismo que utiliza el bus de un cable de Dallas para enumeración y el bus CAN para arbitraje.

Pero un serio inconveniente de su enfoque es que la velocidad ahora está limitada por el tiempo de subida, impulsado por la resistencia de pull-up. Esto será más lento que cuando se maneja con una salida push-pull, y probablemente limitará la velocidad a la que puede operar el bus.

Si tiene dos pines de repuesto en cada esclavo, puede encadenarlos y tener un esquema de enumeración basado en su lugar en la misma.

    
respondido por el Wouter van Ooijen
4
  
  • Establezca MISO en el master como Pull-up y
  •   
  • Establezca MISO en cada esclavo como Desagüe abierto.
  •   

He intentado esto, pero incluso con un solo esclavo, esta configuración no funciona (el osciloscopio muestra un cero constante en la línea).

Debe comprobar cuál es la resistencia equivalente del pin de E / S maestro en el modo pull-up.

Típicamente, el modo pull-up tiene una resistencia muy alta, tal vez 50 kOhms o más. Está pensado para evitar que el pin se produzca un error debido a emi u otro ruido, o para establecer un valor predeterminado para señales de control muy lentas y, al mismo tiempo, no desperdiciar demasiada energía haciendo eso.

Como señaló Wouter, en un bus de drenaje abierto la velocidad está limitada por la resistencia de pull-up. Los valores de resistencia más altos hacen que el bus sea más lento. Los valores típicos en I2C (que obtiene 100 o 400 kHz) son de 1 a 5 kOhms. Querrás una resistencia similar para lograr una velocidad similar.

Creo que necesitas usar una resistencia de pull-up externa (de 1 a 5 kOhms o menos) en lugar del pull-up del pin de E / S del maestro para que este esquema funcione.

    
respondido por el The Photon
1

Para que un bus cableado y con cables funcionen, los nodos del bus deben estar abiertos, es decir, deben transmitir

  • baja la lógica tirando hacia abajo con fuerza, y
  • la lógica alta desconectándose del bus.

Además, el autobús debe ser levantado débilmente.

El comportamiento peculiar que se ve con un solo maestro no transmisor y un solo esclavo transmisor podría explicarse ya sea porque el maestro tira fuertemente hacia arriba o el esclavo hacia abajo débilmente.

Debes determinar cuál de los anteriores está sucediendo.

Ponga al esclavo en modo de alta impedancia y conecte el bus a tierra mediante una resistencia de 10k. Si el voltaje de la línea no cambia significativamente, entonces el maestro está subiendo fuertemente y usted necesita arreglar eso. De lo contrario, realice el mismo procedimiento con el esclavo (esta vez conecte la resistencia a Vcc); si el voltaje de la línea aumenta significativamente, el esclavo está bajando débilmente (corríjalo). De lo contrario, busque distorsiones en el espacio-tiempo en el área que lo rodea.

    
respondido por el avakar
1

Yo sugeriría tener un pull-up o un pull-down pasivo en el autobús (asumiré un pull-up), y que los esclavos manejen el autobús de manera activa (manejando a alta velocidad y manejando a baja velocidad) cuando tengan algo que decir y flotar de lo contrario. Tenga comandos de consulta-dirección que toman una dirección y una máscara, e instruyen a cada esclavo para que emita 00 o no haga nada (mantenga flotando su salida) en función de si le gusta la dirección y la máscara. Si es posible, haga que el maestro conduzca activamente el autobús alto un tiempo antes de que los esclavos comiencen a conducirlo. Dependiendo de la fuerza del pull-up y de si el maestro maneja el bus alto, antes de que se permita que los esclavos lo bajen, puede ser necesario limitar la velocidad del bus durante la fase de configuración. Por otro lado, una vez que se completa la configuración, hacer que cada esclavo seleccionado maneje activamente los niveles alto y bajo permitirá que el bus corra mucho más rápido que un bus de colector abierto.

    
respondido por el supercat

Lea otras preguntas en las etiquetas