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
-
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 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.