Y a-t-il une différence entre l'utilisation d'un module SPI intégré et le bit banging?

25

Y a-t-il une différence entre les deux, ou s'agit-il simplement d'une question d'abstraction? Mon intuition dit qu'il n'y a pas de différence mais j'aimerais me tromper.

Skaevola
la source
1
Cela dépend à quel point vous êtes bon à frapper. Voir code.google.com/p/fastspi et waitforbigo.com :-)
Robert Atkins

Réponses:

33

Un périphérique de contrôleur SPI réel dans le MCU peut souvent fonctionner beaucoup plus rapidement que le fait de frapper l'interface. Bien sûr, cela dépend du MCU, mais cela ne m'étonnerait pas de voir un contrôleur SPI fonctionner à 30+ MHz, tandis que le banging pourrait être limité à environ 1 MHz (si vous avez de la chance).

Mais il y a plus que cela. Lors du bang-bang, le MCU est occupé à le bang-bang. Il déplace les données et fait tourner les lignes GPIO. Cela signifie qu'il ne peut rien faire d'autre. Lorsque vous utilisez un contrôleur SPI, le contrôleur est occupé à faire tout cela et le MCU est libre de faire d'autres choses.

Ainsi, avec un contrôleur SPI réel, le transfert SPI réel est beaucoup plus rapide et le MCU récupère certains cycles qu'il peut utiliser pour faire d'autres choses.

Dietrich Epp
la source
11

Il n'y a aucune différence en termes que vous pouvez obtenir le même résultat en utilisant les deux méthodes, mais il y a quelques raisons pour lesquelles vous choisiriez l'une plutôt que l'autre.

L'utilisation d'un périphérique SPI permettra au processeur de ne pas avoir à se soucier de générer le timing pour frapper les broches d'E / S, lui permettant d'effectuer d'autres tâches de calcul et de simplifier votre programmation du CPU. Étant donné que le périphérique est implémenté dans le matériel, il fonctionnera plus rapidement et consommera moins d'énergie que les E / S de frappe de bits. Il peut y avoir des cas où vous voudriez mordre les E / S pour interfacer avec SPI si votre application exige que vous choisissiez un processeur sans périphérique SPI. Pour des raisons de santé mentale, je recommanderais d'éviter cela, sauf si cela est absolument nécessaire.

Amoch
la source
La raison de raison est des ordures. Souvent, la configuration du matériel SPI selon la configuration dont vous avez besoin prend plus de temps à lire la fiche technique périphérique SPI qu'à écrire le code maître SPI, et donc à lire uniquement la fiche technique du périphérique esclave.
Olin Lathrop
J'admets que j'étais un peu sensationnaliste avec ma remarque sur la raison, mais l'intention (certes non écrite) était qu'à mesure que la complexité de l'application augmente, le fardeau de s'assurer que le système dans son ensemble continue de fonctionner dans les délais prévus augmente. Je l'ai implémenté dans les deux sens et je sais que je préférerais utiliser le périphérique, même si cela me prend quelques minutes supplémentaires pour lire la fiche technique.
Amoch
6

SPI est une interface synchrone , le maître contrôlant l'horloge. Cela signifie que si vous êtes le maître, vous pouvez choisir la vitesse d'horloge et le timing. Les périphériques esclaves auront une limite supérieure sur la fréquence d'horloge qu'ils peuvent gérer, mais ne se soucient généralement pas de la lenteur de l'horloge en dessous. Plus spécifiquement, il y a généralement un temps minimum pour que chaque esclave ait besoin de voir l'horloge à l'état haut et bas avant de pouvoir à nouveau basculer, et il y aura une configuration minimale de données et des limites sur la ligne de données entourant le bord de l'horloge sur lequel le l'esclave lit la ligne de données.

Pour cette raison, l'implémentation d'un maître SPI dans le firmware est vraiment assez facile. Je l'ai souvent fait pour faciliter l'utilisation de certaines broches, lorsqu'il n'y avait pas de matériel SPI intégré, ou qu'il n'était pas disponible à cette fin pour une raison quelconque. Faire un maître SPI dans le firmware est aussi simple que possible.

