arduino
Komunikacja SPI
Szukaj…
Uwagi
Chip wybierz sygnały
Większość urządzeń podrzędnych ma aktywne wejście wyboru niskiego układu. Tak więc właściwy kod do inicjalizacji i użycia pinu wyboru chipa to:
#define CSPIN 1 // or whatever else your CS pin is
// init:
pinMode(CSPIN, OUTPUT);
digitalWrite(CSPIN, 1); // deselect
// use:
digitalWrite(CSPIN, 0); // select
... perform data transfer ...
digitalWrite(CSPIN, 1); // deselect
Usunięcie zaznaczenia urządzenia podrzędnego jest równie ważne, jak jego wybranie, ponieważ urządzenie podrzędne może sterować linią MISO, gdy jest ona wybrana. Może być wielu niewolników, ale tylko jeden może prowadzić MISO. Jeśli niewolnik nie zostanie odpowiednio odznaczony, dwóch lub więcej niewolników może prowadzić MISO, co może prowadzić do zwarć między wyjściami i może uszkodzić urządzenia.
Transakcje
Transakcje służą dwóm celom:
- powiedz SPI, kiedy chcemy rozpocząć i zakończyć korzystanie z niego w określonym kontekście
- skonfiguruj SPI dla konkretnego układu
Linia zegara ma różne stany bezczynności w różnych trybach SPI. Zmiana trybu SPI, gdy wybrany jest Slave, może wprowadzić w błąd Slave, dlatego zawsze należy ustawiać tryb SPI przed wyborem Slave. Tryb SPI można ustawić za pomocą obiektu SPISettings
przekazanego do SPI.beginTransaction
:
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
digitalWrite(CSPIN, 0);
... perform data transfer ...
digitalWrite(CSPIN, 1);
SPI.endTransaction();
SPISettings
można również przechowywać w innym miejscu:
SPISettings mySettings(1000000, MSBFIRST, SPI_MODE0);
SPI.beginTransaction(mySettings);
Jeśli inna część kodu próbuje użyć SPI między parą wywołań funkcji beginTransaction()
i endTransaction()
, może pojawić się błąd - sposób wykonania zależy od implementacji.
Zobacz także Arduino Reference: SPISettings
Używanie SPI w procedurach obsługi przerwań
Jeśli SPI musi być używany w ramach ISR, żadna inna transakcja nie może mieć miejsca w tym samym czasie. Biblioteka SPI udostępnia usingInterrupt(interrupt_number)
aby to ułatwić. Działa poprzez wyłączenie danego przerwania za każdym razem, gdy wywoływana jest funkcja beginTransaction()
, więc przerwanie nie może zostać uruchomione między tą parą wywołań funkcji beginTransaction()
i endTransaction()
.
Zobacz także Arduino Reference: SPI: usingInterrupt
Podstawy: zainicjuj SPI i pin wyboru chipa i wykonaj transfer 1-bajtowy
#include <SPI.h>
#define CSPIN 1
void setup() {
pinMode(CSPIN, OUTPUT); // init chip select pin as an output
digitalWrite(CSPIN, 1); // most slaves interpret a high level on CS as "deasserted"
SPI.begin();
SPI.beginTransaction(SPISettings(1000000, MSBFIRST, SPI_MODE0));
digitalWrite(CSPIN, 0);
unsigned char sent = 0x01;
unsigned char received = SPI.transfer(sent);
// more data could be transferred here
digitalWrite(CSPIN, 1);
SPI.endTransaction();
SPI.end();
}
void loop() {
// we don't need loop code in this example.
}
Ten przykład:
- poprawnie inicjuje się i wykorzystuje pin wyboru chipa (patrz uwagi)
- prawidłowo wykorzystuje transakcję SPI (patrz uwagi)
- używa tylko SPI do przesłania jednego bajtu. Istnieje również metoda przenoszenia tablic, która nie jest tutaj stosowana.