Pour les impatients, vous pouvez sauter l'arrière-plan.
Contexte
Je programme un ensemble de microcontrôleurs qui communiquent avec SPI. Il y a un maître et des n
esclaves qui partagent le bus. Il n'y a pas de sélection de puces. (Ce n'est pas un mauvais design, mais il n
est grand et il n'y a pas assez d'espace pour n
des lignes supplémentaires).
Il est donc de la responsabilité des esclaves de maintenir leur MISO sous haute impédance et tout au plus l'un d'eux parle. Cela se fait en répondant uniquement lorsque leur identifiant est interrogé.
Maintenant, nous aimerions avoir une première phase de découverte où le maître découvre les esclaves avec quels identifiants y sont attachés. Pour vous faciliter la vie (sur certains aspects), nous aimerions avoir l'identifiant unique (et donc par exemple 32 bits). Cela empêche le maître de simplement interroger les identifiants un par un et de voir qui répond (il y a trop de possibilités).
Pour résoudre ce problème, j'ai imaginé une variante de recherche binaire où les esclaves répondent collectivement et le maître est capable de trouver rapidement l'id minimum. L'esclave avec cet identifiant est invité à ne plus participer et l'algorithme se répète. (Détails sans importance).
Il y a cependant un problème. La réponse collective doit être le OU logique (ou ET logique) de toutes les réponses. On m'a dit que la ligne peut être configurée de telle manière que le bus MISO puisse agir comme un OU logique. Ce qu'on m'a dit, c'est:
- Réglez MISO sur le maître comme Pull-up et
- Réglez MISO sur chaque esclave en tant que drain ouvert.
J'ai essayé cela, mais même avec un seul esclave, cette configuration ne fonctionne pas (l'oscilloscope affiche un zéro constant sur la ligne). Si je configure MISO sur le maître comme entrée haute impédance, je peux voir avec l'oscilloscope que la tension chute de moitié où les bits des sorties de deux esclaves diffèrent (fondamentalement, je présume un court-circuit).
Remarque: en configurant MISO sur le maître en haute impédance et les esclaves chacun en push-pull, je peux parler à chacun d'eux individuellement même s'il y en a beaucoup sur le même bus. Je veux dire, je doute que ce soit un problème de la ligne elle-même.
Question
Ma question est, si cela est possible, et si oui, comment puis-je configurer les broches d'entrée et de sortie du maître et des esclaves afin que la ligne MISO partagée agisse comme OU logique (ou ET logique)?
Éditer
Il s'est avéré que cela devient un OU avec une logique négative-vraie (essentiellement un ET).
Le problème avec un seul esclave a été résolu en écrivant 1 sur la broche de traction du maître. Auparavant, il avait un état initial de 0.
Modifier 2
Il s'est avéré que l'esclave ST remplace ma configuration GPIO de MISO en tant que drain ouvert et le forçait à un niveau élevé lors de l'écriture. J'ai résolu de faire taire SPI et de sortir MISO dans ce cas particulier manuellement.