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.