Un esclave SPI peut-il démarrer une transmission en mode duplex intégral?

8

Pour autant que je sache, la transmission SPI pour un esclave SPI fonctionne comme ci-dessous:

  1. Le maître sélectionne un esclave à l'aide de la broche SS
  2. Le maître et l'esclave s'envoient des données simultanément
  3. Le maître démarre l'horloge et la transmission de données en même temps (il n'y a pas d'horloge avant l'opération d'écriture)
  4. Le maître arrête la transmission à tout moment (en arrêtant l'opération d'écriture et la génération d'horloge), même si l'esclave a plus de données à envoyer.

Existe-t-il une configuration d'esclave SPI qui permet à l'esclave de transmettre des données sans l'autorisation du maître?

Je pense juste à haute voix. Supposons qu'il n'y ait qu'un seul esclave et qu'une horloge continue soit fournie par le maître, etc.

Même si la déclaration supposée est vraie, le maître et l'esclave ne perdent-ils pas la synchronisation des octets (c'est-à-dire qu'ils reçoivent le flux binaire) car il n'y a pas de bits start-stop pour SPI?

Je pose une telle question parce que j'ai lu la section suivante de ce document .

2.2 Exemple SPI

L'exemple SPI ci-joint illustre l'utilisation de l'USART en mode synchrone. USART1 est configuré comme esclave, tandis que USART2 est maître. Les transactions suivantes ont lieu:

  • Transmission des données du maître à l'esclave.
  • Transmission des données de l'esclave au maître.
  • Transmission de données du maître à l'esclave et de l'esclave au maître simultanément.

Le document donne un exemple SPI mais réalise l'exemple en utilisant des appareils USART. Et je comprends qu'un esclave USART peut démarrer une transmission sans l'autorisation du maître.

Je n'ai pas pu trouver le code source référencé par le document.

JeJoRic
la source
4
L'esclave, par définition, ne peut pas initier une transaction (il peut cependant être capable d'interrompre le maître pour démarrer une transaction).
Peter Smith
5
Le transfert de données unidirectionnel dans le SPI traditionnel n'est qu'une personne ignorant l'état de la ligne allant dans l'autre sens. Les écritures, les lectures et les transferts bidirectionnels ne sont pas vraiment différents. En fait, par exemple, de nombreux périphériques SPI horodent un mot d'état pendant le premier mot, avant même de savoir ce qui est demandé, car cela ne coûte pratiquement rien et permet une interrogation d'état rapide.
Chris Stratton

Réponses:

17

Non, avec SPI, toutes les communications sont gérées par le périphérique maître. Vous avez raison de dire que le maître ne peut pas simplement fournir une horloge continue; il n'y aurait aucun moyen de détecter les limites d'octets.

Un appareil esclave aura souvent une broche de sortie distincte pour signaler au maître qu'il a des données disponibles. Cette broche est connectée à une entrée sur un microcontrôleur et est souvent utilisée comme interruption.

Ensuite, l'appareil peut affirmer la broche, ce qui fait tourner le microcontrôleur sur le bus SPI.


Pour des informations plus détaillées, lisez la suite :) Ceci est une version légèrement modifiée d'une explication trouvée ici :

Le périphérique esclave ne peut communiquer que s'il dispose d'une horloge du maître. Cela complique la lecture de l'esclave, car vous devez obliger le maître à fournir suffisamment de cycles d'horloge pour que l'esclave réponde.

Lorsque vous envoyez une commande SPI depuis le maître, deux transmissions se produisent réellement pendant les mêmes huit impulsions d'horloge. Le premier est que votre octet est cadencé hors de la ligne MOSI. Mais, en même temps, les données sont synchronisées avec le microcontrôleur via la ligne MISO.

Mais comme l'esclave n'obtient pas la commande complète jusqu'à la fin de ces transactions, il ne présente aucune donnée au bus. Il en résulte une valeur reçue de 0x00 ou 0xFF.

Ensuite, vous devez fournir huit horloges supplémentaires pour permettre à l'esclave de renvoyer la valeur réelle. Dans de nombreuses implémentations de code, cela se fait en envoyant un "octet factice" à l'esclave.

Notez que, dans la première transmission, le maître ignore tout ce qui arrive de l'esclave. Dans la deuxième transmission, l'esclave ignore tout ce qui est envoyé par le maître.

Cela décrit le cas général. Il peut y avoir des complexités supplémentaires. Par exemple, certains circuits intégrés esclaves émettent en fait une sorte d'octet d'état en même temps qu'ils reçoivent une commande du maître. Donc, dans ce cas, le maître ne doit pas supprimer le premier octet reçu.

bitsmack
la source
2
"le maître ne peut pas simplement fournir une horloge continue" En fait, j'ai vu un appareil il n'y a pas si longtemps qui fait exactement cela. C'était une petite bête bizarre. Je ne me souviens pas du P / N malheureusement.
Aaron
@Aaron Bon à savoir! Les gens deviennent de plus en plus intelligents :-)
bitsmack
7

Non, le maître est celui qui arbitre les chipsets et pilote l'horloge. Un esclave n'écoutera toujours que l'horloge et la puce. Le transfert de données peut être encore en duplex intégral. Il existe certaines implémentations où l'horloge peut être continue, mais cela n'a pas beaucoup d'importance car le chipselect est utilisé pour synchroniser les limites d'octets de toute façon. Mais il y a aussi des systèmes multimaître, donc en gros vous pouvez avoir un mécanisme pour que les appareils décident qui est esclave et maître. Ou incluez simplement un fil "d'interruption" séparé pour l'esclave pour signaler au maître qu'il a un paquet de données pour le maître.

Juste moi
la source
Pourriez-vous ajouter un exemple de système multimaître?
davidcary