Le SPI est-il nettement plus rapide que le bit banging?


8

J'ai un projet basé sur une photo 18f4550. Pour écrire dans un registre à décalage '595, y a-t-il un avantage distinct à utiliser des spi sur des broches io régulières? J'ai entendu dire que le spi est plus rapide, mais je ne sais pas comment. Utilise-t-elle une horloge différente et plus rapide que le reste de la puce, ou est-elle simplement plus efficace? Je peux mordre un octet via des broches io régulières dans un assez petit nombre d'instructions. Le spi utilise-t-il moins de puissance de traitement? Je vais décaler assez souvent lors de calculs assez intenses, je veux donc autant de cycles que possible dédiés à mon processus et non pas décaler.

Ma principale raison de ne pas vouloir utiliser spi est que ma disposition actuelle rendrait un peu plus difficile l'accès aux broches requises parce que j'en utilise déjà quelques-unes pour d'autres choses et que je devrais mélanger les choses. Je voulais savoir quels avantages il y a avant de commencer à déchirer les choses et à les déplacer.


5
Vous pouvez faire du SPI en frappant des bits.
starblue

Réponses:


17

En supposant que vous comparez un "moteur" série spi périphérique ou synchrone dans le micro à la génération de la même séquence via le "bit banging", alors oui, cela a tendance à être un peu plus rapide, mais plus important encore, le processeur peut transmettre un octet entier à le périphérique pour envoyer et faire d'autres choses pendant qu'il est transmis. Dans le cas du bit banging, le processeur a tendance à être bloqué pendant la transmission (bien que le micro ayant tendance à être le maître et que la plupart des périphériques soient entièrement statiques, vous pouvez probablement tolérer une pause en milieu d'octet pour effectuer une interruption ou même interroger choses - ADC série à horloge d'interface et tâches d'intervalle d'échantillonnage étant des exemples notables d'exceptions).

Sur des MCU plus performants, il peut même être possible de programmer un contrôleur DMA pour exécuter un transfert multi-octets de la mémoire via le moteur SPI sans plus d'attention du processeur, surtout si seules les données dans une direction sont importantes.

Mais de nombreux projets de microcontrôleurs finissent par être hautement optimisés pour leur tâche; si vous pouvez épargner les cycles et tolérer la réduction de vitesse, compliquer votre logiciel afin de pouvoir utiliser les GPIO qui rendent la disposition physique plus propre n'est en aucun cas un choix rare.


Oui ça ^. Comme Chris le mentionne, le plus grand avantage de l'utilisation de périphériques matériels est que vous pouvez transférer un octet de données d'un flux vers le périphérique et être averti par interruption s'il a fini de le déplacer et prêt pour un autre octet. Cela libère votre utilisation du processeur pour d'autres choses pendant que l'octet est déplacé - ce qui peut être une durée de vie en cycles machine compte tenu du débit en bauds de ces protocoles série.
Jon L

3
Pas une vie pour SPI. Si vous parlez de vitesse, alors vous pourriez bien exécuter le SPI à 10 MHz, ce qui n'est que 10 instructions PIC à pleine vitesse. Ce n'est guère un âge. Juste assez de temps pour préparer votre prochain octet. C'est à peine assez de temps pour réparer une interruption.
Rocketmagnet

2
Il pourrait être juste de dire que beaucoup dépend du débit en bauds prévu / requis, qui n'a pas été indiqué. Cependant, comme je l'ai souligné, si le micro est le maître, il peut être libre d'envoyer tardivement l'octet suivant, à condition que l'application puisse tolérer l'irrégularité / réduction du débit.
Chris Stratton

1
@Rocketmagnet, je suis corrigé. SPI est beaucoup plus rapide que je ne le pensais - je suppose que je l'ai regroupé avec des protocoles série plus lents tels que UART (où 9600 bauds sont ~ 10 kHz).
Jon L

1
Notez également que le maître SPI est relativement facile à mordre. L'esclave SPI peut être un peu plus difficile car les transistions de sélection de puce et d'horloge doivent être spécifiquement chronométrées et gérées (comme une broche d'interruption externe). J'utilise souvent le style SPI master bit bang dans mes projets, surtout si je n'ai pas besoin de hautes performances mais que je veux une planche propre (également agréable pour la gravure à domicile). Notez également qu'il est courant de faire le contraire: déplacer les données dans des registres à décalage (HC595, etc.) à l'aide de SPI et d'un GPIO (goupille de verrouillage).
Hans

10

Avantages du bang-banging:

  • Contrôle absolu sur le protocole.
  • Si le temps d'exécution des instructions sur le microcontrôleur est plus rapide que le débit en bauds du SPI, il peut être plus rapide, mais cela est peu probable. Il faudrait une vitesse de transmission SPI à très très basse vitesse avec un microcontrôleur à vitesse relativement élevée.
  • Peut avoir une latence plus petite qu'une interruption SPI.
  • Choix d'épingles.

Inconvénients du bit banging:

  • Nécessite beaucoup plus de code pour gérer -Le rythme en bauds -L'échantillonnage fiable des bits reçus -Les limites des trames de processus * Chaque segment de code ci-dessus consomme du temps qui pourrait être consacré à l'exécution d'un autre code.

Avantages de SPI:

  • La configuration du registre gère la synchronisation de la vitesse de transmission, l'échantillonnage des bits reçus et le traitement des comptages de trames
  • La plupart des microcontrôleurs avec SPI ont un vecteur d'interruption dédié pour chaque périphérique SPI (Vérifiez votre micro!)
  • Une fois configuré, il suffit de vérifier si le tampon SPI TX / RX est vide / plein et d'écrire / lire un octet.
  • Si DMA est disponible, le SPI peut transmettre de grands tampons de données contiguës sans aucune interférence logicielle.

Inconvénients de SPI:

  • Un périphérique supplémentaire pour apprendre et configurer (est-ce vraiment un inconvénient?)
  • Nécessite des broches supplémentaires ou un multiplexage des broches
  • Coût supplémentaire (a tendance à être négligeable avec les microcontrôleurs actuels)
  • J'ai eu des problèmes de bruit avec SPI, mais ceux-ci étaient sur des cartes prototypes à des vitesses relativement élevées (10 MHz)
  • Choix de broches très restreint

Pour moi, les avantages du bit-banging sont mineurs par rapport aux avantages de SPI. Les inconvénients du bit-banging sont beaucoup plus importants que les SPI. Les trois principales raisons pour lesquelles je peux choisir le bit-banging sont les suivantes:

  1. Protocole personnalisé à faible vitesse
  2. Si la communication est à faible débit et que le reste de l'application a des exigences de calcul faibles
  3. Ou si la communication est à faible vitesse et le choix des broches est un problème majeur

8

Sur le PIC, une implémentation classique de style SPI bit-bang prend environ cinq cycles par bit; avec un peu de travail sur les pièces 18Fxx, on peut réduire cela à environ quatre (au prix d'environ trois cycles par octet de surcharge supplémentaire). Ce temps s'ajoute à tout le temps nécessaire pour récupérer des données (généralement trois cycles par octet). Donc, comptez environ 40 à 43 cycles par octet. En utilisant le SPI matériel, la vitesse s'améliore à deux cycles par bit plus quelques cycles supplémentaires par octet (certains autres peuvent gérer des transferts consécutifs, mais les PIC que j'ai vus ne peuvent pas), et pendant que le SPI envoie un octet le processeur peut récupérer le suivant, permettant un temps global d'environ 18 cycles / octet - un gain de vitesse d'environ 2,5x.


0

Pour le bit banging (BB), vous avez oublié de mentionner:

  1. Attache le processeur pendant la durée de la communication. (SPI charge les registres puis vous rend la main pour faire autre chose)
  2. Les interruptions d'arrière-plan peuvent sérieusement interférer avec le code BB, ce qui ne le rend utile que dans les conceptions à un seul thread, rappelez-vous que le code BB doit accorder une attention à 100% au traitement du protocole.
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.