SPI ou I2C: à utiliser pour un bus long


36

J'envisage un projet qui nécessiterait que plusieurs AVR se parlent dans un bus. Ils seraient séparés par pas moins de 6 pieds.

Il semble qu'I2C et SPI puissent laisser une série de micros communiquer sur un bus, mais je n'ai rien vu qui dise combien de temps cela prendrait. Quelqu'un at-il essayé de connecter ces protocoles sur des distances de plusieurs pieds?


J'ai déjà utilisé un bus I2C avec un câble. Avec le recul, j'aurais dû utiliser CAN ou RS-485 à la place (avec des microcontrôleurs aux deux extrémités).
Nick Alexeev

Réponses:


19

Comme d'autres l'ont dit, SPI et I2C peuvent être utilisés sur de longues distances, à condition que les résistances de rappel, les fréquences d'horloge, etc.

Les principales alternatives (qui donneront une meilleure immunité au bruit) sont RS485 et CAN . Les deux utilisent des lignes différentielles afin de minimiser les problèmes de bruit et conviennent mieux à cette longueur de transmission de données que I2C ou SPI. Cependant, je ne pense pas que beaucoup (aucun?) AVRs soient livrés avec des périphériques CAN intégrés, ce qui facilite beaucoup l'utilisation de CAN.

Je dirais que la chose la plus importante à prendre en compte lors du choix d’un bus est de s’assurer que le protocole que vous utilisez pour la communication entre périphériques inclut un CRC ou l’équivalent, de sorte que vous puissiez déterminer si un message a été reçu correctement (le CAN en a fait partie Le Colis). Compte tenu de cela, il est également utile d’avoir une réponse de type ACK / NACK dans le protocole afin qu’un message corrompu puisse être retransmis.


Il semble que l'un ou l'autre fonctionnera. Je pense principalement à ces deux protocoles particuliers, car la plupart des AVR les prennent en charge de manière native, sans ajouter de composants supplémentaires. Sinon, RS485 ou CAN serait un bon choix.
Edebill

Si vous n'êtes pas limité aux paquets traversants, ST propose ses microcontrôleurs STM32 et STM8 avec CAN, à la fois économiques et puissants, tandis que NXP propose une gamme de microcontrôleurs LPC17xx, et quelques autres également. CAN est de plus en plus courant (et abordable) sur beaucoup de microcontrôleurs.
DrAl

1
Il existe en effet des récepteurs AVR avec récepteurs CAN intégrés, mais, à l'instar des autres fournisseurs, il ne s'agit que d'un sous-ensemble limité de leurs puces.
davr

1
Microchip a quelques PIC avec CAN. microchip.com/wwwproducts/Devices.aspx?dDocName=en010302 . Je dois admettre que leur programmation est un peu "funky", en particulier dans les bibliothèques C18 / C30 de Microchip. Lors de la révision du code, nous avons observé un code de bibliothèque très difficile à lire en raison de détails d’implémentation - un tampon de transmission utilisé comme tampon de réception, des noms d’indicateurs qui sont en réalité opposés à ce qu’ils représentent. Ce n’est certainement pas quelque chose que je recommanderais à un novice en développement de microcontrôleurs.
J. Polfer

2
CAN et RS-485 sont vraiment des pommes et des oranges. CAN définit le protocole de niveau binaire ainsi que la couche physique physique (PHY). RS-485 est juste une spécification de couche physique, elle ne spécifie rien sur le protocole. Il serait tout à fait à vous de trouver ou d’implémenter un protocole réel sur le PHY RS-485. CAN a été conçu pour les environnements très bruyants, principalement dans les secteurs de l’automobile et de la fabrication. Son protocole est un système de transmission de messages assez complexe et a une surcharge très élevée (faible débit de données réel) mais une intégrité de données élevée.
Marc

10

