Comment lire des données en utilisant Arduino SPI

dans la fiche technique, il est indiqué que je devrais appliquer 32 horloges série pour obtenir les 32 bits de données. Comment puis-je Je programme cest Arduino?

Commentaires

  • Je vous suggère douvrir les exemples de la librairie SPI et de les vérifier. Quoi quil en soit, le code doit être byte result[4]; for (i = 0; i < 4; i++) result[i] = SPI.transfer(0x00); et vous trouverez dans result les 32 bits dont vous avez besoin
  • Je lai déjà fait. mais la puce dénergie Jutilise STPM10 et cela suggère que je devrais utiliser SPI synchrone simplex où le MOSI nest pas connecté. Il y a juste un chronogramme pour passer de la lecture doctets à lécriture doctets. Quand jai utilisé SPI.transfer (), les données ne sont pas stable et je ne pense pas fiable
  • Comment dites-vous quil nest pas fiable? Le périphérique est en duplex intégral, et selon la façon dont il fonctionne, la seule façon de recevoir des données est denvoyer des données factices. Si MOSI est pas connecté, eh bien, cela na ‘ pas dimportance ; notez cependant que vous pouvez ‘ t utiliser la broche MOSI pour dautres tâches. Au fait, vous êtes-vous souvenu davoir correctement réglé la broche de sélection esclave de lautre périphérique? Avez-vous utilisé la broche SS sur la carte arduino ou une autre?

Réponse

Vous appelez SPI.transfer() quatre fois, à chaque fois en enregistrant la valeur renvoyée dans une variable après un décalage de bits approprié.

uint32_t val; val = SPI.transfer(0xff); //0xff is a dummy val |= (uint32_t)SPI.transfer(0xff) << 8; val |= (uint32_t)SPI.transfer(0xff) << 16; val |= (uint32_t)SPI.transfer(0xff) << 24; 

Je suppose le moins significatif loctet est reçu en premier. Assurez-vous que le mode SPI est le bon, comme indiqué dans votre fiche technique.

Si lesclave ne peut pas gérer la désactivation entre octets (ce qui est ce que SPI.transfer() fera à la fin de la transaction), alors vous pouvez soit essayer lapproche SPI matérielle de st2000, soit utiliser SPI bitbanged avec shiftIn().

Commentaires

  • Je ne suis pas sûr que cela fonctionnera. Nous avons vraiment besoin de savoir comment fonctionne lesclave SPI avant de pouvoir supposer comment il va réagir. De plus, si la ligne Chip Select est affirmée et annulée avec chaque transaction SPI 8 bits, dans quelle mesure lesclave SPI est-il bien conçu? Autrement dit, un tel esclave SPI pourrait facilement se désynchroniser avec le maître SPI. Plus précisément, comment savez-vous quel octet de 8 bits vous lisez réellement?
  • @ st2000 LOP a jugé bon de ne pas donner suffisamment de détails; rien dautre que des hypothèses ne peuvent être faites jusquà ce que cela change.
  • Tous les exemples que jai ‘ vus utiliser SPI, transfer (0) pour lire les données plutôt que SPI.transfer (0xff). Ils utilisent également SPI.transfer pour écrire des données. Je nai toujours pas ‘ compris ce que SPI fait avec le 0 ou 0xff lorsque vous lisez réellement des données. Est-ce envoyé à lesclave?
  • @ S.Imp Ils ‘ sont des octets factices. Vous pouvez envoyer tout ce que vous voulez envoyer, lappareil à lautre extrémité les rejettera toujours, sil paye même les données. SPI.transfer() est toujours utilisé en partie en raison de la nature intrinsèque du duplex intégral de SPI et (en conséquence du premier facteur) en partie en raison de la manière dont la plupart des MCU implémentent leurs périphériques SPI. Une fois que lhorloge commence à fonctionner, il y a toujours des  » data  » sur les lignes MOSI et MISO, cest ‘ revient à chaque participant sur le bus de le lire ou non, de décider en fonction du protocole de couche supérieure prédéfini si les données  »  » est significatif ou pas.
  • Il ne serait pas ‘ totalement incorrect de dire que vous pouvez ‘ t vraiment lire sans écrire sur un bus SPI et vice versa également. Il est donc logique de simplement concevoir un périphérique qui prend un octet dans un registre et, 8 cycles plus tard, retourne un octet dans un autre (ou même le même) registre, juste pour généraliser les cas dutilisation. Ensuite, c’est à l’application de ‘ qu’elle appartient à l’utilisateur ‘ de décider si ‘ re intéressé uniquement par loctet qui a été écrit en premier lieu (TX) ou celui qui a été relu (RX) ou les deux (TX et RX). Aussi, doù le nom ambigu transfer() car il sert à la fois des rôles de lecture et décriture.

