Rozważ następujący minimalny przykład, w którym ustawiłem pinMode
przed wywołaniem funkcji SPI:
#include <SPI.h>
void setup() {
pinMode(10, OUTPUT);
SPI.begin(10);
SPI.setDataMode(10,SPI_MODE1);
}
void loop() {
delay(1000);
SPI.transfer(10,1);
}
Teraz, kiedy SPI.transfer(10,1)
jest wywoływany loop()
, zawsze widzę, że wybrany pin slave spada do 1,65 V, ale nie 0, jak powinien! (patrz zdjęcie poniżej)
Jeśli nie dzwonimy pinMode()
, tak:
#include <SPI.h>
void setup() {
SPI.begin(10);
SPI.setDataMode(10,SPI_MODE1);
}
void loop() {
delay(1000);
SPI.transfer(10,1);
}
Otrzymujemy to, czego oczekujemy, dzwoniąc SPI.transfer
:
Czy to błąd, czy masz wyjaśnienie tego zachowania?
Z góry dziękuję za poświęcony czas i zainteresowanie!
arduino-due
spi
newandlost
źródło
źródło
SPI.setDataMode(10, SPI_MODE1);
? Przydaje się tylko drugi, ponieważbegin()
wywołania setDataMode. Patrząc na kod źródłowy wygląda na to, że biblioteka SPI nie zmienia podanego pinu (chociaż nie znam ARM).Odpowiedzi:
Może to mieć coś wspólnego z wewnętrznym rezystorem podciągającym. Zgodnie z arkuszem danych SAM3X / A,
Jeśli przejrzysz wszystkie znalezione pliki dołączania:
Wiersz 124 określa
pinMode(uint32_t ulPin, uint32_t ulMode)
funkcję. Analizując instrukcję switch / case dla INPUT vs INPUT_PULLUP vs OUTPUT, widzisz:reg = PORT_PINCFG_INEN
.reg = (PORT_PINCFG_INEN | PORT_PINCFG_PULLEN)
reg &= ~PORT_PINCFG_INEN
.„Rejestr” w każdym przypadku jest taki sam. Nie mogę przez całe życie znaleźć, jaką wartość PORT_PINCFG_INEN lub PORT_PINCFG_PULLEN są zdefiniowane, ale bez wątpienia są to tylko 8-bitowe maski (są one przesyłane do uint8_t, gdy są przypisywane do „rejestru”). Możemy zatem założyć, że którykolwiek bit kontrolujący wejście / wyjście jest aktywny, gdy jest potwierdzony, podobnie jak bit pullup. Na przykład:
Jeśli pull-upy są włączone po resecie, możemy powiedzieć, że po resecie:
Punkt 3 powyżej wyraźnie sugeruje, że instrukcja jest:
Dlatego jeśli wywołasz pinMode (X, WYJŚCIE) przed czymkolwiek innym , skończysz z włączonym rezystorem podciągającym. Ustawienie pinu na wejście wyczyści bit włączania pullup, po czym możesz ustawić pin na wyjście, a bit pozostanie czysty.
Jednak cała arguement spada z prostego faktu, że jeśli nie nazywamy pinMode () w ogóle , problem nie występuje ...
źródło