Plusieurs pieds ne devraient pas être problématiques, utilisez simplement des fils torsadés si vous le pouvez. SPI est beaucoup plus facile à tamponner (si vous en avez besoin) que I2C car les signaux SPI sont tous unidirectionnels, alors que les signaux I2C sont sur des lignes partagées.

les microcontrôleurs AVR peuvent-ils gérer les modes esclaves I2C et SPI ainsi que les modes maîtres? (vous auriez besoin des deux)


2
fils torsadés ?? Ne tordez JAMAIS les lignes de données et d'horloge I2C! Avec SPI, le problème est probablement moins grave, mais je ne voudrais jamais tordre les lignes de signal à moins que ce soit une paire équilibrée, auquel cas la torsion est une très bonne idée.
Wouter van Ooijen

ne jamais dire jamais; Je prendrais un couplage capacitif mineur (à cause de la torsion) entre données + horloge de tous les jours au lieu d'un couplage inductif mineur à une électronique de puissance bruyante (à cause de la non torsion)
Jason S

4
Désolé, je ne suis absolument pas d'accord. Dans l'état 1, les lignes ont une impédance plutôt élevée. Vu cela fait, vu cela échouer. La meilleure option consiste à disposer des lignes de masse à faible courant entre les deux côtés des lignes I2C, voire mieux.
Wouter van Ooijen

10

Pour I2C sur de longues distances, vous pouvez rechercher des solutions de "répéteur de bus I2C". Gardez à l'esprit que toute distance maximale que vous pourriez trouver pour une communication I2C ou SPI fait principalement référence à la distance totale du bus et non à la distance séparant deux nœuds d'un bus.

Vous voudrez peut-être examiner la RS485 pour résoudre ce type de problèmes. C'est un protocole de bus série qui communique sur des lignes différentielles. Ainsi, lorsque vous utilisez des câbles torsadés, les risques de parasites sont minimisés. De très longues distances peuvent être atteintes de cette façon. L'inconvénient serait que vous auriez besoin d'un IC de codeur RS485 supplémentaire (comme un MAX485, pas très cher) dans votre circuit.


RS485 est certainement un bon moyen d’agir pour une telle chose.
Scott Murphy

Gardez à l'esprit que RS485 a deux aspects quelque peu différents: les niveaux logiques physiques différentiels et les aspects multimaître. Vous pouvez choisir + choisir ceux-ci, nous avons utilisé à la fois les traducteurs LVDS et RS485 avec UART (RS232) pour un transfert point à point sans entrer dans les parties multipoints de RS485.
Jason S

2
BTW RS485 n'est pas un protocole! il définit uniquement la couche physique. Cela dit, vous pouvez certainement utiliser SPI sur RS485 !!! Ce serait une bonne solution de garder les communications en mode SPI si nécessaire (je suppose que c'est, peut être connecté à un CAN distant ou similaire). En utilisant SPI sur RS485, vous devrez vérifier que les vitesses de balayage de l'émetteur-récepteur sont compatibles avec les datarates SPI proposés
smashtastic

8

Un avantage non mentionné encore de SPI par rapport à I2C est que tous les fils de SPI sont unidirectionnels et sont toujours alimentés haut ou bas. Cela permet une communication beaucoup plus rapide qu'avec I2C, réduit les risques de bruit et permet d'utiliser de simples portes comme répéteurs. Une autre option utile est la communication async simple (un fil dans chaque sens). Le seul inconvénient de la communication asynchrone, c’est qu’elle exige généralement que les deux parties soient «éveillées», avec une horloge stable, pour échanger des données.

Pour un projet personnel, j'ai utilisé un protocole SPI légèrement modifié à 3 fils et j'ai trouvé les résultats satisfaisants. J'envoie des données d'affichage bitmap (où la corruption occasionnelle de données ne serait pas grave) à 10 Mbps et d'autres données à 2,5 Mbps sans difficulté.


C'est une très vieille réponse, mais diriez-vous sur quelle distance vous envoyiez votre protocole SPI modifié? (C'est le sens de la question ...)
Daniel Griscom

