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.


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow