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.
la source
Réponses:
Votre SPI sans sélection est ce que Microchip utilise sur ses puces MCP23017 (et autres). Rien de mal à cette approche.
Oui, ce que vous voulez est possible, mais vous devez obliger les esclaves à être ouverts. Vous pouvez tricher en mettant une diode (schottky) en série avec chaque sortie si vous ne pouvez pas les faire se comporter comme un drain ouvert.
Votre approche d'énumération est la même que celle utilisée par le bus monofil de Dallas pour l'énumération et par le bus CAN pour l'arbitrage.
Mais un sérieux inconvénient de votre approche est que la vitesse est désormais limitée par le temps de montée, entraîné par la résistance de pull-up. Ce sera plus lent que lorsqu'il est entraîné par une sortie push-pull, et limitera probablement la vitesse à laquelle vous pouvez utiliser le bus.
Si vous avez deux broches à épargner sur chaque esclave, vous pouvez les connecter en chaîne et avoir un schéma d'énumération en fonction de leur place dans la chaîne.
la source
Vous devez vérifier quelle est la résistance équivalente de la broche d'E / S principale en mode pull-up.
En règle générale, le mode pull-up a une résistance très élevée, peut-être 50 kOhms ou plus. Il est destiné à empêcher la broche de scintiller en raison de l'émi ou d'autres bruits, ou de définir une valeur par défaut pour les signaux de contrôle très lents, et en même temps de ne pas gaspiller trop d'énergie à le faire.
Comme l'a souligné Wouter, dans un bus à drain ouvert, la vitesse est limitée par la résistance de rappel. Des valeurs de résistance plus élevées rendent le bus plus lent. Les valeurs typiques en I2C (qui obtient 100 ou 400 kHz) sont de 1 à 5 kOhms. Vous voudrez une résistance à la traction similaire afin d'atteindre une vitesse similaire.
Je pense que vous devez utiliser une résistance de rappel externe (de 1 à 5 kOhms environ) plutôt que le pull-up des broches d'E / S du maître pour faire fonctionner ce schéma.
la source
Pour qu'un câble et un bus fonctionnent, les nœuds du bus doivent être à drain ouvert, c'est-à-dire qu'ils doivent transmettre
De plus, l'autobus doit être tiré légèrement vers le haut.
Le comportement particulier que vous voyez avec un seul maître non émetteur et un seul esclave émetteur peut être expliqué soit par le maître tirant fortement, soit par l'esclave baissant faiblement.
Vous devez déterminer lequel des événements ci-dessus se produit.
Mettez l'esclave en mode haute impédance et connectez le bus à la terre via une résistance 10k. Si la tension de ligne ne change pas de manière significative, le maître tire fortement et vous devez y remédier. Sinon, faites la même procédure avec l'esclave (connectez cette fois la résistance à Vcc); si la tension de ligne augmente de manière significative, l'esclave tire vers le bas faiblement (corrigez cela). Sinon, recherchez les distorsions spatio-temporelles dans la zone autour de vous.
la source
Je suggérerais d'avoir un pull-up ou un pull-down passif sur le bus (je suppose que le pull-up) et d'avoir des esclaves conduisent activement le bus (conduisant haut et conduisant bas) quand ils ont quelque chose à dire et le font flotter autrement . Avoir des commandes d'adresse de requête qui prennent une adresse et un masque et ordonnent à chaque esclave de sortir 00 ou de ne rien faire (continuer à faire flotter sa sortie) selon qu'il aime l'adresse et le masque. Si possible, demandez au maître de conduire activement le bus haut quelque temps avant que les esclaves ne commencent à le conduire. Selon la force du pull-up et si le maître pousse le bus vers le haut, avant que les esclaves ne soient autorisés à le tirer vers le bas, il peut être nécessaire de limiter la vitesse du bus pendant la phase de configuration. D'un autre côté, une fois la configuration terminée,
la source