Betrachten Sie das folgende minimale Beispiel, das ich pinMode
vor dem Aufrufen von SPI-Funktionen festgelegt habe:
#include <SPI.h>
void setup() {
pinMode(10, OUTPUT);
SPI.begin(10);
SPI.setDataMode(10,SPI_MODE1);
}
void loop() {
delay(1000);
SPI.transfer(10,1);
}
Wenn jetzt SPI.transfer(10,1)
angerufen wird loop()
, sehe ich immer, dass der vom Slave ausgewählte Pin auf 1,65 V abfällt, aber nicht auf 0, wie es sollte! (siehe Bild unten)
Wenn wir nicht anrufen pinMode()
, so:
#include <SPI.h>
void setup() {
SPI.begin(10);
SPI.setDataMode(10,SPI_MODE1);
}
void loop() {
delay(1000);
SPI.transfer(10,1);
}
Wir bekommen, was wir erwarten würden, wenn wir anrufen SPI.transfer
:
Ist das ein Fehler oder haben Sie eine Erklärung für dieses Verhalten?
Vielen Dank im Voraus für Ihre Zeit und Ihr Interesse!
arduino-due
spi
newandlost
quelle
quelle
SPI.setDataMode(10, SPI_MODE1);
? Auch nur der zweite ist nützlich, dabegin()
setDataMode aufgerufen wird. Wenn man sich den Quellcode ansieht, sieht es so aus, als würde die SPI-Bibliothek den von Ihnen angegebenen Pin nicht ändern (obwohl ich ARM nicht kenne).Antworten:
Dies könnte etwas mit dem internen Pull-up-Widerstand zu tun haben. Laut SAM3X / A-Datenblatt
Wenn Sie alle Include-Dateien durchsuchen, die Sie finden:
Zeile 124 definiert die
pinMode(uint32_t ulPin, uint32_t ulMode)
Funktion. Wenn Sie die switch / case-Anweisung für INPUT vs INPUT_PULLUP vs OUTPUT untersuchen, sehen Sie Folgendes:reg = PORT_PINCFG_INEN
.reg = (PORT_PINCFG_INEN | PORT_PINCFG_PULLEN)
reg &= ~PORT_PINCFG_INEN
.Das 'Register' ist jeweils das gleiche. Ich kann für mein ganzes Leben nicht finden, als welchen Wert PORT_PINCFG_INEN oder PORT_PINCFG_PULLEN definiert sind, aber es handelt sich zweifellos nur um 8-Bit-Masken (sie werden in uint8_t umgewandelt, wenn sie dem 'Register' zugewiesen werden). Wir können also davon ausgehen, dass jedes Bit, das die Ein- / Ausgabe steuert, aktiv ist, wenn es aktiviert ist, ebenso wie das Pullup-Bit. Zum Beispiel:
Wenn Klimmzüge nach dem Zurücksetzen aktiviert sind, können wir dies beim Zurücksetzen sagen:
Punkt (3) oben impliziert stark, dass die Anweisung lautet:
Deshalb , wenn Sie pinMode (X, OUTPUT) , bevor irgendetwas nennen sonst werden Sie aktiviert mit dem Pull - up - Widerstand am Ende. Wenn Sie den Pin auf einen Eingang setzen, wird das Pullup-Aktivierungsbit gelöscht. Danach können Sie den Pin auf einen Ausgang setzen und das Bit bleibt frei.
Die ganze Argumentation fällt jedoch mit der einfachen Tatsache zusammen, dass das Problem nicht auftritt , wenn Sie pinMode () überhaupt nicht aufrufen ...
quelle