De nombreux périphériques esclaves SPI sont assez rapides, donc souvent l'horloge minimale et les temps de configuration sont respectés simplement en s'assurant que chacun a au moins un cycle d'instruction. Dans ce cas, le code est très court et rapide. Dans certains cas, un appareil esclave peut nécessiter deux ou trois cycles d'instructions par phase d'horloge, mais ce n'est vraiment pas difficile à garantir non plus. La boucle de bits SPI de bas niveau nécessite d'effectuer un certain décalage du bit de sortie suivant en position, de saisir le bit d'entrée et de vérifier le compteur de boucle. Vous pouvez généralement répondre à des exigences de temps minimum de deux ou trois cycles simplement en organisant lorsque vous conduisez et en échantillonnant les lignes avec certains des autres frais généraux insérés aux bons endroits. Si la vitesse est importante, vous pouvez utiliser le préprocesseur assembleur pour écrire une boucle déroulée. Avec des techniques comme celle-ci,

Il y a quelques avantages à faire le maître SPI dans le firmware. Le matériel SPI est parfois un peu ridicule dans la façon dont il peut être configuré. Il y a toujours la question de ce qui doit exactement se produire immédiatement lorsque la sélection d'esclaves est affirmée. Le premier bit est-il alors écrit sur les lignes de données? Que se passe-t-il si l'horloge commence bas et que les lignes de données sont censées être verrouillées sur le front descendant? Parfois, cela compte, parfois non. Avec un firmware SPI maître, vous pouvez être plus indulgent et éventuellement utiliser la même routine pour communiquer avec différents esclaves. Par exemple, vous pouvez vous assurer que la ligne de données MOSI (Master Out Slave In) est stable sur les deux bords de l'horloge. Le matériel SPI ne fait généralement pas cela, donc ce matériel devrait être reconfiguré en fonction de l'esclave avec lequel il communique à l'époque.

Un autre avantage d'un firmware SPI maître est que vous pouvez choisir un nombre arbitraire de bits par séquence SPI. Le matériel est généralement limité à des multiples de 8 bits. La plupart des appareils sont conçus pour permettre des transferts d'octets entiers, mais souvent ils n'en ont pas besoin. Par exemple, un A / D 10 bits enverra probablement les 10 bits de données en premier, puis enverra 0 ou des ordures après cela si vous continuez à le synchroniser. Si vous utilisez du matériel SPI, vous serez obligé de transférer 16 bits et de masquer les déchets. Tout fonctionnera bien, mais un micrologiciel SPI maître pourrait en fait être plus rapide que le matériel dans ce cas, car il ne transfère que le minimum de 10 bits requis.

Les principaux avantages des maîtres matériels SPI sont que le micrologiciel peut lancer un transfert d'octets, puis s'éteindre et faire autre chose. Le cadencement peut également être généralement plus rapide que ne peut le faire une boucle de micrologiciel non déroulée. Notez que bien que ces deux avantages puissent être importants dans certaines circonstances, ils sont souvent non pertinents. La plupart du code SPI qui utilise du matériel pour transférer un octet entre immédiatement dans une boucle d'attente pour que le matériel termine le transfert. Vérifiez également attentivement les exigences de synchronisation de l'esclave. Les périphériques SPI sont généralement rapides dans leur ensemble, mais il y a des cas où vous devez quand même ralentir le matériel pour correspondre à la vitesse maximale que l'esclave peut gérer.

C'était tout du point de vue du maître. En bref, il y a souvent peu d'avantages à utiliser du matériel SPI comme maître, et même quelques avantages à ne pas l'utiliser parfois. Cependant, tout cela est différent pour les esclaves. Puisque le maître contrôle l'horloge, les esclaves doivent être prêts pour tout ce que le maître fait chaque fois que le maître le fait. Les exigences de synchronisation sont souvent assez courtes par rapport aux temps d'instruction, donc avoir du matériel implémentant un esclave SPI est généralement ce que vous voulez.

Vous pouvez faire des esclaves SPI dans le micrologiciel, mais c'est délicat, vous devez compter soigneusement les cycles et la latence, et vous finissez généralement par implémenter un sous-ensemble du protocole que vous savez utiliser par votre maître particulier. Par exemple, une fois, j'ai dû concevoir un équivalent numérique d'une ancienne carte contrôleur analogique (ils voulaient des fonctionnalités supplémentaires qui ne pouvaient pas être raisonnablement faites en analogique, et ils voulaient quelque chose de plus petit, moins cher à produire et plus stable). Cette carte est interfacée au reste du système via un bus SPI. L'ancienne carte analogique avait un D / A à deux canaux pour régler les valeurs de contrôle et un A / D à deux canaux pour relire les valeurs mesurées. La mise en œuvre de ces deux dans un seul processeur était délicate, et cela comprenait la détermination du sous-ensemble du protocole matériel D / A et A / D SPI que le maître existant utilisait réellement. Il a également imaginé un processeur qui pourrait fonctionner beaucoup plus rapidement que la fréquence d'horloge SPI. Au final, j'ai utilisé trois interruptions, une pour chaque sélection d'esclave et une pour le front montant de la ligne d'horloge. Cette dernière devait être l'interruption de priorité la plus élevée du système, sinon l'exigence de latence ne pouvait pas être satisfaite.

