Wie kann ich testen, ob mein Programm für die SPI-Kommunikation korrekt funktioniert?

Ich habe einen einfachen Code zum Erlernen von SPI in Arduino Due entwickelt. Der Code wird richtig kompiliert und jetzt möchte ich den nächsten Schritt lernen, wie man den Code mit dem Board testet und den Master dazu bringt, mit dem Slave zu kommunizieren. Hier ist der Code:

#include"SPI.h"
 int mosi = 75;          //assigning variables to pins
 int sck = 76;
 int ss = 10;
 int miso = 74;

void setup()
 {
   pinMode(mosi,OUTPUT);     //Configuring pins as input and output
   pinMode(sck,OUTPUT);
   pinMode(ss,OUTPUT);
   pinMode(miso,INPUT);
   SPI.begin(10);                   // waking up SPI bus
   SPI.setDataMode(10,SPI_MODE_0);  //setting mode for clk phase & pol
   SPI.setBitOrder(10, MSBFIRST);   // setting bit order for transfer
   SPI.setClockDivider(10,42);     //setting clock to 2 MHz
   digitalWrite(10,HIGH);     //keeping slave device unactive
 }
void set_value(int value);
 {
   digitalWrite(10,LOW);      //activate slave select line
   SPI.transfer(0);           
   SPI.transfer(value);    // transfer values from 0 to 255
   digitalWrite(10,HIGH);   //deactivate slave line after transfer
 }
void loop()
 {
   for(int i=0 ; i<256 ;i++)     //values to transfer
    {
      set_value(i);             //call function to transfer values
      delay(100);
    }
  }

Verwendete IDE: Arduino, Verwendetes Board: Arduino Due

Ich habe einige Zweifel bezüglich dieses Codes:

1) Wie kann ich diesen Code mit meinem Board testen, um zu überprüfen, ob er richtig funktioniert?

2) Warum werden die Pins mosi, sck und ss nirgendwo im Code verwendet, während alle Operationen/Funktionen in Bezug auf die Slave-Leitung ss = 10 ausgeführt werden? Kümmert sich das SPI-Modul automatisch um die Datenübertragung und den Empfang durch MOSI und MISO?

3) Was sind die möglichen Hardwareverbindungen, wenn ich ein Due-Board als Master und ein anderes Due-Board als Slave verwende?

4) Sollte ich diesen Code sowohl in den Master als auch in den Slave laden, damit er funktioniert? Oder Da der Master Daten von der Slave-Platine senden und empfangen muss, muss ich einige Änderungen an diesem Code vornehmen?

5) Wenn ich etwas verpasse oder irgendwelche Anweisungen dazu wären hilfreich. Ich bin Neuling bei eingebetteten Systemen und total verwirrt und voller dummer Zweifel. Bitte vergiss es. Danke!

Sie können Ihre Fragen aufteilen, damit sie besser in das Q&A-Format von StackExchange passen.
IMO mehrteilige Fragen sind in Ordnung, wenn sie eng miteinander verbunden sind.
Sie müssen den CS-Pin nicht manuell umschalten oder die SPI-Pins konfigurieren, dies ist bereits in der SPI-Bibliothek erledigt. Die SPI-Bibliothek befindet sich im Bibliotheksordner Ihres Arduino-Installationsverzeichnisses. Öffnen Sie die C++-Dateien und werfen Sie einen Blick auf den Code. Ich denke, Sie werden das Innenleben besser verstehen. Es ist auch gut, das Datenblatt für die MCU von Due herunterzuladen und einen Blick in die SPI-Sektion zu werfen. Denken Sie daran, dass der Arduino nur der avr-gcc-Compiler mit einigen C++-Kernbibliotheken und einer auf Verarbeitung basierenden IDE ist.
@geometrisch: Ich habe tatsächlich einige Probleme mit der spi.transfer-Funktion, da sie ihre Aufgabe nicht erfüllt. Also habe ich, wie Sie sagten, angefangen, die Bibliotheken im Installationsverzeichnis zu durchsuchen. Die spi c++-Datei ist nur im WiFi-Bibliotheksordner verfügbar. Ich habe die Dienstprogramme im WiFi-Ordner überprüft und die C++-Datei spi_drv gefunden, aber in dieser Datei habe ich gesucht und konnte keinen spi.transfer()-Funktionscode sehen, obwohl sie ihn verwendet haben. Also wollte ich nur wissen, ob Sie gekommen sind darüber irgendwann, wenn Sie durch den Spi-Code scannen. Wenn ja, bitte direkt. Danke
Ich möchte keine weitere Frage stellen, ob jemand diese Funktion in den Arduino-Bibliotheken gefunden hat, da dies dumm wäre. Also, jede Hilfe in Kürze wäre willkommen.
Endlich habe ich die spi.function() gefunden. Es war im Hardware-Ordner im Arduino-Verzeichnis vorhanden

Antworten (2)

Das Arduino DUE verwendet eine etwas andere Methodik für SPI im Vergleich zu den anderen Arduino-Boards. Es übernimmt für Sie den Betrieb der SS-Linie, damit Sie es nicht tun müssen.

Während Sie die manuelle Softwaremethode verwenden können, ist es besser, die Hardwareeinrichtungen zu verwenden, sofern verfügbar.

