Bonjour, je cherche à réaliser une interface permettant de gérer plusieurs signaux arrivant depuis plusieurs modules à un microcontrôleur.
En gros j'ai plusieurs modules qui lisent des signaux de même type et les envoient à un dernier module chargé de les réunir et les traiter.
Je pensais utiliser les communications en SPI, mais je ne vois pas bien comment configurer mes liaisons.
Les signaux peuvent arriver à n'importe quel moment et doivent être traités en temps réel.
Si le module chargé de réunir les signaux est configuré en maître, il est responsable d'engager une communication avec les autres. Or les signaux étant envoyés depuis les autres modules quand ils ont été traités, ce n'est pas mon module maître qui sait quand un signal va être envoyé.
Première solution à laquelle j'ai pensée : configurer le module chargé de réunir les signaux en esclave. Mais alors, je ne dispose que de 2 modules SPI sur le µC et peut passer à 4 si 2 liaisons sont assurées en Usart. Mais ça ne me parait pas terrible.
Seconde solution : configurer le module principal en maître et dans la boucle principale, demander l'un après l'autre à chaque module s'il a un signal à transmettre. Ca me parait consommer beaucoup de ressources pour pas grand chose et enlève la possibilité de mise en veille d'un module qui n'aurait rien à transmettre pendant un certain temps.
Dernière solution, qui me parait la plus viable, mais qui consomme beaucoup plus de pins : configurer le module chargé de réunir les signaux en maître et ajouter une liaison supplémentaire pour chaque module permettant à chacun d'indiquer au module principal qu'il a une info à lui envoyer (voir shéma ci-dessous).
Chaque module enregistrerait dans un buffer circulaire les données à envoyer. Quand un signal prêt à être transmis, il enverrait un 1 (ou un 0) sur une pin d'interruption du maître (qui suivant la pin utilisée saura qui lui parle). Le maître pourrait alors engager une communication SPI avec ce même module en passant le SS correspondant à Low et en envoyant une première commande demandant à l'esclave de transmettre son signal. Un octet de fin de message signalerait au maître que la transmission est terminée. Le SS pourrait alors repasser à High. Le signal reçu serait lui aussi enregistré dans un buffer circulaire pour pouvoir traiter les signaux de tous les esclaves "en même temps" par la suite.
Est-ce que je suis sur la bonne voie ou est-ce qu'il y a une pratique qui permettrait de faire la même chose plus simplement ?
En l'occurrence, j'utilise 3 pins pour le SPI + 2 pins par esclave, ce qui me semble beaucoup. Mais je ne vois pas comment faire autrement.
Si vous avez des avis et conseils, si je suis complètement à côté de la plaque, je suis tout ouïe. Je suis toujours dans la découverte des µC, et il est possible (voire probable) que je n'aie pas du tout compris le principe des communications entre différents modules...
Merci et bonne journée.
-----