Quel est le bus série intégré le plus populaire? [fermé]

8

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).

pfyon
la source
3
Cela dépend des périphériques avec lesquels vous souhaitez interagir, à quelles tensions, à quelles vitesses et à quelle distance.
Toby Jaffey
1
J'ai ajouté plus de détails à la question
pfyon
1
Je ne peux pas croire que l'UART n'ait pas été mentionnée du tout ... Je dis juste.
vicatcu
Corrigez-moi si je me trompe, mais je ne pensais pas que l'UART était un bus. Je pensais que c'était juste une communication série entre deux appareils.
pfyon
Un bus n'est donc pas pour la communication série entre deux appareils? L'escomptez-vous parce qu'il est parfois simplement utilisé point à point? PCIe, SATA, HT sont tous généralement point à point. Quoi qu'il en soit, la plupart des périphériques UART peuvent être utilisés pour RS-422, RS-485 ou LIN qui sont multi-drop.
Nick T

Réponses:

12

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.

pingswept
la source
1
Je pense que si vous avez un contrôleur très simple et que vous devez utiliser le bit-banging (en fait, manuellement, faire fonctionner l'horloge), il est beaucoup plus facile d'implémenter SPI sur 4 ports GPIO restants.
Wouter Simons
1
Je pense que vous avez raison sur le fait qu'il est plus facile de bitbang SPI que I2C. J'espère cependant que cela ne se résumera pas à un coup.
pfyon
3
+1 pour le caractère louche du système à 2 fils commercialisé comme "1 fil".
semaj
Et pour aggraver les choses, de nombreuses puces qui implémentent le système à 1 fil (+ masse) nécessitent une troisième broche - Vcc - car elles ne peuvent pas fonctionner hors tension parasite! Quand je pense à un bus à 1 fil, j'imagine une configuration couplée capacitivement, avec un pont redresseur à courant limité et un code de ligne à auto-synchronisation; pas 2 ou 3 fils.
Kevin Vermeer
"1-wire" aurait dû être appelé "1-data-wire", car c'est plus ce que c'est. Les fils supplémentaires sont GND et (parfois) une ligne électrique stable.
Johan
3

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.

Rex Logan
la source
2

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!

Wouter Simons
la source
2

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.

Kevin Vermeer
la source
1

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.

mjh2007
la source