Je suis en train de concevoir un appareil embarqué que je voudrais rendre interopérable avec des périphériques tiers via un bus série. Dois-je choisir SPI, I²C ou un autre bus?
Les périphériques auront une bande passante assez faible (certains capteurs qui communiquent sur le bus, interrogés périodiquement) et très probablement à moins d'un mètre ou moins du contrôleur. La seule tâche du contrôleur est de collecter les données du capteur, de les empaqueter d'une certaine manière, puis de les envoyer à un module sans fil via un autre bus (bien que le bus du capteur puisse également être réutilisé pour cela).
Réponses:
Si vous n'êtes pas sûr et que vos exigences sont assez vagues, je choisirais I²C.
La principale différence entre SPI et I²C est que SPI nécessite une ligne de sélection de puce pour chaque périphérique. I²C diffuse une adresse périphérique au début de la communication, elle n'a donc pas besoin de lignes de sélection de puce. Les lignes à puce deviennent encombrantes après les premières.
D'un autre côté, SPI est probablement plus facile à implémenter et à déboguer. Ce pourrait être le gagnant si vous souhaitez simplement vous connecter à quelques appareils.
J'exclurais l'USB, sauf si vous avez besoin de débits de données élevés sur des distances relativement longues (m plutôt que cm). J'exclurais également RS-232 à moins que ce ne soit encore en 1976 et que vos périphériques aient besoin d'un signal massif pour distinguer un peu du bruit.
Vous pourriez envisager Dallas 1-wire, mais je soupçonne que ce n'est pas aussi courant que I²C, et un bus "1-wire" qui a besoin de 2 fils pour fonctionner m'a toujours semblé un peu louche.
la source
Puisque vous avez dit que la bande passante serait faible, j'allouerais suffisamment d'E / S pour gérer à la fois SPI et I2C. J'aurais aussi si possible des lignes CS supplémentaires pour que vous puissiez exécuter plusieurs appareils SPI. N'oubliez pas non plus de regarder comment vous allez alimenter le périphérique. Si vous utilisez une batterie pour obtenir une durée de vie maximale, vous devez mettre l'appareil en mode basse consommation ou couper l'alimentation lorsqu'il n'est pas utilisé. Utilisez également vos contrôleurs module de contrôleur série si possible, beaucoup de contrôleurs multiplexeront SPI, I2C et série. Si vous le pouvez et séparez le sans fil du capteur, il est plus facile d'éteindre les appareils lorsqu'ils ne sont pas utilisés. De plus, certains capteurs ont une ligne qui indiquera au contrôleur quand ils doivent être réparés, de sorte que vous souhaitez également avoir une entrée / sortie supplémentaire dans une broche, idéalement celle à partir de laquelle vous pouvez générer une interruption.
la source
La question est un peu problématique en raison de problèmes de définition.
La communication sérialisée est fondamentalement ce dont vous avez besoin si vous souhaitez communiquer avec un périphérique externe sans utiliser une multitude de ports sur votre contrôleur. Fondamentalement, chaque méthode de communication série nécessite une horloge et une configuration sur la façon de gérer les connexions de données.
SPI est un bus à 4 fils. I2C est un bus à 2 fils.
Chacun a des caractéristiques différentes. Ce à quoi vous devez répondre, c'est à quelle vitesse votre communication doit-elle être, à quel point doit-elle être fiable, quelles options offre votre microcontrôleur, etc.
Cet article wikipedia et ce site de référence expliquent beaucoup plus clairement que moi, suivez également les références pour en savoir encore plus!
la source
Fondamentalement, vous devez choisir entre I2C et SPI.
Quel que soit le bus que vous utilisez, vous devez tenir compte du niveau de tension de vos capteurs et périphériques tiers. Vous pouvez le faire en créant votre propre convertisseur avec deux MOSFETS (ne va que dans un sens - ramasser / pas de changement ou descendre / pas de changement; seulement un problème si vous devez exécuter vos capteurs à 3,3 et interfacer avec des maîtres 1,8 et 5 V). Voir AN10441 de NXP [PDF]. Cela fonctionnera également pour SPI (il suffit de retirer les pullups). Vous devrez ajouter une ligne à votre connecteur pour établir une tension de référence (si vous ne le faites pas déjà.)
Un inconvénient de I2C est que vous êtes limité à l'horloge la plus lente du bus. Si un capteur n'est capable que de 100 kHz et que vous souhaitez parler à votre mémoire à 400 kHz ou 1 MHz (les deux vitesses valides), le comportement de votre capteur plus lent n'est pas spécifié. Si vous utilisez SPI, la ligne de sélection de puce signifie que le capteur plus lent n'écoutera même pas ce qui se trouve sur le bus, et vous pouvez exécuter différentes vitesses pour différents capteurs.
la source
J'utiliserais I2C. Assurez-vous simplement que vous pouvez obtenir un module sans fil qui peut communiquer via I2C si vous souhaitez l'avoir sur le même bus que vos capteurs. La plupart des périphériques de communication que j'ai vus utilisent SPI et non I2C.
la source