Quoi qu'il en soit, le point global est qu'un maître SPI du micrologiciel est facile, petit, rapide et flexible, et il n'y a pas de raison de se détourner d'en faire un. D'un autre côté, pour un esclave, vous voulez vraiment du matériel, ou vous devez vous réveiller et réfléchir très attentivement au timing, à la latence, etc.

Olin Lathrop
la source
Avez-vous trouvé des implémentations d'esclaves de microcontrôleurs qui peuvent se comporter comme des périphériques SPI matériels typiques (par exemple, permettre au maître de donner un avantage sur CS et lire l'état à tout moment, et utiliser CS pour marquer les limites des commandes? La plupart des implémentations que j'ai vues ne le font pas même signaler s'il y avait un bord CS entre l'octet actuel et le précédent.
supercat
@supe: Oui, c'est un problème. Le matériel SPI esclave ignore généralement les données d'horloge et d'entrée et maintient la ligne de données de sortie à haute impédance lorsque la sélection de puce n'est pas confirmée, mais il ne vous indique généralement pas où se trouvent les limites de sélection de puce. Au moins avec le matériel PIC SPI dont je me souviens avoir utilisé, vous devez configurer votre propre sélection d'interruption sur puce pour cela.
Olin Lathrop
Je me demandais si vous connaissiez des implémentations décentes. Je suppose que non. Le problème avec l'utilisation d'une interruption matérielle sur le fil de sélection est que si une transition se produit sur le fil de sélection très peu de temps après l'envoi d'un octet, l'esclave peut avoir du mal à déterminer si cela s'est produit avant ou après l'octet en question. Je trouve curieux que presque toutes les puces aient une implémentation esclave SPI, mais il semble qu'aucune d'entre elles ne puisse réellement être utilisée comme un périphérique esclave matériel SPI typique. La situation ressemble un peu au port esclave du processeur sur le PIC par rapport au 8048.
supercat
Le port esclave du processeur 8048 a une broche d'adresse; lorsque des données sont écrites en externe sur le 8048, le 8048 verrouille l'état de cette broche et le rend disponible pour son code (généralement le premier octet d'une commande sera écrit sur une adresse et les paramètres ou données sur l'autre). Une lecture d'une adresse donnera ce que le code 8048 y mettra, mais certains bits qui sont lus à partir de l'autre adresse sont générés par le matériel 8048 pour indiquer s'il est prêt à lire ou à écrire des données.
supercat
+1 pour avoir souligné la différence entre frapper un maître (facile) et un esclave (beaucoup plus difficile).
tcrosley
1

Cela dépend de ce pour quoi vous faites le SPI. Si votre intérêt en tire les taux de données les plus élevés, le matériel est toujours plus rapide que le bitbanging (par exemple, la puce du cortex du bras dans l'adolescence 3, je peux diffuser des données à 22 Mbps en utilisant le support SPI matériel, contre ~ 4,5 Mbps avec le bitbanging (il peut également gérer des nombres arbitraires de bits par transfert de 3 à 16 - utile lors de l'envoi de données en morceaux de 12 bits pour certains contrôleurs led!)). Sur 16Mhz avrs, la différence est un peu moins extrême, le débit de données le plus élevé avec le matériel semble être élevé 4 / faible 5Mbps, tandis que le bitbanging est d'environ 2,3Mbps).

De plus, si vous utilisez la prise en charge matérielle, encore une fois, selon le microcontrôleur en question, vous disposez d'options pour utiliser les contrôleurs DMA pour déplacer vos données, laissant votre code revenir à d'autres choses, potentiellement plus intéressantes que de garder les données écrire.

Tout ce qui précède dépend du fait que le SPI matériel soit ou non une option.

rDg
la source
0

Si vous bit-bang SPI, vous ne pouvez pas utiliser l'interruption SSP pour gérer les communications. Ce n'est pas si important pour SPI pour de nombreuses utilisations

Scott Seidman
la source
1
Aucun processeur spécifique n'a été mentionné, donc "interruption SSP" est un terme vide de sens dans ce contexte.
Olin Lathrop