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!
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.
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.
Mast
geometrisch
geometrisch
PsychedGuy
PsychedGuy
PsychedGuy