@DanielGriscom: environ 3 pieds en général, sur un câblage pas vraiment impressionnant, mais parfois plus long.
Supercat

6

Bien que les systèmes I2C et SPI soient conçus pour des transports à courte distance (quelques centimètres), ils peuvent tous deux être utilisés pour des transports plus longs avec un câble approprié et une attention particulière à la capacité globale du bus.

Bien que j'ai peu d'expérience avec SPI, I2C n'est pas terriblement difficile, car vous devez toujours calculer la taille appropriée pour votre résistance de rappel. De plus, il existe des tampons I2C dédiés et peu coûteux, qui sont assez faciles à utiliser. Toutefois, vous devrez toujours utiliser une résistance de rappel de taille appropriée pour votre réseau.

J'ai utilisé I2C pour mettre en réseau deux AVR à une distance de 8 pieds, en utilisant uniquement des résistances de rappel et un câble torsadé de haute qualité et bien blindé.


vous devez faire attention à I2C avec des câbles multiconducteurs, la capacité peut provoquer un ralentissement important du bus.
Jason S

6

Comme beaucoup l'ont suggéré, I2C et SPI sont mieux utilisés pour les courtes distances. Bien qu'il soit possible d'implémenter une solution avec ces interfaces, je vous recommande fortement de rechercher une solution différente, "plus standard" (par exemple, Ethernet, RS485, CAN, etc.). - Surtout si vous prévoyez d’utiliser des câbles pour atteindre la distance de 6 pieds entre les microcontrôleurs.


6

Juste un FYI, l’interface entre la télécommande sans fil Nintendo Wii et son compagnon Nunchuck utilise I2C sur un câble d’environ 3 pieds de long. Il existe également des câbles de rallonge de 3 pieds qui prolongent la longueur totale à environ 6 pieds. Ce n'est pas exactement la même chose que votre configuration (seulement deux périphériques connectés ensemble), mais c'est un exemple d'I2C sur un câble dans un produit grand public très utilisé.


4

J'ai travaillé sur un projet impliquant environ 80 nœuds basés sur AVR dans un réseau en étoile communiquant via I2C. C'était un désordre total et n'a pas fonctionné à la fin. Obtenir des mises à jour sur tous les nœuds prenait quelques secondes et une seule connexion défaillante aurait pour effet de gâcher tout le réseau. Enfin, j’ai parlé au gars qui a créé les nœuds, il a dit qu’il avait cessé d’utiliser I2C pour des projets comme celui-ci. Malheureusement, je ne sais pas pourquoi spécifiquement I2C était inadéquat ici.


1
I2C est beaucoup plus lent que SPI ... cela pourrait également être dû à la façon dont votre projet a géré l'arbitrage en cas de collision ... ou la capacité a peut-être été suffisamment élevée avec tous ces nœuds pour lesquels vous deviez simplement utiliser une fréquence d'horloge lente.
Jason S

2

Cela devrait être facile avec ces courtes distances. Ce que vous pouvez faire, c'est comprendre ce que signifient ces distances et votre câblage en termes de capacité et d'impédance de ligne, et voir quel type de fréquences (temps de montée / descente) vous pouvez traverser. Au-delà d'un certain point, il est préférable de les traiter comme des lignes de transmission. Si le résultat est mauvais, vous pouvez en effet basculer sur une autre ligne série telle que EIA-232 ou 422. Cela pourrait signifier une puce supplémentaire aux deux extrémités mais s’étirerait loin. Si vous devez vraiment aller vite et loin, vous aurez besoin de quelque chose de plus (Ethernet, ne comptez pas la radio ou le laser :).


2

Si vous pouvez contrôler la vitesse d'horloge et que vous n'avez pas besoin de transfert de données à haute vitesse, essayez de ralentir l'horloge. Cela le rendra moins susceptible au bruit.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.