Answer

Réponse

Lobjectif est de lire 32 bits en utilisant le port SPI du périphérique (inconnu).

Si lappareil tolère lactivité de la ligne SPI Chip Select (passant dinactif à actif à inactif pour chaque lecture doctet de 8 bits), vous devriez être en mesure dobtenir les 32 bits de données souhaités en effectuant 4 8 consécutifs bit SPI lit.

Cependant, si le périphérique ne tolère pas lactivité de ligne SPI Chip Select ci-dessus (cest-à-dire si le périphérique nécessite que SPI Chip Select soit actif pendant toute la transaction SPI 32 bits), vous ne pouvez pas séparer la transaction 32 bits en 4 transactions SPI 8 bits individuelles sans contrôler la ligne SPI Chip Select. Lexemple de code suivant illustre comment procéder:

void loop(){ //transfer 0x0F to the device on pin 10, keep the chip selected SPI.transfer(10, 0xF0, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, keep the chip selected SPI.transfer(10, 0×00, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, store byte received in response1, keep the chip selected byte response1 = SPI.transfer(10, 0×00, SPI_CONTINUE); //transfer 0x00 to the device on pin 10, store byte received in response2, deselect the chip byte response2 = SPI.transfer(10, 0×00); } 

Lexemple ci-dessus provient de la bibliothèque Arduino SPI page Web et est un transfert 16 bits (et non 32 bits). Pour coder un transfert 32 bits, continuez dappeler la méthode SPI.transfer en utilisant le paramètre SPI_CONTINUE.

ajouté plus tard …

Il semble que les gens découragent lutilisation des méthodes DueExtendedSPI . Et SPISettings et SPI.beginTransaction () doivent être utilisés? Si tel est le cas, cette page affiche un exemple de code où le code contrôle explicitement la ligne SPI Chip Select (recherchez slaveAPin & slaveBPin). Notez comment le code lit 24 bits de lesclave A et écrit 8 bits sur lesclave B.Pour lire 32 bits au lieu de 24 bits, nous devons modifier un segment du code (avec quelques autres changements de support) de cette manière:

... SPI.beginTransaction(settingsA); digitalWrite (slaveAPin, LOW); // reading only, so data sent does not matter val0 = SPI.transfer(0); val1 = SPI.transfer(0); val2 = SPI.transfer(0); val3 = SPI.transfer(0); digitalWrite (slaveAPin, HIGH); SPI.endTransaction(); ... 

Commentaires

  • Nous avons vraiment besoin de voir les spécifications du SPI esclave pour en composer un plus réponse spécifique.
  • Jutilise la carte dévaluation STPM10. La connexion est un SPI synchrone simplex et le MOSI de lArduino nest connecté à rien. Il existe un chronogramme permettant de passer de la lecture seule à lécriture seule. Mes problèmes sont de savoir comment lire les données des registres de la puce. Jai utilisé SPI.transfer mais je ne pense ‘ que les données sont fiables.
  • Le chronogramme STPM10 trouvé à la page 11 ‘ ne ressemble pas à une transaction SPI standard. Jai tendance à dire que vous ne pouvez pas utiliser la bibliothèque Arduino SPI. Au lieu de cela, vous devrez peut-être totalement le faire dans le logiciel. Par exemple, je ne pense pas quil existe une ligne  » SYN  » dans le bus SPI standard. Et je ne crois ‘ pas que la ligne de sélection de puce devrait être élevée avant la fin de la transaction SPI.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *