Para los impacientes, puede omitir el fondo.
Antecedentes
Estoy programando un conjunto de microcontroladores que se comunican con SPI. Hay un maestro y n
esclavos que comparten el autobús. No hay selección de chip. (No es un mal diseño, pero n
es grande y no hay suficiente espacio para n
líneas adicionales).
Por lo tanto, es responsabilidad de los esclavos mantener su MISO en alta impedancia y, a lo sumo, uno de ellos habla. Esto se hace respondiendo solo cuando se sondea su identificación.
Ahora nos gustaría tener una fase de descubrimiento inicial en la que el maestro descubra esclavos con los identificadores que tiene adjuntos. Para hacer la vida más fácil (en algunos aspectos), nos gustaría tener la identificación única (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 búsqueda binaria donde 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. (Detalles sin importancia).
Sin embargo, hay un problema. La respuesta colectiva debe ser el OR lógico (o el AND 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 maestro como Pull-up y
- Configure MISO en cada esclavo como drenaje 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 cae a la mitad donde difieren los bits de las salidas de dos esclavos (supongo, básicamente, cortocircuito).
Nota: configurando MISO en maestro como 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 línea misma.
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ógico (o AND lógico)?
Editar
Resultó que se convierte en un OR con lógica negativa verdadera (básicamente un AND).
El problema con el esclavo único se resolvió escribiendo 1 en el pin pull-up 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 drenaje abierto y lo estaba forzando alto cuando se escribió uno. Resolví silenciar SPI y generar MISO en este caso particular manualmente.
fuente
Respuestas:
Su SPI-sin-selección es lo que utiliza Microchip en sus chips MCP23017 (y otros). No hay nada malo con ese enfoque.
Sí, lo que quieres es posible, pero debes hacer que los esclavos sean de drenaje abierto. Puede hacer trampa poniendo 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 el utilizado por el bus de un cable de Dallas para la enumeración, y por el bus CAN para el arbitraje.
Pero un inconveniente grave de su enfoque es que la velocidad ahora está limitada por el tiempo de subida, impulsado por la resistencia pull-up. Esto será más lento que cuando es impulsado por una salida push-pull, y probablemente limitará la velocidad a la que puede operar el bus.
Si tiene dos pines de sobra en cada esclavo, puede encadenarlos y tener un esquema de enumeración basado en su lugar en la cadena de margaritas.
fuente
Debe verificar cuál es la resistencia equivalente del pin maestro de E / S en modo pull-up.
Por lo general, el modo pull-up tiene una resistencia muy alta, quizás 50 kOhms o más. Su objetivo es evitar que el pin falle debido a emi u otro ruido, o establecer un valor predeterminado para señales de control muy lentas y, al mismo tiempo, no desperdiciar demasiada energía al hacerlo.
Como señaló Wouter, en un bus de drenaje abierto la velocidad está limitada por la resistencia 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. Necesitará una resistencia de pull-up similar para lograr una velocidad similar.
Creo que debe usar una resistencia pull-up externa (de 1 a 5 kOhms más o menos) en lugar del pull-up del pin de E / S del maestro para que este esquema funcione.
fuente
Para que un cable y un bus funcionen, los nodos del bus deben ser de drenaje abierto, es decir, deben transmitir
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 por el maestro tirando hacia arriba fuertemente o el esclavo hacia abajo débilmente.
Debe determinar cuál de los anteriores está sucediendo.
Ponga el esclavo en modo de alta impedancia y conecte el bus a tierra a través de una resistencia de 10k. Si el voltaje de la línea no cambia significativamente, entonces el maestro está tirando fuertemente hacia arriba y necesita arreglarlo. 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 (arregle eso). De lo contrario, busca distorsiones espacio-temporales en el área que te rodea.
fuente
Sugeriría tener un pull-up o pull-down pasivo en el autobús (supongo que pull-up), y que los esclavos conduzcan activamente el autobús (conduciendo alto y bajo) cuando tengan algo que decir y lo floten de otra manera . Tenga comandos de dirección de consulta que toman una dirección y una máscara, y le indica a cada esclavo que salga 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 bus alto antes de que los esclavos comiencen a conducirlo. Dependiendo de la fuerza del pull-up y de si el maestro conduce el bus alto, antes de que los esclavos puedan bajarlo, 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,
fuente