Die SPI-Schnittstelle des Arduino Due funktioniert anders als alle anderen Arduino-Boards. Die Bibliothek kann auf dem Due mit den gleichen Methoden verwendet werden, die für andere Arduino-Boards verfügbar sind, oder mit den erweiterten Methoden. Die erweiterten Methoden nutzen die SAM3X-Hardware und ermöglichen einige interessante Funktionen wie:

  • automatische Behandlung der Geräte-Slave-Auswahl.
  • automatische Handhabung verschiedener Gerätekonfigurationen (Taktrate, Datenmodus usw.), sodass für jedes Gerät automatisch seine eigene Konfiguration ausgewählt werden kann.

Arduino Due hat drei freiliegende Pins für die Slave Select (SS)-Leitungen der Geräte (Pins 4, 10 und 52).

Dies bedeutet, dass Sie den SPI mit dem von Ihnen verwendeten SS-Pin initialisieren:

SPI.begin(10);

Dann senden und empfangen Sie mit den „Fortsetzungs“-Versionen der SPI-Übertragungsfunktion:

SPI.transfer(10, 0, SPI_CONTINUE);
SPI.transfer(10, value);

Der erste Parameter ist der SS-Pin (er wird als Schlüssel verwendet, um die Funktion mit der richtigen SPI-Instanz zu verbinden), der zweite ist der zu übertragende Wert, und der dritte weist SPI an, den SS-Pin nach der Übertragung nicht zu erhöhen.

Der SPI auf dem Due ist ein einzelner SPI-Bus mit mehreren Hardware-SS-Pins. Die Konfiguration des Busses ist an diesen SS-Pin angehängt. Wenn Sie also einen SS-Pin aktivieren, wird der Bus automatisch mit den Einstellungen konfiguriert, die Sie diesem SS-Pin zugeordnet haben. Dadurch kann ein Bus mehrere verschiedene Einstellungen (Geschwindigkeit, Taktpolarität, Bitreihenfolge usw.) haben und ohne manuelles Eingreifen Ihrerseits richtig zwischen ihnen umschalten.

Sie können hier mehr über diese Arbeitsweise lesen: http://arduino.cc/en/Reference/DueExtendedSPI

Was das Testen Ihres Codes angeht, wenn ich einen SPI-Port testen muss, erstelle ich normalerweise eine Loopback-Verbindung (verbinde MOSI mit MISO) und sende zufällige Werte durch sie und empfange, was gesendet wird. Der gesendete Wert und der empfangene Wert sollten übereinstimmen, wenn der SPI ordnungsgemäß funktioniert.

Tut mir leid, wenn das nichts damit zu tun hat. Angenommen, Sie haben 2 Slaves, einen an Pin 10 und einen an Pin 4, rufen Sie SPI.begin(10) oder SPI.begin(4) auf, bevor Sie Daten an jeden Slave senden?

Der einfachste Weg, um zu sehen, ob Ihr SPI-Code funktioniert, besteht darin, Ihren Controller mit externen Schieberegistern zu verbinden und es herauszufinden.

Sie können ein oder mehrere Serial-In-Parallel-Out-Schieberegister verwenden, die LEDs ansteuern, um den SPI-Ausgang zu testen: 74hc595-Treiber-LEDs mit 1k-Vorwiderständen an jeder LED funktionieren gut. Ich ziehe es vor, dass die Schieberegisterausgänge aktiv LOW sind - das bedeutet, dass alle LED-Widerstände die +5-V-Schiene mit LEDs von jedem Widerstand zu den Schieberegisterausgängen führen.

Sie können ein oder mehrere Parallel-In-Serial-Out-Schieberegister mit DIP-Schaltern verwenden, um den SPI-Eingang zu testen: 4021 mit 10k Pull-up-Widerständen plus einem DIP-Schalter gegen Masse für jeden der Eingänge.

Ein schneller Test besteht darin, Code zu schreiben, der einfach die DIP-Schaltereingänge auf den LEDs widerspiegelt.

Der spezifische Grund, warum ich erwähne, wo die Widerstände sowohl für die Serial-In- als auch für die Serial-Out-Schieberegister verwendet werden, ist, dass ich Bus-Widerstandsnetzwerke in 10-Pin-SIP-Gehäusen verwende. Diese sind steckbrettfreundlich (0,1 Zoll Stiftabstand) und machen es einfach (und sauber und ordentlich), die erforderlichen Widerstände hinzuzufügen.

Eine letzte Anmerkung: Da ich das früher sehr oft gemacht habe (und immer noch tue!), habe ich tatsächlich mehrere kleine Stücke Veroboard (Streifenplatte) mit den Komponenten auf den Brettern gemacht. Eine Ausführung hat einen 8-fachen DIP-Schalter und Pull-up-SIP-Netzwerk, die andere Ausführung hat eine 10-Segment-LED-Balkenanzeige mit Pull-up-SIP-Widerstandsnetzwerk. Diese wurden alle mit Maschinenbuchsen im SIP-Stil (einreihig) hergestellt, die es mir ermöglichen, 24 AWG-Telefon / Cat-5-Volldraht zu verwenden, um von den kleinen Modulen zum Steckbrett zu gelangen.

Die Verwendung dieser kleinen Module macht das Testen und Experimentieren sehr einfach. Die zusätzlichen Vorteile sind, dass die Komponenten auf diesen kleinen Modulen keinen Platz auf Ihrem Steckbrett beanspruchen, sie können immer wieder verwendet werden und sie sind freundlich zu Mikrocontrollern auf Platinenebene wie Arduino oder anderen Single-Board-Controllern .

Ich habe meine kleinen Module vor einigen Jahrzehnten zum ersten Mal so gemacht und benutze sie noch heute.