Considérations relatives à la terminaison du bus SPI


22

Donc, dans ma question précédente, j'ai demandé à propos de l'utilisation du bus SPI sur une courte distance pour la communication carte à carte. On m'a recommandé d'essayer des résistances de terminaison. J'ai placé une résistance près de la destination (mais pas exactement là, il y avait une distance de 1 cm) et je l'ai mise à la terre [comme c'était une carte sans empreintes de résistance de terminaison, j'ai dû improviser. Je n'ai pas pu souder la résistance sur l'appareil car c'est un TQFP et a des broches délicates.]

À partir de quelques tests de base, j'ai trouvé qu'une résistance 1K réduisait à peine le dépassement. 470 Ohms et 180 Ohms ont mieux fonctionné. Plus je descendais, mieux cela fonctionnait. Avec 180 Ohms, le dépassement était d'environ un volt ou un peu plus bas. Maintenant, malheureusement, je ne peux pas descendre beaucoup plus que cela parce que le courant est plus que ce que mon MCU peut gérer. J'ai résolu le problème, sur la révision actuelle de la carte, en utilisant une résistance de 330 Ohms en série. Cela a amené le dépassement à 3,7 V et le temps de montée était de 10 ou 11 ns. Mais j'aimerais vraiment une solution «correcte» lors de la prochaine révision. Mes besoins en fréquence restent les mêmes: 2 MHz mais préfèrent 4 MHz.

J'ai donc pensé que je devrais demander ici: lors de la prochaine révision de la carte, devrais-je placer des buffers costauds sur les lignes? Trouver un tampon n'est pas vraiment un problème mais le tirage actuel augmentera considérablement - j'ai 8 appareils sur le SPI qui ont besoin d'une terminaison et 3 lignes qui sont toujours actives vont à chacun. Un exemple, SCK va aux 8 appareils. Chaque appareil aura, disons, une résistance de terminaison de 100 Ohms. Il s'agit donc d'une consommation de courant de 12 * 3,3 / 100 = 390 mA!

Alors, quel est le meilleur recours ici? Dois-je opter pour une «terminaison active» en utilisant des diodes Schottky comme pinces?

EDIT: Concernant l'impédance de ligne: Comme je l'ai mentionné précédemment, l'intention est de connecter 4 cartes externes. La distance pad à pad est la même pour tous (12 pouces). Cependant, il existe également des appareils sur la même carte que le MCU - mais ceux-ci n'ont pas besoin de terminaisons - les longueurs sont d'environ un pouce (ou moins) et il y a très peu de dépassement (300 ou mV). Les traces qui vont aux planches externes sont grossières de même longueur et largeur. La 2e couche de ma planche est un plan de sol ininterrompu.


Une méthode courante consiste à placer une résistance série qui correspond à l'impédance de ligne. Essayez quelque chose comme une terminaison série de 50 ohms. Il serait utile que vous conceviez vos traces et connexions comme une impédance quelque peu fixe. Essayez des terminaisons série inférieures et voyez ce que vous trouvez. Il a suggéré une terminaison à la terre de 32 ohms, vous pouvez réellement faire cette puissance beaucoup plus faible, bien moins 3 dB de puissance, en mettant un 64 ohms sur le rail d'alimentation et un 64 ohms sur le rail de terre.
Kortuk

@Kortuk Une résistance de 32 ohms n'a malheureusement pas réduit le dépassement de manière significative. Cependant, l'empreinte était également au mauvais endroit (elle n'a jamais été conçue pour être un terminateur) et pas à la source, donc c'est peut-être je ne suis pas sûr. En ce qui concerne l'impédance de ligne, toutes les lignes ont, à peu près, la même longueur et largeur. Ils parcourent tous sur un sol complet un avion, qui est sur la 2ème couche.
Saad

1
La terminaison série est à la source, si vous la placez à la charge elle ne fait rien. Essayez de placer un 50ohm directement à votre source en série pour voir l'effet.
Kortuk

Vous pouvez le considérer comme stevenvh décrit, il y a toute la ligne agissant comme un condensateur et cette résistance agit comme le R avec elle pour un passe-bas, si vous le considérez comme un modèle unique. Une résistance adaptée là-bas si vous regardez le modèle de ligne de transmission signifie que vous avez la moitié de la course des ondes d'amplitude, puis lorsqu'elle atteint l'autre extrémité et la reflète, elle atteint sa pleine valeur.
Kortuk

Réponses:


32

Parler de terminaison de signal, c'est comme ouvrir une boîte de vers. C'est un sujet ÉNORME qui est difficile à résumer en quelques centaines de mots. Par conséquent, je ne le ferai pas. Je vais laisser une énorme quantité de choses hors de cette réponse. Mais je vais également vous donner un gros avertissement: il y a beaucoup de désinformation sur la terminaison des résistances sur le net. En fait, je dirais que la plupart de ce qui se trouve sur le net est faux ou trompeur. Un jour, j'écrirai quelque chose de grand et le posterai sur mon blog, mais pas aujourd'hui.

La première chose à noter est que la valeur de résistance à utiliser pour votre terminaison doit être liée à votre impédance de trace. La plupart du temps, la valeur de la résistance est la même que votre impédance de trace. Si vous ne savez pas quelle est l'impédance de trace, vous devez le comprendre. Il existe de nombreux calculateurs d'impédance en ligne . Une recherche Google fera apparaître des dizaines d'autres.

La plupart des traces de PCB ont une impédance de 40 à 120 ohms, c'est pourquoi vous avez constaté qu'une résistance de terminaison 1k ne faisait presque rien et qu'une résistance de 100 ohms était bien meilleure.

Il existe de nombreux types de terminaison, mais nous pouvons les classer en deux catégories: la terminaison source et la terminaison. La terminaison source est au niveau du pilote, la terminaison d'extrémité est à l'extrémité distante. Dans chaque catégorie, il existe de nombreux types de résiliation. Chaque type est le meilleur pour différentes utilisations, avec aucun type bon pour tout.

Votre terminaison, une seule résistance à la terre à l'extrémité éloignée, n'est en fait pas très bonne. En fait, c'est faux. Les gens le font, mais ce n'est pas idéal. Idéalement, cette résistance irait à un rail d'alimentation différent à la moitié de votre rail d'alimentation. Donc, si la tension d'E / S est de 3,3 V, cette résistance n'ira pas à GND, mais un autre rail d'alimentation à la moitié de 3,3 V (aka 1,65 V). Le régulateur de tension pour ce rail doit être spécial car il doit fournir et absorber du courant, où la plupart des régulateurs ne produisent que du courant. Les régulateurs qui fonctionnent pour cette utilisation mentionneront quelque chose sur la résiliation dans la première page de la fiche technique.

Le gros problème avec la plupart des terminaisons est qu'elles consomment beaucoup de courant. Il y a une raison à cela, mais je n'entrerai pas dans les détails. Pour une utilisation à faible courant, nous devons examiner la terminaison de la source. La forme de terminaison de source la plus simple et la plus courante est une simple résistance série à la sortie du pilote. La valeur de cette résistance est la même que l'impédance de trace.

La terminaison de source fonctionne différemment de la terminaison de fin, mais l'effet net est le même. Il fonctionne en contrôlant les réflexions du signal, sans empêcher les réflexions en premier lieu. Pour cette raison, cela ne fonctionne que si une sortie de pilote alimente une seule charge. S'il y a plusieurs charges, il faut faire autre chose (comme utiliser une terminaison d'extrémité ou plusieurs résistances de terminaison de source). L'énorme avantage de la terminaison source est qu'elle ne charge pas votre pilote comme la terminaison de fin.

J'ai dit auparavant que votre résistance série pour la terminaison de la source doit être située sur le pilote, et elle doit avoir la même valeur que votre impédance de trace. C'était une simplification excessive. Il y a un détail important à savoir à ce sujet. La plupart des pilotes ont une certaine résistance sur sa sortie. Cette résistance est généralement comprise entre 10 et 30 ohms. La somme de la résistance de sortie et de votre résistance doit être égale à votre impédance de trace. Disons que votre trace est de 50 ohms et que votre pilote a 20 ohms. Dans ce cas, votre résistance serait de 30 ohms puisque 30 + 20 = 50. Si les fiches techniques ne disent pas quelle est l'impédance / résistance de sortie du pilote, alors vous pouvez supposer qu'elle est de 20 ohms - alors regardez les signaux sur le PCB et voyez si elle doit être ajustée.

Une autre chose importante: lorsque vous regardez ces signaux sur un o-scope, vous DEVEZ sonder le récepteur. Sonder ailleurs vous donnera probablement une forme d'onde déformée et vous incitera à penser que les choses sont pires qu'elles ne le sont vraiment. Assurez-vous également que votre clip de mise à la terre est aussi court que possible.

Conclusion: passez à la terminaison de la source avec une résistance de 33 à 50 ohms et ça devrait aller. Les mises en garde habituelles s'appliquent.


David, merci beaucoup pour une réponse exhaustive. Tout cela était parfaitement logique, mais je pense qu'il y a une complication de plus dans mon système - les lignes SPI vont d'une carte à l'autre. Ainsi, l'estimation de l'impédance de la ligne peut être difficile - le signal parcourt environ 3 "sur la carte principale, passe par un câble ruban de 6" puis se déplace à nouveau sur une trace de 3 "jusqu'à ce qu'il atteigne sa destination. Les fils du câble ruban sont alternatifs sol (comme SCK, GND, MOSI, GND etc.) Votre recommandation de 30-20 Ohms est-elle toujours valable?
Saad

@Saad Ce que j'ai fait dans des cas comme celui-ci (et je l'ai souvent fait), c'est d'utiliser une seule résistance au niveau du pilote et de modifier sa valeur une fois le prototype construit. C'est un compromis, mais ça marche. J'ai actuellement plusieurs systèmes qui exécutent SPI sur des câbles de 1 pied avec 3-6 pouces de traces sur chaque PCB. Certains d'entre eux fonctionnent à 30 MHz! Oui, commencez par 33 ou 47 ohms et modifiez à partir de là.

3
+1 déjà, mais un diagramme montrant comment connecter une terminaison de source (c'est-à-dire en série, pas de la ligne à la terre) serait très utile.
The Photon

16

Puisque vous parcourez de courtes distances, je ne pense pas que les résistances de terminaison soient une bonne idée. Comme vous l'avez constaté, ils doivent être assez faibles pour faire le travail, puis la ligne consomme beaucoup de courant et la tension est atténuée de 2 si vous conduisez également la ligne avec la même impédance.

Votre fréquence d'horloge n'est pas si élevée, donc les fréquences dont vous avez besoin pour prendre en charge même un débit binaire de 4 MHz ne sont pas celles qui causent le problème. Le problème est que vous avez des bords rapides entraînant les lignes, qui ont des harmoniques dans les 100 MHz, ce qui cause le problème. À vos fréquences souhaitées, vous avez un système unique, pas une ligne de transmission. Cela facilite considérablement les choses.

La solution est donc d'atténuer les hautes fréquences dont vous n'avez pas vraiment besoin mais qui causent des ennuis. Cela peut être fait avec un simple filtre passe-bas RC immédiatement après tout ce qui entraîne une ligne. C'est en partie ce que font maintenant les résistances de 330 Ω. Ils forment un filtre passe-bas avec la capacité parasite de la ligne. Apparemment, cela ne suffit pas et / ou n'est pas suffisamment prévisible. Cela peut être corrigé avec une certaine capacité délibérée sur chaque ligne.

Vous voulez faire fonctionner le bus à 4 MHz, ce qui signifie que le signal le plus rapide qu'il doit prendre en charge est une onde carrée de 4 MHz. Cela signifie que la longueur de chaque niveau est de 125 ns. Disons que nous voulons que ce soit au moins 4 constantes de temps, ce qui implique 98% de temps de stabilisation. Cela signifie que la constante de temps maximale que nous voulons autoriser est de 31 ns. 31ns / 330Ω = 94 pF. C'est la charge totale sur les résistances de la série 330 Ω dont vous avez besoin pour obtenir la constante de temps de 31 ns. Il y aura toujours une capacité parasite que vous ne pouvez pas prédire, donc je verrais à quoi les choses ressemblent avec 47 pF. Cela laisse de la place pour 10-20 pF de capacité cachée sans dépasser notre constante de temps maximale autorisée.

Les résistances série doivent être aussi proches que possible de toutes les broches qui entraînent le bus. Cela suppose que toutes les autres broches du bus seront des entrées CMOS lorsque l'une conduira. Pour les lignes qui ne sont jamais pilotées que par une seule broche (comme la ligne d'horloge, qui n'est pilotée que par le maître), placez le 47 pF aussi près que possible après la résistance. Pour les lignes qui peuvent être entraînées par différentes broches à différents moments (comme MISO), placez le 47 pF quelque part près du milieu de tous les pilotes. Chaque ligne ne reçoit qu'un seul condensateur de 47 pF quel que soit le nombre de pilotes, mais il y a une résistance pour chaque pilote.

Les calculs ci-dessus sont censés être un bon guide pour commencer. Certains paramètres ne peuvent pas être connus et sont donc pris en compte dès le départ. Commencez avec les 330 Ω en série et 47 pF à la masse, mais n'ayez pas peur de changer les choses en fonction des résultats réels observés.


2

En l'absence de toute terminaison, lorsqu'un signal est envoyé d'une source à très faible impédance vers un récepteur à très haute impédance, le signal rebondit d'avant en arrière à plusieurs reprises; la phase du signal sera inversée de 180 degrés à chaque aller-retour.

Si l'on ne souhaite pas que les signaux soient réfléchis lorsqu'ils atteignent la destination, on peut utiliser la terminaison de fin. Cela entraînera une absorption nette du signal à la destination sans être réfléchi, mais de nombreuses implémentations courantes feront que la source verra une charge continue importante.

Dans de nombreux cas, on peut obtenir des résultats tout aussi utiles en pratique si l'on insère à la place une résistance série à la source du signal. S'il n'y a pas de récepteur à l'extrémité de la ligne, le signal sera réfléchi lorsqu'il y arrivera, mais toute réflexion de ce type sera absorbée par la source plutôt que réfléchie. Notez également que la terminaison de la source n'impose pas de charge CC à l'appareil entraînant la ligne.

En l'absence de terminaison, si une ligne est entraînée par une faible impédance et reçue avec une impédance élevée, le dispositif de réception peut voir une tension supérieure à la tension d'attaque (en théorie, jusqu'à deux fois la tension, si l'impédance d'attaque de la source est zéro et l'impédance de réception est infinie). Si la source ou le récepteur est correctement terminé, la tension reçue sera presque égale à la tension d'attaque (si une source à impédance nulle alimentait un récepteur à impédance correcte, ou qu'une source à impédance correcte entraînait un récepteur à impédance infinie, la tension reçue sera égale à la tension du variateur). Si les deux sont correctement terminées, la tension de réception sera la moitié de la tension du variateur.

La simulation ici le démontre. Il comprend un générateur d'impulsions qui produit une chaîne d'impulsions environ 49 fois par seconde, deux lignes à retard de 5 ms en série (temps aller-retour 1/50 seconde) et des résistances de terminaison commutables aux deux extrémités.

Le circuit comprend trois commutateurs SPDT; cliquez sur l'un pour changer son état. Les deux commutateurs inférieurs contrôlent la terminaison source et destination. Pour ceux-ci, "up" représente une bonne terminaison et "down" représente une mauvaise. L'interrupteur supérieur contrôle si la ligne doit être entraînée par un générateur d'impulsions automatique ou par une entrée logique manuelle. Pour envoyer manuellement des impulsions sur la ligne, basculez l'interrupteur supérieur sur "bas", puis horlogez le "L" à côté.

Les signaux atteignant la destination sera propre si soit la source ou la destination est correctement terminé. Si les deux sont correctement terminées, la tension du signal reçu sera la moitié de la tension du variateur. Si l'une est correctement terminée mais que l'autre ne l'est pas, la tension reçue sera d'environ 91% de la tension d'attaque (les "mauvaises" résistances sont "fausses" par un facteur de dix et ne parviennent donc pas à absorber environ (10/11) de l'énergie). Si aucun des deux n'est terminé, la tension reçue sera initialement d'environ 1,656 fois la tension du variateur, mais des réflexions étranges apparaîtront toutes les 20 ms.


1

Essayez une terminaison CA (par exemple un condensateur de 470 pF en série avec une résistance de 110 Ohms) et connectez cette combinaison en série de la sortie de la destination de l'horloge SPI à la masse. La terminaison attirera environ 30 mA pendant la durée du temps de front, ce qu'elle peut facilement faire, mais aucun courant sinon. Pour la ligne de données bidirectionnelle, cela devient un peu plus délicat. J'ai mis une terminaison de 470 pF, 220 Ohm AC sur les extrémités maître et esclave de la ligne de données SPI et cela fonctionne, c'est-à-dire un dépassement et un sous-dépassement acceptables.

Je me réjouis des commentaires à ce sujet.


0

Ne pas aller trop loin dans les détails car les articles précédents ont touché le clou sur la tête. Cela revient à SPI étant des lignes déséquilibrées. Même si vous avez une fréquence d'horloge faible, les fronts d'horloge ns rapides doivent être respectés. Dans mon cas, j'ai trouvé une résistance de 470 ohms en série avec la ligne SPI CLK du côté maître. Suppression de cette résistance et mise en œuvre de la solution recommandée pour les lignes asymétriques de Lattice et suggestions postées ci-dessus (je ne pouvais implémenter que la moitié de la solution du côté esclave, ajusté les capuchons de filtre en conséquence) J'ai pu étendre la longueur de mon câble de communication ruban SPI à partir de 10 cm à 160 cm sans erreur de communication:

Améliorer l'immunité au bruit pour l'interface série : un livre blanc sur les semi-conducteurs en treillis (juillet 2014)

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.